chore: Initial commit of Opencord base state

This commit is contained in:
Jannis Braun
2026-02-18 02:49:21 +01:00
commit 4fd17084a5
124 changed files with 17955 additions and 0 deletions
+116
View File
@@ -0,0 +1,116 @@
import { create } from 'zustand';
import { api } from '../api/client';
export const useServerStore = create((set, get) => ({
servers: [],
currentServerId: null,
channels: [],
members: [],
setServers: (servers) => set({ servers }),
setCurrentServer: (serverId) => set({ currentServerId: serverId }),
setChannels: (channels) => set({ channels }),
setMembers: (members) => set({ members }),
loadServers: async () => {
try {
const servers = await api.servers.list();
set({ servers });
}
catch {
// Silently fail - will be populated from WS ready
}
},
loadServerDetail: async (serverId) => {
try {
const detail = await api.servers.get(serverId);
set({
currentServerId: serverId,
channels: detail.channels.sort((a, b) => a.position - b.position),
members: detail.members,
});
}
catch {
// Handle error silently
}
},
createServer: async (name, icon) => {
const server = await api.servers.create({ name, icon });
set((state) => ({ servers: [...state.servers, server] }));
return server;
},
updateServer: async (serverId, data) => {
const updated = await api.servers.update(serverId, data);
set((state) => ({
servers: state.servers.map(s => s.id === serverId ? { ...s, ...updated } : s),
}));
},
deleteServer: async (serverId) => {
await api.servers.delete(serverId);
set((state) => ({
servers: state.servers.filter(s => s.id !== serverId),
currentServerId: state.currentServerId === serverId ? null : state.currentServerId,
}));
},
joinServer: async (serverId, inviteCode) => {
const server = await api.servers.join(serverId, { inviteCode });
set((state) => {
if (state.servers.find(s => s.id === server.id))
return state;
return { servers: [...state.servers, server] };
});
},
generateInvite: async (serverId) => {
const result = await api.servers.invite(serverId);
return result.inviteCode;
},
createChannel: async (serverId, name, type, topic) => {
const channel = await api.channels.create(serverId, { name, type, topic });
set((state) => ({
channels: [...state.channels, channel].sort((a, b) => a.position - b.position),
}));
return channel;
},
deleteChannel: async (channelId) => {
await api.channels.delete(channelId);
set((state) => ({
channels: state.channels.filter(c => c.id !== channelId),
}));
},
addServer: (server) => {
set((state) => {
if (state.servers.find(s => s.id === server.id))
return state;
return { servers: [...state.servers, server] };
});
},
removeServer: (serverId) => {
set((state) => ({
servers: state.servers.filter(s => s.id !== serverId),
currentServerId: state.currentServerId === serverId ? null : state.currentServerId,
}));
},
updateMemberPresence: (userId, status) => {
set((state) => ({
members: state.members.map(m => m.userId === userId ? { ...m, user: { ...m.user, status: status } } : m),
}));
},
addMember: (member) => {
set((state) => ({
members: [...state.members.filter(m => m.userId !== member.userId), member],
}));
},
removeMember: (userId) => {
set((state) => ({
members: state.members.filter(m => m.userId !== userId),
}));
},
populateFromReady: (servers) => {
const simpleServers = servers.map(s => ({
id: s.id,
name: s.name,
icon: s.icon,
ownerId: s.ownerId,
inviteCode: s.inviteCode,
createdAt: s.createdAt,
}));
set({ servers: simpleServers });
},
}));