import { useAuthStore } from '@/stores/authStore' import { ensureFreshToken, startLogin, startLogout } from '@/lib/keycloak' /** * Compat-shim для `useAuth` API из react-oidc-context. Минимальный * superset того, что использовалось в codebase (см. RequireAuth, * useUserDisplay, Sidebar, MyDraftsPanel, reviews, etc.): * - `auth.user.profile.sub` / `preferred_username` / `email` / `name` * - `auth.user.expired` * - `auth.user.access_token` * - `auth.isAuthenticated` / `auth.isLoading` * - `auth.signinSilent()` / `auth.signinRedirect()` / `auth.signoutRedirect()` * - `auth.activeNavigator` (всегда undefined в keycloak-js модели) * *

Поверх zustand `useAuthStore` — реактивно обновляется на * keycloak-js callbacks (onAuthSuccess, onAuthRefreshSuccess, onTokenExpired, * onAuthLogout). Permissions / role checks остаются работать без изменений. */ export const useAuth = () => { const user = useAuthStore((s) => s.user) const isAuthenticated = useAuthStore((s) => s.isAuthenticated) const isLoading = useAuthStore((s) => s.isLoading) const error = useAuthStore((s) => s.error) return { user, isAuthenticated, isLoading, error, activeNavigator: undefined, /** Forced silent refresh — wraps ensureFreshToken(0). На failure * keycloak-js делает kc.login() автоматически → user редиректится. */ signinSilent: async () => { await ensureFreshToken(0) return useAuthStore.getState().user }, signinRedirect: async () => { await startLogin() }, signoutRedirect: async () => { await startLogout() }, /** Local-only logout (clear store без redirect на Keycloak). Зеркало * `react-oidc-context removeUser` — callsites используют для "забыть * user" без full logout flow. В keycloak-js модели соответствует * очистке локального state — следующий ensureFreshToken покажет * Login. */ removeUser: async () => { const { user, ...rest } = useAuthStore.getState() void user useAuthStore.setState({ ...rest, user: null, isAuthenticated: false }) }, } }