import { useEffect, useId, useMemo, useRef, useState } from 'react' import { Link, useLocation, useNavigate } from 'react-router-dom' import { ChevronRight, ChevronDown, Search } from 'lucide-react' import { Header } from '../components/Header' import { ImageCropper } from '../components/ImageCropper' import { ImageGallery } from '../components/ImageGallery' import { PriceInput } from '../components/PriceInput' import { RichTextArea } from '../components/RichTextArea' import { TagInput } from '../components/TagInput' import { findCategory, flattenCategories, initialCategories, } from '../data/categories' import type { SellUnit } from '../data/products' import { parsePriceNumber } from '../utils/price' import styles from './HomePage.module.css' import pageStyles from './AddProductPage.module.css' export function AddProductPage() { const location = useLocation() const navigate = useNavigate() const formId = useId() const [mainImage, setMainImage] = useState(null) const [categoryId, setCategoryId] = useState(null) const [nameFa, setNameFa] = useState('') const [nameEn, setNameEn] = useState('') const [sellUnit, setSellUnit] = useState('unit') const [price, setPrice] = useState('') const [intro, setIntro] = useState('') const [description, setDescription] = useState('') const [gallery, setGallery] = useState([]) const [tags, setTags] = useState([]) const [error, setError] = useState('') const [categoryQuery, setCategoryQuery] = useState('') const [categoryOpen, setCategoryOpen] = useState(false) const categoryRef = useRef(null) const categoryOptions = useMemo( () => flattenCategories(initialCategories), [], ) const filteredCategories = useMemo(() => { const q = categoryQuery.trim().toLowerCase() if (!q) return categoryOptions return categoryOptions.filter( (option) => option.labelFa.includes(categoryQuery.trim()) || option.labelEn.toLowerCase().includes(q), ) }, [categoryOptions, categoryQuery]) const selectedCategory = categoryId ? findCategory(initialCategories, categoryId) : null useEffect(() => { function handlePointerDown(event: MouseEvent) { if (!categoryRef.current?.contains(event.target as Node)) { setCategoryOpen(false) } } document.addEventListener('mousedown', handlePointerDown) return () => document.removeEventListener('mousedown', handlePointerDown) }, []) function handleSubmit(event: React.FormEvent) { event.preventDefault() if (!mainImage) { setError('تصویر اصلی الزامی است') return } if (!categoryId) { setError('انتخاب دسته‌بندی الزامی است') return } if (!nameFa.trim() || !nameEn.trim()) { setError('نام فارسی و انگلیسی الزامی است') return } const numericPrice = parsePriceNumber(price) if (numericPrice === null || numericPrice <= 0) { setError('قیمت معتبر الزامی است') return } setError('') window.alert('محصول با موفقیت ثبت شد (نسخه نمایشی)') navigate('/products/list') } return (
New Product

بازگشت به محصولات

ثبت محصول جدید

اطلاعات محصول را تکمیل کنید و ذخیره نمایید.

فرم ثبت محصول

{error && (
{error}
)}

تصویر اصلی

اطلاعات پایه

{ setCategoryQuery(e.target.value) setCategoryOpen(true) if (categoryId) setCategoryId(null) }} onFocus={() => { setCategoryOpen(true) setCategoryQuery('') }} autoComplete="off" />
{categoryOpen && (
    {filteredCategories.length === 0 ? (
  • موردی یافت نشد
  • ) : ( filteredCategories.map((option) => (
  • )) )}
)}
setNameFa(e.target.value)} />
setNameEn(e.target.value)} />