import type { FormSubmitEvent } from "@nuxt/ui"; export function useAuth() { const { loggedIn, session } = useUserSession(); const isLoggedIn = loggedIn; const isSwitchedTo = computed(() => Boolean(session.value?.isSwitchedTo)); const hasRole = (role: string) => session.value?.user?.roles?.includes(role) || false; const isAdmin = computed(() => hasRole("administrator")); return { isLoggedIn, isSwitchedTo, hasRole, isAdmin }; } export function useAuthActions() { const { fetch: refreshUserSession } = useUserSession(); const routeRedirect = useRoute().query.redirect as string || undefined; const router = useRouter(); const toast = useToast(); // Login const loginFields = [ { name: "email", type: "text" as const, label: "Courriel", placeholder: "Entrez votre courriel", required: true, }, { name: "password", label: "Mot de passe", type: "password" as const, placeholder: "Entrez votre mot de passe", required: true, }, ]; async function login({ data: args }: FormSubmitEvent, redirect?: string) { try { const redirectTo = redirect || routeRedirect || "/"; const { data, errors } = await useGraphqlMutation("login", args); if (errors.length || !data.login) { console.error(errors); throw new Error("Une erreur est survenue."); } await refreshUserSession(); await router.push(redirectTo); } catch (error) { const message = error instanceof Error ? error.message : "Une erreur est survenue."; toast.add({ title: "Échec de la connexion", description: message, color: "error" }); } } // Logout async function logout(redirect?: string) { try { const redirectTo = redirect || routeRedirect || "/"; console.log(redirectTo); const result = await $fetch("/api/logout", { method: "POST" }); if (!result.success) { throw new Error("Une erreur est survenue."); } await refreshUserSession(); await router.push(redirectTo); } catch (error) { const message = error instanceof Error ? error.message : "Une erreur est survenue."; toast.add({ title: "Échec de la déconnexion", description: message, color: "error" }); } } // Switch to async function switchTo(userId: number, redirect?: string) { try { const redirectTo = redirect || routeRedirect; const { data, errors } = await useGraphqlMutation("switchTo", { userId }); if (errors.length || !data.switchTo) { throw new Error("Une erreur est survenue"); } await refreshUserSession(); if (redirectTo) { await router.push(redirectTo); } } catch (error) { const message = error instanceof Error ? error.message : "Une erreur est survenue"; toast.add({ title: "Échec du changement d'utilisateur", description: message, color: "error" }); } } // Switch back async function switchBack(redirect?: string) { try { const redirectTo = redirect || routeRedirect; const result = await $fetch("/api/switch-back", { method: "POST" }); if (!result.success) { throw new Error("Une erreur est survenue."); } await refreshUserSession(); if (redirectTo) { await router.push(redirectTo); } } catch (error) { const message = error instanceof Error ? error.message : "Une erreur est survenue"; toast.add({ title: "Échec du changement d'utilisateur", description: message, color: "error" }); } } return { loginFields, login, logout, switchTo, switchBack }; }