element-call-Github/src/FullScreenView.tsx

151 lines
3.6 KiB
TypeScript
Raw Normal View History

import React, { ReactNode, useCallback, useEffect } from "react";
2021-12-15 10:23:49 +08:00
import { useLocation } from "react-router-dom";
2021-12-15 08:12:58 +08:00
import classNames from "classnames";
2022-10-10 21:19:10 +08:00
import { Trans, useTranslation } from "react-i18next";
import { Header, HeaderLogo, LeftNav, RightNav } from "./Header";
2021-12-15 10:23:49 +08:00
import { LinkButton, Button } from "./button";
import { useSubmitRageshake } from "./settings/submit-rageshake";
import { ErrorMessage } from "./input/Input";
import styles from "./FullScreenView.module.css";
2022-10-10 21:19:10 +08:00
import { translatedError, TranslatedError } from "./TranslatedError";
import { Config } from "./config/Config";
2021-12-11 08:42:18 +08:00
interface FullScreenViewProps {
className?: string;
children: ReactNode;
}
export function FullScreenView({ className, children }: FullScreenViewProps) {
2021-12-11 08:42:18 +08:00
return (
2021-12-15 08:12:58 +08:00
<div className={classNames(styles.page, className)}>
2021-12-11 08:42:18 +08:00
<Header>
<LeftNav>
<HeaderLogo />
</LeftNav>
<RightNav />
</Header>
<div className={styles.container}>
<div className={styles.content}>{children}</div>
</div>
</div>
);
}
interface ErrorViewProps {
error: Error;
}
export function ErrorView({ error }: ErrorViewProps) {
2021-12-11 08:42:18 +08:00
const location = useLocation();
2022-10-10 21:19:10 +08:00
const { t } = useTranslation();
2021-12-11 08:42:18 +08:00
useEffect(() => {
console.error(error);
}, [error]);
2021-12-15 10:23:49 +08:00
const onReload = useCallback(() => {
window.location.href = "/";
2021-12-15 10:23:49 +08:00
}, []);
2021-12-11 08:42:18 +08:00
return (
<FullScreenView>
<h1>Error</h1>
2022-10-10 21:19:10 +08:00
<p>
{error instanceof TranslatedError
? error.translatedMessage
: error.message}
</p>
2021-12-15 10:23:49 +08:00
{location.pathname === "/" ? (
<Button
size="lg"
variant="default"
className={styles.homeLink}
onPress={onReload}
>
2022-10-10 21:19:10 +08:00
{t("Return to home screen")}
2021-12-15 10:23:49 +08:00
</Button>
) : (
<LinkButton
size="lg"
variant="default"
className={styles.homeLink}
to="/"
>
2022-10-10 21:19:10 +08:00
{t("Return to home screen")}
2021-12-15 10:23:49 +08:00
</LinkButton>
2021-12-11 08:42:18 +08:00
)}
</FullScreenView>
);
}
export function CrashView() {
2022-10-10 21:19:10 +08:00
const { t } = useTranslation();
const { submitRageshake, sending, sent, error } = useSubmitRageshake();
const sendDebugLogs = useCallback(() => {
submitRageshake({
description: "**Soft Crash**",
sendLogs: true,
});
}, [submitRageshake]);
const onReload = useCallback(() => {
window.location.href = "/";
}, []);
2022-10-10 21:19:10 +08:00
let logsComponent: JSX.Element | null = null;
if (sent) {
2022-10-10 21:19:10 +08:00
logsComponent = <div>{t("Thanks! We'll get right on it.")}</div>;
} else if (sending) {
2022-10-10 21:19:10 +08:00
logsComponent = <div>{t("Sending…")}</div>;
} else if (Config.get().rageshake?.submit_url) {
logsComponent = (
<Button
size="lg"
variant="default"
onPress={sendDebugLogs}
className={styles.wideButton}
>
2022-10-10 21:19:10 +08:00
{t("Send debug logs")}
</Button>
);
}
return (
<FullScreenView>
2022-10-10 21:19:10 +08:00
<Trans>
<h1>Oops, something's gone wrong.</h1>
</Trans>
{Config.get().rageshake?.submit_url && (
<Trans>
<p>Submitting debug logs will help us track down the problem.</p>
</Trans>
)}
<div className={styles.sendLogsSection}>{logsComponent}</div>
2022-10-10 21:19:10 +08:00
{error && (
<ErrorMessage error={translatedError("Couldn't send debug logs!", t)} />
)}
<Button
size="lg"
variant="default"
className={styles.wideButton}
onPress={onReload}
>
2022-10-10 21:19:10 +08:00
{t("Return to home screen")}
</Button>
</FullScreenView>
);
}
2021-12-11 08:42:18 +08:00
export function LoadingView() {
2022-10-10 21:19:10 +08:00
const { t } = useTranslation();
2021-12-11 08:42:18 +08:00
return (
<FullScreenView>
2022-10-10 21:19:10 +08:00
<h1>{t("Loading…")}</h1>
2021-12-11 08:42:18 +08:00
</FullScreenView>
);
}