/
tsps
/
lk
Обзор
Документация
Войти
/
tsps
/
lk
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
master
src/store/authStore.ts
72 строки
2 KB
Василий Петров
Просмотр документов
21 мар 2026, 18:18
21 мар 2026, 18:18
d94153c
Код
Авторство
О чём код?
import { create } from 'zustand'; import { apiFetch } from '@/lib/api/client'; import type { JudgeAccount, Judge } from '@/types/judge'; // Импортируем типы interface AuthState { isAuthenticated: boolean; accessToken: string | null; account: JudgeAccount | null; judge: Judge | null; login: (token: string, account: JudgeAccount, judge: Judge) => void; logout: () => void; } const STORAGE_KEY = 'auth_state_lk'; // Читает и парсит состояние из localStorage const getStoredState = (): Partial<AuthState> => { if (typeof window === 'undefined') return {}; try { const stored = localStorage.getItem(STORAGE_KEY); return stored ? JSON.parse(stored) : {}; } catch (e) { console.warn('Failed to parse auth state from localStorage'); return {}; } }; // Вспомогательная функция для безопасного создания начального состояния const createInitialState = (): AuthState => { const stored = getStoredState(); return { isAuthenticated: stored.isAuthenticated ?? false, accessToken: stored.accessToken ?? null, account: stored.account ?? null, judge: stored.judge ?? null, login: () => {}, // будет перезаписан ниже logout: () => {}, // будет перезаписан ниже }; }; export const useAuthStore = create<AuthState>((set) => { const initialState = createInitialState(); return { ...initialState, login: (token, account, judge) => { const newState = { isAuthenticated: true, accessToken: token, account, judge }; set(newState); localStorage.setItem(STORAGE_KEY, JSON.stringify(newState)); }, logout: async () => { const { accessToken } = useAuthStore.getState(); if (accessToken) { try { await apiFetch('/logout', { method: 'POST' }); } catch (error) { console.warn('Не удалось отправить запрос на logout:', error); // Игнорируем ошибку — всё равно очищаем локально } } set({ isAuthenticated: false, accessToken: null, account: null, judge: null }); localStorage.removeItem(STORAGE_KEY); } }; });