import { zodResolver } from "@hookform/resolvers/zod"; import { useQuery } from "@tanstack/react-query"; import { Button } from "@workspace/ui/components/button"; import { Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, } from "@workspace/ui/components/form"; import { ScrollArea } from "@workspace/ui/components/scroll-area"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@workspace/ui/components/select"; import { Sheet, SheetContent, SheetFooter, SheetHeader, SheetTitle, SheetTrigger, } from "@workspace/ui/components/sheet"; import { Switch } from "@workspace/ui/components/switch"; import { EnhancedInput } from "@workspace/ui/composed/enhanced-input"; import { Icon } from "@workspace/ui/composed/icon"; import { getVerifyConfig, updateVerifyConfig, } from "@workspace/ui/services/admin/system"; import { useEffect, useState } from "react"; import { useForm } from "react-hook-form"; import { useTranslation } from "react-i18next"; import { toast } from "sonner"; import { z } from "zod"; const verifySchema = z.object({ captcha_type: z.string().optional(), turnstile_site_key: z.string().optional(), turnstile_secret: z.string().optional(), enable_user_login_captcha: z.boolean().optional(), enable_user_register_captcha: z.boolean().optional(), enable_admin_login_captcha: z.boolean().optional(), enable_user_reset_password_captcha: z.boolean().optional(), }); type VerifyFormData = z.infer; export default function VerifyConfig() { const { t } = useTranslation("system"); const [open, setOpen] = useState(false); const [loading, setLoading] = useState(false); const { data, refetch } = useQuery({ queryKey: ["getVerifyConfig"], queryFn: async () => { const { data } = await getVerifyConfig(); return data.data; }, enabled: open, }); const form = useForm({ resolver: zodResolver(verifySchema), defaultValues: { captcha_type: "local", turnstile_site_key: "", turnstile_secret: "", enable_user_login_captcha: false, enable_user_register_captcha: false, enable_admin_login_captcha: false, enable_user_reset_password_captcha: false, }, }); useEffect(() => { if (data) { form.reset(data); } }, [data, form]); async function onSubmit(values: VerifyFormData) { setLoading(true); try { await updateVerifyConfig(values as API.VerifyConfig); toast.success(t("verify.saveSuccess", "Save Successful")); refetch(); setOpen(false); } catch (_error) { toast.error(t("verify.saveFailed", "Save Failed")); } finally { setLoading(false); } } return (

{t("verify.title", "Security Verification")}

{t( "verify.description", "Configure Turnstile CAPTCHA and verification settings" )}

{t("verify.title", "Security Verification")}
( {t("verify.captchaType", "Captcha Type")} {t( "verify.captchaTypeDescription", "Choose between local image captcha (offline) or Cloudflare Turnstile" )} )} /> {form.watch("captcha_type") === "turnstile" && ( <> ( {t("verify.turnstileSiteKey", "Turnstile Site Key")} {t( "verify.turnstileSiteKeyDescription", "Cloudflare Turnstile site key for frontend verification" )} )} /> ( {t("verify.turnstileSecret", "Turnstile Secret Key")} {t( "verify.turnstileSecretDescription", "Cloudflare Turnstile secret key for backend verification" )} )} /> )} ( {t( "verify.enableUserLoginCaptcha", "Enable User Login Captcha" )} {t( "verify.enableUserLoginCaptchaDescription", "When enabled, users must pass captcha verification during login" )} )} /> ( {t( "verify.enableUserRegisterCaptcha", "Enable User Registration Captcha" )} {t( "verify.enableUserRegisterCaptchaDescription", "When enabled, users must pass captcha verification during registration" )} )} /> ( {t( "verify.enableUserResetPasswordCaptcha", "Enable User Password Reset Captcha" )} {t( "verify.enableUserResetPasswordCaptchaDescription", "When enabled, users must pass captcha verification during password reset" )} )} /> ( {t( "verify.enableAdminLoginCaptcha", "Enable Admin Authentication Captcha" )} {t( "verify.enableAdminLoginCaptchaDescription", "When enabled, administrators must pass captcha verification during login" )} )} />
); }