61 lines
1.4 KiB
TypeScript
61 lines
1.4 KiB
TypeScript
import type { Task } from '../types';
|
|
|
|
export enum TasksActions {
|
|
FETCH_TASKS = 'fetch-tasks',
|
|
ADD_TASK = 'add-task',
|
|
UPDATE_TASK = 'update-task',
|
|
DELETE_TASK = 'delete-task',
|
|
SET_LOADING = 'set-loading',
|
|
SET_ERROR = 'set-error',
|
|
}
|
|
|
|
export interface TaskState {
|
|
tasks: Task[];
|
|
loading: boolean;
|
|
error: string | null;
|
|
}
|
|
|
|
export interface Action {
|
|
type: TasksActions;
|
|
payload?: any;
|
|
}
|
|
|
|
export const initialState: TaskState = {
|
|
tasks: [],
|
|
loading: false,
|
|
error: null,
|
|
};
|
|
|
|
export const taskReducer = (state: TaskState, action: Action): TaskState => {
|
|
switch (action.type) {
|
|
case TasksActions.FETCH_TASKS:
|
|
return { ...state, tasks: action.payload, loading: false };
|
|
case TasksActions.ADD_TASK:
|
|
return {
|
|
...state,
|
|
tasks: [...state.tasks, action.payload],
|
|
loading: false,
|
|
};
|
|
case TasksActions.UPDATE_TASK:
|
|
return {
|
|
...state,
|
|
tasks: state.tasks.map((task) =>
|
|
task.id === action.payload.id ? { ...task, ...action.payload } : task,
|
|
),
|
|
loading: false,
|
|
};
|
|
case TasksActions.DELETE_TASK:
|
|
return {
|
|
...state,
|
|
tasks: state.tasks.filter((task) => task.id !== action.payload),
|
|
loading: false,
|
|
};
|
|
case TasksActions.SET_LOADING:
|
|
return { ...state, loading: true };
|
|
case TasksActions.SET_ERROR:
|
|
return { ...state, error: action.payload, loading: false };
|
|
default:
|
|
return state;
|
|
}
|
|
};
|