diff options
Diffstat (limited to 'src/slices/votes.ts')
-rw-r--r-- | src/slices/votes.ts | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/src/slices/votes.ts b/src/slices/votes.ts new file mode 100644 index 0000000..87d84e8 --- /dev/null +++ b/src/slices/votes.ts @@ -0,0 +1,73 @@ +import { createSlice, PayloadAction } from "@reduxjs/toolkit"; + +export interface VoteSliceState { + votes: Record<string, Record<string, number | null>>; +} + +interface VoteChange { + questionId: string; + optionId: string; + change: 1 | -1; +} + +interface VoteRegister { + questionId: string; + questionSlugs: string[]; +} + +const voteSlice = createSlice({ + name: "vote", + initialState: { + votes: {}, + }, + reducers: { + registerVote: ( + state: VoteSliceState, + action: PayloadAction<VoteRegister>, + ) => { + state.votes[action.payload.questionId] = {}; + action.payload.questionSlugs.forEach((value) => { + state.votes[action.payload.questionId][value] = null; + }); + }, + changeVote: ( + state: VoteSliceState, + action: PayloadAction<VoteChange>, + ) => { + const foundVote = + state.votes[action.payload.questionId][action.payload.optionId]; + + if (foundVote !== null) { + if (foundVote === 1 && action.payload.change <= 0) { + return; + } + if ( + foundVote >= + Object.keys(state.votes[action.payload.questionId]) + .length && + action.payload.change >= 0 + ) { + state.votes[action.payload.questionId][ + action.payload.optionId + ] = null; + return; + } + state.votes[action.payload.questionId][ + action.payload.optionId + ] += action.payload.change; + } else { + if (action.payload.change <= 0) { + state.votes[action.payload.questionId][ + action.payload.optionId + ] = Object.keys( + state.votes[action.payload.questionId], + ).length; + } + } + }, + }, +}); + +export const { registerVote, changeVote } = voteSlice.actions; + +export default voteSlice.reducer; |