import { Button } from "~/components/ui/button"; import Card, { CardTitle } from "~/components/ui/card"; import { FormLabel } from "~/components/ui/form-field"; import Input from "~/components/ui/input"; import { useData } from "~/renderer/hooks"; import { Data } from "./+data"; import { useForm } from "~/hooks/useForm"; import { z } from "zod"; import { Controller } from "react-hook-form"; import { navigate } from "vike/client/router"; import Divider from "~/components/ui/divider"; import trpc from "~/lib/trpc"; import { useAuth } from "~/hooks/useAuth"; import { usePageContext } from "~/renderer/context"; import { useMemo } from "react"; const schema = z.object({ forkFromId: z.number(), title: z.string(), user: z .object({ name: z.string().min(3), email: z.string().email(), password: z.string().min(6), }) .optional(), }); type Schema = z.infer<typeof schema>; const GetStartedPage = () => { const { presets, forkFrom } = useData<Data>(); const { isLoggedIn } = useAuth(); const ctx = usePageContext(); const initialValue: Schema = useMemo( () => ({ forkFromId: forkFrom?.id || 0, title: forkFrom?.title || "", }), [forkFrom] ); const form = useForm(schema, initialValue); const create = trpc.project.create.useMutation({ onSuccess(data) { navigate(`/${data.slug}`); }, }); const onSubmit = form.handleSubmit((values) => { create.mutate(values); }); return ( <div className="container max-w-3xl min-h-[80dvh] flex flex-col items-center justify-center py-8 md:py-16"> <Card className="w-full md:p-8"> <CardTitle>{(forkFrom ? "Fork" : "Create New") + " Project"}</CardTitle> <form onSubmit={onSubmit}> {!forkFrom ? ( <> <FormLabel>Select Preset</FormLabel> <Controller control={form.control} name="forkFromId" render={({ field }) => ( <div className="flex md:grid md:grid-cols-3 gap-4 overflow-x-auto md:overflow-x-hidden"> {presets.map((preset) => ( <Button key={preset.projectId} variant={ field.value === preset.projectId ? "default" : "outline" } className="flex py-16 border border-white/40 shrink-0 w-[160px] md:w-auto" onClick={() => field.onChange(preset.projectId)} > <p className="text-wrap">{preset.title}</p> </Button> ))} </div> )} /> </> ) : null} <Input form={form} name="title" label="Title" placeholder="Optional" className="mt-4" /> {!isLoggedIn ? ( <div className="mt-8"> <p className="text-lg">Account detail</p> <Divider className="mt-2 mb-4" /> <div className="grid md:grid-cols-2 gap-x-2 gap-y-4"> <div className="order-1 md:order-2 flex flex-col items-center justify-center gap-3 py-4"> <p className="text-center">Already have an account?</p> <Button href={`/auth/login?return=${encodeURI(ctx.urlPathname)}`} variant="outline" > Log in now </Button> </div> <div className="order-2 md:order-1 space-y-3"> <Input form={form} name="user.name" label="Full Name" placeholder="John Doe" /> <Input form={form} name="user.email" label="Email Address" placeholder="john.doe@mail.com" /> <Input form={form} type="password" name="user.password" label="Password" placeholder="P@ssw0rd123!" /> </div> </div> </div> ) : null} <Divider className="my-6" /> <Button type="submit" size="lg" isLoading={create.isPending} className="w-full md:w-[160px]" > Create </Button> </form> </Card> </div> ); }; export default GetStartedPage;