-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathApp.tsx
More file actions
98 lines (87 loc) · 2.71 KB
/
App.tsx
File metadata and controls
98 lines (87 loc) · 2.71 KB
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
import { useCallback, useContext, useEffect, useMemo, useState } from "react";
import { Route, Routes, useSearchParams } from "react-router-dom";
// pages
import Home from "@pages/Home";
import LeaderboardPage from "@pages/LeaderboardPage";
import Error from "@pages/Error";
// context
import { GlobalDispatchContext } from "@context/GlobalContext";
import { SET_INTERACTIVE_PARAMS } from "@context/types";
// utils
import { setupBackendAPI } from "@utils/backendAPI";
const App = () => {
const [searchParams] = useSearchParams();
const [hasInitBackendAPI, setHasInitBackendAPI] = useState(false);
const dispatch = useContext(GlobalDispatchContext);
const interactiveParams = useMemo(() => {
return {
assetId: searchParams.get("assetId") || "",
displayName: searchParams.get("displayName") || "",
interactiveNonce: searchParams.get("interactiveNonce") || "",
interactivePublicKey: searchParams.get("interactivePublicKey") || "",
profileId: searchParams.get("profileId") || "",
sceneDropId: searchParams.get("sceneDropId") || "",
uniqueName: searchParams.get("uniqueName") || "",
urlSlug: searchParams.get("urlSlug") || "",
username: searchParams.get("username") || "",
visitorId: Number(searchParams.get("visitorId")) || 0,
identityId: searchParams.get("identityId") || "",
};
}, [searchParams]);
const setInteractiveParams = useCallback(
({
assetId,
displayName,
interactiveNonce,
interactivePublicKey,
profileId,
sceneDropId,
uniqueName,
urlSlug,
username,
visitorId,
identityId,
}: typeof interactiveParams) => {
const isInteractiveIframe = visitorId && interactiveNonce && interactivePublicKey && assetId;
dispatch({
type: SET_INTERACTIVE_PARAMS,
payload: {
assetId,
displayName,
interactiveNonce,
interactivePublicKey,
isInteractiveIframe,
profileId,
sceneDropId,
uniqueName,
urlSlug,
username,
visitorId,
identityId,
},
});
},
[dispatch],
);
useEffect(() => {
if (interactiveParams.assetId) {
setInteractiveParams({
...interactiveParams,
});
}
}, [interactiveParams, setInteractiveParams]);
useEffect(() => {
if (!hasInitBackendAPI) {
setupBackendAPI(interactiveParams);
setHasInitBackendAPI(true);
}
}, [hasInitBackendAPI, interactiveParams]);
return (
<Routes>
<Route path="/start" element={<Home />} />
<Route path="/leaderboard" element={<LeaderboardPage />} />
<Route path="*" element={<Error />} />
</Routes>
);
};
export default App;