Skip to content
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

Merged
merged 7 commits into from
May 30, 2023
Merged

Conversation

ponomareva-frontend
Copy link
Contributor

No description provided.

@ponomareva-frontend ponomareva-frontend changed the base branch from main to dev May 25, 2023 17:29
Copy link
Contributor

@Artyom774 Artyom774 left a 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;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Почему максимальная ширина у изображения карточки стала 288, если на макете есть 376px?

Copy link
Contributor Author

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;
Copy link
Contributor

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);

}, []);

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>
Copy link
Contributor

@Artyom774 Artyom774 May 25, 2023

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 Show resolved Hide resolved
@@ -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;
Copy link
Contributor

@Artyom774 Artyom774 May 25, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Почему 1? Должна быть зависимость от разрешения окна браузера

Для констант используем верблюжий шрифт CamelCase. Исключения - ошибки и регулярки

Copy link
Contributor Author

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
если где-то пропустила информацию, что другие цифры для первой подгрузки новостей, скажи, пожалуйста :)

const PapersPage = () => {
const [papersList, setPapersList] = useState([]); // список отображаемых карточек со статьями
const [papersPage, setPapersPage] = useState(0); // текущая загруженная страница статей
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Зачем отдельная переменная состояния для этого? Достаточно использовать papersList.length

papersApi
.getPapers(9) // загрузка статей
.getPapers(PAPERS_PER_PAGE, papersPage * PAPERS_PER_PAGE) // загрузка статей
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Здесь точно надо умножать второй аргумент на PAPERS_PER_PAGE?

<Button className='margin_column-center'>Больше статей</Button>
<Button
className='button--full-width'
disabled={!hasMorePapers}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Кнопку лучше не деактивировать, а вообще скрывать - для этого есть класс display_none

Copy link
Contributor Author

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}, проще сделать условный рендеринг кнопки, в зависимости от того, есть новости или нет

Copy link
Contributor

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) {
Copy link
Contributor

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);
Copy link
Contributor

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;
Copy link
Contributor

@Artyom774 Artyom774 May 26, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Стиль padding уже задавала ранее с тем же значением

.then((res) => {
setPapersList(res.results);
setPapersList((prev) => { return [...prev, ...res.results]; });
Copy link
Contributor

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);
Copy link
Contributor

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);
}

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Лишняя пустая строка

}
}

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Лишняя пустая строка

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 };
Copy link
Contributor

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, но кто меня спрашивал)

Примечание: надо иметь ввиду, что точки переходов зависят от стилей, поэтому могут поменяться, так что, возможно, есть решение получше

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ну тогда я тебя не поняла, так как ты написал как раз таки не в camelCase, а в СamelCase 😅

На счет количества загружаемых карточек, зачем такая сложная логика, на что это влияет с точки зрения пользователя? Учитывая называнные брейкпоинты и количество для них, выглядит как костыль 🙂 если поменяется дизайн, ширина карточки или еще что - все поменяется и придется менять логику в коде и поддержка будет услажнена.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Лишь написал, как считается делать грамотно. Можешь не воссоздавать. Про момент в случае смены дизайна - сам указал в примечании

Классы и функциональные компоненты - с большой буквы
Переменные и методы - с маленькой буквы

Можно в css задавать количество столбцов для grid, если не нравятся, что брейкпоинты для grid не совпадают с брейкпоинтами для разрешений в макете

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Предлагаю подумать позже, если на сейчас этот момент не критичен.
Пока не нашла хорошее решение, которое будет легко и понятно поддерживать😕

default:
return PapersAmountByBreakpoint.desktop;
}
}, [isMobile, isTablet, isDesktop]);
Copy link
Contributor

@Artyom774 Artyom774 May 27, 2023

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

Copy link
Contributor

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/

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

думаю, useMemo действительно лишний тут
насчет создания функции с привязкой к dom, не соглашусь, что это более оптимизированно

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

можно попробовать через window.innerWidth

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

чем это лучше, объясните, пожалуйста)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

я не знаю, чем это лучше, но раз мы отказываемся от useMemo, я предложила вариант, который знаю)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

с помощью useMemo я думала мемоизировать константу, я уберу его)) на использование useMediaQuery использование useMemo не влияет

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@bevuxyna, разница в том, что window.innerWidth не учитывает скроллы

}
}

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Лишняя пустая строчка

}
}

Copy link
Contributor

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;
Copy link
Contributor

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);
Copy link
Contributor

@Artyom774 Artyom774 May 27, 2023

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;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Если каждый будет менять общие файлы на свой вкус, то у них будет забитая история коммитов, что может только мешать
В таких случаях надо или смотреть в доках, или искать договорённости в истории, или обсуждать, чтобы код поддерживать в одном стиле

@Artyom774
Copy link
Contributor

Artyom774 commented May 27, 2023

@stillNiceTanya, здорово, спасибо большое!

Возникло несколько предложений что можно улучшить

Copy link
Contributor

@Artyom774 Artyom774 left a 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 Artyom774 requested a review from bevuxyna May 29, 2023 16:04
@ponomareva-frontend
Copy link
Contributor Author

Так и не понял, зачем создавать 2 постоянных слушателей useMediaQuery вместо того, чтобы смотреть какая ширина у document 1 раз при загрузке страницы и после только при нажатии на кнопку

PapersContent выглядит неплохо, если сделать его универсальным и использовать на других страницах, а так не особо понимаю зачем выносить в отдельный компонент

На созвоне просили всегда добавлять по 3 карточки со статьями и изначальное количество сделать как на макетах

У isError всегда значение false и никогда не меняется, так что смысла в нём не вижу

Eslint не позволяет запустить проект из-за того, что было изменение в правилах, а код после этого не подправлен

@ponomareva-frontend
Copy link
Contributor Author

@Artyom774
исправила логику добавления количества статей. useMediaQuery - удобный хук, не совсем понимаю, чем следить за обновлением ширины экрана пользователя напрямую удобнее, чем использовать хук🙃

все-таки вынесла обратно вне компонента PapersPage константы initialPapersAmountByBreakpoint и papersAmount , так как у этих констант нет зависимостей от PapersPage, и не нужно, чтобы каждый раз был их перерендер

У isError добавила логику true, спасибо, что заметил, я пропустила😌

PapersContent - вынесла в отдельный компонент, так как уже совсем портянка становилась PapersPage. Если потребуется подобный компонент, сделаем его более универсальным, или когда будем рефакторить другие страницы

@ponomareva-frontend ponomareva-frontend merged commit 6fad85e into dev May 30, 2023
@ponomareva-frontend ponomareva-frontend deleted the papers-page-adaptive branch June 5, 2023 07:09
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants