fix: repair invite links, social features, messaging + Discord UI overhaul
Phase 1 - Feature Repair: - Fix member kick/leave: add missing db.delete() call in servers.ts - Stabilize invite codes: return existing code instead of regenerating - Fix user search: use LIKE instead of exact match in social.ts - Wire DM button on FriendsPage to create/navigate to DM channels - Add cancel outgoing friend request (DELETE endpoint + frontend) - Add accept/decline friend request actions with WS real-time events - Fix replyToId persistence in message creation - Hydrate reactions and replyTo in message queries - Add joinByCode to API client and serverStore - Add friend_request_received/accepted WebSocket events Phase 2 - Discord UI Overhaul: - Remove stray borders between layout columns - Replace shadow-sm with shadow-header on content headers - Replace all bg-gray-*/text-gray-* with Discord color tokens - Ensure flat color contrast (#1E1F22, #2B2D31, #313338) Testing: - Set up vitest + @testing-library/react + jsdom - Add 17 tests across InviteModal, JoinServer, FriendsPage (all passing) - Fix vite resolve.extensions to prefer .tsx over stale .js files
This commit is contained in:
@@ -5,10 +5,18 @@ export const useServerStore = create((set, get) => ({
|
||||
currentServerId: null,
|
||||
channels: [],
|
||||
members: [],
|
||||
roles: [],
|
||||
folders: [],
|
||||
dmChannels: [],
|
||||
setServers: (servers) => set({ servers }),
|
||||
setCurrentServer: (serverId) => set({ currentServerId: serverId }),
|
||||
setChannels: (channels) => set({ channels }),
|
||||
setMembers: (members) => set({ members }),
|
||||
setRoles: (roles) => set({ roles }),
|
||||
setDmChannels: (dmChannels) => set({ dmChannels }),
|
||||
addDmChannel: (channel) => set((state) => ({
|
||||
dmChannels: [channel, ...state.dmChannels.filter(c => c.id !== channel.id)]
|
||||
})),
|
||||
loadServers: async () => {
|
||||
try {
|
||||
const servers = await api.servers.list();
|
||||
@@ -25,12 +33,22 @@ export const useServerStore = create((set, get) => ({
|
||||
currentServerId: serverId,
|
||||
channels: detail.channels.sort((a, b) => a.position - b.position),
|
||||
members: detail.members,
|
||||
roles: detail.roles.sort((a, b) => b.position - a.position), // Higher position = higher in list
|
||||
});
|
||||
}
|
||||
catch {
|
||||
// Handle error silently
|
||||
}
|
||||
},
|
||||
loadDmChannels: async () => {
|
||||
try {
|
||||
const dmChannels = await api.dm.list();
|
||||
set({ dmChannels });
|
||||
}
|
||||
catch {
|
||||
// Handle error silently
|
||||
}
|
||||
},
|
||||
createServer: async (name, icon) => {
|
||||
const server = await api.servers.create({ name, icon });
|
||||
set((state) => ({ servers: [...state.servers, server] }));
|
||||
@@ -102,7 +120,7 @@ export const useServerStore = create((set, get) => ({
|
||||
members: state.members.filter(m => m.userId !== userId),
|
||||
}));
|
||||
},
|
||||
populateFromReady: (servers) => {
|
||||
populateFromReady: (servers, folders, dmChannels) => {
|
||||
const simpleServers = servers.map(s => ({
|
||||
id: s.id,
|
||||
name: s.name,
|
||||
@@ -111,6 +129,10 @@ export const useServerStore = create((set, get) => ({
|
||||
inviteCode: s.inviteCode,
|
||||
createdAt: s.createdAt,
|
||||
}));
|
||||
set({ servers: simpleServers });
|
||||
set({
|
||||
servers: simpleServers,
|
||||
folders: folders || [],
|
||||
dmChannels: dmChannels || []
|
||||
});
|
||||
},
|
||||
}));
|
||||
|
||||
Reference in New Issue
Block a user