frontend: add sleep record hooks/queries
Pedro Lucas Porcellis porcellis@eletrotupi.com · 5 months ago
c00102e4121175ec5a0ad91435073a5e8f33e3c1 Browse filesParents
5e76badChanged files
2
Additions
+70
Deletions
0
frontend/hooks/index.ts
1 1
// Legacy shit from react native
2 2
export {
3 3
useThemeColor
4 4
} from '@/hooks/use-theme-color';
5 5
14 14
useMoodEntriesInfinite,
15 15
useMoodEntry,
16 16
useCreateMoodEntry,
17 17
useDeleteMoodEntry
18 18
} from '@/hooks/useMoodEntries.queries';
19 +
20 +
export {
21 +
useSleepRecords,
22 +
useCreateSleepRecord
23 +
} from '@/hooks/useSleepRecord.queries';
/dev/null → frontend/hooks/useSleepRecord.queries.ts
1 +
import {
2 +
useQuery,
3 +
useMutation,
4 +
useQueryClient
5 +
} from '@tanstack/react-query';
6 +
7 +
import { apiClient, SleepRecord, SleepRecordPayload } from '@/lib/api';
8 +
9 +
export const sleepRecordKeys = {
10 +
all: () => ['sleep-records'] as const,
11 +
lists: () => [...sleepRecordKeys.all(), 'list'] as const,
12 +
list: (filters?: SleepRecordFilters) => [...sleepRecordKeys.lists(), filters] as const,
13 +
detail: (id: string) => [...sleepRecordKeys.all(), 'detail', id] as const,
14 +
};
15 +
16 +
interface SleepRecordFilters {
17 +
from?: string; // ISO date
18 +
to?: string; // ISO date
19 +
limit?: number;
20 +
}
21 +
22 +
export const useSleepRecords = (filters?: SleepRecordFilters) => {
23 +
return useQuery({
24 +
queryKey: sleepRecordKeys.list(filters),
25 +
queryFn: () => apiClient.getSleepRecords(filters),
26 +
});
27 +
};
28 +
29 +
export const useCreateSleepRecord = () => {
30 +
const queryClient = useQueryClient();
31 +
32 +
return useMutation({
33 +
mutationFn: (payload: SleepRecordPayload) =>
34 +
apiClient.createSleepRecord(payload),
35 +
36 +
onMutate: async (payload) => {
37 +
await queryClient.cancelQueries({ queryKey: sleepRecordKeys.lists() });
38 +
39 +
const previous = queryClient.getQueryData(sleepRecordKeys.list());
40 +
41 +
// TODO: might as well create a shared attrs that we're keeping it
42 +
queryClient.setQueryData(sleepRecordKeys, (old: SleepRecord[] = []) => [
43 +
{
44 +
...payload,
45 +
id: `temp-${Date.now()}`,
46 +
createdAt: new Date().toISOString(),
47 +
_optimistic: true,
48 +
},
49 +
...old,
50 +
]);
51 +
52 +
return { previous };
53 +
},
54 +
55 +
onError: (_err, _payload, context) => {
56 +
if (context?.previous) {
57 +
queryClient.setQueryData(sleepRecordKeys.list(), context.previous);
58 +
}
59 +
},
60 +
61 +
onSuccess: () => {
62 +
queryClient.invalidateQueries({ queryKey: sleepRecordKeys.lists() });
63 +
},
64 +
});
65 +
}