"use client"; import * as z from "zod"; import { zodResolver } from "@hookform/resolvers/zod"; import { useForm } from "react-hook-form"; import { Button } from "@/components/ui/button"; import { Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, } from "@/components/ui/form"; import { Input } from "@/components/ui/input"; import { READ_SCOPES, WRITE_SCOPES, ADMIN_READ_SCOPES, ADMIN_WRITE_SCOPES, } from "@/lib/utils"; import ScopeSection from "./ScopeSection"; export type MethodType = | "read" | "write" | "follow" | "crypto" | "follow" | "admin" | "push"; export interface ScopeInfo { method: MethodType; label: string; scopes?: string[] | string[][]; description: string; } const scopesInfo: ScopeInfo[] = [ { method: "read", label: "Read", scopes: READ_SCOPES, description: "read account's data", }, { method: "write", label: "Write", scopes: WRITE_SCOPES, description: "modify account's data", }, { method: "admin", label: "Admin", scopes: [ADMIN_READ_SCOPES, ADMIN_WRITE_SCOPES], description: "read all data on the server", }, { method: "follow", label: "Follow", description: "modify account relationships,deprecated in 3.5.0 and newer.", }, { method: "push", label: "Push", description: "receive push notifications", }, { method: "crypto", label: "Crypto", description: "use end-to-end encryption", }, ]; const formSchema = z.object({ instance: z.string().trim(), clientName: z.string().trim(), redirectUris: z.string().trim(), scopes: z.string().array().nonempty().optional(), website: z.string().url().trim().optional(), }); const InputForm = () => { const form = useForm<z.infer<typeof formSchema>>({ resolver: zodResolver(formSchema), defaultValues: { instance: "https://", clientName: "", redirectUris: "", scopes: [], }, }); function onSubmit(values: z.infer<typeof formSchema>) { const scopes = values.scopes?.join(" "); console.log(scopes); } return ( <Form {...form}> <form onSubmit={form.handleSubmit(onSubmit)} className="space-y-6"> <FormField control={form.control} name="instance" render={({ field }) => ( <FormItem> <FormLabel>Instance</FormLabel> <FormControl> <Input {...field} /> </FormControl> <FormMessage /> </FormItem> )} /> <FormField control={form.control} name="clientName" render={({ field }) => ( <FormItem> <FormLabel>Application name</FormLabel> <FormControl> <Input {...field} /> </FormControl> <FormMessage /> </FormItem> )} /> <FormField control={form.control} name="website" render={({ field }) => ( <FormItem> <FormLabel>Application Website</FormLabel> <FormControl> <Input {...field} /> </FormControl> <FormMessage /> </FormItem> )} /> <FormField control={form.control} name="redirectUris" render={({ field }) => ( <FormItem> <FormLabel>Redirect URI</FormLabel> <FormControl> <Input {...field} /> </FormControl> <FormDescription> Use{" "} <code className="relative rounded bg-muted px-[0.3rem] py-[0.2rem] font-mono text-xs font-semibold"> urn:ietf:wg:oauth:2.0:oob </code>{" "} for local tests </FormDescription> <FormMessage /> </FormItem> )} /> <FormField control={form.control} name="scopes" render={() => ( <FormItem> <FormLabel>Scopes</FormLabel> <FormControl className="flex flex-col gap-2"> <FormField control={form.control} name="scopes" render={({ field }) => ( <FormItem> <div className="flex flex-col gap-2"> {scopesInfo.map((info) => ( <ScopeSection key={info.method} info={info} field={field} /> ))} </div> </FormItem> )} ></FormField> </FormControl> <FormMessage /> </FormItem> )} /> <Button type="submit">Submit</Button> </form> </Form> ); }; export default InputForm;