'use client' import {zodResolver} from '@hookform/resolvers/zod' import {EntityType} from '@prisma/client' import dynamic from 'next/dynamic' import React, {Suspense, useEffect, useMemo, useRef, useState} from 'react' import {useFieldArray, useForm} from 'react-hook-form' import toast from 'react-hot-toast' import {z} from 'zod' import {onEntityCreateEditAction} from '@/actions/admin/entity' import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select' import {i18nDefaultLocale, i18nLocales} from '@/i18n-config' import {BaseEditorConfig} from '@/lib/config/editor' import { EntityTypeDescription, createEntityFormSchema } from '@/lib/schemas/admin/entity' import {toEmptyParams} from '@/lib/utils' import {Button} from '@/ui/button' import { Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage } from '@/ui/form' import {Input} from '@/ui/input' import {Switch} from '@/ui/switch' import {Tabs, TabsContent, TabsList, TabsTrigger} from '@/ui/tabs' const JoditEditor = dynamic(() => import('jodit-react'), {ssr: false}) let localesValues = { type: '', media: '', title: '', annotation: '', body: '' } let metaValues = { title: '', description: '', keywords: '', author: '' } export const EntityCrudForm = ({data}: {data?: any}) => { const [loading, setLoading] = useState(false) const [error, setError] = useState('') const [success, setSuccess] = useState('') const [annotation0, setAnnotation0] = useState( data?.locales[0].annotation || '' ) const [annotation1, setAnnotation1] = useState( data?.locales[1].annotation || '' ) const [body0, setBody0] = useState(data?.locales[0].body || '') const [body1, setBody1] = useState(data?.locales[1].body || '') const editor = useRef(null) //declared a null value const config = useMemo(() => BaseEditorConfig, []) config.maxWidth = '100%' const form = useForm>({ resolver: zodResolver(createEntityFormSchema), mode: 'onBlur', defaultValues: data ? (data => { const {locales, meta} = data return { published: data.published, image: data.image, locales: toEmptyParams(locales) as any, meta: meta ? (toEmptyParams(meta) as any) : [{...metaValues}, {...metaValues}] } })(data) : { scopes: '', published: false, media: '', slug: '', locales: [ {lang: 'uk', ...localesValues}, {lang: 'ru', ...localesValues} ], meta: [{...metaValues}, {...metaValues}] } }) const {register, setValue} = form useEffect(() => { register('locales.0.annotation') register('locales.1.annotation') register('locales.0.body') register('locales.1.body') }, [register]) const {fields: localeFields} = useFieldArray({ name: 'locales', control: form.control }) const {fields: metaFields} = useFieldArray({ name: 'meta', control: form.control }) console.log(form.formState.errors) const onSubmit = async (values: z.infer) => { setLoading(true) onEntityCreateEditAction(values).then((res: any) => { if (res?.error) { setError(res?.error) setSuccess('') setLoading(false) toast.error(res?.error) } else { setSuccess(res?.success as string) setError('') setLoading(false) toast.success(res?.success) } }) } return (

Створити блок / статтю / сторінку

(
Опублікувати Відразу після збереження буде розміщено на сайті
)} />
( Тип сутності )} />
( Аліас / Slug )} />
( Область виведення )} />
( Медіа (файл на диску чи URL посилання на ресурс) )} />
{i18nLocales.map(locale => ( {locale.nameUkr} ))} {localeFields.map((_, index) => ( ( )} />
( Назва сутності )} />
Анотація / Коротка назва { index === 0 ? setAnnotation0(value) : setAnnotation1(value) setValue(`locales.${index}.annotation`, value) }} />
Текст { index === 0 ? setBody0(value) : setBody1(value) setValue(`locales.${index}.body`, value) }} />
))}
) }