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>
)
}