-
Notifications
You must be signed in to change notification settings - Fork 2
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
Zaytsev header #9
Conversation
✅ Deploy Preview for rest-graphql-client ready!
To edit notification comments on pull requests, go to your Netlify site configuration. |
@@ -17,6 +17,7 @@ | |||
"react/static-property-placement": 0, | |||
"react/require-default-props": 0, | |||
"react-hooks/exhaustive-deps": 0, | |||
"linebreak-style": 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.
ты уверен в этой настройке? я вообще не знала, что такая есть (в настройках я видела обычно только lf, если настраивали), но тут в комментах к ответам, которые ее предлагают, говорят, что она плоха
https://stackoverflow.com/questions/39114446/how-can-i-write-a-eslint-rule-for-linebreak-style-changing-depending-on-windo
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/app/globals.css
Outdated
html { | ||
color-scheme: dark; | ||
} | ||
button { |
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.
всем кнопкам в проекте будет задан margin? обычно привычнее, что элементы, особенно такие базовые, не задают сами себе маржины
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.
не настаиваю. нужно было раздвинуть кнопки. сделаю контейнер
render(<RootLayout children={undefined} />); | ||
|
||
expect(screen.getByRole('img', { name: 'RSSchool' })).toHaveProperty('alt', 'RSSchool'); | ||
expect(screen.getByText('2024')).toBeDefined(); |
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.
тут наверное лучше использовать toBeInTheDocument, или по какой причине выбран toBeDefined?
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.
верно. сперва хотел поставить библиотеку .../jest-dom. там есть эти методы. Но библиотека нормально не встала, показались ошибки зависимостей. В документации NEXT JS предлагается toBeDefined...
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.
желательно поисследовать, как можно это решить. Сейчас те пакеты, что есть, все равно плохие (ошибки при установке). А где предлагается в документации? Если не получится нагуглить решения, можно пока оставить так, потом если получится, все пофиксить.
Вот какой-то ишью похожий, пока я его весь не просматривала
testing-library/jest-dom#515
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.
https://github.com/vercel/next.js/blob/canary/examples/with-vitest/__tests__/Home.test.tsx
вот их пример. Я согласен что надо настроить jest dom
import { render, screen } from '@testing-library/react'; | ||
import RootLayout from './layout'; | ||
|
||
describe('Layout component', () => { |
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.
и тут выглядит так, что компонент layout ответственен только за то, чтобы отрисовать футер. Но у него же есть header и children. Тут можно добавить пару простых тестов на это. Header можно замокать вообще, просто проверить что был вызван (с нужными пропсами если они есть). И проверить, что отрисовал детей, вложив ему какой-то текст и проверить что этот текст есть.
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.
ок
test('Page renders', () => { | ||
render(<Page />); | ||
|
||
expect(screen.getByRole('heading', { level: 1 })).toBeDefined(); |
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.
у некста такие тесты что ли в базовом приложении? странно, для меня это очень странно такое видеть в тестах DOM. to be defined, это больше про переменные. Я бы использовала toBeInTheDocument, если нет где-то инфы, что по какой-то причине это предпочтительно.
Ну вот тут говорят, что от tobedefined может быть много false positives.
https://medium.com/@jameswinston/quick-tips-tobedefined-or-not-tobedefined-that-is-the-question-tips-for-false-positives-in-jest-6f07025ea705
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.
выше написал
align-items: center; | ||
justify-content: space-evenly; | ||
width: 100%; | ||
background-color: #eaeae4; |
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 variable под это, и везде использовать ее (чтобы если захотелось изменить background цвет приложения везде, нужно было бы менять только одно место)
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/components/header/header.tsx
Outdated
import { Button } from 'antd'; | ||
|
||
function Header() { | ||
const [Y, setY] = React.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.
Y не очень имя, в коде ниже сразу непонятно. Лучше назвать scrollY, setScrollY хотя бы
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/components/header/header.tsx
Outdated
const scrollValue = window.scrollY; | ||
setY(scrollValue); | ||
} | ||
React.useEffect(() => { |
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.
тут не критично, но можно импортировать только то, что нужно (деструктурировать import {useState, useEffect} from 'react', и не нужно все время писать в коде React...
Если у вас у всех есть предпочтение писать так, то ну можно (но тогда нужно чтобы везде было консистентно), но особо не вижу смысла в лишних буквах
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/components/header/header.tsx
Outdated
return () => window.removeEventListener('scroll', onChangeY); | ||
}, []); | ||
return ( | ||
<header className={`${style.header} ${Y > 0 && 'issticky'}`}> |
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.
тут при Y 0 будет стиль style.header false. Ну, конечно он вряд ли что-то себе поймает, но можно сделать для такого варианта пустую строку просто. Или использовать библиотеку classnames и с ее помощью собирать
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.
ок
})); | ||
|
||
function SwitchLang() { | ||
//const language = useLang((state) => state.language); |
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.
лучше когда создаешь PR, просматривать его, чтобы не было таких мест (ниже тоже есть забытый закоментированный код)
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.
ок
return ( | ||
<form className={style.form}> | ||
<label className={style.label}> | ||
<input type="radio" name="lang" defaultChecked={true} value="en" onChange={(e) => setLanguage(e.target.value)}></input> |
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.
у тебя тут хэндлер переключения языка три раза копипастится. Можно его вынести в handleLangChange и везде использовать
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.
либо тут вообще можно было бы сделать массив языков, и далее просто по ним мапиться, т.к. у тебя здесь у этих трех инпутов отличается только value и label и что en default checked, остальное копипаста
setLanguage: (language: State['language']) => void; | ||
}; | ||
|
||
export const useLang = create<State & Action>((set) => ({ |
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.
тут надо посмотреть, куда складывать этот стор. Если все будут его импортировать из компонента switchlang, это будет очень странно. Лучше если он будет где-то лежать отдельно, и уже оттуда этот компонент будет импортировать useLang и далее те, кто будет пользоваться этим языком (intl provider или что-то такое)
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.
Если Zustand - правильнее делать один большой стор по типу Redux?
. "$(dirname "$0")/h" |
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.
а что делает это? я хаски можно почти не пользовалась. Тут нужно убирать совсем npx lint-staged? Я нашла какую-то статейку, где была эта строка и далее команда, которую выполняем (т.е. тут npx lint-staged).
попробовала сейчас, тогда просто ничего не происходит. Если вернуть - тогда выполняется что-то, если пытаюсь делать коммит. Это похоже ошибка
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_welcome_wrapper { |
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.
это же не глобальный стиль, этот стиль к page относится. Его можно в page.module.css сложить и можно сделать buttonWrapper просто. Ну или wrapper будет в том css module, который будет, когда этот блок кнопок будет сложен в shared (чтобы его можно было вставить и на странице и в хедере, вроде так же обсуждали)
Create layout: header, footer, main page.