diff --git a/frontend/src/components/blog/PostReactionButtons.astro b/frontend/src/components/blog/PostReactionButtons.astro index 8180083..8cb79d5 100644 --- a/frontend/src/components/blog/PostReactionButtons.astro +++ b/frontend/src/components/blog/PostReactionButtons.astro @@ -224,6 +224,9 @@ const { initialLikes = 0, initialDislikes = 0, postId } = Astro.props; const dislikeBtn = container.querySelector('.dislike-btn'); async function loadUserVote() { + const likesCountEl = container.querySelector('[data-count="likes"]'); + const dislikesCountEl = container.querySelector('[data-count="dislikes"]'); + try { console.log('[Vote] Загрузка голосов для post:', postId); const response = await fetch(`/api/votes?post_id=${postId}`, { @@ -234,8 +237,8 @@ const { initialLikes = 0, initialDislikes = 0, postId } = Astro.props; const result = await response.json(); console.log('[Vote] Данные:', result); // Обновляем счетчики - if (likesCount) likesCount.textContent = result.likes.toString(); - if (dislikesCount) dislikesCount.textContent = result.dislikes.toString(); + if (likesCountEl) likesCountEl.textContent = result.likes.toString(); + if (dislikesCountEl) dislikesCountEl.textContent = result.dislikes.toString(); // Показываем голос пользователя if (pb.authStore.isValid) { if (result.userVote === 'like') { diff --git a/frontend/src/components/blog/comments/CommentForm.tsx b/frontend/src/components/blog/comments/CommentForm.tsx index ad092d6..501742b 100644 --- a/frontend/src/components/blog/comments/CommentForm.tsx +++ b/frontend/src/components/blog/comments/CommentForm.tsx @@ -1,15 +1,11 @@ -import { createSignal, Show } from "solid-js"; - -interface CommentFormData { - content: string; -} +import { createSignal, Show, For } from "solid-js"; interface ValidationErrors { content?: string; } interface CommentFormProps { - onSubmit: (data: CommentFormData) => void; + onSubmit: (data: { content: string }) => void; isReply?: boolean; onCancel?: () => void; user?: { @@ -17,10 +13,17 @@ interface CommentFormProps { email: string; avatar?: string; }; + initialContent?: string; + isEdit?: boolean; + onUpdate?: (data: { content: string }) => void; + onDelete?: () => void; } -const MAX_MESSAGE_LENGTH = 2000; -const MIN_MESSAGE_LENGTH = 10; +const EMOJIS = [ + "👍", "👎", "❤️", "😊", "😂", "🎉", "🔥", "👏", + "😢", "😮", "😡", "🙏", "⭐", "💯", "❤️‍🔥", "🤔", + "👀", "💪", "🚀", "✨" +]; const DANGEROUS_PATTERNS = [ /)<[^<]*)*<\/script>/gi, @@ -34,10 +37,14 @@ const DANGEROUS_PATTERNS = [ /url\s*\(\s*['"]*\s*javascript:/gi, ]; +const MAX_MESSAGE_LENGTH = 2000; +const MIN_MESSAGE_LENGTH = 10; + export default function CommentForm(props: CommentFormProps) { - const [content, setContent] = createSignal(""); + const [content, setContent] = createSignal(props.initialContent || ""); const [errors, setErrors] = createSignal({}); const [touched, setTouched] = createSignal<{ [key: string]: boolean }>({}); + const [showEmojiPicker, setShowEmojiPicker] = createSignal(false); const sanitizeInput = (input: string): string => { return input @@ -82,6 +89,11 @@ export default function CommentForm(props: CommentFormProps) { } }; + const addEmoji = (emoji: string) => { + setContent((prev) => prev + emoji); + setShowEmojiPicker(false); + }; + const validateForm = (): boolean => { const contentError = validateContent(content()); setErrors({ content: contentError }); @@ -93,13 +105,17 @@ export default function CommentForm(props: CommentFormProps) { e.preventDefault(); if (!validateForm()) return; - props.onSubmit({ - content: sanitizeInput(content().trim()), - }); + if (props.isEdit && props.onUpdate) { + props.onUpdate({ content: sanitizeInput(content().trim()) }); + } else { + props.onSubmit({ content: sanitizeInput(content().trim()) }); + } - setContent(""); - setErrors({}); - setTouched({}); + if (!props.isEdit) { + setContent(""); + setErrors({}); + setTouched({}); + } }; const handleBlur = () => { @@ -131,33 +147,67 @@ export default function CommentForm(props: CommentFormProps) { d="M8 12h.01M12 12h.01M16 12h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z" /> - {props.isReply ? "Написать ответ" : "Оставить комментарий"} + {props.isEdit ? "Редактировать комментарий" : props.isReply ? "Написать ответ" : "Оставить комментарий"}
-