-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat: add adaptive and pagination #112
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@stillNiceTanya, привет!
Проделана хорошая и объёмная работа, спасибо большое!
Оставил несколько комментарий по коду
max-width: 376px; | ||
height: 252px; | ||
object-fit: contain; | ||
max-width: 288px; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Почему максимальная ширина у изображения карточки стала 288, если на макете есть 376px?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Спасибо, взяла не правильную ширину из мобильной версии
padding: 0; | ||
font-size: 24px; | ||
line-height: 29px; | ||
font-weight: 500; | ||
font-family: 'Montserrat Alternates', 'Inter', Arial, sans-serif; | ||
font-family: "Montserrat Alternates", "Inter", Arial, sans-serif; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Мы всегда используем одинарные кавычки, так что менять незачем
Для шрифтов и цветов используем CSS-переменные, которые хранятся в файле https://github.com/Lapkipomoshi/help_paw_frontend/blob/dev/src/utils/vars.css
Конкретно здесь будет font-family: var(--font-family-title);
src/pages/PapersPage/PapersPage.jsx
Outdated
}, []); | ||
|
||
return ( | ||
<MainContainer> | ||
<main className='main papers'> | ||
<div className='papers__head-block'> | ||
<h1 className='papers__title'>Полезные статьи</h1> | ||
<Button className='margin-left_auto' to='/shelters' link>Хочу помогать</Button> | ||
<Button className='margin-left_auto button--mobile-hidden' to='/shelters' link> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Все классы называем согласно БЭМ-методологии. Название класса button--mobile-hidden не подходит
По БЭМ можно создать класс papers__offer-button
и прописать нужные стили туда
Всем новые и изменённые файлы стилей можешь делать с расширением .scss
src/pages/PapersPage/PapersPage.jsx
Outdated
@@ -5,30 +5,47 @@ import PaperCard from '../../components/PaperCard/PaperCard'; | |||
import Button from '../../ui/Button/Button'; | |||
import papersApi from './api'; | |||
|
|||
const PAPERS_PER_PAGE = 1; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Почему 1? Должна быть зависимость от разрешения окна браузера
Для констант используем верблюжий шрифт CamelCase. Исключения - ошибки и регулярки
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
сделала зависимость от разрешения окна такое mobile: 2, tablet: 4, desktop: 8
если где-то пропустила информацию, что другие цифры для первой подгрузки новостей, скажи, пожалуйста :)
src/pages/PapersPage/PapersPage.jsx
Outdated
const PapersPage = () => { | ||
const [papersList, setPapersList] = useState([]); // список отображаемых карточек со статьями | ||
const [papersPage, setPapersPage] = useState(0); // текущая загруженная страница статей |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Зачем отдельная переменная состояния для этого? Достаточно использовать papersList.length
src/pages/PapersPage/PapersPage.jsx
Outdated
papersApi | ||
.getPapers(9) // загрузка статей | ||
.getPapers(PAPERS_PER_PAGE, papersPage * PAPERS_PER_PAGE) // загрузка статей |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Здесь точно надо умножать второй аргумент на PAPERS_PER_PAGE
?
src/pages/PapersPage/PapersPage.jsx
Outdated
<Button className='margin_column-center'>Больше статей</Button> | ||
<Button | ||
className='button--full-width' | ||
disabled={!hasMorePapers} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Кнопку лучше не деактивировать, а вообще скрывать - для этого есть класс display_none
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
расположение .display_none не перебивает .button {display:inline-block}, проще сделать условный рендеринг кнопки, в зависимости от того, есть новости или нет
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
еще как вариант можно сделать так же, как с показом надписи "Не удалось загрузить статьи". Если все новости отображены, то ничего не рендерить.
{papersList.length условие ? ( <Route path="/movies"> <Button className='margin_column-center'>Больше статей</Button> </Route> ) : ( "" )}
} | ||
|
||
@media (min-width: 768px) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Можно добавить класс элементу standart-font_type_h2
, тогда можно вообще не прописывать для шрифтов медиа запросы
Это стиль из файла https://github.com/Lapkipomoshi/help_paw_frontend/blob/dev/src/pages/App/styles/standart-font.scss
min-width: 400px; | ||
min-height: 416px; | ||
padding: 8px 8px 24px; | ||
border: 2px solid var(--color-background-base); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Можно или не указывать границу, раз уж она не отображается, или задавать цвет rgba(0,0,0,0)
. А заданный цвет вводит в заблуждение как будто граница есть
gap: 36px 24px; | ||
margin: 0 auto 60px; | ||
padding: 0; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Стиль padding
уже задавала ранее с тем же значением
src/pages/PapersPage/PapersPage.jsx
Outdated
.then((res) => { | ||
setPapersList(res.results); | ||
setPapersList((prev) => { return [...prev, ...res.results]; }); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Можно записать короче, setPapersList([...papersList, ...res.results]);
@@ -6,7 +6,7 @@ | |||
font-size: 24px; | |||
line-height: 29px; | |||
font-weight: 500; | |||
font-family: "Montserrat Alternates", "Inter", Arial, sans-serif; | |||
font-family: var(--font-family-title); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Тут лишний пробел
@@ -6,7 +6,7 @@ | |||
font-size: 24px; | |||
line-height: 29px; | |||
font-weight: 500; | |||
font-family: "Montserrat Alternates", "Inter", Arial, sans-serif; | |||
font-family: var(--font-family-title); | |||
color: var(--color-text-base); | |||
} | |||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Лишняя пустая строка
} | ||
} | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Лишняя пустая строка
src/pages/PapersPage/PapersPage.jsx
Outdated
import './PapersPage.scss'; | ||
import MainContainer from '../../components/MainContainer/MainContainer'; | ||
import PaperCard from '../../components/PaperCard/PaperCard'; | ||
import Button from '../../ui/Button/Button'; | ||
import papersApi from './api'; | ||
|
||
const PapersAmountByBreakpoint = { mobile: 2, tablet: 4, desktop: 8 }; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Эту константу лучше перенести в PapersPage
, так как только в нём и используется
На фронте первая буква в СamelCase должная быть строчная. Заглавная - только у классов и функциональных компонентов. Это принятая общая договорённость вообще среди общества фронтов, чтобы видеть сразу с чем имеем дело
В требованиях этого не написано, но на созвоне после спрашивал: команда попросила всегда по 3 статьи добавлять при нажатии на кнопку "Больше статей". Изначальное количество просили сделать как на макете. Но в действительности сумма карточек должна быть кратна количеству умещаемых в ряд этих самых карточек, то есть ряд по горизонтали всегда должен быть законченным
Предлагаю:
- до 633px (1 карточка в ряд) изначально загружать 3 карточки как на макете (я бы 5 загружал, правда) и добавлять по 3 карточки;
- на отрезке от 634 по 750px (2 карточки в ряд) изначально загружать 6 карточек и добавлять по 2 (или 4) карточки;
- если от 751px (3 карточки в ряд) изначально загружать 9 карточек и добавлять по 3 карточки (по-моему лучше 6, но кто меня спрашивал)
Примечание: надо иметь ввиду, что точки переходов зависят от стилей, поэтому могут поменяться, так что, возможно, есть решение получше
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ну тогда я тебя не поняла, так как ты написал как раз таки не в camelCase, а в СamelCase 😅
На счет количества загружаемых карточек, зачем такая сложная логика, на что это влияет с точки зрения пользователя? Учитывая называнные брейкпоинты и количество для них, выглядит как костыль 🙂 если поменяется дизайн, ширина карточки или еще что - все поменяется и придется менять логику в коде и поддержка будет услажнена.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Лишь написал, как считается делать грамотно. Можешь не воссоздавать. Про момент в случае смены дизайна - сам указал в примечании
Классы и функциональные компоненты - с большой буквы
Переменные и методы - с маленькой буквы
Можно в css задавать количество столбцов для grid, если не нравятся, что брейкпоинты для grid не совпадают с брейкпоинтами для разрешений в макете
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Предлагаю подумать позже, если на сейчас этот момент не критичен.
Пока не нашла хорошее решение, которое будет легко и понятно поддерживать😕
src/pages/PapersPage/PapersPage.jsx
Outdated
default: | ||
return PapersAmountByBreakpoint.desktop; | ||
} | ||
}, [isMobile, isTablet, isDesktop]); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Любопытное решение, особенно учитывая, что никогда не встречал useMemo
и useMediaQuery
. Код работает, выглядит вполне читаемо
Однако он подключает дополнительную библиотеку и использует нескольких констант, которые код, видимо, постоянно отслеживает, что не очень оптимизировано
Альтернативное решение, если интересно, - создать функцию computePapersAmount:
const computePapersAmount = (isStart = false) => {
const documentWidth = document.documentElement.clientWidth;
if (documentWidth < 634) {
return 3;
}
if (documentWidth > 750) {
return isStart ? 9 : 3;
}
return isStart ? 6 : 4;
};
И в запросе тогда указывать:
.getPapers(computePapersAmount(isStart), papersList.length)
Аргумент isStart
нужен, так как количество изначальных карточек отличается от того, сколько надо добавлять при нажатии на кнопку
Думаю, тут надо посоветоваться с @bevuxyna
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
вообще почитала, что в нашем случае цена использования useMemo выше цены вычислений, так что не знаю, есть ли смысл использовать
https://habr.com/ru/companies/otus/articles/696610/
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
думаю, useMemo действительно лишний тут
насчет создания функции с привязкой к dom, не соглашусь, что это более оптимизированно
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
можно попробовать через window.innerWidth
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
чем это лучше, объясните, пожалуйста)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
я не знаю, чем это лучше, но раз мы отказываемся от useMemo, я предложила вариант, который знаю)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
с помощью useMemo я думала мемоизировать константу, я уберу его)) на использование useMediaQuery использование useMemo не влияет
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@bevuxyna, разница в том, что window.innerWidth не учитывает скроллы
} | ||
} | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Лишняя пустая строчка
} | ||
} | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Лишняя пустая строчка
font-size: 40px; | ||
line-height: 49px; | ||
font-size: 20px; | ||
line-height: 24px; | ||
font-weight: 600; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Стили font-size
, line-height
и font-weight
уже есть в классе standart-font_type_h2
, так что дублировать их не надо
Лишнее 2 строчки в конце
width: 1440px; | ||
padding: 0 132px 80px; | ||
width: 100%; | ||
padding: 0 16px 32px; | ||
background-color: var(--color-background-base); | ||
box-sizing: border-box; | ||
font-family: var(--font-family-title); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
font-family: var(--font-family-title);
Эта строка уже тут лишняя. Удали, пожалуйста
@@ -11,7 +11,7 @@ | |||
border: none; | |||
border-radius: 12px; | |||
box-sizing: border-box; | |||
transition-duration: .7s; | |||
transition-duration: 0.7s; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Если каждый будет менять общие файлы на свой вкус, то у них будет забитая история коммитов, что может только мешать
В таких случаях надо или смотреть в доках, или искать договорённости в истории, или обсуждать, чтобы код поддерживать в одном стиле
@stillNiceTanya, здорово, спасибо большое! Возникло несколько предложений что можно улучшить |
77cddef
to
7f84f5b
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Так и не понял, зачем создавать 2 постоянных слушателей useMediaQuery
вместо того, чтобы смотреть какая ширина у document
1 раз при загрузке страницы и после только при нажатии на кнопку
PapersContent
выглядит неплохо, если сделать его универсальным и использовать на других страницах, а так не особо понимаю зачем выносить в отдельный компонент
На созвоне просили всегда добавлять по 3 карточки со статьями и изначальное количество сделать как на макетах
У isError
всегда значение false
и никогда не меняется, так что смысла в нём не вижу
Eslint не позволяет запустить проект из-за того, что было изменение в правилах, а код после этого не подправлен
|
@Artyom774 все-таки вынесла обратно вне компонента PapersPage константы initialPapersAmountByBreakpoint и papersAmount , так как у этих констант нет зависимостей от PapersPage, и не нужно, чтобы каждый раз был их перерендер У isError добавила логику true, спасибо, что заметил, я пропустила😌 PapersContent - вынесла в отдельный компонент, так как уже совсем портянка становилась PapersPage. Если потребуется подобный компонент, сделаем его более универсальным, или когда будем рефакторить другие страницы |
No description provided.