2026-03-29 16:25:40 -05:00
|
|
|
import { useTranslation } from "react-i18next";
|
2026-06-25 18:25:59 -05:00
|
|
|
import { Link } from "react-router-dom";
|
2026-03-29 16:25:40 -05:00
|
|
|
import { Alert, AlertDescription } from "@/components/ui/alert";
|
2026-06-25 18:25:59 -05:00
|
|
|
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;
|
2026-06-25 18:25:59 -05:00
|
|
|
values?: Record<string, unknown>;
|
|
|
|
|
docLink?: string;
|
2026-03-29 16:25:40 -05:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
export function ConfigFieldMessage({
|
|
|
|
|
messageKey,
|
|
|
|
|
severity,
|
2026-06-25 18:25:59 -05:00
|
|
|
values,
|
|
|
|
|
docLink,
|
2026-03-29 16:25:40 -05:00
|
|
|
}: ConfigFieldMessageProps) {
|
2026-06-25 18:25:59 -05:00
|
|
|
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} />
|
2026-06-25 18:25:59 -05:00
|
|
|
<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>
|
|
|
|
|
);
|
|
|
|
|
}
|