## Общее ``` import React from 'react'; ``` Ненужен если не используется, посмотри как это настроить, по умолчанию в новых проектах он ен нужен. (Для этого может понадобится обновить версию typescript) --- Хотел бы узнать зачем webpack настроен вручную... У меня yarn не смог запустить проект --- eslint и prettier можно настроить пожестче --- в **tsconfig** настроет `baseUrl`, при этом все импорты относительные Вместо `import { IRootReducer } from '../../../redux/reducers/state';` Можно писать `import { IRootReducer } from 'redux/reducers/state';` --- Анимация у человеска организована стилями css, это быстрый вариант, но ограниченный. Если есть планы по **большому** расширению функционала, то рекомендую смотреть в сторону pixijs и react-pixi --- `: any` - *depricated*, типы стоит всегда называть, typescript все таки) --- ```typescript useEffect(() => {}, [<prop1>, <prop2>]); ``` `[]` - depricated (позволяется если нет пропсов совсем) --- точки с запятой либо используем в конце функций, типов и т.п. либо не используем --- Нужно убрать варнинги и критические ошибки в консоле --- перед `return` лучше перенос оставлять ## По файлам **src/view/components/LoginForm/index.tsx:16** ```typescript const LoginForm: React.FC<IFormRenderProps> = ({ handler, communication }: IFormRenderProps) => { ``` брать все props есть смысл только при пробросе вниз `<Component {...props} />` --- **src/core/Config.ts** - должен быть в системных енвироментах или в корне типо .env.development https://create-react-app.dev/docs/adding-custom-environment-variables/#adding-development-environment-variables-in-env **src/src/index.txt** - удалить **src/view/containers/Header/components/Burger** - удалить **src/view/containers/Header/Header.scss:10-12** - удалить **src/styles/fonts.scss** - пустой **src/view/components/InputField/index.tsx:34** - добавить `type={type}`. При вводе пароля, видим что пишем **src/modules/ProfilePage/index.tsx:11** - нет импорта. либо комментим импорт вместе с компонентом - либо удаляем оба **src/view/elements/Logo/index.tsx** - `svg-inline-react` ? не вижу причин для его использования, в нем же неправильно проброшена svg (смотри console.log) **src/view/containers/VideosContainer/index.tsx** - в `useEffect` мы имеем неудавлетворенную зависимость `communication` Если нет юзера то выдается мок. Надо сделать страницу приватной, тогда `user` точно будет и не нужно класть [user] в useEffect, там тогда вообще useEffect не нужен будет **src/redux/actions/communication/index.ts** - c redux toolkit легче и красивее **/src/redux/reducers/video/sagas/index.ts:10** videoMock - сомневаюсь что на продакшене это нужно **/src/redux/reducers/video/sagas/index.ts:58** - `yield call` неявно указан тип `any` **URL :/profile, :/upload** - неприватные ссылки **src/view/containers/ProjectContainer/index.tsx:41-45** - Приватные страницы должны проверяться в одном месте выше по роутам смотри примеры https://reactrouter.com/web/example/auth-workflow https://github.com/remix-run/react-router/blob/main/examples/auth/src/App.tsx **src/view/elements/Heading/index.tsx** - все варианты делают одно и то же кроме default и то он отличается только `h1` - `p`, рассмотри как убрать дублирующийся код --- **src/modules** - лишнее, все оборачиваем одинаково, предлагаю написать один компонент с парой свойств управляющих содержимым или еще лучше написать одинаково для всех компонентов и обернуть ими роутер не надо все компоненты копипастить и оборачивать одним и тем же лучше в одном файле все обернуть, даже в MainRouter Wrapper не обернут только profile и examples - я не увидел отличий --- **src/view/containers/ProjectContainer/index.tsx:49~21** - перенос строки после вызова копонента https://airbnb.io/javascript/react/#alignment **src/view/containers/ProjectContainer/index.tsx:39** - `singleVideo` вместо `curVideoId` **src/view/containers/ProjectContainer/index.tsx:37** - `console.log` не использовать без явной необходимости **src/view/containers/ProjectContainer/index.tsx:22** - `props` объявлена но не используется **src/view/containers/ProjectContainer/index.tsx:23** - `useParams<{id: string}>()` вместо интерфейса, если не используется в проекте больше. Интерфейс избыточен **src/view/containers/ProjectContainer/index.tsx:55** - `</>` выглядит как одинокая. Пример отступов airbnb ```typescript {singleVideo && <> <ProjectName title={singleVideo.name} handler={(value: string) => dispatch( singleVideoAction.singleVideoEdit({ name: value, id: curVideoId, }) )} /> <VideosWrapper video={singleVideo} /> </> } ``` --- **src/view/containers/ProjectContainer/components/ProjectName/index.tsx:18** Пример переносов: ```typescript <input className={b()} value={inputTitle} onBlur={(e) => handler(e.currentTarget.value)} onChange={event => setTitle(event.target.value)} /> ``` --- **src/view/containers/ProjectContainer/components/VideosWrapper/index.tsx:20** - отступ на 1 вниз **src/view/containers/ProjectContainer/components/VideosWrapper/index.tsx:26** - убрать console.log **src/view/containers/ProjectContainer/components/VideosWrapper/index.tsx:43** - добавить отступ **src/view/containers/ProjectContainer/components/VideosWrapper/index.tsx:51** - убрать console.log **src/view/containers/ProjectContainer/components/VideosWrapper/index.tsx:54** - убрать отступ **src/view/containers/ProjectContainer/components/VideosWrapper/index.tsx** - после смены страницы видео может продолжить играть, не проверял но похорошему `componentWillUnmount` **-->** `{pauseVideo(); videoRef.current?.remove()}` удалить видео из памяти **src/view/containers/ProjectContainer/components/VideosWrapper/index.tsx** - не вижу `videoRef.current?.load()`, для этого там `console.log` ? **src/view/containers/ProjectContainer/components/VideosWrapper/index.tsx** - сложно сказать что конкретно нужно сделать, но большое количество свойств должно намекнуть на неправильную декомпозицию videoRef прокидываем вниз чтоб управлять им и снизу и всерху, тоже признак неверной структуры. Сложно понять взаимодействие Попробую предложить сделать отдельно хук загружающий видео, дописать менеджмент видео и уже в интерфейсных компонентах просто дергать функции --- **src/assets/index.html:6** - не вижу папки images **src/core/MainRouter.tsx:18** - не безопасно хранить токен в localStorage (этим часто принебрегают, просто лучше об этом знать) **src/core/helpers/encodeUrlParams.ts** - однострочная одноразовая утилита, а она нужна? **src/redux/reducers/communication/index.ts** - признак того что код можно сократить **src/core/api/modules/Auth.ts** - можно ли сократить очень похожий или дублирующийся код? **src/core/api/modules/LocalStorage.ts** - зачем `Date.now()`?, просто лишняя нагрузка. **src/core/api/modules/LocalStorage.ts** - класс `LocalStorage` проверяет есть ли локалсторадж, потом `getObject` проверяет, потом в блоке `try` вызываем `get`, он тоже проверяет доступность Не слышал о такой проблеме, но если она есть, используй паттерн одиночка, и просто в дескрипторах проверяй `_available`. Интересно приложение нормально будет себя вести без localStorage? Если нет, то нужен аналог, хотя бы редакса в случае `_available = false` ## Типы **src/types/index.ts** - можно обойтись без экспортов и импортов https://www.typescriptlang.org/docs/handbook/declaration-files/templates/module-d-ts.html **src/types/requests/auth/index.ts** - типы тоже можно оптимизировать, переиспользовать и прочее. Главное делать по смыслу приложения *Пример:* ``` interface UserRequest { name: string; email: string; password: string; token: string; } export type ILoginRequest = Pick<UserRequest, "name" | "password">; export type IRegisterRequest = Omit<UserRequest, "token">; export type IForgotRequest = Pick<UserRequest, "email">; export type IRestoreRequest = Omit<UserRequest, "name">; ``` Множество одинаковых типов, как минимум в половине можно их объеденить `IRestorePasswordResponse` и `IForgotPasswordResponse` одинаковые - однострочные и больше нигде не используются ## Рекомендации https://atomicdesign.bradfrost.com/chapter-2/ https://feature-sliced.design/docs/get-started/motivation/ https://storybook.js.org/