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