import { create } from "zustand"; import { api } from "../lib/api.ts"; export interface Member { id: string; username: string; display_name: string; nickname?: string; avatar: string; status: "online" | "idle" | "dnd" | "offline"; status_text: string; is_bot?: boolean; bot_type?: string; } interface MemberState { membersByServer: Record; isLoading: boolean; fetchMembers: (serverId: string) => Promise; updateMemberStatus: (userId: string, status: Member["status"]) => void; setMemberNickname: (serverId: string, userId: string, nickname: string) => Promise; } export const useMemberStore = create((set) => ({ membersByServer: {}, isLoading: false, fetchMembers: async (serverId) => { set({ isLoading: true }); try { const members = await api.get( `/servers/${serverId}/members`, ); set((state) => ({ membersByServer: { ...state.membersByServer, [serverId]: members }, isLoading: false, })); } catch { set({ isLoading: false }); } }, updateMemberStatus: (userId, status) => set((state) => { const next: Record = {}; for (const [serverId, list] of Object.entries(state.membersByServer)) { next[serverId] = list.map((m) => m.id === userId ? { ...m, status } : m, ); } return { membersByServer: next }; }), setMemberNickname: async (serverId, userId, nickname) => { await api.patch(`/servers/${serverId}/members/${userId}`, { nickname }); set((state) => { const list = state.membersByServer[serverId] || []; const updated = list.map((m) => m.id === userId ? { ...m, nickname: nickname || undefined } : m ); return { membersByServer: { ...state.membersByServer, [serverId]: updated }, }; }); }, }));