lecoffre-front/src/front/Stores/CustomerStore.ts
Sosthene e87b1ddde5
All checks were successful
Test - Build & Deploy to Scaleway / build-and-push-image-lecoffre (push) Successful in 1m15s
Test - Build & Deploy to Scaleway / deploy-to-scaleway-lecoffre (push) Successful in 3s
Make authentication more reliable
2025-08-03 21:55:36 +02:00

104 lines
2.9 KiB
TypeScript

"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);
}
}