File size: 1,814 Bytes
cd6f98e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
import type { StateCreator } from "zustand";
import { create } from "zustand";

import { createSelectors } from "./helpers";
import type { Message } from "../types/message";
import type { Task } from "../types/task";
import { isTask, TASK_STATUS_COMPLETED, TASK_STATUS_EXECUTING } from "../types/task";

export const isExistingTask = (message: Message): boolean =>
  isTask(message) &&
  (message.status === TASK_STATUS_EXECUTING || message.status === TASK_STATUS_COMPLETED);

const resetters: (() => void)[] = [];

const initialTaskState = {
  tasks: [],
};

export interface TaskSlice {
  tasks: Task[];
  addTask: (newTask: Task) => void;
  updateTask: (updatedTask: Task) => void;
  deleteTask: (taskId: string) => void;
}

export const createTaskSlice: StateCreator<TaskSlice, [], [], TaskSlice> = (set) => {
  resetters.push(() => set(initialTaskState));

  return {
    ...initialTaskState,
    addTask: (newTask) => {
      set((state) => ({
        ...state,
        tasks: [...state.tasks, { ...newTask }],
      }));
    },
    updateTask: (updatedTask) => {
      set((state) => {
        const updatedTasks = state.tasks.map((task) => {
          if (task.id === updatedTask.id && task.taskId == updatedTask.taskId) {
            return {
              ...updatedTask,
            };
          }
          return task;
        });

        return {
          ...state,
          tasks: updatedTasks,
        };
      });
    },
    deleteTask: (taskId) => {
      set((state) => ({
        ...state,
        tasks: state.tasks.filter((task) => task.taskId !== taskId),
      }));
    },
  };
};

export const useTaskStore = createSelectors(
  create<TaskSlice>()((...a) => ({
    ...createTaskSlice(...a),
  }))
);

export const resetAllTaskSlices = () => resetters.forEach((resetter) => resetter());