{"id":15021374,"url":"https://github.com/vladislaw9/shift-cinema","last_synced_at":"2026-01-20T14:33:45.517Z","repository":{"id":240549790,"uuid":"802886503","full_name":"VLADISLAW9/shift-cinema","owner":"VLADISLAW9","description":null,"archived":false,"fork":false,"pushed_at":"2024-06-18T22:03:11.000Z","size":3371,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-02-13T02:27:02.658Z","etag":null,"topics":["axios","babel","cypress","eslint","jest","prettier","react","react-testing-lib","scss","storybook","stylelint","tanstack-query","vite","zustand"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/VLADISLAW9.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-05-19T14:35:54.000Z","updated_at":"2024-06-18T22:47:08.000Z","dependencies_parsed_at":"2024-05-19T18:22:48.960Z","dependency_job_id":"db0cb266-93bd-4fd6-bf6c-3a41926da6e5","html_url":"https://github.com/VLADISLAW9/shift-cinema","commit_stats":{"total_commits":34,"total_committers":1,"mean_commits":34.0,"dds":0.0,"last_synced_commit":"0b024b2c2b12ac6f54f3046bbebffcbb231a1984"},"previous_names":["vladislaw9/shift-cinema"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/VLADISLAW9%2Fshift-cinema","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/VLADISLAW9%2Fshift-cinema/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/VLADISLAW9%2Fshift-cinema/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/VLADISLAW9%2Fshift-cinema/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/VLADISLAW9","download_url":"https://codeload.github.com/VLADISLAW9/shift-cinema/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247544394,"owners_count":20955994,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["axios","babel","cypress","eslint","jest","prettier","react","react-testing-lib","scss","storybook","stylelint","tanstack-query","vite","zustand"],"created_at":"2024-09-24T19:56:30.725Z","updated_at":"2026-01-20T14:33:45.511Z","avatar_url":"https://github.com/VLADISLAW9.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"## Проект\n\nМакет и API данного проекта взята с [ШИФТ SUMMER ИНТЕНСИВА](https://omniscient-honeydew-f15.notion.site/90eef6b45a7843158d5731a1d4fd2440) компании ЦФТ. \n\n\n## Запуск проекта\n\n```\nnpm install - устанавливаем зависимости\nnpm run dev - Запуск проекта \n```\n\n---\n\n## Скрипты\n\n-   `npm run dev` - Запуск frontend проекта в dev режиме\n-   `npm run build` - Сборка frontend приложения\n-   `npm run lint:ts` - Проверка ts файлов линтером\n-   `npm run lint:ts:fix` - Исправление ts файлов линтером\n-   `npm run lint:scss` - Проверка scss файлов style линтером\n-   `npm run lint:scss:fix` - Исправление scss файлов style линтером\n-   `npm run prettier` - Исправление ts, tsx, json файлов форматером Prettier\n-   `npm run test:unit` - Запуск unit тестов с jest\n-   `npm run storybook` - запуск Storybook\n-   `npm run storybook:build` - Сборка storybook билда\n-   `npm run prepare` - прекоммит хуки\n\n---\n\n## Архитектура проекта\n\nПроект написан в соответствии с методологией Feature sliced design\n\nСсылка на документацию - [feature sliced design](https://feature-sliced.design/docs/get-started/tutorial)\n\n---\n\n## Тесты\n\nВ проекте используются 3 вида тестов:\n\n1. Обычные unit тесты на jest - `npm run test:unit`\n2. Тесты на компоненты с React testing library -`npm run test:unit`\n4. e2e тестирование с Cypress `npm run test:e2e`\n\n---\n\n## Линтинг\n\nВ проекте используется eslint для проверки typescript кода и stylelint для проверки файлов со стилями.\n\n##### Запуск линтеров\n\n-   `npm run lint:ts` - Проверка ts файлов линтером\n-   `npm run lint:ts:fix` - Исправление ts файлов линтером\n-   `npm run lint:scss` - Проверка scss файлов style линтером\n-   `npm run lint:scss:fix` - Исправление scss файлов style линтером\n\n---\n\n## Storybook\n\nВ проекте для каждого компонента описываются стори-кейсы.\n\nФайл со сторикейсами создает рядом с компонентом с расширением .stories.tsx\n\nЗапустить сторибук можно командой:\n\n-   `npm run storybook`\n\n---\n\n## pre commit хуки\n\nВ прекоммит хуках проверяем проект линтерами, конфиг в /.husky\n\n---\n\n### Работа с данными\n\nВзаимодействие с данными осуществляется с помощью zustand.\n\nПример: \n\n```typescript jsx\nimport { create } from 'zustand';\nimport type { User } from '../types/user';\n\nexport interface UserState {\n  user?: Partial\u003cUser\u003e;\n  isLoggedIn: boolean;\n}\n\nexport interface UserActions {\n  initUser: (user: User) =\u003e void;\n  setUserData: (user: Omit\u003cUser, 'id'\u003e) =\u003e void;\n  clearUser: () =\u003e void;\n}\n\nconst initialState: UserState = {\n  user: undefined,\n  isLoggedIn: false\n};\n\nexport const useUserStore = create\u003cUserState \u0026 UserActions\u003e((set) =\u003e ({\n  ...initialState,\n\n  initUser: (user) =\u003e {\n    set({ user });\n    set({ isLoggedIn: true });\n  },\n\n  setUserData: (newUserData) =\u003e {\n    set(({ user }) =\u003e ({ user: { id: user?.id, ...newUserData } }));\n  },\n\n  clearUser: () =\u003e {\n    set(initialState);\n  }\n}));\n```\n\n\nЗапросы на сервер отправляются с помощью [TanStackQuery](/src/shared/api/api.ts)\n\nПример: \n\n```typescript jsx\nimport { useQuery } from '@tanstack/react-query';\nimport { $api } from '@/shared/api/api';\nimport { USER_LOCALSTORAGE_KEY } from '@/shared/consts/localstorage';\nimport type { Response } from '@/shared/types/response';\nimport type { User } from '../model/types/user';\n\ninterface InitAuthDataResponseSchema extends Response {\n  user: User;\n}\n\nexport const useInitAuthDataQuery = () =\u003e\n  useQuery({\n    queryKey: ['initAuthData'],\n    queryFn: async () =\u003e {\n      const token = localStorage.getItem(USER_LOCALSTORAGE_KEY);\n\n      if (!token) {\n        throw new Error('token not found');\n      }\n\n      const response = await $api.get\u003cInitAuthDataResponseSchema\u003e('/users/session');\n\n      return response.data;\n    }\n  });\n\n```\n\n---","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvladislaw9%2Fshift-cinema","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fvladislaw9%2Fshift-cinema","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvladislaw9%2Fshift-cinema/lists"}