Files
Agent-System/web/src/data/projectsStorage.ts
T
weichenandCursor c8dbefe8a1 fix(web): align settings CAS, PDF preview, and collaboration UX guards
Wire expected_revision, blob PDF framing, mustChangePassword session rewrite,
client_key project create, no-project send disable, and right-rail persistence.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-20 07:05:06 +00:00

88 lines
2.5 KiB
TypeScript

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