import { Component, createEffect, createSignal, Show } from 'solid-js' import formStyles from '../styles/Form.module.css' import styles from '../styles/Modal.module.css' import Button from '../ui/Button' import Modal from '../ui/Modal' interface Author { id: number name: string email: string slug: string } interface Shout { id: number title: string slug: string created_by: Author } interface Invite { inviter_id: number author_id: number shout_id: number status: 'PENDING' | 'ACCEPTED' | 'REJECTED' inviter: Author author: Author shout: Shout created_at?: number } interface InviteEditModalProps { isOpen: boolean invite: Invite | null // null для создания нового onClose: () => void onSave: (invite: Partial) => void } /** * Модальное окно для создания и редактирования приглашений */ const InviteEditModal: Component = (props) => { const [formData, setFormData] = createSignal({ inviter_id: 0, author_id: 0, shout_id: 0, status: 'PENDING' as 'PENDING' | 'ACCEPTED' | 'REJECTED' }) const [errors, setErrors] = createSignal>({}) // Синхронизация с props.invite createEffect(() => { if (props.isOpen) { if (props.invite) { // Редактирование существующего приглашения setFormData({ inviter_id: props.invite.inviter_id, author_id: props.invite.author_id, shout_id: props.invite.shout_id, status: props.invite.status }) } else { // Создание нового приглашения setFormData({ inviter_id: 0, author_id: 0, shout_id: 0, status: 'PENDING' }) } setErrors({}) } }) const validateForm = () => { const newErrors: Record = {} const data = formData() // Валидация ID приглашающего if (!data.inviter_id || data.inviter_id <= 0) { newErrors.inviter_id = 'ID приглашающего обязателен' } // Валидация ID приглашаемого if (!data.author_id || data.author_id <= 0) { newErrors.author_id = 'ID приглашаемого обязателен' } // Валидация ID публикации if (!data.shout_id || data.shout_id <= 0) { newErrors.shout_id = 'ID публикации обязателен' } // Проверка что приглашающий и приглашаемый не совпадают if (data.inviter_id === data.author_id && data.inviter_id > 0) { newErrors.author_id = 'Приглашающий и приглашаемый не могут быть одним и тем же автором' } setErrors(newErrors) return Object.keys(newErrors).length === 0 } const updateField = (field: string, value: string | number) => { setFormData((prev) => ({ ...prev, [field]: value })) // Очищаем ошибку для поля при изменении setErrors((prev) => ({ ...prev, [field]: '' })) } const handleSave = () => { if (!validateForm()) { return } const inviteData = { ...formData() } props.onSave(inviteData) } const isCreating = () => props.invite === null const modalTitle = () => isCreating() ? 'Создание нового приглашения' : `Редактирование приглашения: ${props.invite?.inviter.name || ''} → ${props.invite?.author.name || ''}` return (
updateField('inviter_id', Number.parseInt(e.target.value) || 0)} class={`${formStyles.input} ${errors().inviter_id ? formStyles.error : ''} ${!isCreating() ? formStyles.disabled : ''}`} placeholder="1" required disabled={!isCreating()} // При редактировании ID нельзя менять /> {errors().inviter_id && (
⚠️ {errors().inviter_id}
)}
💡 ID автора, который отправляет приглашение
updateField('author_id', Number.parseInt(e.target.value) || 0)} class={`${formStyles.input} ${errors().author_id ? formStyles.error : ''} ${!isCreating() ? formStyles.disabled : ''}`} placeholder="2" required disabled={!isCreating()} // При редактировании ID нельзя менять />
⚠️ {errors().author_id}
💡 ID автора, которого приглашают к сотрудничеству
updateField('shout_id', Number.parseInt(e.target.value) || 0)} class={`${formStyles.input} ${errors().shout_id ? formStyles.error : ''} ${!isCreating() ? formStyles.disabled : ''}`} placeholder="123" required disabled={!isCreating()} // При редактировании ID нельзя менять />
⚠️ {errors().shout_id}
💡 ID публикации, к которой приглашают на сотрудничество
💡 Текущий статус приглашения
{/* Информация о связанных объектах при редактировании */}
👤 Приглашающий: {props.invite?.inviter.name} ({props.invite?.inviter.email})
👥 Приглашаемый: {props.invite?.author.name} ({props.invite?.author.email})
📄 Публикация: {props.invite?.shout.title}
) } export default InviteEditModal