-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path6_BoxPlayground.tsx
82 lines (74 loc) · 1.91 KB
/
6_BoxPlayground.tsx
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
import { useCallback, useMemo, useState } from "react";
import { generate } from "randomstring";
import { useSearchParamsFull } from "../../hooks/useSearchParamsFull";
import { SearchParamsDataTransformer } from "../../types";
import { randomPositive } from "../../utils/random";
interface Box {
content: string;
amount: number;
}
export const BoxPlayground = () => {
const [prefix, setPrefix] = useState("123");
const serializer = useCallback<
SearchParamsDataTransformer<Box>["serializer"]
>(
(val) => {
return {
[`${prefix}_amount`]: val.amount + "",
[`${prefix}_content`]: val.content,
};
},
[prefix]
);
const deserializer = useCallback<
SearchParamsDataTransformer<Box>["deserializer"]
>(
(val) => {
if (typeof val !== "string") {
return {
content: val[`${prefix}_content`],
amount: Number(val[`${prefix}_amount`]),
};
}
return null;
},
[prefix]
);
const searchParamsDataTransformer = useMemo<SearchParamsDataTransformer<Box>>(
() => ({
serializer,
deserializer,
}),
[deserializer, serializer]
);
const { params, update } = useSearchParamsFull<Box>({
searchParamKey: "TEST_KEY",
dataTransformer: searchParamsDataTransformer,
});
const updateParams = useCallback(() => {
update([
{
amount: randomPositive(),
content: "Apples",
},
{
amount: randomPositive(),
content: "Oranges",
},
]);
}, [update]);
const updatePrefix = useCallback(() => {
setPrefix(generate(4));
}, [setPrefix]);
return (
<div>
<h2>Final 📦 🛝</h2>
<div>Current params: {JSON.stringify(params, null, 4)}</div>
<br />
<button onClick={updateParams}>Update with serialization!</button>
<br />
<br />
<button onClick={updatePrefix}>Update prefix!</button>
</div>
);
};