From 028ef2940887aa1b850944e99c9e18bf50834cc7 Mon Sep 17 00:00:00 2001 From: Denis Date: Fri, 18 Apr 2025 18:08:44 +0800 Subject: [PATCH 1/3] 1 task --- api-examples/comments.http | 2 +- src/app/article/index.js | 3 + src/components/button/index.js | 2 +- src/components/button/style.css | 14 ++++- src/components/comment-item/index.js | 87 +++++++++++++++++++++++++++ src/components/comment-item/style.css | 42 +++++++++++++ src/components/comment-list/index.js | 62 +++++++++++++++++++ src/components/comment-list/style.css | 8 +++ src/components/input/index.js | 4 +- src/components/textarea/index.js | 33 ++++++++++ src/components/textarea/style.css | 19 ++++++ src/containers/comments/index.js | 79 ++++++++++++++++++++++++ src/global.css | 1 + src/i18n/translations/en.json | 2 +- src/i18n/translations/ru.json | 2 +- src/store-redux/comments/actions.js | 45 ++++++++++++++ src/store-redux/comments/reducer.js | 38 ++++++++++++ src/store-redux/exports.js | 1 + src/utils/buildCommentTree.js | 21 +++++++ src/utils/format-date.js | 17 ++++++ 20 files changed, 475 insertions(+), 7 deletions(-) create mode 100644 src/components/comment-item/index.js create mode 100644 src/components/comment-item/style.css create mode 100644 src/components/comment-list/index.js create mode 100644 src/components/comment-list/style.css create mode 100644 src/components/textarea/index.js create mode 100644 src/components/textarea/style.css create mode 100644 src/containers/comments/index.js create mode 100644 src/store-redux/comments/actions.js create mode 100644 src/store-redux/comments/reducer.js create mode 100644 src/utils/buildCommentTree.js create mode 100644 src/utils/format-date.js diff --git a/api-examples/comments.http b/api-examples/comments.http index fd797fb83..bf6bc3de0 100644 --- a/api-examples/comments.http +++ b/api-examples/comments.http @@ -1,6 +1,6 @@ # Комментрии к товару -GET http://query.rest/api/v1/comments?fields=items(_id,text,dateCreate,author(profile(name)),parent(_id,_type),isDeleted),count&limit=*&search[parent]=670260bb7dd498df5525e5ed +GET http://query.rest/api/v1/comments?field=items(_id,text,dateCreate,author(profile(name)),paren(_id,_type),isDeleted),count&limit=*&search[parent]=670260bb7dd498df5525e5ed # Остальные методы в http://query.rest/api/v1/docs/ (http://localhost:8010/api/v1/docs/) diff --git a/src/app/article/index.js b/src/app/article/index.js index 54f037b64..ac464b9e6 100644 --- a/src/app/article/index.js +++ b/src/app/article/index.js @@ -14,6 +14,8 @@ import { useDispatch, useSelector } from 'react-redux'; import shallowequal from 'shallowequal'; import articleActions from '../../store-redux/article/actions'; import HeadLayout from '../../components/head-layout'; +import Comments from "../../containers/comments"; + function Article() { const store = useStore(); @@ -56,6 +58,7 @@ function Article() { + ); diff --git a/src/components/button/index.js b/src/components/button/index.js index 7d1d3d05c..d2c7e11dc 100644 --- a/src/components/button/index.js +++ b/src/components/button/index.js @@ -16,7 +16,7 @@ function Button({ onClick = () => {}, title, style, type = 'button' }) { Button.propTypes = { onClick: PropTypes.func, title: PropTypes.string, - style: PropTypes.oneOf(['text', 'primary', 'delete', 'outline']), + style: PropTypes.oneOf(['text', 'primary', 'delete', 'outline', 'text-com']), type: PropTypes.oneOf(['button', 'submit']), }; diff --git a/src/components/button/style.css b/src/components/button/style.css index 0efc8a896..7dfd4563d 100644 --- a/src/components/button/style.css +++ b/src/components/button/style.css @@ -34,8 +34,20 @@ .Button_style_text { padding: 0; border: none; + color: var(--primary); &:hover { - color: var(--primary); + color: var(--main-text); + } +} + +.Button_style_text-com { + padding: 0; + border: none; + font-size: 12px; + color: var(--primary); + + &:hover { + color: var(--main-text); } } diff --git a/src/components/comment-item/index.js b/src/components/comment-item/index.js new file mode 100644 index 000000000..6853542e8 --- /dev/null +++ b/src/components/comment-item/index.js @@ -0,0 +1,87 @@ +import React, { useCallback } from 'react'; +import './style.css'; +import formatDate from '../../utils/format-date'; +import Button from '../button'; +import Textarea from '../textarea'; + +const CommentItem = ({ + comment, + activeReplyId = null, + setActiveReplyId = _id => {}, + isAuth = false, + postCommentText = '', + setPostCommentText = () => {}, + onPost = () => {}, + sessionUserId = null, + goToLogin = () => {}, +}) => { + + const callbacks = { + onReply: useCallback(() => { + setActiveReplyId(comment._id); + setPostCommentText(''); + }, []), + onActiveReplyReset: useCallback(() => { + setActiveReplyId(null); + setPostCommentText(''); + }, []), + }; + + return ( + <> +
+
+
+ {comment?.author?.profile?.name} +
+
{formatDate(comment?.dateCreate)}
+
+ +
{comment?.text}
+ +
+ +
+ {comment.replies.length > 0 && ( + <> + {comment.replies.map(child => ( + + ))} + + )} + {activeReplyId === comment._id && isAuth && ( +