From d0bbd4a20fcab0d827961243dc60d4bccad1906a Mon Sep 17 00:00:00 2001 From: nav Date: Thu, 14 May 2026 16:46:38 +0000 Subject: [PATCH] feat(frontend): add collapsible v1/v2/v4 panels and guild members column --- src/index.css | 36 +++++++++++++++++++++++- src/pages/ChatPage.tsx | 62 +++++++++++++++++++++++++++++++++++++----- 2 files changed, 90 insertions(+), 8 deletions(-) diff --git a/src/index.css b/src/index.css index 9d052ed..d87cb54 100644 --- a/src/index.css +++ b/src/index.css @@ -88,11 +88,45 @@ a:hover { .chat-top-grid { display: grid; - grid-template-columns: 220px 260px 1fr; + grid-template-columns: 220px 260px 1fr 220px; gap: 12px; min-height: 68vh; } +.chat-top-grid.hide-v1 { + grid-template-columns: 0 260px 1fr 220px; +} + +.chat-top-grid.hide-v2 { + grid-template-columns: 220px 0 1fr 220px; +} + +.chat-top-grid.hide-v4 { + grid-template-columns: 220px 260px 1fr 0; +} + +.chat-top-grid.hide-v1.hide-v2 { + grid-template-columns: 0 0 1fr 220px; +} + +.chat-top-grid.hide-v1.hide-v4 { + grid-template-columns: 0 260px 1fr 0; +} + +.chat-top-grid.hide-v2.hide-v4 { + grid-template-columns: 220px 0 1fr 0; +} + +.chat-top-grid.hide-v1.hide-v2.hide-v4 { + grid-template-columns: 0 0 1fr 0; +} + +.chat-top-grid.hide-v1 .col-v1, +.chat-top-grid.hide-v2 .col-v2, +.chat-top-grid.hide-v4 .col-v4 { + display: none; +} + .chat-right { display: grid; grid-template-rows: 1fr auto; diff --git a/src/pages/ChatPage.tsx b/src/pages/ChatPage.tsx index 21213e4..290b5b3 100644 --- a/src/pages/ChatPage.tsx +++ b/src/pages/ChatPage.tsx @@ -11,12 +11,19 @@ type MessageItem = { } type GuildChannel = { id: string; name: string } +type GuildRecord = { id: string; name: string } +type GuildMember = { id: string; userId: string; guildId: string; status: string } export default function ChatPage() { const { session, logout } = useAuth() const [selectedGuildId, setSelectedGuildId] = useState('') const [selectedChannelId, setSelectedChannelId] = useState('') const [channels, setChannels] = useState([]) + const [guildDbId, setGuildDbId] = useState('') + const [members, setMembers] = useState([]) + const [showGuilds, setShowGuilds] = useState(true) + const [showChannels, setShowChannels] = useState(true) + const [showMembers, setShowMembers] = useState(true) const [messages, setMessages] = useState([]) const [content, setContent] = useState('') const [newChannelName, setNewChannelName] = useState('') @@ -57,7 +64,9 @@ export default function ChatPage() { if (!guild || !guildToken) return setError('') try { - const res = await guildApi().get('/channels') + const res = await guildApi().get('/channels', { + params: guildDbId ? { guildId: guildDbId } : undefined, + }) const list = Array.isArray(res.data) ? (res.data as GuildChannel[]) : [] setChannels(list) if (!selectedChannelId && list.length) setSelectedChannelId(list[0].id) @@ -67,6 +76,26 @@ export default function ChatPage() { } } + async function loadGuildMetaAndMembers() { + if (!guild || !guildToken) return + setError('') + try { + const guildRes = await guildApi().get('/guilds') + const guildList = Array.isArray(guildRes.data) ? (guildRes.data as GuildRecord[]) : [] + const nextGuildDbId = guildList[0]?.id ?? '' + setGuildDbId(nextGuildDbId) + + const memberRes = await guildApi().get('/members', { + params: nextGuildDbId ? { guildId: nextGuildDbId } : undefined, + }) + const memberList = Array.isArray(memberRes.data) ? (memberRes.data as GuildMember[]) : [] + setMembers(memberList) + } catch { + setError('Failed to load guild members') + setMembers([]) + } + } + async function pullMessages() { if (!selectedChannelId || !guild || !guildToken) return setLoading(true) @@ -102,7 +131,8 @@ export default function ChatPage() { if (!guild || !guildToken || !newChannelName.trim()) return setError('') try { - const res = await guildApi().post('/channels', { name: newChannelName.trim() }) + const payload = guildDbId ? { name: newChannelName.trim(), guildId: guildDbId } : { name: newChannelName.trim() } + const res = await guildApi().post('/channels', payload) const createdId = res.data?.id as string | undefined setNewChannelName('') await loadChannels() @@ -112,11 +142,15 @@ export default function ChatPage() { } } + useEffect(() => { + void loadGuildMetaAndMembers() + }, [selectedGuildId]) + useEffect(() => { void loadChannels() setMessages([]) setSelectedChannelId('') - }, [selectedGuildId]) + }, [selectedGuildId, guildDbId]) useEffect(() => { void pullMessages() @@ -145,8 +179,8 @@ export default function ChatPage() { return (
-
-
+
+

Guilds

    {guilds.map((g) => ( @@ -159,7 +193,7 @@ export default function ChatPage() {
-
+

Channels

-
+

Messages

{loading ?

Loading...

: null} @@ -201,9 +235,23 @@ export default function ChatPage() {
+ +
+

Members

+
    + {members.map((m) => ( +
  • + {m.userId} +
  • + ))} +
+
+ + +