init
This commit is contained in:
31
src/store/contestantSlice.ts
Normal file
31
src/store/contestantSlice.ts
Normal 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
41
src/store/displaySlice.ts
Normal 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
17
src/store/index.ts
Normal 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
25
src/store/socketSlice.ts
Normal 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;
|
||||
Reference in New Issue
Block a user