75 lines
2.5 KiB
TypeScript

import { createReducer, createAction } from '@reduxjs/toolkit';
import { DayEarning } from '@app-types/index';
import { mockWeeklyEarnings, mockTodayEarnings } from '../../mockData/mockEarnings';
import { getTodayEarningsThunk, getWeeklyEarningsThunk } from './thunk';
export interface EarningsState {
todayEarnings: number;
completedCount: number;
onlineMinutes: number;
weeklyData: DayEarning[];
loading: boolean;
error: string | null;
}
const initialState: EarningsState = {
todayEarnings: mockTodayEarnings.total,
completedCount: mockTodayEarnings.completedCount,
onlineMinutes: mockTodayEarnings.onlineMinutes,
weeklyData: mockWeeklyEarnings,
loading: false,
error: null,
};
export const addEarning = createAction<number>('earnings/addEarning');
export const setEarnings = createAction<Partial<EarningsState>>('earnings/setEarnings');
export const incrementOnlineMinutes = createAction('earnings/incrementOnlineMinutes');
export const resetTodayEarnings = createAction('earnings/resetTodayEarnings');
export const earningsReducer = createReducer(initialState, (builder) => {
builder
// Sync Actions
.addCase(addEarning, (state, action) => {
state.todayEarnings += action.payload;
state.completedCount += 1;
})
.addCase(setEarnings, (state, action) => {
return { ...state, ...action.payload };
})
.addCase(incrementOnlineMinutes, (state) => {
state.onlineMinutes += 1;
})
.addCase(resetTodayEarnings, (state) => {
state.todayEarnings = 0;
state.completedCount = 0;
state.onlineMinutes = 0;
})
// Async Thunks
.addCase(getTodayEarningsThunk.pending, (state) => {
state.loading = true;
state.error = null;
})
.addCase(getTodayEarningsThunk.fulfilled, (state, action) => {
state.loading = false;
state.todayEarnings = action.payload.total;
state.completedCount = action.payload.completedCount;
state.onlineMinutes = action.payload.onlineMinutes;
})
.addCase(getTodayEarningsThunk.rejected, (state, action) => {
state.loading = false;
state.error = action.payload as string;
})
.addCase(getWeeklyEarningsThunk.pending, (state) => {
state.loading = true;
state.error = null;
})
.addCase(getWeeklyEarningsThunk.fulfilled, (state, action) => {
state.loading = false;
state.weeklyData = action.payload;
})
.addCase(getWeeklyEarningsThunk.rejected, (state, action) => {
state.loading = false;
state.error = action.payload as string;
});
});