diff --git a/.eslintrc.cjs b/.eslintrc.cjs index ec5d957..1402448 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -1,8 +1,10 @@ module.exports = { extends: ['@it-incubator/eslint-config', 'plugin:storybook/recommended'], + plugins:['myPlugin'], rules: { 'no-console': ['warn', { allow: ['warn', 'error'] - }] + }], + "myPlugin/no-wrong-redux-import": "error" } }; \ No newline at end of file diff --git a/eslint/index.js b/eslint/index.js new file mode 100644 index 0000000..120dbb7 --- /dev/null +++ b/eslint/index.js @@ -0,0 +1,12 @@ +const fs = require('fs') +const path = require('path') + +const ruleFiles = fs + .readdirSync(__dirname) + .filter(file => file !== 'index.js' && !file.endsWith('test.js')) + +const rules = Object.fromEntries( + ruleFiles.map(file => [path.basename(file, '.js'), require('./' + file)]) +) + +module.exports = { rules } diff --git a/eslint/no-wrong-redux-import.js b/eslint/no-wrong-redux-import.js new file mode 100644 index 0000000..d81cbeb --- /dev/null +++ b/eslint/no-wrong-redux-import.js @@ -0,0 +1,26 @@ +// @ts-check +/** @type {import('eslint').Rule.RuleModule} */ +module.exports = { + meta: { + fixable: 'code', + }, + create(context) { + return { + ImportDeclaration(node) { + if ( + (node.source && node.source.value === '@reduxjs/toolkit/query/') || + node.source.value === '@reduxjs/toolkit/query' + ) { + context.report({ + node, + message: + "Import from '@reduxjs/toolkit/query/' is disallowed. Please import from '@reduxjs/toolkit/query/react'.", + fix(fixer) { + return fixer.replaceText(node.source, "'@reduxjs/toolkit/query/react'") + }, + }) + } + }, + } + }, +} diff --git a/package.json b/package.json index 870b6cc..6a4f64f 100644 --- a/package.json +++ b/package.json @@ -58,6 +58,7 @@ "storybook": "^7.2.1", "stylelint": "^15.10.2", "typescript": "^5.0.2", - "vite": "^4.4.5" + "vite": "^4.4.5", + "eslint-plugin-myPlugin": "file:./eslint" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5b09e77..ccdb962 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -115,6 +115,9 @@ devDependencies: eslint: specifier: ^8.45.0 version: 8.45.0 + eslint-plugin-myPlugin: + specifier: file:./eslint + version: file:eslint eslint-plugin-react-hooks: specifier: ^4.6.0 version: 4.6.0(eslint@8.45.0) @@ -10210,3 +10213,9 @@ packages: /zod@3.21.4: resolution: {integrity: sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==} dev: false + + file:eslint: + resolution: {directory: eslint, type: directory} + name: eslint + version: 0.0.0 + dev: true diff --git a/src/router.tsx b/src/router.tsx index ea595b6..939fe1d 100644 --- a/src/router.tsx +++ b/src/router.tsx @@ -1,14 +1,43 @@ -import { createBrowserRouter, RouteObject, RouterProvider } from 'react-router-dom' +import { + createBrowserRouter, + Navigate, + Outlet, + RouteObject, + RouterProvider, +} from 'react-router-dom' -const routes: RouteObject[] = [ +import { useGetDecksQuery } from '@/services/base-api' + +const publicRoutes: RouteObject[] = [ + { + path: '/login', + element:
login
, + }, +] + +const privateRoutes: RouteObject[] = [ { path: '/', element:
hello
, }, ] - -const router = createBrowserRouter(routes) +const router = createBrowserRouter([ + { + element: , + children: privateRoutes, + }, + ...publicRoutes, +]) export const Router = () => { + const result = useGetDecksQuery() + + console.log(result) + return } +function PrivateRoutes() { + const isAuthenticated = false + + return isAuthenticated ? : +} diff --git a/src/services/auth/index.ts b/src/services/auth/index.ts deleted file mode 100644 index aa69f63..0000000 --- a/src/services/auth/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './auth.ts' diff --git a/src/services/auth/auth.ts b/src/services/base-api.ts similarity index 61% rename from src/services/auth/auth.ts rename to src/services/base-api.ts index 8a37071..9f21d8a 100644 --- a/src/services/auth/auth.ts +++ b/src/services/base-api.ts @@ -1,9 +1,9 @@ import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query/react' -export const api = createApi({ - reducerPath: 'api', +export const baseApi = createApi({ + reducerPath: 'baseApi', baseQuery: fetchBaseQuery({ - baseUrl: 'http://localhost:3333', + baseUrl: 'https://api.flashcards.andrii.es', credentials: 'include', prepareHeaders: headers => { headers.append('x-auth-skip', 'true') @@ -11,11 +11,11 @@ export const api = createApi({ }), endpoints: builder => { return { - getMe: builder.query({ + getDecks: builder.query({ query: () => `v1/decks`, }), } }, }) -export const { useGetMeQuery } = api +export const { useGetDecksQuery } = baseApi diff --git a/src/services/store.ts b/src/services/store.ts index 18c9c17..8470fd9 100644 --- a/src/services/store.ts +++ b/src/services/store.ts @@ -1,13 +1,16 @@ import { configureStore } from '@reduxjs/toolkit' +import { setupListeners } from '@reduxjs/toolkit/query/react' -import { api } from '@/services/auth' +import { baseApi } from './base-api' export const store = configureStore({ reducer: { - [api.reducerPath]: api.reducer, + [baseApi.reducerPath]: baseApi.reducer, }, - middleware: getDefaultMiddleware => getDefaultMiddleware().concat(api.middleware), + middleware: getDefaultMiddleware => getDefaultMiddleware().concat(baseApi.middleware), }) export type AppDispatch = typeof store.dispatch export type RootState = ReturnType + +setupListeners(store.dispatch)