-
Notifications
You must be signed in to change notification settings - Fork 0
/
store.js
227 lines (201 loc) · 6.56 KB
/
store.js
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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
import { create } from 'zustand';
import AsyncStorage from '@react-native-async-storage/async-storage';
const useStore = create((set) => ({
isLoggedIn: false,
userId: null,
token: null,
todos: [],
loading: true, // Add loading state
initialize: async () => {
try {
const token = await AsyncStorage.getItem('token');
if (token) {
// Optionally, verify token validity by making a request to the backend
const response = await fetch('http://192.168.1.102:5000/api/verifyToken', {
headers: {
'Authorization': `Bearer ${token}`,
},
});
if (response.ok) {
const data = await response.json();
set({ isLoggedIn: true, userId: data.userId, token });
} else {
await AsyncStorage.removeItem('token');
set({ isLoggedIn: false, userId: null, token: null });
}
} else {
set({ loading: false }); // Set loading to false if no token is found
}
} catch (error) {
console.error('Initialization failed:', error.message);
set({ loading: false }); // Ensure loading state is set to false on error
} finally {
set({ loading: false }); // Ensure loading state is set to false after initialization attempt
}
},
// Login function
// Login function
login: async (username, password) => {
try {
const response = await fetch('http://192.168.1.102:5000/api/login', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({ username, password }),
});
const data = await response.json();
if (!response.ok) {
console.error('Login failed:', response.status, data.error || 'Unknown error');
throw new Error(data.error || 'Login failed');
}
console.log(data.token);
await AsyncStorage.setItem('token', data.token);
// Fetch the token from AsyncStorage and log it
const savedToken = await AsyncStorage.getItem('token');
console.log('Token saved in AsyncStorage:', savedToken);
set({ isLoggedIn: true, userId: data.userId, token: data.token }); // Update token in Zustand
} catch (error) {
console.error('Login failed:', error.message);
throw error;
}
},
// Logout function
logout: async () => {
try {
await AsyncStorage.removeItem('token');
set({ isLoggedIn: false, userId: null, token: null });
} catch (error) {
console.error('Logout failed:', error.message);
throw error;
}
},
// Signup function
signup: async (username, password) => {
try {
const response = await fetch('http://192.168.1.102:5000/api/signup', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({ username, password }),
});
if (!response.ok) {
const data = await response.json();
throw new Error(data.error || 'Signup failed');
}
return { success: true };
} catch (error) {
console.error('Signup failed:', error.message);
throw error;
}
},
// Add Todo function
addTodo: async (newTodo) => {
try {
const token = useStore.getState().token;
if (!token) {
throw new Error('Token not found');
}
const response = await fetch('http://192.168.1.102:5000/api/todos', {
method: 'POST',
headers: {
'Authorization': `Bearer ${token}`,
'Content-Type': 'application/json',
},
body: JSON.stringify(newTodo),
});
const data = await response.json();
if (response.ok) {
set((state) => ({ todos: [...state.todos, data] }));
} else {
throw new Error(data.error || 'Failed to add todo');
}
} catch (error) {
console.error('Error adding todo:', error.message);
throw error;
}
},
// Update Todo function
updateTodo: async (updatedTodo) => {
try {
const token = useStore.getState().token;
if (!token) {
throw new Error('Token not found');
}
const response = await fetch(`http://192.168.1.102:5000/api/todos/${updatedTodo.id}`, {
method: 'PUT',
headers: {
'Authorization': `Bearer ${token}`,
'Content-Type': 'application/json',
},
body: JSON.stringify(updatedTodo),
});
const data = await response.json();
if (response.ok) {
set((state) => ({
todos: state.todos.map((todo) => (todo.id === data.id ? data : todo)),
}));
} else {
throw new Error(data.error || 'Failed to update todo');
}
} catch (error) {
console.error('Error updating todo:', error.message);
throw error;
}
},
// Delete Todo function
deleteTodo: async (todoId) => {
try {
const token = useStore.getState().token;
if (!token) {
throw new Error('Token not found');
}
const response = await fetch(`http://192.168.1.102:5000/api/todos/${todoId}`, {
method: 'DELETE',
headers: {
'Authorization': `Bearer ${token}`,
},
});
if (response.ok) {
set((state) => ({
todos: state.todos.filter((todo) => todo.id !== todoId),
}));
} else {
const data = await response.json();
throw new Error(data.error || 'Failed to delete todo');
}
} catch (error) {
console.error('Error deleting todo:', error.message);
throw error;
}
},
// Get All Todos function
getAllTodos: async () => {
try {
const token = await AsyncStorage.getItem('token');
if (!token) {
throw new Error('Token not found');
}
const response = await fetch('http://192.168.1.102:5000/api/todos', {
headers: {
'Authorization': `Bearer ${token}`,
},
});
const data = await response.json();
if (response.ok) {
set((state) => ({
todos: data || state.todos, // Update todos with fetched data or keep existing state
}));
} else {
throw new Error(data.error || 'Failed to fetch todos');
}
} catch (error) {
console.error('Error fetching todos:', error.message);
throw error; // Rethrow error to propagate to the caller
}
},
}));
// Call initialize function to set initial state based on stored token
useStore.getState().initialize();
export default useStore;