diff --git a/src/api/index.js b/src/api/index.js index a5f073295..c644c15e2 100644 --- a/src/api/index.js +++ b/src/api/index.js @@ -9,6 +9,14 @@ class APIService { this.defaultHeaders = { 'Content-Type': 'application/json', }; + + const i18n = this.services?.i18n; + if (i18n) { + this.setHeader('X-Lang', i18n.getLocale()); + i18n.subscribe(locale => { + return this.setHeader('X-Lang', locale); + }); + } } /** diff --git a/src/app/article/index.js b/src/app/article/index.js index 54f037b64..fe7318501 100644 --- a/src/app/article/index.js +++ b/src/app/article/index.js @@ -14,19 +14,21 @@ 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'; +import useServices from '../../hooks/use-services'; function Article() { const store = useStore(); + const services = useServices(); + const locale = services.i18n?.getLocale(); const dispatch = useDispatch(); - // Параметры из пути /articles/:id const params = useParams(); useInit(() => { - //store.actions.article.load(params.id); dispatch(articleActions.load(params.id)); - }, [params.id]); + }, [params.id, locale]); const select = useSelector( state => ({ @@ -34,8 +36,7 @@ function Article() { waiting: state.article.waiting, }), shallowequal, - ); // Нужно указать функцию для сравнения свойства объекта, так как хуком вернули объект - + ); const { t } = useTranslate(); const callbacks = { @@ -55,6 +56,7 @@ function Article() { + diff --git a/src/app/main/index.js b/src/app/main/index.js index d9fb1c6c2..ce462596e 100644 --- a/src/app/main/index.js +++ b/src/app/main/index.js @@ -10,15 +10,19 @@ import CatalogList from '../../containers/catalog-list'; import LocaleSelect from '../../containers/locale-select'; import TopHead from '../../containers/top-head'; import HeadLayout from '../../components/head-layout'; +import useServices from '../../hooks/use-services'; function Main() { const store = useStore(); + const services = useServices(); + const locale = services.i18n?.getLocale(); useInit( async () => { await Promise.all([store.actions.catalog.initParams(), store.actions.categories.load()]); }, [], + [locale], true, ); diff --git a/src/app/profile/index.js b/src/app/profile/index.js index 166d127fb..76043ab05 100644 --- a/src/app/profile/index.js +++ b/src/app/profile/index.js @@ -37,7 +37,7 @@ function Profile() { - + diff --git a/src/components/article-card/index.js b/src/components/article-card/index.js index d636d9f88..03073b60e 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('card.country')}
{article.madeIn?.title} ({article.madeIn?.code})
-
Категория:
+
{t('card.сategory')}
{article.category?.title}
-
Год выпуска:
+
{t('card.year')}
{article.edition}
-
Цена:
+
{t('card.price')}
{numberFormat(article.price)} ₽
+ ); } @@ -16,7 +17,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-primary']), type: PropTypes.oneOf(['button', 'submit']), }; diff --git a/src/components/button/style.css b/src/components/button/style.css index 0efc8a896..0ca4e0c2c 100644 --- a/src/components/button/style.css +++ b/src/components/button/style.css @@ -1,41 +1,44 @@ .Button_style_primary { background-color: var(--primary); color: var(--second-text); - &:hover { background-color: var(--background); border-color: var(--primary); color: var(--primary); } } - .Button_style_delete { background-color: var(--delete); color: var(--second-text); border-color: var(--delete); - &:hover { background-color: var(--background); color: var(--delete); border-color: var(--delete); } } - .Button_style_outline { border-color: var(--primary); color: var(--primary); - &:hover { background-color: var(--primary); color: var(--second-text); } } - .Button_style_text { padding: 0; border: none; - &:hover { color: var(--primary); } } + +.Button_style_text-primary { + padding: 0; + border: none; + color: var(--primary); + + &:hover { + color: var(--primary-select); + } +} diff --git a/src/components/comments-container/index.js b/src/components/comments-container/index.js new file mode 100644 index 000000000..98d4f816b --- /dev/null +++ b/src/components/comments-container/index.js @@ -0,0 +1,24 @@ +import { memo } from 'react'; +import PropTypes from 'prop-types'; +import { cn as bem } from '@bem-react/classname'; +import './style.css'; + +function CommentsContainer({ children, t, count = '0' }) { + const cn = bem('CommentsContainer'); + + return ( +
+

+ {t('comments.header')} ({count}) +

+ {children} +
+ ); +} + +// CommentsConatiner.propTypes = { +// count: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), +// t: PropTypes.func, +// children: PropTypes.node, +// }; +export default memo(CommentsContainer); diff --git a/src/components/comments-container/style.css b/src/components/comments-container/style.css new file mode 100644 index 000000000..f5fc18afe --- /dev/null +++ b/src/components/comments-container/style.css @@ -0,0 +1,8 @@ +.CommentsContainer { + color: var(--main-text); +} + +.CommentsContainer-header { + margin-bottom: 24px; + font-family: var(--second-font-family); +} diff --git a/src/components/comments-form/index.js b/src/components/comments-form/index.js new file mode 100644 index 000000000..bd3956657 --- /dev/null +++ b/src/components/comments-form/index.js @@ -0,0 +1,48 @@ +import { memo } from 'react'; +import PropTypes from 'prop-types'; +import Form from '../form'; +import Textarea from '../textarea'; +import './style.css'; +import { cn as bem } from '@bem-react/classname'; + +function CommentsForm({ + onSubmit = () => {}, + t, + style, + option, + onClick = () => {}, + onChange = () => {}, + value, + success, +}) { + const cn = bem('CommentsForm'); + + return ( +
+
+