"use client"; import * as z from "zod"; import { Dispatch, SetStateAction, useState } from "react"; import { useForm } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; import { Loader2 } from "lucide-react"; import Image from "next/image"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, } from "@/components/ui/form"; import ScopeSection from "@/components/scopes/ScopeSection"; import { AppInfo } from "@/components/FormContainer"; import { getScopes } from "@/lib/scopes"; import { Credentials } from "@/lib/types"; const formSchema = z.object({ instanceUrl: z.string().url().trim(), instanceType: z.enum(["mastodon", "akkoma", "misskey", "pleroma"]), clientName: z.string().trim(), redirectUris: z.string().trim(), scopes: z.string().array().nonempty().optional(), website: z.string().url().trim().optional(), }); export type FormSchema = z.infer; export type InstanceType = FormSchema["instanceType"]; interface CreateAppFormProps { createApp: ({}: FormSchema) => Promise; setAppInfo: Dispatch>; credentials: Credentials | undefined; } const CreateAppForm: React.FC = ({ createApp, setAppInfo, credentials, }) => { const [isSubmitted, setIsSubmitted] = useState(false); const form = useForm({ resolver: zodResolver(formSchema), defaultValues: { instanceUrl: "https://", instanceType: "mastodon", clientName: "", redirectUris: "urn:ietf:wg:oauth:2.0:oob", scopes: ["read"], website: "", }, mode: "onChange", }); const watchInstancType = form.watch("instanceType"); const onSubmit = async (values: FormSchema) => { console.log(values); setAppInfo(values); setIsSubmitted(true); await createApp(values); }; return (
( Instance* )} /> ( Instance Type )} /> ( Application name* )} /> ( Application Website )} /> ( Redirect URI* Use{" "} urn:ietf:wg:oauth:2.0:oob {" "} for local tests or to obtaining an access token. )} /> ( Scopes (
{getScopes(watchInstancType).map((info) => ( ))}
)} >
)} /> {!credentials && isSubmitted ? ( ) : ( )} ); }; export default CreateAppForm;