"use client"; import { SettingsSection, SettingsSectionBody, SettingsSectionDescription, SettingsSectionForm, SettingsSectionHeader, SettingsSectionTitle } from "@app/components/Settings"; import { useEnvContext } from "@app/hooks/useEnvContext"; import { zodResolver } from "@hookform/resolvers/zod"; import { useTranslations } from "next-intl"; import z from "zod"; import { createApiClient } from "@app/lib/api"; import { useRouter } from "next/navigation"; import { createPolicySchema } from "."; import { Credenza, CredenzaBody, CredenzaClose, CredenzaContent, CredenzaDescription, CredenzaFooter, CredenzaHeader, CredenzaTitle } from "@app/components/Credenza"; import { SwitchInput } from "@app/components/SwitchInput"; import { Button } from "@app/components/ui/button"; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from "@app/components/ui/form"; import { Input } from "@app/components/ui/input"; import { InputOTP, InputOTPGroup, InputOTPSlot } from "@app/components/ui/input-otp"; import { Binary, Bot, Key, Plus } from "lucide-react"; import { cn } from "@app/lib/cn"; import { useResourcePolicyContext } from "@app/providers/ResourcePolicyProvider"; import { useActionState, useState } from "react"; import { useForm } from "react-hook-form"; // ─── PolicyAuthMethodsSection ───────────────────────────────────────────────── const setPasswordSchema = z.object({ password: z.string().min(4).max(100) }); const setPincodeSchema = z.object({ pincode: z.string().length(6) }); const setHeaderAuthSchema = z.object({ user: z.string().min(4).max(100), password: z.string().min(4).max(100), extendedCompatibility: z.boolean() }); export function EditPolicyAuthMethodsSectionForm() { const { policy } = useResourcePolicyContext(); const router = useRouter(); const api = createApiClient(useEnvContext()); const form = useForm({ resolver: zodResolver( createPolicySchema.pick({ password: true, pincode: true, headerAuth: true }) ) }); const t = useTranslations(); const [isExpanded, setIsExpanded] = useState(false); const [isSetPasswordOpen, setIsSetPasswordOpen] = useState(false); const [isSetPincodeOpen, setIsSetPincodeOpen] = useState(false); const [isSetHeaderAuthOpen, setIsSetHeaderAuthOpen] = useState(false); const hasPassword = Boolean(form.watch("password") ?? policy.passwordId); const hasPincode = Boolean(form.watch("pincode") ?? policy.pincodeId); const hasHeaderAuth = Boolean( form.watch("headerAuth") ?? policy.headerAuth ); const passwordForm = useForm({ resolver: zodResolver(setPasswordSchema), defaultValues: { password: "" } }); const pincodeForm = useForm({ resolver: zodResolver(setPincodeSchema), defaultValues: { pincode: "" } }); const headerAuthForm = useForm({ resolver: zodResolver(setHeaderAuthSchema), defaultValues: { user: "", password: "", extendedCompatibility: true } }); const [, formAction, isSubmitting] = useActionState(onSubmit, null); async function onSubmit() { const isValid = await form.trigger(); if (!isValid) return; const payload = form.getValues(); console.log({ payload }); } if (!isExpanded) { return ( {t("resourceAuthMethods")} {t("resourcePolicyAuthMethodsDescription")} ); } return ( <> {/* Password Credenza */} { setIsSetPasswordOpen(val); if (!val) passwordForm.reset(); }} > {t("resourcePasswordSetupTitle")} {t("resourcePasswordSetupTitleDescription")}
{ form.setValue("password", data); setIsSetPasswordOpen(false); passwordForm.reset(); })} className="space-y-4" id="set-password-form" > ( {t("password")} )} />
{/* Pincode Credenza */} { setIsSetPincodeOpen(val); if (!val) pincodeForm.reset(); }} > {t("resourcePincodeSetupTitle")} {t("resourcePincodeSetupTitleDescription")}
{ form.setValue("pincode", data); setIsSetPincodeOpen(false); pincodeForm.reset(); })} className="space-y-4" id="set-pincode-form" > ( {t("resourcePincode")}
)} />
{/* Header Auth Credenza */} { setIsSetHeaderAuthOpen(val); if (!val) headerAuthForm.reset(); }} > {t("resourceHeaderAuthSetupTitle")} {t("resourceHeaderAuthSetupTitleDescription")}
{ form.setValue("headerAuth", data); setIsSetHeaderAuthOpen(false); headerAuthForm.reset(); } )} className="space-y-4" id="set-header-auth-form" > ( {t("user")} )} /> ( {t("password")} )} /> ( )} />
{}}> {t("resourceAuthMethods")} {t("resourcePolicyAuthMethodsDescription")} {/* Password row */}
{t("resourcePasswordProtection", { status: hasPassword ? t("enabled") : t("disabled") })}
{/* Pincode row */}
{t("resourcePincodeProtection", { status: hasPincode ? t("enabled") : t("disabled") })}
{/* Header auth row */}
{hasHeaderAuth ? t( "resourceHeaderAuthProtectionEnabled" ) : t( "resourceHeaderAuthProtectionDisabled" )}
); }