core/panel/modals/ReactionEditModal.tsx
Untone c8728540ed
All checks were successful
Deploy on push / deploy (push) Successful in 7s
reactions-admin-tab
2025-07-04 12:39:41 +03:00

207 lines
5.8 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { Component, createSignal, createEffect } from 'solid-js'
import styles from '../styles/Modal.module.css'
import Button from '../ui/Button'
import Modal from '../ui/Modal'
import HTMLEditor from '../ui/HTMLEditor'
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<void>
}
/**
* Модальное окно для редактирования реакции
*/
const ReactionEditModal: Component<ReactionEditModalProps> = (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 (
<Modal isOpen={props.isOpen} onClose={props.onClose} title="Редактирование реакции">
<div class={styles['modal-content']}>
{error() && (
<div class={styles['error-message']}>
{error()}
</div>
)}
<div class={styles['form-group']}>
<label class={styles['form-label']}>ID реакции:</label>
<input
type="text"
value={props.reaction.id}
disabled
class={styles['form-input']}
/>
</div>
<div class={styles['form-group']}>
<label class={styles['form-label']}>Тип реакции:</label>
<input
type="text"
value={getReactionName(props.reaction.kind)}
disabled
class={styles['form-input']}
/>
</div>
<div class={styles['form-group']}>
<label class={styles['form-label']}>Автор:</label>
<input
type="text"
value={`${props.reaction.created_by.name || 'Без имени'} (${props.reaction.created_by.email})`}
disabled
class={styles['form-input']}
/>
</div>
<div class={styles['form-group']}>
<label class={styles['form-label']}>Публикация:</label>
<input
type="text"
value={`${props.reaction.shout.title} (ID: ${props.reaction.shout.id})`}
disabled
class={styles['form-input']}
/>
</div>
<div class={styles['form-group']}>
<label class={styles['form-label']}>Текст реакции:</label>
<HTMLEditor
value={body()}
onInput={(value) => setBody(value)}
placeholder="Введите текст реакции (поддерживается HTML)..."
rows={6}
/>
</div>
<div class={styles['form-group']}>
<label class={styles['form-label']}>Статистика:</label>
<div class={styles['stat-info']}>
<span>Рейтинг: {props.reaction.stat.rating}</span>
<span>Комментариев: {props.reaction.stat.comments_count}</span>
</div>
</div>
<div class={styles['form-group']}>
<label class={styles['form-label']}>Статус:</label>
<input
type="text"
value={props.reaction.deleted_at ? 'Удалено' : 'Активно'}
disabled
class={styles['form-input']}
/>
</div>
<div class={styles['modal-actions']}>
<Button variant="secondary" onClick={props.onClose} disabled={loading()}>
Отмена
</Button>
<Button variant="primary" onClick={handleSave} disabled={loading()}>
{loading() ? 'Сохранение...' : 'Сохранить'}
</Button>
</div>
</div>
</Modal>
)
}
export default ReactionEditModal