import { useEffect, useState } from 'react' import { createPortal } from 'react-dom' import { X } from 'lucide-react' import { useLocale } from '@meshkee/dashboard-ui' import { useT } from '../i18n/useT' import type { ShippingCostGroup, ShippingCostGroupFormPayload, ShippingMethodId, } from '../types/shippingCostGroup' import { SHIPPING_METHOD_IDS } from '../types/shippingCostGroup' import { formatIrtInput, parseIrtInput } from '../utils/irtPrice' import styles from './ShippingCostGroupModal.module.css' const METHOD_EN_LABELS: Record = { post: 'Post', tipax: 'Tipax', mahex: 'Mahex', freight: 'Freight', air: 'Air', } interface ShippingCostGroupModalProps { open: boolean onClose: () => void onSubmit: (data: ShippingCostGroupFormPayload) => void editingGroup?: ShippingCostGroup | null isSubmitting?: boolean } const ANIMATION_MS = 220 export function ShippingCostGroupModal({ open, onClose, onSubmit, editingGroup = null, isSubmitting = false, }: ShippingCostGroupModalProps) { const t = useT() const { locale } = useLocale() const isFa = locale === 'fa' const [mounted, setMounted] = useState(open) const [closing, setClosing] = useState(false) const [nameFa, setNameFa] = useState('') const [nameEn, setNameEn] = useState('') const [description, setDescription] = useState('') const [methods, setMethods] = useState([]) const [defaultAmount, setDefaultAmount] = useState('') const [pasKraye, setPasKraye] = useState(false) const [isDefault, setIsDefault] = useState(false) const [formError, setFormError] = useState('') useEffect(() => { if (open) { setMounted(true) setClosing(false) setNameFa(editingGroup?.nameFa ?? '') setNameEn(editingGroup?.nameEn ?? '') setDescription(editingGroup?.description ?? '') setMethods(editingGroup?.methods ?? []) setPasKraye(editingGroup?.pasKraye ?? false) setDefaultAmount( editingGroup ? formatIrtInput(String(Math.round(editingGroup.defaultAmount))) : '', ) setIsDefault(editingGroup?.isDefault ?? false) setFormError('') } else if (mounted) { setClosing(true) const timer = setTimeout(() => { setMounted(false) setClosing(false) }, ANIMATION_MS) return () => clearTimeout(timer) } }, [open, editingGroup, mounted]) useEffect(() => { if (!mounted || closing) return const onKey = (e: KeyboardEvent) => { if (e.key === 'Escape' && !isSubmitting) onClose() } document.addEventListener('keydown', onKey) return () => document.removeEventListener('keydown', onKey) }, [mounted, closing, onClose, isSubmitting]) if (!mounted) return null function toggleMethod(method: ShippingMethodId) { setMethods((prev) => prev.includes(method) ? prev.filter((item) => item !== method) : [...prev, method], ) } function handleSubmit(e: React.FormEvent) { e.preventDefault() setFormError('') const trimmedFa = nameFa.trim() const trimmedEn = nameEn.trim() const amount = pasKraye ? 0 : parseIrtInput(defaultAmount) if (!trimmedFa || !trimmedEn) { setFormError(t('store.shipping.form.errorRequired')) return } if (!methods.length) { setFormError(t('store.shipping.form.errorMethods')) return } if (!pasKraye && (amount === null || amount < 0)) { setFormError(t('store.shipping.form.errorAmount')) return } onSubmit({ nameFa: trimmedFa, nameEn: trimmedEn, description: description.trim() || undefined, methods, defaultAmount: amount ?? 0, pasKraye, isDefault, }) } return createPortal(
!isSubmitting && onClose()} >
e.stopPropagation()} role="dialog" aria-modal="true" aria-labelledby="shipping-group-modal-title" lang={isFa ? 'fa' : 'en'} dir={isFa ? 'rtl' : 'ltr'} >

{editingGroup ? t('store.shipping.form.editTitle') : t('store.shipping.form.addTitle')}

{formError ? (
{formError}
) : null}
setNameFa(e.target.value)} disabled={isSubmitting} required />
setNameEn(e.target.value)} disabled={isSubmitting} required />