| |
| |
| |
|
|
| const INFORADAR_ADMIN_TOKEN_KEY = 'admin_token'; |
| const ADMIN_MODE_KEY = 'is_admin_mode'; |
|
|
| export class AdminManager { |
| private static instance: AdminManager | null = null; |
| private adminToken: string | null = null; |
| private isAdminMode: boolean = false; |
|
|
| private constructor() { |
| |
| const savedToken = localStorage.getItem(INFORADAR_ADMIN_TOKEN_KEY); |
| const savedMode = localStorage.getItem(ADMIN_MODE_KEY); |
| |
| if (savedToken) { |
| this.adminToken = savedToken; |
| } |
| |
| if (savedMode === 'true') { |
| this.isAdminMode = true; |
| } |
| } |
|
|
| public static getInstance(): AdminManager { |
| if (!AdminManager.instance) { |
| AdminManager.instance = new AdminManager(); |
| } |
| return AdminManager.instance; |
| } |
|
|
| |
| |
| |
| public getAdminToken(): string | null { |
| return this.adminToken; |
| } |
|
|
| |
| |
| |
| public isInAdminMode(): boolean { |
| return this.isAdminMode && this.adminToken !== null; |
| } |
|
|
| |
| |
| |
| |
| public async setAdminToken(token: string): Promise<{ success: boolean; message?: string }> { |
| try { |
| |
| const response = await fetch('/api/check_admin', { |
| method: 'POST', |
| headers: { |
| 'Content-Type': 'application/json', |
| 'X-Admin-Token': token |
| }, |
| body: JSON.stringify({ token }) |
| }); |
|
|
| const result = await response.json(); |
| |
| if (result.success) { |
| this.adminToken = token; |
| this.isAdminMode = true; |
| localStorage.setItem(INFORADAR_ADMIN_TOKEN_KEY, token); |
| localStorage.setItem(ADMIN_MODE_KEY, 'true'); |
| return { |
| success: true, |
| message: result.message |
| }; |
| } else { |
| |
| this.clearAdminToken(); |
| return { |
| success: false, |
| |
| message: result && typeof result.message === 'string' ? result.message : undefined |
| }; |
| } |
| } catch (error) { |
| console.error('验证admin token失败:', error); |
| this.clearAdminToken(); |
| |
| return { |
| success: false, |
| message: 'Request failed, please try again later.' |
| }; |
| } |
| } |
|
|
| |
| |
| |
| public clearAdminToken(): void { |
| this.adminToken = null; |
| this.isAdminMode = false; |
| localStorage.removeItem(INFORADAR_ADMIN_TOKEN_KEY); |
| localStorage.removeItem(ADMIN_MODE_KEY); |
| } |
|
|
| |
| |
| |
| private listeners: Array<(isAdmin: boolean) => void> = []; |
|
|
| public onAdminModeChange(callback: (isAdmin: boolean) => void): void { |
| this.listeners.push(callback); |
| } |
|
|
| private notifyListeners(): void { |
| const isAdmin = this.isInAdminMode(); |
| this.listeners.forEach(callback => callback(isAdmin)); |
| } |
|
|
| |
| |
| |
| public async setAdminTokenAndNotify(token: string): Promise<{ success: boolean; message?: string }> { |
| const result = await this.setAdminToken(token); |
| this.notifyListeners(); |
| return result; |
| } |
|
|
| |
| |
| |
| public clearAdminTokenAndNotify(): void { |
| this.clearAdminToken(); |
| this.notifyListeners(); |
| } |
| } |
|
|