From 06c711bdaf13f3240eaf044c0c9d09127f04206f Mon Sep 17 00:00:00 2001 From: cfngc4594 Date: Tue, 18 Mar 2025 14:43:48 +0800 Subject: [PATCH] feat(form): add language-server form for settings --- .../@admin/settings/language-server/form.tsx | 181 ++++++++++++++++++ 1 file changed, 181 insertions(+) create mode 100644 src/app/(app)/dashboard/@admin/settings/language-server/form.tsx diff --git a/src/app/(app)/dashboard/@admin/settings/language-server/form.tsx b/src/app/(app)/dashboard/@admin/settings/language-server/form.tsx new file mode 100644 index 0000000..3c3ffc2 --- /dev/null +++ b/src/app/(app)/dashboard/@admin/settings/language-server/form.tsx @@ -0,0 +1,181 @@ +"use client"; + +import { z } from "zod"; +import { + Form, + FormControl, + FormDescription, + FormField, + FormItem, + FormLabel, + FormMessage, +} from "@/components/ui/form"; +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from "@/components/ui/select"; +import { useForm } from "react-hook-form"; +import { Input } from "@/components/ui/input"; +import { Button } from "@/components/ui/button"; +import { Separator } from "@/components/ui/separator"; +import { zodResolver } from "@hookform/resolvers/zod"; +import { EditorLanguage, LanguageServerProtocol } from "@prisma/client"; +import { handleLanguageServerConfigSubmit } from "@/app/actions/language-server"; + +const settingsLanguageServerFormSchema = z.object({ + protocol: z.nativeEnum(LanguageServerProtocol), + hostname: z.string(), + port: z + .number() + .nullable() + .transform((val) => (val === undefined ? null : val)), + path: z + .string() + .nullable() + .transform((val) => (val === "" || val === undefined ? null : val)), +}); + +export type SettingsLanguageServerFormValues = z.infer; + +interface SettingsLanguageServerFormProps { + defaultValues: Partial; + language: EditorLanguage; +} + +export function SettingsLanguageServerForm({ + defaultValues, + language, +}: SettingsLanguageServerFormProps) { + const form = useForm({ + resolver: zodResolver(settingsLanguageServerFormSchema), + defaultValues, + mode: "onChange", + }); + + const onSubmit = async (data: SettingsLanguageServerFormValues) => { + await handleLanguageServerConfigSubmit(language, data); + }; + + return ( +
+ + ( + +
+ Protocol + + This is the protocol of the language server. + +
+
+ + +
+
+ )} + /> + + ( + +
+ Hostname + + This is the hostname of the language server. + +
+
+ + + + +
+
+ )} + /> + + ( + +
+ Port + + This is the port of the language server. + +
+
+ + { + const value = e.target.value; + field.onChange(value === "" ? null : Number(value)); + }} + className="w-full" + /> + + +
+
+ )} + /> + + ( + +
+ Path + + This is the path of the language server. + +
+
+ + + + +
+
+ )} + /> +
+ +
+ + + ); +}