From cf309102a22d0a2c1767ffee10783f6873b9af1a Mon Sep 17 00:00:00 2001 From: David Baker Date: Wed, 20 Jul 2022 20:43:11 +0100 Subject: [PATCH] Make the error boundary work We had an error boundary at the top level of the app, but it didn't work because it used ErrorPage which tried to use a bunch of things like useLocation() and an error prop. Also it wasn't passed in correctly anyway. This wires it up correctly to a separate view with a button to send debug logs, and also moves it down a few layers so it has access to enough things to be able to send rageshakes. Related: https://github.com/vector-im/element-call/issues/421 --- src/App.jsx | 52 ++++++++++++++++++++--------------- src/FullScreenView.jsx | 52 +++++++++++++++++++++++++++++++++++ src/FullScreenView.module.css | 8 +++++- src/main.tsx | 8 +----- 4 files changed, 90 insertions(+), 30 deletions(-) diff --git a/src/App.jsx b/src/App.jsx index 3c882c51..1782f69e 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -26,37 +26,45 @@ import { RoomRedirect } from "./room/RoomRedirect"; import { ClientProvider } from "./ClientContext"; import { usePageFocusStyle } from "./usePageFocusStyle"; import { SequenceDiagramViewerPage } from "./SequenceDiagramViewerPage"; +import { InspectorContextProvider } from "./room/GroupCallInspector"; +import { CrashView } from "./FullScreenView"; const SentryRoute = Sentry.withSentryRouting(Route); export default function App({ history }) { usePageFocusStyle(); + const errorPage = ; + return ( - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + ); diff --git a/src/FullScreenView.jsx b/src/FullScreenView.jsx index fc252868..6dd71277 100644 --- a/src/FullScreenView.jsx +++ b/src/FullScreenView.jsx @@ -4,6 +4,8 @@ import styles from "./FullScreenView.module.css"; import { Header, HeaderLogo, LeftNav, RightNav } from "./Header"; import classNames from "classnames"; import { LinkButton, Button } from "./button"; +import { useSubmitRageshake } from "./settings/submit-rageshake"; +import { ErrorMessage } from "./input/Input"; export function FullScreenView({ className, children }) { return ( @@ -59,6 +61,56 @@ export function ErrorView({ error }) { ); } +export function CrashView() { + const { submitRageshake, sending, sent, error } = useSubmitRageshake(); + + const sendDebugLogs = useCallback(() => { + submitRageshake({ + description: "**Soft Crash**", + sendLogs: true, + }); + }, [submitRageshake]); + + const onReload = useCallback(() => { + window.location = "/"; + }, []); + + let logsComponent; + if (sent) { + logsComponent =
Thanks! We'll get right on it.
; + } else if (sending) { + logsComponent =
Sending...
; + } else { + logsComponent = ( + + ); + } + + return ( + +

Oops, something's gone wrong.

+

Submitting debug logs will help us track down the problem.

+
{logsComponent}
+ {error && Couldn't send debug logs!} + +
+ ); +} + export function LoadingView() { return ( diff --git a/src/FullScreenView.module.css b/src/FullScreenView.module.css index f30d9f6c..9d8fc665 100644 --- a/src/FullScreenView.module.css +++ b/src/FullScreenView.module.css @@ -36,6 +36,12 @@ margin-bottom: 0; } -.homeLink { +/* Make the buttons the same width */ +.wideButton { width: 291px; } + +/* Fixed height to avoid content jumping around*/ +.sendLogsSection { + height: 50px; +} diff --git a/src/main.tsx b/src/main.tsx index 50aa6cd4..2330bedc 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -28,9 +28,7 @@ import { Integrations } from "@sentry/tracing"; import "./index.css"; import App from "./App"; -import { ErrorView } from "./FullScreenView"; import { init as initRageshake } from "./settings/rageshake"; -import { InspectorContextProvider } from "./room/GroupCallInspector"; initRageshake(); @@ -104,11 +102,7 @@ Sentry.init({ ReactDOM.render( - - - - - + , document.getElementById("root") );