From c4aaa7c915587343a5d1ec4a4f32d6d6886fa992 Mon Sep 17 00:00:00 2001 From: Dayuan Jiang <34411969+DayuanJiang@users.noreply.github.com> Date: Mon, 8 Dec 2025 11:00:14 +0900 Subject: [PATCH] feat: only show access code field when password is configured (#161) Co-authored-by: dayuan.jiang --- components/settings-dialog.tsx | 118 +++++++++++++++++++++------------ 1 file changed, 76 insertions(+), 42 deletions(-) diff --git a/components/settings-dialog.tsx b/components/settings-dialog.tsx index b5570b2..3779ad2 100644 --- a/components/settings-dialog.tsx +++ b/components/settings-dialog.tsx @@ -6,7 +6,6 @@ import { Dialog, DialogContent, DialogDescription, - DialogFooter, DialogHeader, DialogTitle, } from "@/components/ui/dialog" @@ -22,6 +21,14 @@ interface SettingsDialogProps { export const STORAGE_ACCESS_CODE_KEY = "next-ai-draw-io-access-code" export const STORAGE_CLOSE_PROTECTION_KEY = "next-ai-draw-io-close-protection" +const STORAGE_ACCESS_CODE_REQUIRED_KEY = "next-ai-draw-io-access-code-required" + +function getStoredAccessCodeRequired(): boolean | null { + if (typeof window === "undefined") return null + const stored = localStorage.getItem(STORAGE_ACCESS_CODE_REQUIRED_KEY) + if (stored === null) return null + return stored === "true" +} export function SettingsDialog({ open, @@ -32,6 +39,32 @@ export function SettingsDialog({ const [closeProtection, setCloseProtection] = useState(true) const [isVerifying, setIsVerifying] = useState(false) const [error, setError] = useState("") + const [accessCodeRequired, setAccessCodeRequired] = useState( + () => getStoredAccessCodeRequired() ?? false, + ) + + useEffect(() => { + // Only fetch if not cached in localStorage + if (getStoredAccessCodeRequired() !== null) return + + fetch("/api/config") + .then((res) => { + if (!res.ok) throw new Error(`HTTP ${res.status}`) + return res.json() + }) + .then((data) => { + const required = data?.accessCodeRequired === true + localStorage.setItem( + STORAGE_ACCESS_CODE_REQUIRED_KEY, + String(required), + ) + setAccessCodeRequired(required) + }) + .catch(() => { + // Don't cache on error - allow retry on next mount + setAccessCodeRequired(false) + }) + }, []) useEffect(() => { if (open) { @@ -49,11 +82,12 @@ export function SettingsDialog({ }, [open]) const handleSave = async () => { + if (!accessCodeRequired) return + setError("") setIsVerifying(true) try { - // Verify access code with server const response = await fetch("/api/verify-access-code", { method: "POST", headers: { @@ -65,17 +99,10 @@ export function SettingsDialog({ if (!data.valid) { setError(data.message || "Invalid access code") - setIsVerifying(false) return } - // Save settings only if verification passes localStorage.setItem(STORAGE_ACCESS_CODE_KEY, accessCode.trim()) - localStorage.setItem( - STORAGE_CLOSE_PROTECTION_KEY, - closeProtection.toString(), - ) - onCloseProtectionChange?.(closeProtection) onOpenChange(false) } catch { setError("Failed to verify access code") @@ -97,31 +124,42 @@ export function SettingsDialog({ Settings - Configure your access settings. + Configure your application settings.
-
- - setAccessCode(e.target.value)} - onKeyDown={handleKeyDown} - placeholder="Enter access code" - autoComplete="off" - /> -

- Required if the server has enabled access control. -

- {error && ( -

- {error} + {accessCodeRequired && ( +

+ +
+ + setAccessCode(e.target.value) + } + onKeyDown={handleKeyDown} + placeholder="Enter access code" + autoComplete="off" + /> + +
+

+ Required to use this application.

- )} -
+ {error && ( +

+ {error} +

+ )} +
+ )}
- - - - )