import { Button, FormControl, FormErrorMessage, FormHelperText, FormLabel, Input, Modal, ModalBody, ModalCloseButton, ModalContent, ModalFooter, ModalHeader, ModalOverlay, useToast } from '@chakra-ui/react' import * as React from 'react' import {Controller, useForm} from 'react-hook-form' import {IFormProps, IJaenTemplate} from '../../../../../types' type TemplateSelectorProps = { selectedTemplate: string templates: Omit[] onSelect: (templateName: string) => void } const TemplateSelector = ({ selectedTemplate, templates, onSelect }: TemplateSelectorProps) => { // const [selectedTemplate, setSelectedTemplate] = React.useState( // props.selectedTemplate // ) const handleSelect = (templateName: string) => { let newSelectedTemplate = templateName // Clear selection if the same template is selected if (newSelectedTemplate === selectedTemplate) { newSelectedTemplate = '' } // setSelectedTemplate(newSelectedTemplate) onSelect(newSelectedTemplate) } return ( <> {templates.map(({name, displayName}, key) => ( ))} ) } export type CreateValues = { slug: string title: string template: Omit } export interface PageCreatorProps extends IFormProps { templates: TemplateSelectorProps['templates'] isTemplatesLoading: boolean finalFocusRef: React.RefObject isOpen: boolean onClose: () => void } /** * Modal to create a new page. * Renders a list of templates to choose from. */ export const PageCreator = ({ templates, finalFocusRef, isOpen, isTemplatesLoading, onClose, ...form }: PageCreatorProps) => { const initialFocusRef = React.useRef() const toast = useToast() const { register, reset, handleSubmit, control, formState: {errors, isSubmitting, isDirty, isValid} } = useForm({ defaultValues: form.values }) const onSubmit = (values: CreateValues) => { // update template displayName values.template = templates.find( e => e.name === values.template.name ) as IJaenTemplate form.onSubmit(values) reset() toast({ title: 'Page created', description: `Page "${values.title}" created`, status: 'success' }) } const onCancel = () => { reset() onClose() } return (
Create a page Title {errors.title?.message} Slug { const {externalValidation} = form if (externalValidation) { const validation = externalValidation('slug', value) if (validation) { return validation } } } })} /> {!errors.slug && ( Make sure the slug is unique between siblings. )} {errors.slug?.message} Template ( <> {isTemplatesLoading ? (
Loading...
) : ( { onChange(templateName) }} /> )} )} /> {!errors.template?.name && ( Select the template to use for this page. )} {errors.template?.name?.message}
) }