slice-machine-ui 2.18.1-beta.7 → 2.18.1-beta.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/out/404.html +1 -1
- package/out/_next/static/{Zy4opMpDS8I-mxQ1kA3m2 → U9WVTg1pSTJVt94SbRE5Y}/_buildManifest.js +1 -1
- package/out/_next/static/chunks/{248-43faecb386a16518.js → 248-a9c33f7fbe2da2f1.js} +1 -1
- package/out/_next/static/chunks/34-50c64778da33cff6.js +1 -0
- package/out/_next/static/chunks/429-aab52070cad2884b.js +3 -0
- package/out/_next/static/chunks/{489-234ed5471aa694b3.js → 489-a046ae0fa4f74435.js} +1 -1
- package/out/_next/static/chunks/{630-bb6e3db525588f16.js → 630-eae75e90b30f201a.js} +1 -1
- package/out/_next/static/chunks/pages/{_app-64feff311539f17b.js → _app-1b4541325b4a29ab.js} +40 -40
- package/out/_next/static/chunks/pages/{changelog-ba55ed247c20dc21.js → changelog-3901f2fc937d9648.js} +1 -1
- package/out/_next/static/chunks/pages/changes-c58a60af39167147.js +1 -0
- package/out/_next/static/chunks/pages/{labs-78ac01d97ab02cd7.js → labs-dd04033db23a58f3.js} +1 -1
- package/out/_next/static/chunks/pages/slices/[lib]/[sliceName]/[variation]/{simulator-b127d948a17968d3.js → simulator-f237aaa755dc9a99.js} +1 -1
- package/out/_next/static/chunks/pages/slices/[lib]/[sliceName]/{[variation]-da423aa0da7bc11e.js → [variation]-c8c3e7ffb898261c.js} +1 -1
- package/out/_next/static/chunks/pages/{slices-59b857edc9f72d5f.js → slices-0aaae79dcc7b8c55.js} +1 -1
- package/out/changelog.html +1 -1
- package/out/changes.html +1 -1
- package/out/custom-types/[customTypeId].html +1 -1
- package/out/custom-types.html +1 -1
- package/out/index.html +1 -1
- package/out/labs.html +1 -1
- package/out/page-types/[pageTypeId].html +1 -1
- package/out/slices/[lib]/[sliceName]/[variation]/simulator.html +1 -1
- package/out/slices/[lib]/[sliceName]/[variation].html +1 -1
- package/out/slices.html +1 -1
- package/package.json +3 -3
- package/src/features/auth/LogoutButton.tsx +42 -36
- package/src/features/builder/fields/contentRelationship/ContentRelationshipFieldPicker.tsx +3 -3
- package/src/features/changes/StatusBadge.tsx +1 -9
- package/src/features/customTypes/customTypesBuilder/PageSnippetDialog/PageSnippetDialog.tsx +3 -3
- package/src/features/customTypes/customTypesTable/CustomTypesTablePage.tsx +3 -3
- package/src/features/environments/actions/useSetEnvironment.ts +22 -0
- package/src/features/environments/useActiveEnvironment.ts +17 -9
- package/src/features/environments/useEnvironments.ts +11 -8
- package/src/features/errorBoundaries/AppStateErrorBoundary.tsx +108 -0
- package/src/{ErrorBoundary.tsx → features/errorBoundaries/DefaultErrorBoundary.tsx} +2 -2
- package/src/features/errorBoundaries/index.ts +2 -0
- package/src/features/labs/labsList/LabsPage.tsx +3 -3
- package/src/features/navigation/Navigation.tsx +7 -8
- package/src/features/slices/sliceBuilder/FloatingBackButton.tsx +3 -3
- package/src/features/sync/AutoSyncProvider.tsx +2 -2
- package/src/features/sync/getUnSyncChanges.ts +1 -3
- package/src/legacy/components/AppLayout/index.tsx +10 -85
- package/src/legacy/components/ChangesEmptyState/UnauthenticatedView.tsx +31 -0
- package/src/legacy/components/ChangesEmptyState/index.ts +1 -1
- package/src/legacy/components/ChangesItems/ChangesItems.tsx +3 -3
- package/src/legacy/components/LoginModal/index.tsx +14 -6
- package/src/legacy/components/Navigation/ChangesItem.tsx +2 -6
- package/src/legacy/components/Navigation/Environment.tsx +2 -7
- package/src/legacy/components/Navigation/SideNavEnvironmentSelector/SideNavEnvironmentSelector.tsx +3 -8
- package/src/legacy/components/Simulator/index.tsx +3 -3
- package/src/legacy/lib/builders/CustomTypeBuilder/TabZone/index.tsx +3 -3
- package/src/modules/userContext/index.ts +5 -5
- package/src/modules/userContext/types.ts +2 -3
- package/src/pages/_app.tsx +93 -95
- package/src/pages/changes.tsx +4 -5
- package/src/queryClient.tsx +24 -0
- package/test/__testutils__/index.tsx +13 -10
- package/out/_next/static/chunks/157-fa8b348c960c8283.js +0 -3
- package/out/_next/static/chunks/34-8d9d9b2944824750.js +0 -1
- package/out/_next/static/chunks/pages/changes-4c23263cdc8e59c6.js +0 -1
- package/src/features/environments/actions/setEnvironment.ts +0 -18
- package/src/legacy/components/ChangesEmptyState/AuthErrorPage.tsx +0 -44
- /package/out/_next/static/{Zy4opMpDS8I-mxQ1kA3m2 → U9WVTg1pSTJVt94SbRE5Y}/_ssgManifest.js +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
<!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/_next/static/css/bc89f2cd4e4781f5.css" as="style"/><link rel="stylesheet" href="/_next/static/css/bc89f2cd4e4781f5.css" data-n-g=""/><link rel="preload" href="/_next/static/css/56f2a6684a524374.css" as="style"/><link rel="stylesheet" href="/_next/static/css/56f2a6684a524374.css" data-n-p=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-e0c07a2fe4908d81.js" defer=""></script><script src="/_next/static/chunks/framework-ab7ddb551c23d05a.js" defer=""></script><script src="/_next/static/chunks/main-c46f4dcf6e3174bd.js" defer=""></script><script src="/_next/static/chunks/pages/_app-
|
|
1
|
+
<!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/_next/static/css/bc89f2cd4e4781f5.css" as="style"/><link rel="stylesheet" href="/_next/static/css/bc89f2cd4e4781f5.css" data-n-g=""/><link rel="preload" href="/_next/static/css/56f2a6684a524374.css" as="style"/><link rel="stylesheet" href="/_next/static/css/56f2a6684a524374.css" data-n-p=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-e0c07a2fe4908d81.js" defer=""></script><script src="/_next/static/chunks/framework-ab7ddb551c23d05a.js" defer=""></script><script src="/_next/static/chunks/main-c46f4dcf6e3174bd.js" defer=""></script><script src="/_next/static/chunks/pages/_app-1b4541325b4a29ab.js" defer=""></script><script src="/_next/static/chunks/59b4e022-ef680789f7cc9b11.js" defer=""></script><script src="/_next/static/chunks/f36c6662-1f3a854183168b10.js" defer=""></script><script src="/_next/static/chunks/4c744e84-480e426e4b1cfef3.js" defer=""></script><script src="/_next/static/chunks/065a3ddb-9a38ca0d60f0bf2f.js" defer=""></script><script src="/_next/static/chunks/1cc2734a-09fb3b997ad1eb70.js" defer=""></script><script src="/_next/static/chunks/397-e6c340070a3bcb41.js" defer=""></script><script src="/_next/static/chunks/183-4ea255b867ff171b.js" defer=""></script><script src="/_next/static/chunks/344-fdb3008f4bb3b0c1.js" defer=""></script><script src="/_next/static/chunks/256-07f768a2b19b0a0e.js" defer=""></script><script src="/_next/static/chunks/422-c9192a1dbdd2ae0e.js" defer=""></script><script src="/_next/static/chunks/34-50c64778da33cff6.js" defer=""></script><script src="/_next/static/chunks/647-4379a741c8d85d9e.js" defer=""></script><script src="/_next/static/chunks/630-eae75e90b30f201a.js" defer=""></script><script src="/_next/static/chunks/907-445266211c48b1a5.js" defer=""></script><script src="/_next/static/chunks/489-a046ae0fa4f74435.js" defer=""></script><script src="/_next/static/chunks/pages/page-types/%5BpageTypeId%5D-a24665e91b882169.js" defer=""></script><script src="/_next/static/U9WVTg1pSTJVt94SbRE5Y/_buildManifest.js" defer=""></script><script src="/_next/static/U9WVTg1pSTJVt94SbRE5Y/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/page-types/[pageTypeId]","query":{},"buildId":"U9WVTg1pSTJVt94SbRE5Y","runtimeConfig":{"sentryEnvironment":"beta"},"nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/_next/static/css/bc89f2cd4e4781f5.css" as="style"/><link rel="stylesheet" href="/_next/static/css/bc89f2cd4e4781f5.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-e0c07a2fe4908d81.js" defer=""></script><script src="/_next/static/chunks/framework-ab7ddb551c23d05a.js" defer=""></script><script src="/_next/static/chunks/main-c46f4dcf6e3174bd.js" defer=""></script><script src="/_next/static/chunks/pages/_app-
|
|
1
|
+
<!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/_next/static/css/bc89f2cd4e4781f5.css" as="style"/><link rel="stylesheet" href="/_next/static/css/bc89f2cd4e4781f5.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-e0c07a2fe4908d81.js" defer=""></script><script src="/_next/static/chunks/framework-ab7ddb551c23d05a.js" defer=""></script><script src="/_next/static/chunks/main-c46f4dcf6e3174bd.js" defer=""></script><script src="/_next/static/chunks/pages/_app-1b4541325b4a29ab.js" defer=""></script><script src="/_next/static/chunks/c8eae200-966ce352f7b5d2b9.js" defer=""></script><script src="/_next/static/chunks/72585f70-28b4d7d5384b3703.js" defer=""></script><script src="/_next/static/chunks/429-aab52070cad2884b.js" defer=""></script><script src="/_next/static/chunks/pages/slices/%5Blib%5D/%5BsliceName%5D/%5Bvariation%5D/simulator-f237aaa755dc9a99.js" defer=""></script><script src="/_next/static/U9WVTg1pSTJVt94SbRE5Y/_buildManifest.js" defer=""></script><script src="/_next/static/U9WVTg1pSTJVt94SbRE5Y/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/slices/[lib]/[sliceName]/[variation]/simulator","query":{},"buildId":"U9WVTg1pSTJVt94SbRE5Y","runtimeConfig":{"sentryEnvironment":"beta"},"nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/_next/static/css/bc89f2cd4e4781f5.css" as="style"/><link rel="stylesheet" href="/_next/static/css/bc89f2cd4e4781f5.css" data-n-g=""/><link rel="preload" href="/_next/static/css/e8e03c0d4003d1eb.css" as="style"/><link rel="stylesheet" href="/_next/static/css/e8e03c0d4003d1eb.css" data-n-p=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-e0c07a2fe4908d81.js" defer=""></script><script src="/_next/static/chunks/framework-ab7ddb551c23d05a.js" defer=""></script><script src="/_next/static/chunks/main-c46f4dcf6e3174bd.js" defer=""></script><script src="/_next/static/chunks/pages/_app-
|
|
1
|
+
<!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/_next/static/css/bc89f2cd4e4781f5.css" as="style"/><link rel="stylesheet" href="/_next/static/css/bc89f2cd4e4781f5.css" data-n-g=""/><link rel="preload" href="/_next/static/css/e8e03c0d4003d1eb.css" as="style"/><link rel="stylesheet" href="/_next/static/css/e8e03c0d4003d1eb.css" data-n-p=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-e0c07a2fe4908d81.js" defer=""></script><script src="/_next/static/chunks/framework-ab7ddb551c23d05a.js" defer=""></script><script src="/_next/static/chunks/main-c46f4dcf6e3174bd.js" defer=""></script><script src="/_next/static/chunks/pages/_app-1b4541325b4a29ab.js" defer=""></script><script src="/_next/static/chunks/59b4e022-ef680789f7cc9b11.js" defer=""></script><script src="/_next/static/chunks/c8eae200-966ce352f7b5d2b9.js" defer=""></script><script src="/_next/static/chunks/f36c6662-1f3a854183168b10.js" defer=""></script><script src="/_next/static/chunks/4c744e84-480e426e4b1cfef3.js" defer=""></script><script src="/_next/static/chunks/065a3ddb-9a38ca0d60f0bf2f.js" defer=""></script><script src="/_next/static/chunks/1cc2734a-09fb3b997ad1eb70.js" defer=""></script><script src="/_next/static/chunks/52d4c156-89c6ec6efca0a0bb.js" defer=""></script><script src="/_next/static/chunks/397-e6c340070a3bcb41.js" defer=""></script><script src="/_next/static/chunks/183-4ea255b867ff171b.js" defer=""></script><script src="/_next/static/chunks/344-fdb3008f4bb3b0c1.js" defer=""></script><script src="/_next/static/chunks/256-07f768a2b19b0a0e.js" defer=""></script><script src="/_next/static/chunks/500-d3989390f5e8da53.js" defer=""></script><script src="/_next/static/chunks/484-3e011e79c41f0342.js" defer=""></script><script src="/_next/static/chunks/34-50c64778da33cff6.js" defer=""></script><script src="/_next/static/chunks/630-eae75e90b30f201a.js" defer=""></script><script src="/_next/static/chunks/658-8231c0b729e0124a.js" defer=""></script><script src="/_next/static/chunks/pages/slices/%5Blib%5D/%5BsliceName%5D/%5Bvariation%5D-c8c3e7ffb898261c.js" defer=""></script><script src="/_next/static/U9WVTg1pSTJVt94SbRE5Y/_buildManifest.js" defer=""></script><script src="/_next/static/U9WVTg1pSTJVt94SbRE5Y/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/slices/[lib]/[sliceName]/[variation]","query":{},"buildId":"U9WVTg1pSTJVt94SbRE5Y","runtimeConfig":{"sentryEnvironment":"beta"},"nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
|
package/out/slices.html
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
<!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/_next/static/css/bc89f2cd4e4781f5.css" as="style"/><link rel="stylesheet" href="/_next/static/css/bc89f2cd4e4781f5.css" data-n-g=""/><link rel="preload" href="/_next/static/css/efa5152b7c0f35c0.css" as="style"/><link rel="stylesheet" href="/_next/static/css/efa5152b7c0f35c0.css" data-n-p=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-e0c07a2fe4908d81.js" defer=""></script><script src="/_next/static/chunks/framework-ab7ddb551c23d05a.js" defer=""></script><script src="/_next/static/chunks/main-c46f4dcf6e3174bd.js" defer=""></script><script src="/_next/static/chunks/pages/_app-
|
|
1
|
+
<!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/_next/static/css/bc89f2cd4e4781f5.css" as="style"/><link rel="stylesheet" href="/_next/static/css/bc89f2cd4e4781f5.css" data-n-g=""/><link rel="preload" href="/_next/static/css/efa5152b7c0f35c0.css" as="style"/><link rel="stylesheet" href="/_next/static/css/efa5152b7c0f35c0.css" data-n-p=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-e0c07a2fe4908d81.js" defer=""></script><script src="/_next/static/chunks/framework-ab7ddb551c23d05a.js" defer=""></script><script src="/_next/static/chunks/main-c46f4dcf6e3174bd.js" defer=""></script><script src="/_next/static/chunks/pages/_app-1b4541325b4a29ab.js" defer=""></script><script src="/_next/static/chunks/59b4e022-ef680789f7cc9b11.js" defer=""></script><script src="/_next/static/chunks/c8eae200-966ce352f7b5d2b9.js" defer=""></script><script src="/_next/static/chunks/52d4c156-89c6ec6efca0a0bb.js" defer=""></script><script src="/_next/static/chunks/397-e6c340070a3bcb41.js" defer=""></script><script src="/_next/static/chunks/344-fdb3008f4bb3b0c1.js" defer=""></script><script src="/_next/static/chunks/500-d3989390f5e8da53.js" defer=""></script><script src="/_next/static/chunks/34-50c64778da33cff6.js" defer=""></script><script src="/_next/static/chunks/658-8231c0b729e0124a.js" defer=""></script><script src="/_next/static/chunks/907-445266211c48b1a5.js" defer=""></script><script src="/_next/static/chunks/pages/slices-0aaae79dcc7b8c55.js" defer=""></script><script src="/_next/static/U9WVTg1pSTJVt94SbRE5Y/_buildManifest.js" defer=""></script><script src="/_next/static/U9WVTg1pSTJVt94SbRE5Y/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/slices","query":{},"buildId":"U9WVTg1pSTJVt94SbRE5Y","runtimeConfig":{"sentryEnvironment":"beta"},"nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "slice-machine-ui",
|
|
3
|
-
"version": "2.18.1-beta.
|
|
3
|
+
"version": "2.18.1-beta.8",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"description": "A visual builder for your Slice Models with all the tools you need to generate data models and mock CMS content locally.",
|
|
6
6
|
"repository": {
|
|
@@ -35,8 +35,8 @@
|
|
|
35
35
|
"start-slicemachine": "./bin/start-slicemachine.cjs"
|
|
36
36
|
},
|
|
37
37
|
"dependencies": {
|
|
38
|
-
"@slicemachine/manager": "0.25.3-beta.
|
|
39
|
-
"start-slicemachine": "0.12.61-beta.
|
|
38
|
+
"@slicemachine/manager": "0.25.3-beta.8",
|
|
39
|
+
"start-slicemachine": "0.12.61-beta.8"
|
|
40
40
|
},
|
|
41
41
|
"devDependencies": {
|
|
42
42
|
"@emotion/react": "11.11.1",
|
|
@@ -1,52 +1,34 @@
|
|
|
1
1
|
import { Button, Icon, IconButton, Tooltip } from "@prismicio/editor-ui";
|
|
2
2
|
import { SX } from "@prismicio/editor-ui/dist/theme";
|
|
3
3
|
import * as Sentry from "@sentry/nextjs";
|
|
4
|
-
import {
|
|
4
|
+
import { useQueryClient } from "@tanstack/react-query";
|
|
5
|
+
import { useRouter } from "next/router";
|
|
6
|
+
import { toast } from "react-toastify";
|
|
5
7
|
|
|
6
|
-
import { clearAuth
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
8
|
+
import { clearAuth, getState } from "@/apiClient";
|
|
9
|
+
import { GetActiveEnvironmentQueryKey } from "@/features/environments/useActiveEnvironment";
|
|
10
|
+
import { GetEnvironmentsQueryKey } from "@/features/environments/useEnvironments";
|
|
9
11
|
import useSliceMachineActions from "@/modules/useSliceMachineActions";
|
|
10
12
|
|
|
11
|
-
|
|
12
|
-
children?: ReactNode;
|
|
13
|
-
onLogoutSuccess?: () => void;
|
|
14
|
-
isLoading?: boolean;
|
|
15
|
-
sx?: SX;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
export function LogoutButton(props: LogoutButtonProps) {
|
|
19
|
-
const { children, onLogoutSuccess, isLoading, sx } = props;
|
|
20
|
-
|
|
13
|
+
export function EnvironmentLogoutButton() {
|
|
21
14
|
const { refreshState } = useSliceMachineActions();
|
|
15
|
+
const queryClient = useQueryClient();
|
|
22
16
|
|
|
23
17
|
async function onClick() {
|
|
24
|
-
await
|
|
18
|
+
await clearAuth();
|
|
25
19
|
|
|
26
20
|
const serverState = await getState();
|
|
27
21
|
refreshState(serverState);
|
|
28
|
-
|
|
29
22
|
Sentry.setUser({ id: serverState.env.shortId });
|
|
30
23
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
24
|
+
await Promise.all([
|
|
25
|
+
queryClient.invalidateQueries({ queryKey: GetEnvironmentsQueryKey }),
|
|
26
|
+
queryClient.invalidateQueries({
|
|
27
|
+
queryKey: GetActiveEnvironmentQueryKey,
|
|
28
|
+
}),
|
|
29
|
+
]);
|
|
34
30
|
|
|
35
|
-
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
if (children !== undefined) {
|
|
39
|
-
return (
|
|
40
|
-
<Button
|
|
41
|
-
onClick={() => void onClick()}
|
|
42
|
-
renderEndIcon={() => <Icon name="logout" size="extraSmall" />}
|
|
43
|
-
color="grey"
|
|
44
|
-
loading={isLoading}
|
|
45
|
-
sx={sx}
|
|
46
|
-
>
|
|
47
|
-
{children}
|
|
48
|
-
</Button>
|
|
49
|
-
);
|
|
31
|
+
toast.success("Logged out");
|
|
50
32
|
}
|
|
51
33
|
|
|
52
34
|
return (
|
|
@@ -55,9 +37,33 @@ export function LogoutButton(props: LogoutButtonProps) {
|
|
|
55
37
|
icon="logout"
|
|
56
38
|
onClick={() => void onClick()}
|
|
57
39
|
hiddenLabel="Log out"
|
|
58
|
-
loading={isLoading}
|
|
59
|
-
sx={sx}
|
|
60
40
|
/>
|
|
61
41
|
</Tooltip>
|
|
62
42
|
);
|
|
63
43
|
}
|
|
44
|
+
|
|
45
|
+
interface ReloadLogoutButtonProps {
|
|
46
|
+
sx?: SX;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export function ReloadLogoutButton(props: ReloadLogoutButtonProps) {
|
|
50
|
+
const { sx } = props;
|
|
51
|
+
const router = useRouter();
|
|
52
|
+
|
|
53
|
+
async function onClick() {
|
|
54
|
+
await clearAuth();
|
|
55
|
+
Sentry.setUser({ id: undefined });
|
|
56
|
+
router.reload();
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
return (
|
|
60
|
+
<Button
|
|
61
|
+
onClick={() => void onClick()}
|
|
62
|
+
renderEndIcon={() => <Icon name="logout" size="extraSmall" />}
|
|
63
|
+
color="grey"
|
|
64
|
+
sx={sx}
|
|
65
|
+
>
|
|
66
|
+
Log out
|
|
67
|
+
</Button>
|
|
68
|
+
);
|
|
69
|
+
}
|
|
@@ -30,11 +30,11 @@ import {
|
|
|
30
30
|
} from "@prismicio/types-internal/lib/customtypes";
|
|
31
31
|
import { useEffect } from "react";
|
|
32
32
|
|
|
33
|
-
import { ErrorBoundary } from "@/ErrorBoundary";
|
|
34
33
|
import {
|
|
35
34
|
revalidateGetCustomTypes,
|
|
36
35
|
useCustomTypes as useCustomTypesRequest,
|
|
37
36
|
} from "@/features/customTypes/useCustomTypes";
|
|
37
|
+
import { DefaultErrorBoundary } from "@/features/errorBoundaries";
|
|
38
38
|
import { isValidObject } from "@/utils/isValidObject";
|
|
39
39
|
|
|
40
40
|
type NonReadonly<T> = { -readonly [P in keyof T]: T[P] };
|
|
@@ -226,7 +226,7 @@ export function ContentRelationshipFieldPicker(
|
|
|
226
226
|
props: ContentRelationshipFieldPickerProps,
|
|
227
227
|
) {
|
|
228
228
|
return (
|
|
229
|
-
<
|
|
229
|
+
<DefaultErrorBoundary
|
|
230
230
|
renderError={() => (
|
|
231
231
|
<Box alignItems="center" gap={8}>
|
|
232
232
|
<Icon name="alert" size="small" color="tomato10" />
|
|
@@ -254,7 +254,7 @@ export function ContentRelationshipFieldPicker(
|
|
|
254
254
|
>
|
|
255
255
|
<ContentRelationshipFieldPickerContent {...props} />
|
|
256
256
|
</AnimatedSuspense>
|
|
257
|
-
</
|
|
257
|
+
</DefaultErrorBoundary>
|
|
258
258
|
);
|
|
259
259
|
}
|
|
260
260
|
|
|
@@ -73,7 +73,7 @@ function getStatusBadgeContent(
|
|
|
73
73
|
"Data from the remote repository could not be fetched (no internet connection).",
|
|
74
74
|
};
|
|
75
75
|
}
|
|
76
|
-
if (args.authStatus === AuthStatus.
|
|
76
|
+
if (args.authStatus === AuthStatus.UNAUTHENTICATED) {
|
|
77
77
|
return {
|
|
78
78
|
badgeColor: "grey",
|
|
79
79
|
badgeTitle: "Unknown",
|
|
@@ -81,14 +81,6 @@ function getStatusBadgeContent(
|
|
|
81
81
|
"Data from the remote repository could not be fetched (not connected to Prismic).",
|
|
82
82
|
};
|
|
83
83
|
}
|
|
84
|
-
if (args.authStatus === AuthStatus.FORBIDDEN) {
|
|
85
|
-
return {
|
|
86
|
-
badgeColor: "grey",
|
|
87
|
-
badgeTitle: "Unknown",
|
|
88
|
-
tooltipContent:
|
|
89
|
-
"Data from the remote repository could not be fetched (you don't have access to the repository).",
|
|
90
|
-
};
|
|
91
|
-
}
|
|
92
84
|
}
|
|
93
85
|
default: {
|
|
94
86
|
return {
|
|
@@ -4,9 +4,9 @@ import { FC, Suspense } from "react";
|
|
|
4
4
|
|
|
5
5
|
import { telemetry } from "@/apiClient";
|
|
6
6
|
import { ContentTabs } from "@/components/ContentTabs";
|
|
7
|
-
import { ErrorBoundary } from "@/ErrorBoundary";
|
|
8
7
|
import { MarkdownRenderer } from "@/features/documentation/MarkdownRenderer";
|
|
9
8
|
import { useDocumentation } from "@/features/documentation/useDocumentation";
|
|
9
|
+
import { DefaultErrorBoundary } from "@/features/errorBoundaries";
|
|
10
10
|
import { useOnboarding } from "@/features/onboarding/useOnboarding";
|
|
11
11
|
import { useAdapterName } from "@/hooks/useAdapterName";
|
|
12
12
|
|
|
@@ -68,7 +68,7 @@ type PageSnippetDialogProps = { model: CustomType };
|
|
|
68
68
|
export const PageSnippetDialog: FC<PageSnippetDialogProps> = ({ model }) => {
|
|
69
69
|
return (
|
|
70
70
|
<div>
|
|
71
|
-
<
|
|
71
|
+
<DefaultErrorBoundary>
|
|
72
72
|
<Suspense
|
|
73
73
|
fallback={
|
|
74
74
|
<Button color="grey" startIcon="code">
|
|
@@ -78,7 +78,7 @@ export const PageSnippetDialog: FC<PageSnippetDialogProps> = ({ model }) => {
|
|
|
78
78
|
>
|
|
79
79
|
<PageSnippetContent model={model} />
|
|
80
80
|
</Suspense>
|
|
81
|
-
</
|
|
81
|
+
</DefaultErrorBoundary>
|
|
82
82
|
</div>
|
|
83
83
|
);
|
|
84
84
|
};
|
|
@@ -9,8 +9,8 @@ import Head from "next/head";
|
|
|
9
9
|
import { type FC, Suspense, useState } from "react";
|
|
10
10
|
|
|
11
11
|
import { BreadcrumbItem } from "@/components/Breadcrumb";
|
|
12
|
-
import { ErrorBoundary } from "@/ErrorBoundary";
|
|
13
12
|
import { CUSTOM_TYPES_MESSAGES } from "@/features/customTypes/customTypesMessages";
|
|
13
|
+
import { DefaultErrorBoundary } from "@/features/errorBoundaries";
|
|
14
14
|
import {
|
|
15
15
|
AppLayout,
|
|
16
16
|
AppLayoutActions,
|
|
@@ -42,7 +42,7 @@ export const CustomTypesTablePage: FC<CustomTypesTablePageProps> = ({
|
|
|
42
42
|
Machine
|
|
43
43
|
</title>
|
|
44
44
|
</Head>
|
|
45
|
-
<
|
|
45
|
+
<DefaultErrorBoundary
|
|
46
46
|
renderError={() => (
|
|
47
47
|
<AppLayout>
|
|
48
48
|
<AppLayoutContent>
|
|
@@ -119,7 +119,7 @@ export const CustomTypesTablePage: FC<CustomTypesTablePageProps> = ({
|
|
|
119
119
|
</AppLayoutContent>
|
|
120
120
|
</AppLayout>
|
|
121
121
|
</Suspense>
|
|
122
|
-
</
|
|
122
|
+
</DefaultErrorBoundary>
|
|
123
123
|
</>
|
|
124
124
|
);
|
|
125
125
|
};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { revalidateData } from "@prismicio/editor-support/Suspense";
|
|
2
|
+
import { Environment } from "@slicemachine/manager/client";
|
|
3
|
+
import { useQueryClient } from "@tanstack/react-query";
|
|
4
|
+
|
|
5
|
+
import { getState } from "@/apiClient";
|
|
6
|
+
import { GetActiveEnvironmentQueryKey } from "@/features/environments/useActiveEnvironment";
|
|
7
|
+
import { managerClient } from "@/managerClient";
|
|
8
|
+
|
|
9
|
+
export function useSetEnvironment() {
|
|
10
|
+
const queryClient = useQueryClient();
|
|
11
|
+
|
|
12
|
+
return async (environment: Pick<Environment, "domain">) => {
|
|
13
|
+
await managerClient.project.updateEnvironment({
|
|
14
|
+
environment: environment.domain,
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
void Promise.all([
|
|
18
|
+
queryClient.invalidateQueries({ queryKey: GetActiveEnvironmentQueryKey }),
|
|
19
|
+
revalidateData(getState, []),
|
|
20
|
+
]);
|
|
21
|
+
};
|
|
22
|
+
}
|
|
@@ -1,14 +1,22 @@
|
|
|
1
|
-
import {
|
|
2
|
-
invalidateFetcherData,
|
|
3
|
-
useRequest,
|
|
4
|
-
} from "@prismicio/editor-support/Suspense";
|
|
1
|
+
import { useQuery, useSuspenseQuery } from "@tanstack/react-query";
|
|
5
2
|
|
|
6
3
|
import { getActiveEnvironment } from "./actions/getActiveEnvironment";
|
|
7
4
|
|
|
8
|
-
export
|
|
9
|
-
|
|
10
|
-
}
|
|
5
|
+
export const GetActiveEnvironmentQueryKey = ["getActiveEnvironment"];
|
|
6
|
+
|
|
7
|
+
export function useActiveEnvironment(options?: { suspense?: boolean }) {
|
|
8
|
+
const { suspense } = options ?? {};
|
|
9
|
+
|
|
10
|
+
const hook = suspense === true ? useSuspenseQuery : useQuery;
|
|
11
|
+
|
|
12
|
+
const { data, error, ...rest } = hook({
|
|
13
|
+
queryKey: GetActiveEnvironmentQueryKey,
|
|
14
|
+
queryFn: () => getActiveEnvironment(),
|
|
15
|
+
});
|
|
11
16
|
|
|
12
|
-
|
|
13
|
-
|
|
17
|
+
return {
|
|
18
|
+
activeEnvironment: data?.activeEnvironment,
|
|
19
|
+
error: data?.error ?? error ?? undefined,
|
|
20
|
+
...rest,
|
|
21
|
+
};
|
|
14
22
|
}
|
|
@@ -1,14 +1,17 @@
|
|
|
1
|
-
import {
|
|
2
|
-
invalidateFetcherData,
|
|
3
|
-
useRequest,
|
|
4
|
-
} from "@prismicio/editor-support/Suspense";
|
|
1
|
+
import { useQuery } from "@tanstack/react-query";
|
|
5
2
|
|
|
6
3
|
import { getEnvironments } from "./actions/getEnvironments";
|
|
7
4
|
|
|
8
|
-
export
|
|
9
|
-
invalidateFetcherData(getEnvironments);
|
|
10
|
-
}
|
|
5
|
+
export const GetEnvironmentsQueryKey = ["getEnvironments"];
|
|
11
6
|
|
|
12
7
|
export function useEnvironments() {
|
|
13
|
-
|
|
8
|
+
const { data, error, ...rest } = useQuery({
|
|
9
|
+
queryKey: GetEnvironmentsQueryKey,
|
|
10
|
+
queryFn: () => getEnvironments(),
|
|
11
|
+
});
|
|
12
|
+
return {
|
|
13
|
+
environments: data?.environments,
|
|
14
|
+
error: data?.error ?? error ?? undefined,
|
|
15
|
+
...rest,
|
|
16
|
+
};
|
|
14
17
|
}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import {
|
|
2
|
+
BlankSlate,
|
|
3
|
+
BlankSlateDescription,
|
|
4
|
+
BlankSlateIcon,
|
|
5
|
+
BlankSlateTitle,
|
|
6
|
+
Box,
|
|
7
|
+
ErrorBoundary as EditorUiErrorBoundary,
|
|
8
|
+
Text,
|
|
9
|
+
} from "@prismicio/editor-ui";
|
|
10
|
+
import {
|
|
11
|
+
isInvalidActiveEnvironmentError,
|
|
12
|
+
isUnauthorizedError,
|
|
13
|
+
} from "@slicemachine/manager/client";
|
|
14
|
+
import Link from "next/link";
|
|
15
|
+
import { PropsWithChildren } from "react";
|
|
16
|
+
|
|
17
|
+
import { ReloadLogoutButton } from "@/features/auth/LogoutButton";
|
|
18
|
+
|
|
19
|
+
export function AppStateErrorBoundary(props: PropsWithChildren) {
|
|
20
|
+
return (
|
|
21
|
+
<EditorUiErrorBoundary
|
|
22
|
+
renderError={(error) => {
|
|
23
|
+
return (
|
|
24
|
+
<Box
|
|
25
|
+
position="absolute"
|
|
26
|
+
top={64}
|
|
27
|
+
width="100%"
|
|
28
|
+
justifyContent="center"
|
|
29
|
+
flexDirection="column"
|
|
30
|
+
>
|
|
31
|
+
<BlankSlate>
|
|
32
|
+
<BlankSlateIcon
|
|
33
|
+
lineColor="tomato11"
|
|
34
|
+
backgroundColor="tomato3"
|
|
35
|
+
name="alert"
|
|
36
|
+
/>
|
|
37
|
+
<BlankSlateTitle>Failed to load Slice Machine</BlankSlateTitle>
|
|
38
|
+
<RenderErrorDescription error={error} />
|
|
39
|
+
</BlankSlate>
|
|
40
|
+
</Box>
|
|
41
|
+
);
|
|
42
|
+
}}
|
|
43
|
+
>
|
|
44
|
+
{props.children}
|
|
45
|
+
</EditorUiErrorBoundary>
|
|
46
|
+
);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function RenderErrorDescription(args: { error: unknown }) {
|
|
50
|
+
const { error } = args;
|
|
51
|
+
|
|
52
|
+
if (isUnauthorizedError(error)) {
|
|
53
|
+
return (
|
|
54
|
+
<CommonErrorBox>
|
|
55
|
+
<Box flexDirection="column" gap={8} alignItems="center">
|
|
56
|
+
<Text variant="h3" align="center">
|
|
57
|
+
You don't have access to this repository.
|
|
58
|
+
</Text>
|
|
59
|
+
<Text align="center">
|
|
60
|
+
Check that the repository name is correct, then contact your
|
|
61
|
+
repository administrator.
|
|
62
|
+
</Text>
|
|
63
|
+
</Box>
|
|
64
|
+
<ReloadLogoutButton sx={{ alignSelf: "center" }} />
|
|
65
|
+
</CommonErrorBox>
|
|
66
|
+
);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
if (isInvalidActiveEnvironmentError(error)) {
|
|
70
|
+
return (
|
|
71
|
+
<CommonErrorBox>
|
|
72
|
+
<Box flexDirection="column" gap={8} alignItems="center">
|
|
73
|
+
<Text variant="h3" align="center">
|
|
74
|
+
Your current environment is invalid.
|
|
75
|
+
</Text>
|
|
76
|
+
<Text align="center">
|
|
77
|
+
Check with your repository administrator that you have permissions
|
|
78
|
+
and correctly configured your environment for the current
|
|
79
|
+
repository. For more details, consult the{" "}
|
|
80
|
+
<Link href="https://prismic.io/docs/environments" target="_blank">
|
|
81
|
+
documentation
|
|
82
|
+
</Link>
|
|
83
|
+
.
|
|
84
|
+
</Text>
|
|
85
|
+
</Box>
|
|
86
|
+
<ReloadLogoutButton sx={{ alignSelf: "center" }} />
|
|
87
|
+
</CommonErrorBox>
|
|
88
|
+
);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
return <BlankSlateDescription>{JSON.stringify(error)}</BlankSlateDescription>;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
function CommonErrorBox(args: { children: React.ReactNode }) {
|
|
95
|
+
const { children } = args;
|
|
96
|
+
|
|
97
|
+
return (
|
|
98
|
+
<Box
|
|
99
|
+
flexDirection="column"
|
|
100
|
+
alignItems="center"
|
|
101
|
+
gap={16}
|
|
102
|
+
margin={{ top: 8 }}
|
|
103
|
+
maxWidth={768}
|
|
104
|
+
>
|
|
105
|
+
{children}
|
|
106
|
+
</Box>
|
|
107
|
+
);
|
|
108
|
+
}
|
|
@@ -12,13 +12,13 @@ import {
|
|
|
12
12
|
|
|
13
13
|
import { useAuthStatus } from "@/hooks/useAuthStatus";
|
|
14
14
|
|
|
15
|
-
type
|
|
15
|
+
type DefaultErrorBoundaryProps = Pick<
|
|
16
16
|
// TODO(DT-1979): Export the `ErrorBoundaryProps` type from `@prismicio/editor-ui`.
|
|
17
17
|
ComponentPropsWithoutRef<typeof EditorUiErrorBoundary>,
|
|
18
18
|
"children" | "renderError"
|
|
19
19
|
>;
|
|
20
20
|
|
|
21
|
-
export const
|
|
21
|
+
export const DefaultErrorBoundary: FC<DefaultErrorBoundaryProps> = (props) => {
|
|
22
22
|
const errorRef = useRef<unknown>();
|
|
23
23
|
const authStatus = useAuthStatus();
|
|
24
24
|
return (
|
|
@@ -3,7 +3,7 @@ import Head from "next/head";
|
|
|
3
3
|
import { type FC, ReactNode, Suspense } from "react";
|
|
4
4
|
|
|
5
5
|
import { BreadcrumbItem } from "@/components/Breadcrumb";
|
|
6
|
-
import {
|
|
6
|
+
import { DefaultErrorBoundary } from "@/features/errorBoundaries";
|
|
7
7
|
import {
|
|
8
8
|
AppLayout,
|
|
9
9
|
AppLayoutBreadcrumb,
|
|
@@ -19,7 +19,7 @@ export const LabsPage: FC = () => {
|
|
|
19
19
|
<Head>
|
|
20
20
|
<title>Labs - Slice Machine</title>
|
|
21
21
|
</Head>
|
|
22
|
-
<
|
|
22
|
+
<DefaultErrorBoundary
|
|
23
23
|
renderError={() => (
|
|
24
24
|
<LabsPageLayout>
|
|
25
25
|
<Box alignItems="center" justifyContent="center">
|
|
@@ -42,7 +42,7 @@ export const LabsPage: FC = () => {
|
|
|
42
42
|
<LabsList />
|
|
43
43
|
</LabsPageLayout>
|
|
44
44
|
</Suspense>
|
|
45
|
-
</
|
|
45
|
+
</DefaultErrorBoundary>
|
|
46
46
|
</>
|
|
47
47
|
);
|
|
48
48
|
};
|
|
@@ -9,9 +9,9 @@ import { useRouter } from "next/router";
|
|
|
9
9
|
import { Suspense } from "react";
|
|
10
10
|
|
|
11
11
|
import { telemetry } from "@/apiClient";
|
|
12
|
-
import { ErrorBoundary } from "@/ErrorBoundary";
|
|
13
12
|
import { CUSTOM_TYPES_CONFIG } from "@/features/customTypes/customTypesConfig";
|
|
14
13
|
import { CUSTOM_TYPES_MESSAGES } from "@/features/customTypes/customTypesMessages";
|
|
14
|
+
import { DefaultErrorBoundary } from "@/features/errorBoundaries";
|
|
15
15
|
import { RepositoryInfo } from "@/features/navigation/RepositoryInfo";
|
|
16
16
|
import { OnboardingGuide } from "@/features/onboarding";
|
|
17
17
|
import { useAdapterName } from "@/hooks/useAdapterName";
|
|
@@ -86,21 +86,20 @@ export function Navigation() {
|
|
|
86
86
|
/>
|
|
87
87
|
</ActionList>
|
|
88
88
|
|
|
89
|
-
<
|
|
89
|
+
<DefaultErrorBoundary>
|
|
90
90
|
<Suspense>
|
|
91
91
|
<UpdateInfo />
|
|
92
92
|
</Suspense>
|
|
93
|
-
</
|
|
93
|
+
</DefaultErrorBoundary>
|
|
94
94
|
</Box>
|
|
95
95
|
|
|
96
96
|
<Box flexDirection="column">
|
|
97
97
|
<ActionList variant="compact">
|
|
98
|
-
<
|
|
98
|
+
<DefaultErrorBoundary>
|
|
99
99
|
<Suspense>
|
|
100
100
|
<OnboardingGuide />
|
|
101
101
|
</Suspense>
|
|
102
|
-
</
|
|
103
|
-
|
|
102
|
+
</DefaultErrorBoundary>
|
|
104
103
|
<NavigationItem
|
|
105
104
|
title="Documentation"
|
|
106
105
|
href={documentationLink}
|
|
@@ -136,11 +135,11 @@ export function Navigation() {
|
|
|
136
135
|
Icon={LightningIcon}
|
|
137
136
|
active={router.asPath.startsWith("/changelog")}
|
|
138
137
|
RightElement={
|
|
139
|
-
<
|
|
138
|
+
<DefaultErrorBoundary>
|
|
140
139
|
<Suspense fallback={<Skeleton height={16} />}>
|
|
141
140
|
<SliceMachineVersion />
|
|
142
141
|
</Suspense>
|
|
143
|
-
</
|
|
142
|
+
</DefaultErrorBoundary>
|
|
144
143
|
}
|
|
145
144
|
/>
|
|
146
145
|
</ActionList>
|
|
@@ -2,13 +2,13 @@ import { Box, Button, ButtonGroup } from "@prismicio/editor-ui";
|
|
|
2
2
|
import { useRouter } from "next/router";
|
|
3
3
|
import { type FC, Suspense, useState } from "react";
|
|
4
4
|
|
|
5
|
-
import { ErrorBoundary } from "@/ErrorBoundary";
|
|
6
5
|
import { useCustomType } from "@/features/customTypes/customTypesBuilder/useCustomType";
|
|
7
6
|
import {
|
|
8
7
|
CUSTOM_TYPES_CONFIG,
|
|
9
8
|
matchesBuilderPagePathname,
|
|
10
9
|
readBuilderPageDynamicSegment,
|
|
11
10
|
} from "@/features/customTypes/customTypesConfig";
|
|
11
|
+
import { DefaultErrorBoundary } from "@/features/errorBoundaries";
|
|
12
12
|
import { type Route, useRouteChange } from "@/hooks/useRouteChange";
|
|
13
13
|
import { CloseIcon } from "@/icons/CloseIcon";
|
|
14
14
|
import { UndoIcon } from "@/icons/UndoIcon";
|
|
@@ -17,7 +17,7 @@ export const FloatingBackButton: FC = () => {
|
|
|
17
17
|
const { source } = useRouteChange();
|
|
18
18
|
const sourceCustomTypeId = getSourceCustomTypeId(source);
|
|
19
19
|
return sourceCustomTypeId !== undefined ? (
|
|
20
|
-
<
|
|
20
|
+
<DefaultErrorBoundary>
|
|
21
21
|
<Suspense>
|
|
22
22
|
<Box
|
|
23
23
|
bottom={32}
|
|
@@ -29,7 +29,7 @@ export const FloatingBackButton: FC = () => {
|
|
|
29
29
|
<BackButton sourceCustomTypeId={sourceCustomTypeId} />
|
|
30
30
|
</Box>
|
|
31
31
|
</Suspense>
|
|
32
|
-
</
|
|
32
|
+
</DefaultErrorBoundary>
|
|
33
33
|
) : null;
|
|
34
34
|
};
|
|
35
35
|
|