/
kochkatech
/
CorpGame
Обзор
Документация
Войти
/
kochkatech
/
CorpGame
Код
Запросы
1
Задачи
Вики
Пакеты
0
Релизы
1
CI/CD
Аналитика
dev
frontend/src/store/useGameStore.ts
95 строк
3 KB
kochkareal
chore: добавлен .gitattributes, нормализованы переносы строк (LF везде, кроме .bat/.cmd)
06 авг 2026, 15:18
06 авг 2026, 15:18
c25ef1b
Код
Авторство
О чём код?
import { create } from 'zustand'; import { Notification, Team, TeamMeState } from '../types'; interface GameStore { me: TeamMeState | null; setMe: (me: TeamMeState) => void; applyStateUpdate: (payload: any) => void; notifications: Notification[]; pushNotification: (n: Omit<Notification, 'id'>) => void; dismissNotification: (id: string) => void; lobby: { connected: number; total: number } | null; setLobby: (l: { connected: number; total: number }) => void; /** Состояние WebSocket-соединения — для ненавязчивого индикатора «переподключение…» */ connected: boolean; setConnected: (v: boolean) => void; } function mergeTeam(teams: Team[], updated: Team): Team[] { const idx = teams.findIndex((t) => t.id === updated.id); if (idx === -1) return [...teams, updated]; const copy = [...teams]; copy[idx] = updated; return copy; } export const useGameStore = create<GameStore>((set, get) => ({ me: null, setMe: (me) => set({ me }), applyStateUpdate: (payload) => { const current = get().me; if (!current) return; if (payload.teamUpdated) { const updated: Team = payload.teamUpdated; const teams = mergeTeam(current.teams, updated); const myTeam = updated.id === current.myTeam.id ? updated : current.myTeam; set({ me: { ...current, teams, myTeam } }); return; } if (payload.teamRemoved) { const teams = current.teams.filter((t) => t.id !== payload.teamRemoved); set({ me: { ...current, teams } }); return; } if (payload.configChanged) { // Курс банка / лимиты сменил админ — фактическое обновление конфига подтягивает // компонент страницы через api.get('/team/me'), тут отмечать нечего. return; } if (payload.flagsChanged) { set({ me: { ...current, transferEnabled: payload.transferEnabled ?? current.transferEnabled, sanctionsEnabled: payload.sanctionsEnabled ?? current.sanctionsEnabled, theftEnabled: payload.theftEnabled ?? current.theftEnabled, }, }); return; } if (payload.teams) { const teams: Team[] = payload.teams; const myTeam = teams.find((t) => t.id === current.myTeam.id) ?? current.myTeam; set({ me: { ...current, status: payload.status ?? current.status, remainingSec: payload.remainingSec ?? current.remainingSec, teams, myTeam, }, }); } }, notifications: [], pushNotification: (n) => set((state) => ({ notifications: [...state.notifications, { ...n, id: crypto.randomUUID() }] })), dismissNotification: (id) => set((state) => ({ notifications: state.notifications.filter((n) => n.id !== id) })), lobby: null, setLobby: (lobby) => set({ lobby }), connected: true, setConnected: (connected) => set({ connected }), }));