forked from ErikCH/Gen2Offline
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathuseTitles.ts
99 lines (86 loc) · 2.28 KB
/
useTitles.ts
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
import {
MutationKey,
QueryKey,
useMutation,
useQuery,
useQueryClient,
} from "@tanstack/react-query";
import { generateClient } from "aws-amplify/api";
import { Schema } from "../amplify/data/resource";
import { v4 as uuidv4 } from "uuid";
const client = generateClient<Schema>();
export const titleKeys = {
queryKey: ["titles"] as QueryKey,
addKey: ["addTitle"] as MutationKey,
deleteKey: ["deleteTitle"] as MutationKey,
};
export const useTitles = ({
queryKey,
addKey,
deleteKey,
}: {
queryKey: QueryKey;
addKey: MutationKey;
deleteKey: MutationKey;
}) => {
const query = useQuery({
queryKey,
queryFn: async () => {
const { data: allPosts } = await client.models.Post.list();
return allPosts;
},
});
const queryClient = useQueryClient();
// Mutations
const mutation = useMutation({
mutationKey: addKey,
mutationFn: async (title: string) => {
const { data } = await client.models.Post.create({
title,
});
return data;
},
onMutate: async (newTitles) => {
await queryClient.cancelQueries({ queryKey: queryKey });
const previousTitles = queryClient.getQueryData(queryKey);
if (previousTitles) {
queryClient.setQueryData(queryKey, (old: Schema["Post"]["type"][]) => {
const record = { ...old[0], id: uuidv4(), title: newTitles };
return [...old, record];
});
}
return { previousTitles };
},
onSettled: () => {
queryClient.invalidateQueries({ queryKey });
},
});
// Mutations
const deleteMutation = useMutation({
mutationKey: deleteKey,
mutationFn: async (id: string) => {
const { data } = await client.models.Post.delete({
id,
});
return data;
},
onMutate: async (deletedTitle) => {
await queryClient.cancelQueries({ queryKey });
const previousTitles = queryClient.getQueryData(queryKey);
if (deletedTitle) {
queryClient.setQueryData(queryKey, (old: Schema["Post"]["type"][]) => {
return old.filter((item) => item.id !== deletedTitle);
});
}
return { previousTitles };
},
onSettled: () => {
queryClient.invalidateQueries({ queryKey });
},
});
return {
deleteMutation,
mutation,
query,
};
};