104 lines
2.9 KiB
TypeScript
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);
|
|
}
|
|
}
|