ai_api / src /app /(dashboard) /dashboard /BootstrapBanner.tsx
Yogesh
initial deploy
cd8bd0a
Raw
History Blame Contribute Delete
2.26 kB
"use client";
import { useState } from "react";
import { useTranslations } from "next-intl";
/**
* Shown when OmniRoute was started with auto-generated secrets (zero-config mode).
* The banner is dismissable and persists only for the current session.
*/
export default function BootstrapBanner() {
const t = useTranslations("common");
const [dismissed, setDismissed] = useState(false);
if (dismissed) return null;
// Determine default data dir hint based on platform hint from user-agent
const dataDir =
typeof navigator !== "undefined" && navigator.platform?.startsWith("Win")
? "%APPDATA%\\omniroute\\server.env"
: "~/.omniroute/server.env";
return (
<div
role="alert"
className="flex items-start gap-3 rounded-lg border border-amber-300 dark:border-amber-500/30 bg-amber-50 dark:bg-amber-500/10 px-4 py-3 text-sm text-amber-900 dark:text-amber-200 mb-4"
>
<span className="text-amber-500 dark:text-amber-400 text-base shrink-0 mt-0.5">⚠️</span>
<div className="flex-1 min-w-0">
<p className="font-semibold text-amber-900 dark:text-amber-300">
Running in zero-config mode
</p>
<p className="mt-0.5 text-amber-800/80 dark:text-amber-200/80">
OmniRoute auto-generated secure encryption keys on first launch. They are persisted to{" "}
<code className="font-mono bg-amber-200/50 dark:bg-amber-500/20 px-1 rounded text-xs">
{dataDir}
</code>
. No action is required — your data is encrypted and safe. To use custom keys, add{" "}
<code className="font-mono bg-amber-200/50 dark:bg-amber-500/20 px-1 rounded text-xs">
JWT_SECRET
</code>{" "}
and{" "}
<code className="font-mono bg-amber-200/50 dark:bg-amber-500/20 px-1 rounded text-xs">
STORAGE_ENCRYPTION_KEY
</code>{" "}
to that file.
</p>
</div>
<button
onClick={() => setDismissed(true)}
className="shrink-0 text-amber-600/60 hover:text-amber-700 dark:text-amber-400/60 dark:hover:text-amber-300 transition-colors ml-1"
aria-label={t("bootstrapBannerDismiss")}
>
</button>
</div>
);
}