'use client' import { useForm } from 'react-hook-form' import { zodResolver } from '@hookform/resolvers/zod' import { z } from 'zod' import { toast } from 'sonner' import { Loader2, Shield } from 'lucide-react' import { trpc } from '@/lib/trpc/client' import { Button } from '@/components/ui/button' import { Input } from '@/components/ui/input' import { Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, } from '@/components/ui/form' const formSchema = z.object({ session_duration_hours: z.string().regex(/^\d+$/, 'Must be a number'), magic_link_expiry_minutes: z.string().regex(/^\d+$/, 'Must be a number'), rate_limit_requests_per_minute: z.string().regex(/^\d+$/, 'Must be a number'), }) type FormValues = z.infer interface SecuritySettingsFormProps { settings: { session_duration_hours?: string magic_link_expiry_minutes?: string rate_limit_requests_per_minute?: string } } export function SecuritySettingsForm({ settings }: SecuritySettingsFormProps) { const utils = trpc.useUtils() const form = useForm({ resolver: zodResolver(formSchema), defaultValues: { session_duration_hours: settings.session_duration_hours || '24', magic_link_expiry_minutes: settings.magic_link_expiry_minutes || '15', rate_limit_requests_per_minute: settings.rate_limit_requests_per_minute || '60', }, }) const updateSettings = trpc.settings.updateMultiple.useMutation({ onSuccess: () => { toast.success('Security settings saved successfully') utils.settings.getByCategory.invalidate({ category: 'SECURITY' }) }, onError: (error) => { toast.error(`Failed to save settings: ${error.message}`) }, }) const onSubmit = (data: FormValues) => { updateSettings.mutate({ settings: [ { key: 'session_duration_hours', value: data.session_duration_hours }, { key: 'magic_link_expiry_minutes', value: data.magic_link_expiry_minutes }, { key: 'rate_limit_requests_per_minute', value: data.rate_limit_requests_per_minute }, ], }) } return (
( Session Duration (hours) How long user sessions remain valid before requiring re-authentication. Recommended: 24 hours for jury members, up to 168 hours (1 week) for admins. )} /> ( Magic Link Expiry (minutes) How long magic link authentication links remain valid. Shorter is more secure. Recommended: 15 minutes. )} /> ( API Rate Limit (requests/minute) Maximum API requests allowed per minute per user. Helps prevent abuse and ensures fair resource usage. )} />

Security Note: Changing these settings affects all users immediately. Reducing session duration will not log out existing sessions but will prevent renewal.

) }