fix(i18n): unify shared view states
This commit is contained in:
@@ -3,6 +3,7 @@ import React from "react";
|
||||
import { Alert, Box, Button, CircularProgress, Typography } from "@mui/material";
|
||||
|
||||
import type { ViewResourceError } from "../hooks/useViewResource";
|
||||
import { useI18n } from "../i18n/I18nProvider";
|
||||
|
||||
type Props = {
|
||||
loading?: boolean;
|
||||
@@ -14,11 +15,14 @@ type Props = {
|
||||
compact?: boolean;
|
||||
};
|
||||
|
||||
export default function ViewStateNotice({ loading = false, error = null, title, description, retryLabel = "Retry", onRetry, compact = false }: Props) {
|
||||
export default function ViewStateNotice({ loading = false, error = null, title, description, retryLabel, onRetry, compact = false }: Props) {
|
||||
const { t } = useI18n();
|
||||
const resolvedRetryLabel = retryLabel ?? t("retry");
|
||||
|
||||
if (loading) {
|
||||
return (
|
||||
<Box sx={{ py: compact ? 3 : 6, display: "flex", justifyContent: "center" }}>
|
||||
<CircularProgress size={compact ? 24 : 28} />
|
||||
<Box role="status" aria-live="polite" sx={{ py: compact ? 3 : 6, display: "flex", justifyContent: "center" }}>
|
||||
<CircularProgress size={compact ? 24 : 28} aria-label={t("loading")} />
|
||||
</Box>
|
||||
);
|
||||
}
|
||||
@@ -26,6 +30,7 @@ export default function ViewStateNotice({ loading = false, error = null, title,
|
||||
if (!error) return null;
|
||||
|
||||
const severity = error.kind === "unauthorized" ? "warning" : error.kind === "unavailable" ? "error" : "error";
|
||||
const detail = error.message !== title && error.message !== description ? error.message : null;
|
||||
|
||||
return (
|
||||
<Alert
|
||||
@@ -35,11 +40,11 @@ export default function ViewStateNotice({ loading = false, error = null, title,
|
||||
alignItems: "flex-start",
|
||||
borderRadius: 3,
|
||||
}}
|
||||
action={error.retryable && onRetry ? <Button color="inherit" size="small" onClick={() => void onRetry()}>{retryLabel}</Button> : undefined}
|
||||
action={error.retryable && onRetry ? <Button color="inherit" size="small" onClick={() => void onRetry()}>{resolvedRetryLabel}</Button> : undefined}
|
||||
>
|
||||
<Typography sx={{ fontWeight: 800, mb: 0.35 }}>{title}</Typography>
|
||||
{description ? <Typography variant="body2">{description}</Typography> : null}
|
||||
{error.message ? <Typography variant="body2" sx={{ mt: 0.5 }}>{error.message}</Typography> : null}
|
||||
{detail ? <Typography variant="body2" sx={{ mt: 0.5 }}>{detail}</Typography> : null}
|
||||
</Alert>
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user