Files
vkv/resources/js/stores/contestStore.tsx
Zdeněk Burda 41e3ce6f25 Initial commit
2026-01-09 21:26:40 +01:00

88 lines
2.7 KiB
TypeScript

import { create } from 'zustand';
import { persist } from 'zustand/middleware';
export type ContestSummary = {
id: number;
name: string; // už přeložené jméno podle locale
description?: string | null;
is_active: boolean;
is_test: boolean;
is_mcr: boolean;
is_sixhr: boolean;
start_time: string | null; // ISO string z API
duration: number; // hodiny
logs_deadline_days: number;
rounds?: RoundSummary[];
};
export type RoundSummary = {
id: number;
contest_id: number;
name: string;
description?: string | null;
bands?: { id: number; name: string }[];
categories?: { id: number; name: string }[];
power_categories?: { id: number; name: string }[];
is_active: boolean;
is_test: boolean;
is_sixhr: boolean;
start_time: string | null;
end_time: string | null;
logs_deadline: string | null;
preliminary_evaluation_run_id?: number | null;
official_evaluation_run_id?: number | null;
test_evaluation_run_id?: number | null;
};
type ContestState = {
selectedContest: ContestSummary | null;
selectedRound: RoundSummary | null;
selectedContestRounds: RoundSummary[];
setSelectedContest: (contest: ContestSummary | null) => void;
setSelectedRound: (round: RoundSummary | null) => void;
setSelectedContestRounds: (rounds: RoundSummary[]) => void;
clearSelection: () => void;
};
export const useContestStore = create<ContestState>()(
persist(
(set) => ({
selectedContest: null,
selectedRound: null,
selectedContestRounds: [],
setSelectedContest: (contest) =>
set({
selectedContest: contest,
// při přepnutí závodu implicitně zruš vybrané kolo
selectedRound: null,
selectedContestRounds: contest?.rounds ?? [],
}),
setSelectedRound: (round) => set({ selectedRound: round }),
setSelectedContestRounds: (rounds) => set({ selectedContestRounds: rounds }),
clearSelection: () =>
set({
selectedContest: null,
selectedRound: null,
selectedContestRounds: [],
}),
}),
{
name: 'contest-store',
partialize: (state) => ({
selectedContest: state.selectedContest,
selectedRound: state.selectedRound,
selectedContestRounds: state.selectedContestRounds,
}),
}
)
);
// Použití:
// import { useContestStore } from '@/stores/contestStore';
// const selectedContest = useContestStore((s) => s.selectedContest);
// const selectedRound = useContestStore((s) => s.selectedRound);
// const setSelectedContest = useContestStore((s) => s.setSelectedContest);
// const setSelectedRound = useContestStore((s) => s.setSelectedRound);
// po kliknutí v seznamu závodů:
//setSelectedContest(contestFromApi);