This commit is contained in:
2023-01-31 16:36:37 -06:00
parent 4ad1f7c217
commit cef5fc9879
25 changed files with 8257 additions and 0 deletions

View File

@@ -0,0 +1,31 @@
import { createSlice, PayloadAction } from "@reduxjs/toolkit";
import type { RootState } from "./";
interface ContestantState {
signature: number[][];
canBuzz: boolean;
}
const initialState: ContestantState = {
signature: [],
canBuzz: false,
};
export const contestantSlice = createSlice({
name: "contestant",
initialState,
reducers: {
addPathToSignature: (state, { payload }: PayloadAction<number[]>) => {
state.signature = [...state.signature, payload];
},
setCanBuzz: (state, { payload }: PayloadAction<boolean>) => {
state.canBuzz = payload;
},
},
});
export const { addPathToSignature } = contestantSlice.actions;
export const selectSignature = (state: RootState) => state.contestant.signature;
export const selectCanBuzz = (state: RootState) => state.contestant.canBuzz;
export default contestantSlice.reducer;

41
src/store/displaySlice.ts Normal file
View File

@@ -0,0 +1,41 @@
import { createSlice, PayloadAction } from "@reduxjs/toolkit";
import type { RootState } from "./";
interface DisplayState {
contestants: Record<string, Contestant>;
}
interface Contestant {
signature: number[][];
score: number;
active: boolean;
failed: boolean;
}
const initialState: DisplayState = {
contestants: {},
};
export const displaySlice = createSlice({
name: "display",
initialState,
reducers: {
addContestant: (
state,
{
payload: { sid, signature },
}: PayloadAction<{ sid: string; signature: number[][] }>
) => {
state.contestants = {
...state.contestants,
[sid]: { signature, score: 0, active: false, failed: false },
};
},
},
});
export const { addContestant } = displaySlice.actions;
export const selectContestants = (state: RootState) =>
state.display.contestants;
export default displaySlice.reducer;

17
src/store/index.ts Normal file
View File

@@ -0,0 +1,17 @@
import { configureStore } from "@reduxjs/toolkit";
import socketReducer from "./socketSlice";
import contestantReducer from "./contestantSlice";
import displayReducer from "./displaySlice";
const store = configureStore({
reducer: {
socket: socketReducer,
contestant: contestantReducer,
display: displayReducer,
},
});
export type RootState = ReturnType<typeof store.getState>;
export type AppDispatch = typeof store.dispatch;
export default store;

25
src/store/socketSlice.ts Normal file
View File

@@ -0,0 +1,25 @@
import { createSlice, PayloadAction } from "@reduxjs/toolkit";
import type { RootState } from "./";
interface SocketState {
roomCode: string;
}
const initialState: SocketState = {
roomCode: "",
};
export const socketSlice = createSlice({
name: "socket",
initialState,
reducers: {
setRoomCode: (state, { payload }: PayloadAction<string>) => {
state.roomCode = payload;
},
},
});
export const { setRoomCode } = socketSlice.actions;
export const selectRoomCode = (state: RootState) => state.socket.roomCode;
export default socketSlice.reducer;