"use client" import { useEffect, useState } from "react" import { Button } from "@/components/ui/button" import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, } from "@/components/ui/dialog" import { Input } from "@/components/ui/input" import { Label } from "@/components/ui/label" import { Switch } from "@/components/ui/switch" interface SettingsDialogProps { open: boolean onOpenChange: (open: boolean) => void onCloseProtectionChange?: (enabled: boolean) => void } 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, onOpenChange, onCloseProtectionChange, }: SettingsDialogProps) { const [accessCode, setAccessCode] = useState("") 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) { const storedCode = localStorage.getItem(STORAGE_ACCESS_CODE_KEY) || "" setAccessCode(storedCode) const storedCloseProtection = localStorage.getItem( STORAGE_CLOSE_PROTECTION_KEY, ) // Default to true if not set setCloseProtection(storedCloseProtection !== "false") setError("") } }, [open]) const handleSave = async () => { if (!accessCodeRequired) return setError("") setIsVerifying(true) try { const response = await fetch("/api/verify-access-code", { method: "POST", headers: { "x-access-code": accessCode.trim(), }, }) const data = await response.json() if (!data.valid) { setError(data.message || "Invalid access code") return } localStorage.setItem(STORAGE_ACCESS_CODE_KEY, accessCode.trim()) onOpenChange(false) } catch { setError("Failed to verify access code") } finally { setIsVerifying(false) } } const handleKeyDown = (e: React.KeyboardEvent) => { if (e.key === "Enter") { e.preventDefault() handleSave() } } return ( Settings Configure your application settings.
{accessCodeRequired && (
setAccessCode(e.target.value) } onKeyDown={handleKeyDown} placeholder="Enter access code" autoComplete="off" />

Required to use this application.

{error && (

{error}

)}
)}

Show confirmation when leaving the page.

{ setCloseProtection(checked) localStorage.setItem( STORAGE_CLOSE_PROTECTION_KEY, checked.toString(), ) onCloseProtectionChange?.(checked) }} />
) }