-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathstore.jsx
74 lines (70 loc) · 1.78 KB
/
store.jsx
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
71
72
73
74
import { create } from "zustand";
import { devtools, persist } from "zustand/middleware";
const todo = (set, get) => ({
theme: "dark",
setTheme: (theme) => set({ theme }),
todos: [],
addTodo: (todo) => {
set((state) => ({ todos: [...state.todos, todo] }));
},
removeTodo: (todoId) => {
set((state) => ({
todos: state.todos.filter((todo) => todo.id !== todoId),
}));
},
updateTodo: (todoId, todoText) => {
set((state) => ({
todos: state.todos.map((todo) =>
todo.id === todoId ? { ...todo, text: todoText } : todo
),
}));
},
toggleTodoStatus: (todoId) => {
set((state) => ({
todos: state.todos.map((todo) =>
todo.id === todoId ? { ...todo, status: !todo.status } : todo
),
}));
},
// to update todos after drag and drop
setTodos: (todos) => set({ todos }),
// for clear list button
isTodo: false,
setIsTodo: () => {
set((state) => ({ isTodo: state.todos.length > 0 ? true : false }));
},
todo: "",
setTodo: (todo) => set({ todo }),
selectedTodo: null,
setSelectedTodo: (selectedTodo) => set({ selectedTodo }),
// Modal control
isOpen: false,
setIsOpen: (isOpen) => set({ isOpen }),
handleTodo: (todo, id) => {
if (!todo) alert("Enter a task");
else {
if (!get().todos.some((item) => item.text === todo)) {
if (id) {
get().updateTodo(id, todo);
} else {
get().addTodo({ id: Date.now(), text: todo, status: false });
}
get().setTodo("");
get().setIsOpen(false);
get().setSelectedTodo(null);
} else alert("Same task already exists");
}
},
});
const useTodo = create(
devtools(
persist(
todo,
{
name: "todos",
},
{ name: "theme" }
)
)
);
export default useTodo;