沉淀数字员工角色偏好状态
This commit is contained in:
@@ -2,6 +2,7 @@ import { useState, useEffect, useRef, type CSSProperties } from 'react';
|
||||
import GlassCard from '@/components/digital/GlassCard';
|
||||
import CardTitleBar from '@/components/digital/CardTitleBar';
|
||||
import { useRole, ROLE_PROFILES, type ConsoleRole } from '@/contexts/RoleContext';
|
||||
import { readDigitalEmployeeUiState, saveDigitalEmployeeUiStatePatch } from '@/lib/digitalUiStateBridge';
|
||||
import { t } from '@/lib/i18n';
|
||||
|
||||
const ROLES: ConsoleRole[] = ['sales', 'engineering', 'hr', 'finance', 'executive'];
|
||||
@@ -67,6 +68,11 @@ function loadPreferences(): RolePreferences {
|
||||
}
|
||||
}
|
||||
|
||||
function normalizePreferences(value: unknown): RolePreferences {
|
||||
if (!value || typeof value !== 'object' || Array.isArray(value)) return defaultPreferences;
|
||||
return { ...defaultPreferences, ...value as Partial<RolePreferences> };
|
||||
}
|
||||
|
||||
export default function OpsSettings() {
|
||||
const { role, profile, setRole } = useRole();
|
||||
const [preferences, setPreferences] = useState<RolePreferences>(loadPreferences);
|
||||
@@ -77,6 +83,20 @@ export default function OpsSettings() {
|
||||
return () => { if (savedTimerRef.current) clearTimeout(savedTimerRef.current); };
|
||||
}, []);
|
||||
|
||||
useEffect(() => {
|
||||
let cancelled = false;
|
||||
void readDigitalEmployeeUiState().then((state) => {
|
||||
if (cancelled || !state?.rolePreferences) return;
|
||||
const next = normalizePreferences(state.rolePreferences);
|
||||
setPreferences(next);
|
||||
try {
|
||||
localStorage.setItem(STORAGE_KEY, JSON.stringify(next));
|
||||
localStorage.removeItem(LEGACY_STORAGE_KEY);
|
||||
} catch { /* localStorage blocked */ }
|
||||
});
|
||||
return () => { cancelled = true; };
|
||||
}, []);
|
||||
|
||||
const markSaved = () => {
|
||||
setSaved(true);
|
||||
if (savedTimerRef.current) clearTimeout(savedTimerRef.current);
|
||||
@@ -89,6 +109,10 @@ export default function OpsSettings() {
|
||||
localStorage.setItem(STORAGE_KEY, JSON.stringify(next));
|
||||
localStorage.removeItem(LEGACY_STORAGE_KEY);
|
||||
} catch { /* localStorage blocked */ }
|
||||
void saveDigitalEmployeeUiStatePatch(
|
||||
{ rolePreferences: next as unknown as Record<string, unknown> },
|
||||
{ action: 'update_role_preferences', metadata: { preferences: next } },
|
||||
);
|
||||
markSaved();
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user