projects/Aligned-Platform-EnergizeAI/app/src/components/spaces/create-new-space.tsx (106 lines of code) (raw):

import { PlusIcon } from "lucide-react" import { useState } from "react" import { useForm } from "react-hook-form" import { z } from "zod" import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from "../ui/form" import { Input } from "../ui/input" import { SmallSpinner } from "../ui/small-spinner" import { Textarea } from "../ui/textarea" import { useToast } from "../ui/use-toast" import { Button } from "@/components/ui/button" import { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle, DialogTrigger } from "@/components/ui/dialog" import { energizeEngine } from "@/lib/energize-engine" import { zodResolver } from "@hookform/resolvers/zod" import { useRouter } from "next/router" const formSchema = z.object({ name: z.string().nonempty(), description: z.string().nonempty(), }) type FormValues = z.infer<typeof formSchema> export function CreateNewSpace() { const [open, setOpen] = useState(false) const form = useForm<FormValues>({ resolver: zodResolver(formSchema), }) const { toast } = useToast() const utils = energizeEngine.useContext() const submitMutation = energizeEngine.spaces.createSpace.useMutation() function onSubmit(data: FormValues) { submitMutation.mutate( { name: data.name, description: data.description, }, { onSuccess: () => { toast({ title: "Success", description: "Successfully created space.", variant: "success", }) setOpen(false) form.reset({ name: "", description: "" }) utils.spaces.getSpaces.invalidate() }, onError: (err) => { toast({ title: "Error", description: err.message, variant: "destructive", }) }, }, ) } return ( <Dialog open={open} onOpenChange={(v) => setOpen(v)}> <DialogTrigger asChild> <Button> <PlusIcon className="mr-2" /> Create new space </Button> </DialogTrigger> <DialogContent> <DialogHeader> <DialogTitle>Create new space</DialogTitle> </DialogHeader> <Form {...form}> <form onSubmit={form.handleSubmit(onSubmit)} className="space-y-8"> <FormField control={form.control} name="name" render={({ field }) => ( <FormItem> <FormLabel>Name</FormLabel> <FormControl> <Input placeholder="Enter name..." {...field} /> </FormControl> <FormMessage /> </FormItem> )} /> <FormField control={form.control} name="description" render={({ field }) => ( <FormItem> <FormLabel>Descripton</FormLabel> <FormControl> <Textarea placeholder="Enter description..." {...field} /> </FormControl> <FormMessage /> </FormItem> )} /> <DialogFooter> <Button type="submit" disabled={submitMutation.isLoading}> Submit {submitMutation.isLoading && <SmallSpinner className="ml-2" />} </Button> </DialogFooter> </form> </Form> </DialogContent> </Dialog> ) }