Files
headless-2026-03/wp-content/themes/headless/app/composables/useAuthConnexion.ts

81 lines
2.3 KiB
TypeScript

import { delay } from "es-toolkit/promise";
import type { FormSubmitEvent } from "@nuxt/ui";
export function useAuthConnexion() {
const toast = useToast();
const defaultRedirect = (useRoute().query.redirect as string) || undefined;
const isRedirecting = useState("auth.isRedirecting", () => false);
const { fetch: refreshUserSession } = useUserSession();
// Helper: Redirect after login / logout
async function redirectTo(to: string | undefined) {
isRedirecting.value = true;
await delay(1000);
await refreshUserSession();
await navigateTo(to || defaultRedirect || "/");
}
/**
* Attempt login with the provided credentials.
*
* @param event The form submit event containing the login credentials.
* @param redirect Optional URL to redirect to after successful login.
* @returns A promise that resolves when the login process is complete.
*/
async function login({ data: body }: FormSubmitEvent<AuthLoginForm>, redirect?: string) {
try {
const { success, message } = await $fetch("/api/login", { method: "POST", body });
if (!success) throw new Error(message);
toast.add({
color: "success",
title: "Connexion réussie",
description: message,
});
await redirectTo(redirect);
} catch (error) {
toast.add({
color: "error",
title: "Erreur de connexion",
description:
error instanceof Error ? error.message : "Une erreur est survenue lors de la connexion.",
});
}
}
/**
* Logout the current user.
*
* @param redirect Optional URL to redirect to after successful logout.
* @returns A promise that resolves when the logout process is complete.
*/
async function logout(redirect?: string) {
try {
const { success, message } = await $fetch("/api/logout", { method: "POST" });
if (!success) throw new Error(message);
toast.add({
color: "success",
title: "Déconnexion réussie",
description: message,
});
await redirectTo(redirect);
} catch (error) {
toast.add({
color: "error",
title: "Erreur de déconnexion",
description:
error instanceof Error
? error.message
: "Une erreur est survenue lors de la déconnexion.",
});
}
}
return { isRedirecting, login, logout };
}