2026-04-05 01:17:47 +02:00
|
|
|
import { useLogto } from '@logto/react';
|
|
|
|
|
import { useState, useEffect, useCallback } from 'react';
|
2026-04-05 02:50:51 +02:00
|
|
|
import { useOrgStore } from './useOrganization';
|
2026-04-05 01:17:47 +02:00
|
|
|
|
|
|
|
|
interface IdTokenClaims {
|
|
|
|
|
sub?: string;
|
|
|
|
|
email?: string;
|
|
|
|
|
name?: string;
|
|
|
|
|
username?: string;
|
|
|
|
|
roles?: string[];
|
|
|
|
|
organization_id?: string;
|
|
|
|
|
[key: string]: unknown;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function useAuth() {
|
|
|
|
|
const { isAuthenticated, isLoading, getIdTokenClaims, signOut, signIn } = useLogto();
|
|
|
|
|
const [claims, setClaims] = useState<IdTokenClaims | null>(null);
|
2026-04-05 02:50:51 +02:00
|
|
|
const { currentTenantId, isPlatformAdmin } = useOrgStore();
|
2026-04-05 01:17:47 +02:00
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
if (isAuthenticated) {
|
|
|
|
|
getIdTokenClaims().then((c) => setClaims(c as IdTokenClaims));
|
|
|
|
|
} else {
|
|
|
|
|
setClaims(null);
|
|
|
|
|
}
|
|
|
|
|
}, [isAuthenticated, getIdTokenClaims]);
|
|
|
|
|
|
|
|
|
|
const username = claims?.username ?? claims?.name ?? claims?.email ?? claims?.sub ?? null;
|
|
|
|
|
const roles = (claims?.roles as string[]) ?? [];
|
2026-04-05 02:50:51 +02:00
|
|
|
// tenantId is the DB UUID from the org store (set by OrgResolver after /api/me)
|
|
|
|
|
const tenantId = currentTenantId;
|
2026-04-05 01:17:47 +02:00
|
|
|
|
|
|
|
|
const logout = useCallback(() => {
|
|
|
|
|
signOut(window.location.origin + '/login');
|
|
|
|
|
}, [signOut]);
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
isAuthenticated,
|
|
|
|
|
isLoading,
|
|
|
|
|
username,
|
|
|
|
|
roles,
|
|
|
|
|
tenantId,
|
2026-04-05 02:50:51 +02:00
|
|
|
isPlatformAdmin,
|
2026-04-05 01:17:47 +02:00
|
|
|
logout,
|
|
|
|
|
signIn,
|
|
|
|
|
};
|
|
|
|
|
}
|