"use client"; import CookieService from "@Front/Services/CookieService/CookieService"; import EventEmitter from "@Front/Services/EventEmitter"; import JwtService from "@Front/Services/JwtService/JwtService"; export default class UserStore { public static readonly instance = new this(); protected readonly event = new EventEmitter(); public accessToken: string | null = null; public refreshToken: string | null = null; private initialized = false; private constructor() { // Don't initialize tokens during server-side rendering if (typeof window !== 'undefined') { this.initializeFromCookies(); } } private initializeFromCookies() { if (this.initialized) return; try { const accessToken = CookieService.getInstance().getCookie("leCoffreAccessToken"); const refreshToken = CookieService.getInstance().getCookie("leCoffreRefreshToken"); if (accessToken) { this.accessToken = accessToken; } if (refreshToken) { this.refreshToken = refreshToken; } this.initialized = true; } catch (error) { console.warn("Failed to initialize tokens from cookies:", error); } } public isConnected(): boolean { // Ensure initialization on client side if (typeof window !== 'undefined' && !this.initialized) { this.initializeFromCookies(); } // Check both instance variable and cookie to ensure consistency if (typeof window !== 'undefined') { const cookieToken = CookieService.getInstance().getCookie("leCoffreAccessToken"); return !!(this.accessToken || cookieToken); } return !!this.accessToken; } public getRole(): string | undefined { const decodedPayload = JwtService.getInstance().decodeJwt(); return decodedPayload?.role; } public async connect(accessToken: string, refreshToken: string) { try { //Save tokens in cookies CookieService.getInstance().setCookie("leCoffreAccessToken", accessToken); CookieService.getInstance().setCookie("leCoffreRefreshToken", refreshToken); // Update instance variables this.accessToken = accessToken; this.refreshToken = refreshToken; this.event.emit("connection", this.accessToken); } catch (error) { console.error(error); return false; } return true; } public async disconnect() { try { //Remove tokens from cookies CookieService.getInstance().deleteCookie("leCoffreAccessToken"); CookieService.getInstance().deleteCookie("leCoffreRefreshToken"); // Clear instance variables this.accessToken = null; this.refreshToken = null; this.event.emit("disconnection", this.accessToken); } catch (error) { console.error(error); } } public onDisconnect(callback: (userAddress: string) => void): () => void { this.event.on("disconnection", callback); return () => this.event.off("disconnection", callback); } public onConnect(callback: (userAddress: string) => void): () => void { this.event.on("connection", callback); return () => this.event.off("connection", callback); } }