import { ProjectInfo, ProjectMember, ProjectSession } from '../types/workbench'; import { DEFAULT_PROJECTS } from '@demo-seeds'; /** Must stay in sync with STORAGE_KEYS.PROJECTS in storage.ts */ const STORAGE_KEY_PROJECTS = 'smdf_agent_workbench_v6_projects'; export { DEFAULT_PROJECTS }; /** * 加载项目列表 */ export function loadProjects(fallback: ProjectInfo[] = DEFAULT_PROJECTS): ProjectInfo[] { try { const raw = localStorage.getItem(STORAGE_KEY_PROJECTS); if (!raw) return fallback; const parsed = JSON.parse(raw); if (!Array.isArray(parsed) || parsed.length === 0) return fallback; return parsed; } catch (err) { console.warn('[ProjectsStorage] 加载项目失败,回退默认基线:', err); return fallback; } } /** * 保存项目列表 */ export function saveProjects(projects: ProjectInfo[]): void { try { localStorage.setItem(STORAGE_KEY_PROJECTS, JSON.stringify(projects)); } catch (err) { console.warn('[ProjectsStorage] 保存项目失败:', err); } } /** * 依据项目成员身份严格过滤当前用户可见的项目会话: * 1. 未加入(非项目成员):完全不可见; * 2. 在职成员 (active):正常可见,可操作; * 3. 中途加入后已退出 (exited):保留会话显示,附加 isExited=true 标记供界面只读留痕; * 4. 超级管理员 (userId === 4):通配可见所有会话。 */ export function filterProjectSessionsForUser( sessions: ProjectSession[], projects: ProjectInfo[], userId: number, isAdmin: boolean = false ): ProjectSession[] { if (isAdmin) { return sessions.filter((s) => s.userId === userId || s.userId == null); } const projectMap = new Map(); for (const p of projects) { projectMap.set(p.id, p); } const userSessions = sessions.filter((s) => s.userId === userId); return userSessions.filter((s) => { const proj = projectMap.get(s.projectId); if (!proj) { return true; } const member = proj.members.find((m) => m.userId === userId); if (!member) { return false; } if (member.status === 'exited') { s.isExited = true; return true; } s.isExited = false; return true; }); } /** * 获取用户在指定项目中的成员记录 */ export function getProjectMembership( project: ProjectInfo | undefined, userId: number ): ProjectMember | undefined { if (!project) return undefined; return project.members.find((m) => m.userId === userId); }