import { Component, createEffect, createSignal } from 'solid-js' import formStyles from '../styles/Form.module.css' import styles from '../styles/Modal.module.css' import Button from '../ui/Button' import HTMLEditor from '../ui/HTMLEditor' import Modal from '../ui/Modal' interface Collection { id: number slug: string title: string desc?: string pic?: string amount?: number published_at?: number created_at: number created_by: { id: number name: string email: string } } interface CollectionEditModalProps { isOpen: boolean collection: Collection | null // null для создания новой onClose: () => void onSave: (collection: Partial) => void } /** * Модальное окно для создания и редактирования коллекций */ const CollectionEditModal: Component = (props) => { const [formData, setFormData] = createSignal({ slug: '', title: '', desc: '', pic: '' }) const [errors, setErrors] = createSignal>({}) // Синхронизация с props.collection createEffect(() => { if (props.isOpen) { if (props.collection) { // Редактирование существующей коллекции setFormData({ slug: props.collection.slug, title: props.collection.title, desc: props.collection.desc || '', pic: props.collection.pic || '' }) } else { // Создание новой коллекции setFormData({ slug: '', title: '', desc: '', pic: '' }) } setErrors({}) } }) const validateForm = () => { const newErrors: Record = {} const data = formData() // Валидация slug if (!data.slug.trim()) { newErrors.slug = 'Slug обязателен' } else if (!/^[a-z0-9-_]+$/.test(data.slug)) { newErrors.slug = 'Slug может содержать только латинские буквы, цифры, дефисы и подчеркивания' } // Валидация названия if (!data.title.trim()) { newErrors.title = 'Название обязательно' } // Валидация URL картинки (если указан) if (data.pic.trim() && !/^https?:\/\/.+/.test(data.pic)) { newErrors.pic = 'Некорректный URL картинки' } setErrors(newErrors) return Object.keys(newErrors).length === 0 } const updateField = (field: string, value: string) => { setFormData((prev) => ({ ...prev, [field]: value })) // Очищаем ошибку для поля при изменении setErrors((prev) => ({ ...prev, [field]: '' })) } const handleSave = () => { if (!validateForm()) { return } const collectionData = { ...formData() } props.onSave(collectionData) } const isCreating = () => props.collection === null const modalTitle = () => isCreating() ? 'Создание новой коллекции' : `Редактирование коллекции: ${props.collection?.title || ''}` return (
updateField('title', e.target.value)} placeholder="Введите название коллекции" required /> {errors().title && (
⚠️ {errors().title}
)}
updateField('slug', e.target.value)} placeholder="collection-slug" required /> {errors().slug && (
⚠️ {errors().slug}
)}
updateField('desc', value)} />
updateField('pic', e.target.value)} placeholder="https://example.com/image.jpg" /> {errors().pic && (
⚠️ {errors().pic}
)}
💡 Необязательно. URL изображения для обложки коллекции.
) } export default CollectionEditModal