Add task list demo application
This commit is contained in:
60
examples/task-list/src/task-reducer.ts
Normal file
60
examples/task-list/src/task-reducer.ts
Normal file
@@ -0,0 +1,60 @@
|
||||
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;
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user