170 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			170 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 'use client'
 | ||
| 
 | ||
| import {zodResolver} from '@hookform/resolvers/zod'
 | ||
| import fs from 'node:fs'
 | ||
| import path from 'node:path'
 | ||
| import {useCallback, useState} from 'react'
 | ||
| import Dropzone from 'react-dropzone'
 | ||
| import {useFieldArray, useForm} from 'react-hook-form'
 | ||
| import {z} from 'zod'
 | ||
| 
 | ||
| import {onProductCreateAction} from '@/actions/admin/product'
 | ||
| import {createCategoryFormSchema} from '@/lib/schemas/admin/category'
 | ||
| import {createProductFormSchema} from '@/lib/schemas/admin/product'
 | ||
| import {cn, dump} from '@/lib/utils'
 | ||
| import {ResourceMessages} from '@/types'
 | ||
| import {Button} from '@/ui/button'
 | ||
| import {
 | ||
| 	Form,
 | ||
| 	FormControl,
 | ||
| 	FormField,
 | ||
| 	FormItem,
 | ||
| 	FormLabel,
 | ||
| 	FormMessage
 | ||
| } from '@/ui/form'
 | ||
| import {Input} from '@/ui/input'
 | ||
| 
 | ||
| export default function CreateForm() {
 | ||
| 	const [loading, setLoading] = useState(false)
 | ||
| 	const [error, setError] = useState('')
 | ||
| 	const [success, setSuccess] = useState('')
 | ||
| 
 | ||
| 	const form = useForm<z.infer<typeof createProductFormSchema>>({
 | ||
| 		resolver: zodResolver(createProductFormSchema),
 | ||
| 		mode: 'onBlur',
 | ||
| 		defaultValues: {
 | ||
| 			files: []
 | ||
| 		}
 | ||
| 	})
 | ||
| 
 | ||
| 	const {fields, append} = useFieldArray({
 | ||
| 		name: 'files',
 | ||
| 		control: form.control
 | ||
| 	})
 | ||
| 
 | ||
| 	console.log(form.formState.errors)
 | ||
| 
 | ||
| 	const onSubmit = async (values: z.infer<typeof createProductFormSchema>) => {
 | ||
| 		setLoading(true)
 | ||
| 		onProductCreateAction(values).then((res: any) => {
 | ||
| 			if (res?.error) {
 | ||
| 				setError(res?.error)
 | ||
| 				setSuccess('')
 | ||
| 				setLoading(false)
 | ||
| 			} else {
 | ||
| 				setSuccess(res?.success as string)
 | ||
| 				setError('')
 | ||
| 				setLoading(false)
 | ||
| 			}
 | ||
| 		})
 | ||
| 	}
 | ||
| 
 | ||
| 	return (
 | ||
| 		<div className='flex h-screen items-center justify-center'>
 | ||
| 			<Form {...form}>
 | ||
| 				<form
 | ||
| 					action=''
 | ||
| 					onSubmit={form.handleSubmit(onSubmit)}
 | ||
| 					className='max-w-md flex-1 space-y-5'
 | ||
| 				>
 | ||
| 					<div className='products_name_price_desc relative'>
 | ||
| 						{fields.map((_, index) => {
 | ||
| 							return (
 | ||
| 								<div key={index}>
 | ||
| 									<div className='mb-2 mt-7 text-xl font-bold'>
 | ||
| 										{/*{form.getValues(`files.${index}.file.name`)}*/}
 | ||
| 										{dump(form.getValues(`files.${index}`))}
 | ||
| 									</div>
 | ||
| 									<div className='flex gap-x-3'>
 | ||
| 										<FormField
 | ||
| 											control={form.control}
 | ||
| 											key={index}
 | ||
| 											name={`files.${index}.alt`}
 | ||
| 											render={({field}) => (
 | ||
| 												<FormItem>
 | ||
| 													<FormLabel>Файл Альт Ім'я</FormLabel>
 | ||
| 													<FormControl>
 | ||
| 														<Input {...field} />
 | ||
| 													</FormControl>
 | ||
| 													<FormMessage className='capitalize text-red-500' />
 | ||
| 												</FormItem>
 | ||
| 											)}
 | ||
| 										/>
 | ||
| 										<FormField
 | ||
| 											control={form.control}
 | ||
| 											key={index + 1}
 | ||
| 											name={`files.${index}.title`}
 | ||
| 											render={({field}) => (
 | ||
| 												<FormItem>
 | ||
| 													<FormLabel>Назва файлу</FormLabel>
 | ||
| 													<FormControl>
 | ||
| 														<Input {...field} />
 | ||
| 													</FormControl>
 | ||
| 													<FormMessage className='capitalize text-red-500' />
 | ||
| 												</FormItem>
 | ||
| 											)}
 | ||
| 										/>
 | ||
| 									</div>
 | ||
| 								</div>
 | ||
| 							)
 | ||
| 						})}
 | ||
| 					</div>
 | ||
| 					<div className='products relative'>
 | ||
| 						<FormField
 | ||
| 							control={form.control}
 | ||
| 							name='files'
 | ||
| 							render={() => (
 | ||
| 								<Dropzone
 | ||
| 									accept={{
 | ||
| 										'image/*': ['.jpg', '.jpeg', '.png']
 | ||
| 									}}
 | ||
| 									onDropAccepted={acceptedFiles => {
 | ||
| 										acceptedFiles.map(acceptedFile => {
 | ||
| 											console.log('acceptedFile', acceptedFile)
 | ||
| 
 | ||
| 											return append({
 | ||
| 												file: acceptedFile,
 | ||
| 												alt: '',
 | ||
| 												title: ''
 | ||
| 											})
 | ||
| 										})
 | ||
| 									}}
 | ||
| 									multiple={true}
 | ||
| 									maxSize={5000000}
 | ||
| 								>
 | ||
| 									{({getRootProps, getInputProps}) => (
 | ||
| 										<section>
 | ||
| 											<div {...getRootProps()}>
 | ||
| 												<input {...getInputProps()} />
 | ||
| 												<p>
 | ||
| 													Перетягніть тут, киньте кілька файлів або натисніть,
 | ||
| 													щоб вибрати файли
 | ||
| 												</p>
 | ||
| 											</div>
 | ||
| 										</section>
 | ||
| 									)}
 | ||
| 								</Dropzone>
 | ||
| 							)}
 | ||
| 						/>
 | ||
| 					</div>
 | ||
| 					<Button type='submit' className='!mt-0 w-full'>
 | ||
| 						Створити
 | ||
| 					</Button>
 | ||
| 				</form>
 | ||
| 			</Form>
 | ||
| 		</div>
 | ||
| 	)
 | ||
| 
 | ||
| 	// return (
 | ||
| 	// 	<div className='flex flex-col bg-zinc-200 py-10'>
 | ||
| 	// 		<h1 className='text-center text-3xl font-bold capitalize'>
 | ||
| 	// 			Створити галерею
 | ||
| 	// 		</h1>
 | ||
| 	// 		<div className='mx-auto mb-10 mt-6 flex min-h-[320px] w-[80%] flex-wrap gap-1 rounded-md bg-white p-5 shadow-sm'></div>
 | ||
| 	// 		<div className='flex justify-center'>
 | ||
| 	// 			<Button>Завантажити зображення</Button>
 | ||
| 	// 		</div>
 | ||
| 	// 	</div>
 | ||
| 	// )
 | ||
| }
 |