Corrigndo bug da orgniazacao ativa

This commit is contained in:
Gabriel Santana de Menezes 2026-05-04 20:55:56 -04:00
parent 1688cf092e
commit 7c4884b6ad
5 changed files with 38 additions and 26 deletions

View file

@ -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())
); );
} }

View file

@ -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
) {} ) {}

View file

@ -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
) {} ) {}

View file

@ -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())
)) ))

View file

@ -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 }> = ({
@ -26,9 +31,24 @@ export const AuthProvider: React.FC<{ children: React.ReactNode }> = ({
const [user, setUser] = useState<LoginResponse | null>(null); const [user, setUser] = useState<LoginResponse | null>(null);
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 (