import { Component, createEffect, createSignal } from 'solid-js' import styles from '../styles/Modal.module.css' import Button from '../ui/Button' import HTMLEditor from '../ui/HTMLEditor' import Modal from '../ui/Modal' interface ReactionEditModalProps { reaction: { id: number kind: string body: string created_at: number updated_at?: number deleted_at?: number reply_to?: number created_by: { id: number name: string email: string slug: string } shout: { id: number title: string slug: string layout: string created_at: number published_at?: number deleted_at?: number } stat: { comments_count: number rating: number } } isOpen: boolean onClose: () => void onSave: (reaction: { id: number; body?: string; deleted_at?: number }) => Promise } /** * Модальное окно для редактирования реакции */ const ReactionEditModal: Component = (props) => { const [body, setBody] = createSignal('') const [loading, setLoading] = createSignal(false) const [error, setError] = createSignal('') // Инициализация данных при изменении реакции createEffect(() => { if (props.reaction) { setBody(props.reaction.body || '') setError('') } }) /** * Обработка сохранения изменений */ async function handleSave() { try { setLoading(true) setError('') const updateData: { id: number; body?: string; deleted_at?: number } = { id: props.reaction.id, body: body() } await props.onSave(updateData) } catch (err) { setError(err instanceof Error ? err.message : 'Ошибка сохранения') } finally { setLoading(false) } } /** * Получает название типа реакции на русском */ const getReactionName = (kind: string): string => { switch (kind) { case 'LIKE': return 'Лайк' case 'DISLIKE': return 'Дизлайк' case 'COMMENT': return 'Комментарий' case 'QUOTE': return 'Цитата' case 'AGREE': return 'Согласен' case 'DISAGREE': return 'Не согласен' case 'ASK': return 'Вопрос' case 'PROPOSE': return 'Предложение' case 'PROOF': return 'Доказательство' case 'DISPROOF': return 'Опровержение' case 'ACCEPT': return 'Принять' case 'REJECT': return 'Отклонить' case 'CREDIT': return 'Упоминание' case 'SILENT': return 'Причастность' default: return kind } } return (
{error() &&
{error()}
}
setBody(value)} placeholder="Введите текст реакции (поддерживается HTML)..." rows={6} />
Рейтинг: {props.reaction.stat.rating} Комментариев: {props.reaction.stat.comments_count}
) } export default ReactionEditModal