Files
ERitors-Scribe-Desktop/app/login/LoginWrapper.tsx
natreex 1e6ebba56d Add login page and social login integration
- Implement `LoginPage`, `LoginForm`, and `SocialForm` components.
- Add language toggle and dynamic title support.
- Update `tsconfig.electron.json` for stricter settings.
- Add `electron-store` and associated types for token storage.
- Update `package.json` scripts and dependencies for Electron compatibility.
2025-11-16 13:20:20 -05:00

77 lines
2.9 KiB
TypeScript

'use client'
import frMessages from '@/lib/locales/fr.json';
import enMessages from '@/lib/locales/en.json';
import {useEffect, useState} from "react";
import {LangContext} from "@/context/LangContext";
import {NextIntlClientProvider} from "next-intl";
import StaticAlert from "@/components/StaticAlert";
import {SessionProps} from "@/lib/models/Session";
import System from "@/lib/models/System";
import {SessionContext} from "@/context/SessionContext";
import {AlertContext} from "@/context/AlertContext";
const messagesMap = {
fr: frMessages,
en: enMessages
};
export default function LoginWrapper({children}: { children: React.ReactNode }) {
const [locale, setLocale] = useState<'fr' | 'en'>('fr');
const [errorMessage, setErrorMessage] = useState('');
const [successMessage, setSuccessMessage] = useState('');
const messages = messagesMap[locale];
const [session, setSession] = useState<SessionProps>({
isConnected: false,
user: null,
accessToken: ''
})
useEffect((): void => {
checkAuthentification().then()
}, []);
useEffect((): void => {
if (session.isConnected) {
// Pas de router.push dans Electron, le main process gère
if (!window.electron) {
window.location.href = '/';
}
}
}, [session]);
async function checkAuthentification(): Promise<void> {
const language: "fr" | "en" | null = System.getCookie('lang') as "fr" | "en" | null;
if (language) {
setLocale(language);
}
// Pas besoin de vérifier le token ici dans Electron
// Le main process gère quelle fenêtre ouvrir
}
return (
<SessionContext.Provider value={{session: session, setSession: setSession}}>
<LangContext.Provider value={{lang: locale, setLang: setLocale}}>
<NextIntlClientProvider locale={locale} messages={messages}>
<AlertContext.Provider value={{errorMessage: setErrorMessage, successMessage: setSuccessMessage}}>
{children}
<div className="fixed top-4 right-4 z-[9999] flex flex-col gap-3">
{
successMessage && <StaticAlert type={'success'} message={successMessage} onClose={() => {
setSuccessMessage('')
}}/>
}
{
errorMessage && <StaticAlert type={'error'} message={errorMessage} onClose={() => {
setErrorMessage('')
}}/>
}
</div>
</AlertContext.Provider>
</NextIntlClientProvider>
</LangContext.Provider>
</SessionContext.Provider>
)
}