Corrigndo bug da orgniazacao ativa
This commit is contained in:
parent
1688cf092e
commit
7c4884b6ad
5 changed files with 38 additions and 26 deletions
|
|
@ -35,7 +35,7 @@ public class AuthControllerMapper {
|
||||||
output.expiresIn(),
|
output.expiresIn(),
|
||||||
output.issuedAt(),
|
output.issuedAt(),
|
||||||
output.organizations().stream()
|
output.organizations().stream()
|
||||||
.map(org -> new LoginResponse.Organization(org.name(), org.roles()))
|
.map(org -> new LoginResponse.Organization(org.id(), org.name(), org.roles()))
|
||||||
.collect(Collectors.toList())
|
.collect(Collectors.toList())
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,7 @@ public record LoginResponse(
|
||||||
List<Organization> organizations
|
List<Organization> organizations
|
||||||
) {
|
) {
|
||||||
public record Organization(
|
public record Organization(
|
||||||
|
Long id,
|
||||||
String name,
|
String name,
|
||||||
List<String> roles
|
List<String> roles
|
||||||
) {}
|
) {}
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,7 @@ public record LoginOutput(
|
||||||
List<OrganizationOutput> organizations
|
List<OrganizationOutput> organizations
|
||||||
) {
|
) {
|
||||||
public record OrganizationOutput(
|
public record OrganizationOutput(
|
||||||
|
Long id,
|
||||||
String name,
|
String name,
|
||||||
List<String> roles
|
List<String> roles
|
||||||
) {}
|
) {}
|
||||||
|
|
|
||||||
|
|
@ -53,6 +53,7 @@ public class LoginUseCase {
|
||||||
.collect(Collectors.groupingBy(uo -> uo.getOrganization().getName()))
|
.collect(Collectors.groupingBy(uo -> uo.getOrganization().getName()))
|
||||||
.entrySet().stream()
|
.entrySet().stream()
|
||||||
.map(entry -> new LoginOutput.OrganizationOutput(
|
.map(entry -> new LoginOutput.OrganizationOutput(
|
||||||
|
entry.getValue().stream().map(uo -> uo.getOrganization().getId()).findFirst().orElse(null),
|
||||||
entry.getKey(),
|
entry.getKey(),
|
||||||
entry.getValue().stream().map(uo -> uo.getRole().name()).collect(Collectors.toList())
|
entry.getValue().stream().map(uo -> uo.getRole().name()).collect(Collectors.toList())
|
||||||
))
|
))
|
||||||
|
|
|
||||||
|
|
@ -18,6 +18,11 @@ interface AuthContextType {
|
||||||
setActiveOrg: (id: number) => void;
|
setActiveOrg: (id: number) => void;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const STORAGE_KEYS = {
|
||||||
|
USER: "user",
|
||||||
|
ACTIVE_ORG_ID: "activeOrgId",
|
||||||
|
} as const;
|
||||||
|
|
||||||
const AuthContext = createContext<AuthContextType | undefined>(undefined);
|
const AuthContext = createContext<AuthContextType | undefined>(undefined);
|
||||||
|
|
||||||
export const AuthProvider: React.FC<{ children: React.ReactNode }> = ({
|
export const AuthProvider: React.FC<{ children: React.ReactNode }> = ({
|
||||||
|
|
@ -27,8 +32,23 @@ export const AuthProvider: React.FC<{ children: React.ReactNode }> = ({
|
||||||
const [activeOrgId, setActiveOrgId] = useState<number | null>(null);
|
const [activeOrgId, setActiveOrgId] = useState<number | null>(null);
|
||||||
const [isLoading, setIsLoading] = useState(true);
|
const [isLoading, setIsLoading] = useState(true);
|
||||||
|
|
||||||
|
const setupActiveOrg = useCallback((organizations: LoginResponse["organizations"]) => {
|
||||||
|
const storedOrgId = localStorage.getItem(STORAGE_KEYS.ACTIVE_ORG_ID);
|
||||||
|
const parsedStoredId = storedOrgId ? Number(storedOrgId) : null;
|
||||||
|
|
||||||
|
const isValidOrg = organizations.some(org => org.id === parsedStoredId);
|
||||||
|
|
||||||
|
if (isValidOrg && parsedStoredId !== null) {
|
||||||
|
setActiveOrgId(parsedStoredId);
|
||||||
|
} else if (organizations.length > 0) {
|
||||||
|
const firstOrgId = organizations[0].id;
|
||||||
|
setActiveOrgId(firstOrgId);
|
||||||
|
localStorage.setItem(STORAGE_KEYS.ACTIVE_ORG_ID, firstOrgId.toString());
|
||||||
|
}
|
||||||
|
}, []);
|
||||||
|
|
||||||
const logout = useCallback(() => {
|
const logout = useCallback(() => {
|
||||||
localStorage.removeItem("user");
|
localStorage.removeItem(STORAGE_KEYS.USER);
|
||||||
setUser(null);
|
setUser(null);
|
||||||
window.location.href = "/login";
|
window.location.href = "/login";
|
||||||
}, []);
|
}, []);
|
||||||
|
|
@ -60,7 +80,7 @@ export const AuthProvider: React.FC<{ children: React.ReactNode }> = ({
|
||||||
const renewToken = async (refreshToken: string) => {
|
const renewToken = async (refreshToken: string) => {
|
||||||
try {
|
try {
|
||||||
const response = await authService.refresh(refreshToken);
|
const response = await authService.refresh(refreshToken);
|
||||||
localStorage.setItem("user", JSON.stringify(response));
|
localStorage.setItem(STORAGE_KEYS.USER, JSON.stringify(response));
|
||||||
setUser(response);
|
setUser(response);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error("Failed to renew token", error);
|
console.error("Failed to renew token", error);
|
||||||
|
|
@ -69,24 +89,16 @@ export const AuthProvider: React.FC<{ children: React.ReactNode }> = ({
|
||||||
};
|
};
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const storedUser = localStorage.getItem("user");
|
const storedUser = localStorage.getItem(STORAGE_KEYS.USER);
|
||||||
if (storedUser) {
|
if (storedUser) {
|
||||||
try {
|
try {
|
||||||
const userData: LoginResponse = JSON.parse(storedUser);
|
const userData: LoginResponse = JSON.parse(storedUser);
|
||||||
if (checkTokenExpiration(userData)) {
|
if (checkTokenExpiration(userData)) {
|
||||||
setUser(userData);
|
setUser(userData);
|
||||||
|
setupActiveOrg(userData.organizations);
|
||||||
const storedOrgId = localStorage.getItem("activeOrgId");
|
|
||||||
if (storedOrgId) {
|
|
||||||
setActiveOrgId(Number(storedOrgId));
|
|
||||||
} else if (userData.organizations.length > 0) {
|
|
||||||
const firstOrgId = userData.organizations[0].id;
|
|
||||||
setActiveOrgId(firstOrgId);
|
|
||||||
localStorage.setItem("activeOrgId", firstOrgId.toString());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
localStorage.removeItem("user");
|
localStorage.removeItem(STORAGE_KEYS.USER);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
setIsLoading(false);
|
setIsLoading(false);
|
||||||
|
|
@ -105,27 +117,24 @@ export const AuthProvider: React.FC<{ children: React.ReactNode }> = ({
|
||||||
|
|
||||||
const login = async (email: string, password: string) => {
|
const login = async (email: string, password: string) => {
|
||||||
const response = await authService.login(email, password);
|
const response = await authService.login(email, password);
|
||||||
localStorage.setItem("user", JSON.stringify(response));
|
localStorage.setItem(STORAGE_KEYS.USER, JSON.stringify(response));
|
||||||
setUser(response);
|
setUser(response);
|
||||||
|
setupActiveOrg(response.organizations);
|
||||||
return response;
|
return response;
|
||||||
};
|
};
|
||||||
|
|
||||||
const refreshUser = async () => {
|
const refreshUser = async () => {
|
||||||
try {
|
try {
|
||||||
const response = await authService.me();
|
const response = await authService.me();
|
||||||
const storedUser = localStorage.getItem("user");
|
const storedUser = localStorage.getItem(STORAGE_KEYS.USER);
|
||||||
if (storedUser) {
|
if (storedUser) {
|
||||||
const userData = JSON.parse(storedUser);
|
const userData = JSON.parse(storedUser);
|
||||||
const updatedUser = { ...userData, ...response };
|
const updatedUser = { ...userData, ...response };
|
||||||
localStorage.setItem("user", JSON.stringify(updatedUser));
|
localStorage.setItem(STORAGE_KEYS.USER, JSON.stringify(updatedUser));
|
||||||
setUser(updatedUser);
|
setUser(updatedUser);
|
||||||
|
|
||||||
// Update active org if not set or if current active org is gone
|
// Update active org if not set or if current active org is gone
|
||||||
if (!activeOrgId && updatedUser.organizations.length > 0) {
|
setupActiveOrg(updatedUser.organizations);
|
||||||
const firstOrgId = updatedUser.organizations[0].id;
|
|
||||||
setActiveOrgId(firstOrgId);
|
|
||||||
localStorage.setItem("activeOrgId", firstOrgId.toString());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error("Failed to refresh user profile", error);
|
console.error("Failed to refresh user profile", error);
|
||||||
|
|
@ -134,12 +143,12 @@ export const AuthProvider: React.FC<{ children: React.ReactNode }> = ({
|
||||||
|
|
||||||
const setActiveOrg = (id: number) => {
|
const setActiveOrg = (id: number) => {
|
||||||
setActiveOrgId(id);
|
setActiveOrgId(id);
|
||||||
localStorage.setItem("activeOrgId", id.toString());
|
localStorage.setItem(STORAGE_KEYS.ACTIVE_ORG_ID, id.toString());
|
||||||
};
|
};
|
||||||
|
|
||||||
const activeOrg = React.useMemo(() =>
|
const activeOrg = React.useMemo(
|
||||||
user?.organizations.find(org => org.id === activeOrgId) || null,
|
() => user?.organizations.find((org) => org.id === activeOrgId) || null,
|
||||||
[user, activeOrgId]
|
[user, activeOrgId],
|
||||||
);
|
);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue