import { RULE_ACTION, RULE_CONDITION_FIELD_NAME, RULE_CONDITION_OPERATOR, TRuleCondition } from '@common/rule' import { zodResolver } from '@hookform/resolvers/zod' import RuleConditions from '@renderer/components/RuleConditions' import { Button } from '@renderer/components/ui/button' import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from '@renderer/components/ui/form' import { Input } from '@renderer/components/ui/input' import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@renderer/components/ui/select' import { Switch } from '@renderer/components/ui/switch' import { ArrowLeft, Loader2 } from 'lucide-react' import { useEffect, useState } from 'react' import { useForm } from 'react-hook-form' import { Link, useParams } from 'react-router-dom' import { z } from 'zod' const formSchema = z.object({ name: z .string() .min(1, 'Name is required') .regex(/^[a-zA-Z0-9-]+$/, 'Only alphanumeric characters and hyphens are allowed'), description: z.string().optional(), action: z.enum(['block', 'allow']), enabled: z.boolean() }) type TFormSchema = z.infer export default function EditRule(): JSX.Element { const { id } = useParams<{ id?: string }>() const [ruleId, setRuleId] = useState(null) const [saving, setSaving] = useState(false) const [ruleConditions, setRuleConditions] = useState([ { operator: RULE_CONDITION_OPERATOR.IN, values: [] } ]) const form = useForm({ resolver: zodResolver(formSchema), defaultValues: { name: '', description: '', action: RULE_ACTION.BLOCK, enabled: false } }) const init = async () => { if (!id) return const idNumber = parseInt(id) if (isNaN(idNumber)) return const rule = await window.api.rule.findById(idNumber) if (!rule) return setRuleId(idNumber) form.reset({ name: rule.name, description: rule.description ?? '', action: rule.action, enabled: rule.enabled }) setRuleConditions(rule.conditions) } useEffect(() => { init() }, []) const onSubmit = form.handleSubmit(async (data) => { setSaving(true) if (ruleId) { await window.api.rule.update(ruleId, { ...data, conditions: ruleConditions }) } else { await window.api.rule.create({ ...data, conditions: ruleConditions }) } window.location.href = '#/rules' }) return (
( Rule name )} /> ( Description (Optional) )} /> ( Action )} /> Conditions
(
Enabled
)} />
) }