Files
frigate/web/src/components/config-form/ConfigFieldMessage.tsx
T

76 lines
2.0 KiB
TypeScript
Raw Normal View History

2026-03-29 16:25:40 -05:00
import { useTranslation } from "react-i18next";
import { Link } from "react-router-dom";
2026-03-29 16:25:40 -05:00
import { Alert, AlertDescription } from "@/components/ui/alert";
import {
LuInfo,
LuTriangleAlert,
LuCircleAlert,
LuExternalLink,
} from "react-icons/lu";
import { useDocDomain } from "@/hooks/use-doc-domain";
2026-03-29 16:25:40 -05:00
import type { MessageSeverity } from "./section-configs/types";
const severityVariantMap: Record<
MessageSeverity,
"info" | "warning" | "destructive"
> = {
info: "info",
warning: "warning",
error: "destructive",
};
function SeverityIcon({ severity }: { severity: string }) {
switch (severity) {
case "info":
2026-06-04 13:48:58 -05:00
return <LuInfo className="size-4 shrink-0" />;
2026-03-29 16:25:40 -05:00
case "warning":
2026-06-04 13:48:58 -05:00
return <LuTriangleAlert className="size-4 shrink-0" />;
2026-03-29 16:25:40 -05:00
case "error":
2026-06-04 13:48:58 -05:00
return <LuCircleAlert className="size-4 shrink-0" />;
2026-03-29 16:25:40 -05:00
default:
2026-06-04 13:48:58 -05:00
return <LuInfo className="size-4 shrink-0" />;
2026-03-29 16:25:40 -05:00
}
}
type ConfigFieldMessageProps = {
messageKey: string;
severity: string;
values?: Record<string, unknown>;
docLink?: string;
2026-03-29 16:25:40 -05:00
};
export function ConfigFieldMessage({
messageKey,
severity,
values,
docLink,
2026-03-29 16:25:40 -05:00
}: ConfigFieldMessageProps) {
const { t } = useTranslation(["views/settings", "common"]);
const { getLocaleDocUrl } = useDocDomain();
2026-03-29 16:25:40 -05:00
return (
<Alert
variant={severityVariantMap[severity as MessageSeverity] ?? "info"}
className="flex items-center [&>svg+div]:translate-y-0 [&>svg]:static [&>svg~*]:pl-2"
>
<SeverityIcon severity={severity} />
<AlertDescription>
<div className="flex flex-col gap-1">
<span>{t(messageKey, values)}</span>
{docLink && (
<Link
to={getLocaleDocUrl(docLink)}
target="_blank"
rel="noopener noreferrer"
className="inline-flex items-center underline"
>
{t("readTheDocumentation", { ns: "common" })}
<LuExternalLink className="ml-2 inline-flex size-3" />
</Link>
)}
</div>
</AlertDescription>
2026-03-29 16:25:40 -05:00
</Alert>
);
}