import { Group, Box, Button, TextInput, Stack, Textarea } from "@mantine/core"; import React, { useEffect } from "react"; import { useForm } from "@mantine/form"; import { zodResolver } from "mantine-form-zod-resolver"; import * as z from "zod"; import { useNavigate } from "react-router-dom"; import { useCreateSpaceMutation } from "@/features/space/queries/space-query.ts"; import { computeSpaceSlug } from "@/lib"; import { getSpaceUrl } from "@/lib/config.ts"; import { useTranslation } from "react-i18next"; const formSchema = z.object({ name: z.string().trim().min(2).max(100), slug: z .string() .trim() .min(2) .max(100) .regex( /^[a-zA-Z0-9]+$/, "Space slug must be alphanumeric. No special characters", ), description: z.string().max(500), }); type FormValues = z.infer; export function CreateSpaceForm() { const { t } = useTranslation(); const createSpaceMutation = useCreateSpaceMutation(); const navigate = useNavigate(); const form = useForm({ validate: zodResolver(formSchema), validateInputOnChange: ["slug"], initialValues: { name: "", slug: "", description: "", }, }); useEffect(() => { const name = form.values.name; const words = name.trim().split(/\s+/); // Check if the last character is a space or if the last word is a single character (indicating it's in progress) const lastChar = name[name.length - 1]; const lastWordIsIncomplete = words.length > 1 && words[words.length - 1].length === 1; if (lastChar !== " " || lastWordIsIncomplete) { const slug = computeSpaceSlug(name); form.setFieldValue("slug", slug); } }, [form.values.name]); const handleSubmit = async (data: { name?: string; slug?: string; description?: string; }) => { const spaceData = { name: data.name, slug: data.slug, description: data.description, }; const createdSpace = await createSpaceMutation.mutateAsync(spaceData); navigate(getSpaceUrl(createdSpace.slug)); }; return ( <>
handleSubmit(values))}>