From f082429a58cd69417aec94d46c32337f27f7b99c Mon Sep 17 00:00:00 2001 From: ZhenYi <434836402@qq.com> Date: Sun, 10 May 2026 22:52:16 +0800 Subject: [PATCH] feat(core): initialize project with access control and AI integration --- src/components/layout/MemberList.tsx | 234 ++++++++++----------------- 1 file changed, 86 insertions(+), 148 deletions(-) diff --git a/src/components/layout/MemberList.tsx b/src/components/layout/MemberList.tsx index 3c4998e..4360e0c 100644 --- a/src/components/layout/MemberList.tsx +++ b/src/components/layout/MemberList.tsx @@ -19,41 +19,6 @@ const ROLE_COLORS: Record = { member: 'var(--role-blue)', }; -/** Fallback mock data for non-project pages or loading states */ -const MOCK_ROLES = [ - { - name: 'Admin', - color: 'var(--role-red)', - members: [ - { name: 'ZhenYi', status: 'online' as const, activity: 'Coding' }, - ], - }, - { - name: 'Maintainer', - color: 'var(--role-orange)', - members: [ - { name: 'Alex', status: 'online' as const, activity: '' }, - { name: 'Mia', status: 'idle' as const, activity: 'Reviewing PR' }, - ], - }, - { - name: 'Developer', - color: 'var(--role-blue)', - members: [ - { name: 'Tom', status: 'online' as const, activity: '' }, - { name: 'Luna', status: 'offline' as const, activity: '' }, - { name: 'Jake', status: 'offline' as const, activity: '' }, - ], - }, - { - name: 'Guest', - color: 'var(--role-gray)', - members: [ - { name: 'Sam', status: 'offline' as const, activity: '' }, - ], - }, -]; - function useRoomSafe() { try { return useRoom(); @@ -68,6 +33,7 @@ export function MemberList() { const [groups, setGroups] = useState([]); const [total, setTotal] = useState(0); + const [loading, setLoading] = useState(true); const [apiPresence, setApiPresence] = useState>(new Map()); // Fetch project presence from API @@ -127,10 +93,12 @@ export function MemberList() { if (!projectName) { setGroups([]); setTotal(0); + setLoading(false); return; } let cancelled = false; + setLoading(true); projectMembersGrouped(projectName) .then((res) => { @@ -144,139 +112,109 @@ export function MemberList() { console.error('[MemberList] failed to load project members:', err); setGroups([]); setTotal(0); + }) + .finally(() => { + if (!cancelled) setLoading(false); }); return () => { cancelled = true; }; }, [projectName]); - // Real project members loaded - if (groups.length > 0) { + // Loading state + if (loading) { return (
-
- Members — {total} -
- - {groups.map((g) => { - const color = ROLE_COLORS[g.role.toLowerCase()] || 'var(--role-gray)'; - return ( -
-
- {g.role} - — {g.members.length} -
- - {g.members.map((m) => { - const presence = presenceMap.get(m.user_id) || 'offline'; - const isOffline = presence === 'offline'; - return ( - - ); - })} -
- ); - })} +
); } - // Loading / no project selected: show mock fallback + // No project selected or no members + if (groups.length === 0) { + return ( +
+

+ {projectName ? 'No members' : 'Select a project'} +

+
+ ); + } + + // Real project members return (
- {MOCK_ROLES.map((role) => ( -
-
- {role.name} - — {role.members.length} -
+
+ Members — {total} +
- {role.members.map((m) => ( - - ))} -
- ))} + {g.members.map((m) => { + const presence = presenceMap.get(m.user_id) || 'offline'; + const isOffline = presence === 'offline'; + return ( + + ); + })} +
+ ); + })}
); }