diff --git a/api-examples/comments.http b/api-examples/comments.http index fd797fb83..843b5b82a 100644 --- a/api-examples/comments.http +++ b/api-examples/comments.http @@ -20,9 +20,9 @@ X-Token: 7ee15209d8429544dea8123fbdae254f5f79e6da5d720fec3127d9385b6eb9bc # Создание ответа на коммент коммента POST http://query.rest/api/v1/comments Content-Type: application/json -X-Token: 7ee15209d8429544dea8123fbdae254f5f79e6da5d720fec3127d9385b6eb9bc +X-Token: 40717d1c056933a15c15a0d8ccd6684cd8ff2805b845d9810a4446c85d2f93c4 { "text": "Первый ответ на коммент!", - "parent": {"_id": "670429839c74519426f378bd", "_type": "comment"} + "parent": {"_id": "68056df17e843dad89610a98", "_type": "comment"} } diff --git a/src/app/article/index.js b/src/app/article/index.js index 54f037b64..6acbf51ff 100644 --- a/src/app/article/index.js +++ b/src/app/article/index.js @@ -1,7 +1,6 @@ import { memo, useCallback } from 'react'; import { useParams } from 'react-router-dom'; import useStore from '../../hooks/use-store'; -import useTranslate from '../../hooks/use-translate'; import useInit from '../../hooks/use-init'; import PageLayout from '../../components/page-layout'; import Head from '../../components/head'; @@ -13,20 +12,26 @@ import TopHead from '../../containers/top-head'; import { useDispatch, useSelector } from 'react-redux'; import shallowequal from 'shallowequal'; import articleActions from '../../store-redux/article/actions'; +import commentsActions from '../../store-redux/comments/actions'; import HeadLayout from '../../components/head-layout'; +import ArticleComments from '../../containers/article-comments'; +import useLocale from '../../hooks/use-locale'; + function Article() { const store = useStore(); - const dispatch = useDispatch(); // Параметры из пути /articles/:id + const { t, locale} = useLocale() + const params = useParams(); useInit(() => { //store.actions.article.load(params.id); - dispatch(articleActions.load(params.id)); - }, [params.id]); + dispatch(articleActions.load(params.id, locale)); + dispatch(commentsActions.load(params.id)); + }, [params.id, locale]); const select = useSelector( state => ({ @@ -36,8 +41,6 @@ function Article() { shallowequal, ); // Нужно указать функцию для сравнения свойства объекта, так как хуком вернули объект - const { t } = useTranslate(); - const callbacks = { // Добавление в корзину addToBasket: useCallback(_id => store.actions.basket.addToBasket(_id), [store]), @@ -55,6 +58,7 @@ function Article() { + diff --git a/src/app/basket/index.js b/src/app/basket/index.js index 52a7badfd..61d8494b2 100644 --- a/src/app/basket/index.js +++ b/src/app/basket/index.js @@ -1,19 +1,20 @@ import { memo, useCallback } from 'react'; -import { useDispatch, useStore as useStoreRedux } from 'react-redux'; +import { useDispatch } from 'react-redux'; import useStore from '../../hooks/use-store'; import useSelector from '../../hooks/use-selector'; -import useInit from '../../hooks/use-init'; -import useTranslate from '../../hooks/use-translate'; import ItemBasket from '../../components/item-basket'; import List from '../../components/list'; import ModalLayout from '../../components/modal-layout'; import BasketTotal from '../../components/basket-total'; import modalsActions from '../../store-redux/modals/actions'; +import useLocale from '../../hooks/use-locale'; + + function Basket() { const store = useStore(); const dispatch = useDispatch(); - + const {locale, t} = useLocale() const select = useSelector(state => ({ list: state.basket.list, amount: state.basket.amount, @@ -30,12 +31,11 @@ function Basket() { }, [store]), }; - const { t } = useTranslate(); - const renders = { itemBasket: useCallback( item => ( { await Promise.all([store.actions.catalog.initParams(), store.actions.categories.load()]); }, - [], + [locale], true, ); - const { t } = useTranslate(); - return ( <> diff --git a/src/app/profile/index.js b/src/app/profile/index.js index 166d127fb..450e7dd90 100644 --- a/src/app/profile/index.js +++ b/src/app/profile/index.js @@ -1,7 +1,6 @@ import { memo } from 'react'; import useStore from '../../hooks/use-store'; import useSelector from '../../hooks/use-selector'; -import useTranslate from '../../hooks/use-translate'; import useInit from '../../hooks/use-init'; import PageLayout from '../../components/page-layout'; import Head from '../../components/head'; @@ -11,6 +10,8 @@ import LocaleSelect from '../../containers/locale-select'; import TopHead from '../../containers/top-head'; import ProfileCard from '../../components/profile-card'; import HeadLayout from '../../components/head-layout'; +import useLocale from '../../hooks/use-locale'; + function Profile() { const store = useStore(); @@ -24,7 +25,7 @@ function Profile() { waiting: state.profile.waiting, })); - const { t } = useTranslate(); + const { t } = useLocale() return ( <> @@ -37,7 +38,7 @@ function Profile() { - + diff --git a/src/components/article-card/index.js b/src/components/article-card/index.js index d636d9f88..f8d257e15 100644 --- a/src/components/article-card/index.js +++ b/src/components/article-card/index.js @@ -13,22 +13,22 @@ function ArticleCard(props) {
{article.description}
-
Страна производитель:
+
{t('article.country')}:
{article.madeIn?.title} ({article.madeIn?.code})
-
Категория:
+
{t('article.category')}:
{article.category?.title}
-
Год выпуска:
+
{t('article.releaseYear')}:
{article.edition}
-
Цена:
+
{t('article.price')}:
{numberFormat(article.price)} ₽
+ ); } @@ -18,6 +18,7 @@ Button.propTypes = { title: PropTypes.string, style: PropTypes.oneOf(['text', 'primary', 'delete', 'outline']), type: PropTypes.oneOf(['button', 'submit']), + disabled: PropTypes.bool, }; export default memo(Button); diff --git a/src/components/button/style.css b/src/components/button/style.css index 0efc8a896..c0ba11c33 100644 --- a/src/components/button/style.css +++ b/src/components/button/style.css @@ -7,6 +7,12 @@ border-color: var(--primary); color: var(--primary); } + + &:disabled&:hover { + color: var(--second-text); + border-color: var(--filter-border); + background-color: var(--filter-border); + } } .Button_style_delete { @@ -34,8 +40,9 @@ .Button_style_text { padding: 0; border: none; + color: var(--primary); &:hover { - color: var(--primary); + opacity: 0.6; } } diff --git a/src/components/comment-action/index.js b/src/components/comment-action/index.js new file mode 100644 index 000000000..b865a70e2 --- /dev/null +++ b/src/components/comment-action/index.js @@ -0,0 +1,69 @@ +import { memo } from 'react'; +import PropTypes from 'prop-types'; +import { cn as bem } from '@bem-react/classname'; +import './style.css'; +import Button from '../button'; +import { Link } from 'react-router-dom'; + +function CommentAction(props) { + const { + id='', + t = text => text, + onAdd = () => {}, + setValue = () => {}, + cancel = () => {}, + value = '', + isReply = false, + auth = false, + link = '/login', + backLink = '', + } = props; + const cn = bem('CommentAction'); + + const label = isReply ? t('comment.newReply') : t('comment.newComment'); + + const onChangeHandler = event => { + setValue(event.target.value); + }; + + + if (!auth) { + return ( +
+ {t('comment.authHint.link')}{t('comment.authHint.text')} +
+ ); + } + + + return ( +
+ +