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

Zaytsev header #9

Closed
wants to merge 6 commits into from
Closed

Zaytsev header #9

wants to merge 6 commits into from

Conversation

zytsev
Copy link
Collaborator

@zytsev zytsev commented Aug 24, 2024

Create layout: header, footer, main page.

Copy link

netlify bot commented Aug 24, 2024

Deploy Preview for rest-graphql-client ready!

Name Link
🔨 Latest commit 5aab976
🔍 Latest deploy log https://app.netlify.com/sites/rest-graphql-client/deploys/66ccb0495b4d96000887b727
😎 Deploy Preview https://deploy-preview-9--rest-graphql-client.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.

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,
Copy link
Collaborator

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

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

непонятная настройка. Специально ее не ставил. Возможно, появилась, когда автоматически разрешались зависимости.

html {
color-scheme: dark;
}
button {
Copy link
Collaborator

Choose a reason for hiding this comment

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

всем кнопкам в проекте будет задан margin? обычно привычнее, что элементы, особенно такие базовые, не задают сами себе маржины

Copy link
Collaborator Author

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

Choose a reason for hiding this comment

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

тут наверное лучше использовать toBeInTheDocument, или по какой причине выбран toBeDefined?

Copy link
Collaborator Author

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...

Copy link
Collaborator

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

Copy link
Collaborator Author

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', () => {
Copy link
Collaborator

Choose a reason for hiding this comment

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

и тут выглядит так, что компонент layout ответственен только за то, чтобы отрисовать футер. Но у него же есть header и children. Тут можно добавить пару простых тестов на это. Header можно замокать вообще, просто проверить что был вызван (с нужными пропсами если они есть). И проверить, что отрисовал детей, вложив ему какой-то текст и проверить что этот текст есть.

Copy link
Collaborator Author

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

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

Copy link
Collaborator Author

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

Choose a reason for hiding this comment

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

вот эту переменную хардкодом я уже видела, можно было бы завести css variable под это, и везде использовать ее (чтобы если захотелось изменить background цвет приложения везде, нужно было бы менять только одно место)

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

ок

import { Button } from 'antd';

function Header() {
const [Y, setY] = React.useState(0);
Copy link
Collaborator

Choose a reason for hiding this comment

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

Y не очень имя, в коде ниже сразу непонятно. Лучше назвать scrollY, setScrollY хотя бы

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

ок

const scrollValue = window.scrollY;
setY(scrollValue);
}
React.useEffect(() => {
Copy link
Collaborator

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...
Если у вас у всех есть предпочтение писать так, то ну можно (но тогда нужно чтобы везде было консистентно), но особо не вижу смысла в лишних буквах

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

ок

return () => window.removeEventListener('scroll', onChangeY);
}, []);
return (
<header className={`${style.header} ${Y > 0 && 'issticky'}`}>
Copy link
Collaborator

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 и с ее помощью собирать

Copy link
Collaborator Author

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

Choose a reason for hiding this comment

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

лучше когда создаешь PR, просматривать его, чтобы не было таких мест (ниже тоже есть забытый закоментированный код)

Copy link
Collaborator Author

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

Choose a reason for hiding this comment

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

у тебя тут хэндлер переключения языка три раза копипастится. Можно его вынести в handleLangChange и везде использовать

Copy link
Collaborator

@bananazigzags bananazigzags Aug 24, 2024

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) => ({
Copy link
Collaborator

Choose a reason for hiding this comment

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

тут надо посмотреть, куда складывать этот стор. Если все будут его импортировать из компонента switchlang, это будет очень странно. Лучше если он будет где-то лежать отдельно, и уже оттуда этот компонент будет импортировать useLang и далее те, кто будет пользоваться этим языком (intl provider или что-то такое)

Copy link
Collaborator Author

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"
Copy link
Collaborator

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).
попробовала сейчас, тогда просто ничего не происходит. Если вернуть - тогда выполняется что-то, если пытаюсь делать коммит. Это похоже ошибка

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

не менял эти настройки.

}

.button_welcome_wrapper {
Copy link
Collaborator

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 (чтобы его можно было вставить и на странице и в хедере, вроде так же обсуждали)

@petru6e4ka petru6e4ka closed this Aug 29, 2024
@petru6e4ka petru6e4ka deleted the zaytsev_header branch August 29, 2024 11:43
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