From 457f4bbed2c6bcad51d30e9da8daadbf82bc388d Mon Sep 17 00:00:00 2001 From: Sergey Krylov Date: Wed, 17 Sep 2025 06:14:33 +0300 Subject: [PATCH] feat(frontend): update eslint rules --- .../__mocks__/browser/data/expenses/items.ts | 60 ++++++++-------- .../__mocks__/browser/data/expenses/lists.ts | 30 ++++---- .../browser/handlers/expense/list/get.ts | 3 +- frontend/__mocks__/browser/handlers/index.ts | 4 +- frontend/__mocks__/browser/msw.ts | 2 +- .../jest/wrappers/ReactQueryWrapper.tsx | 4 +- frontend/eslint.config.ts | 69 +++---------------- frontend/jest.config.ts | 16 ++--- frontend/rsbuild.config.ts | 8 +-- frontend/src/entity/account/api/login.ts | 4 +- frontend/src/entity/account/api/logout.ts | 4 +- frontend/src/entity/account/api/register.ts | 4 +- frontend/src/entity/account/hooks/useLogin.ts | 10 +-- frontend/src/entity/account/index.ts | 2 +- frontend/src/entity/cards/api/addBankCard.ts | 4 +- .../src/entity/cards/api/deleteBankCard.ts | 4 +- frontend/src/entity/cards/api/editBankCard.ts | 8 +-- frontend/src/entity/cards/api/getBankCards.ts | 4 +- frontend/src/entity/cards/index.ts | 25 +++---- frontend/src/entity/cards/types/index.ts | 2 +- .../ui/AddBankCardForm.test.tsx | 14 ++-- .../AddBankCardForm/ui/AddBankCardForm.ui.tsx | 26 +++---- .../ui/DeleteBankCardForm.test.tsx | 12 ++-- .../ui/DeleteBankCardForm.ui.tsx | 7 +- .../ui/EditBankCardForm.test.tsx | 20 +++--- .../ui/EditBankCardForm.ui.tsx | 27 ++++---- frontend/src/entity/cash/api/addCash.ts | 6 +- frontend/src/entity/cash/api/deleteCash.ts | 4 +- frontend/src/entity/cash/api/editCash.ts | 8 +-- frontend/src/entity/cash/api/getCash.ts | 4 +- frontend/src/entity/cash/index.ts | 18 ++--- frontend/src/entity/cash/types/index.ts | 2 +- .../ui/AddCashForm/ui/AddCashForm.test.tsx | 14 ++-- .../cash/ui/AddCashForm/ui/AddCashForm.ui.tsx | 26 +++---- .../DeleteCashForm/ui/DeleteCashForm.test.tsx | 12 ++-- .../DeleteCashForm/ui/DeleteCashForm.ui.tsx | 7 +- .../ui/EditCashForm/ui/EditCashForm.test.tsx | 20 +++--- .../ui/EditCashForm/ui/EditCashForm.ui.tsx | 27 ++++---- .../expenses/item/api/addExpenseItem.ts | 4 +- .../expenses/item/api/deleteExpenseItem.ts | 4 +- .../expenses/item/api/editExpenseItem.ts | 4 +- .../item/hooks/useDeleteExpenseItem.ts | 4 +- frontend/src/entity/expenses/item/index.ts | 18 ++--- .../AddExpenseItemForm.test.tsx | 26 +++---- .../AddExpenseItemForm.ui.tsx | 42 +++++------ .../DeleteExpenseItemForm.test.tsx | 16 ++--- .../DeleteExpenseItemForm.ui.tsx | 11 +-- .../EditExpenseItemForm.test.tsx | 40 +++++------ .../EditExpenseItemForm.ui.tsx | 43 ++++++------ .../expenses/list/api/addExpensesList.ts | 6 +- .../expenses/list/api/deleteExpensesList.ts | 4 +- .../expenses/list/api/editExpensesList.ts | 8 +-- .../expenses/list/api/getExpenseList.ts | 4 +- .../expenses/list/api/getExpenseLists.ts | 4 +- .../expenses/list/hooks/useExpenseList.ts | 4 +- frontend/src/entity/expenses/list/index.ts | 18 ++--- .../ui/AddExpensesListForm.test.tsx | 12 ++-- .../ui/AddExpensesListForm.ui.tsx | 30 ++++---- .../ui/DeleteExpensesListForm.test.tsx | 16 ++--- .../ui/DeleteExpensesListForm.ui.tsx | 13 ++-- .../ui/EditExpensesListForm.test.tsx | 20 +++--- .../ui/EditExpensesListForm.ui.tsx | 23 ++++--- .../entity/incomes/item/api/addIncomeItem.ts | 4 +- .../incomes/item/api/deleteIncomeItem.ts | 4 +- .../entity/incomes/item/api/editIncomeItem.ts | 4 +- .../incomes/item/hooks/useDeleteIncomeItem.ts | 4 +- frontend/src/entity/incomes/item/index.ts | 18 ++--- .../AddIncomeItemForm.test.tsx | 26 +++---- .../AddIncomeItemForm.ui.tsx | 38 +++++----- .../DeleteIncomeItemForm.test.tsx | 16 ++--- .../DeleteIncomeItemForm.ui.tsx | 11 +-- .../EditIncomeItemForm.test.tsx | 40 +++++------ .../EditIncomeItemForm.ui.tsx | 39 ++++++----- .../entity/incomes/list/api/addIncomeList.ts | 6 +- .../incomes/list/api/deleteIncomeList.ts | 4 +- .../entity/incomes/list/api/editIncomeList.ts | 8 +-- .../entity/incomes/list/api/getIncomeList.ts | 4 +- .../entity/incomes/list/api/getIncomeLists.ts | 4 +- .../incomes/list/hooks/useIncomeList.ts | 4 +- frontend/src/entity/incomes/list/index.ts | 18 ++--- .../ui/AddIncomeListForm.test.tsx | 12 ++-- .../ui/AddIncomeListForm.ui.tsx | 30 ++++---- .../ui/DeleteIncomeListForm.test.tsx | 16 ++--- .../ui/DeleteIncomeListForm.ui.tsx | 13 ++-- .../ui/EditIncomeListForm.test.tsx | 20 +++--- .../ui/EditIncomeListForm.ui.tsx | 31 +++++---- .../auth/LogoutButton/ui/LogoutButton.ui.tsx | 4 +- .../hooks/useAddBankCardButton.ts | 8 +-- .../ui/AddBankCardButton.test.tsx | 11 ++- .../ui/AddBankCardButton.ui.tsx | 12 ++-- .../hooks/useDeleteBankCardButton.ts | 6 +- .../ui/DeleteBankCardButton.test.tsx | 13 ++-- .../ui/DeleteBankCardButton.ui.tsx | 15 ++-- .../hooks/useEditBankCardButton.ts | 6 +- .../ui/EditBankCardButton.test.tsx | 17 +++-- .../ui/EditBankCardButton.ui.tsx | 15 ++-- .../AddCashButton/hooks/useAddCashButton.ts | 8 +-- .../AddCashButton/ui/AddCashButton.test.tsx | 11 ++- .../AddCashButton/ui/AddCashButton.ui.tsx | 12 ++-- .../hooks/useDeleteCashButton.ts | 6 +- .../ui/DeleteCashButton.test.tsx | 13 ++-- .../ui/DeleteCashButton.ui.tsx | 15 ++-- .../EditCashButton/hooks/useEditCashButton.ts | 6 +- .../EditCashButton/ui/EditCashButton.test.tsx | 19 +++-- .../EditCashButton/ui/EditCashButton.ui.tsx | 15 ++-- .../hooks/useAddExpenseItemButton.ts | 13 ++-- .../ui/AddExpenseItemButton.test.tsx | 29 ++++---- .../ui/AddExpenseItemButton.ui.tsx | 17 ++--- .../hooks/useDeleteExpenseItemButton.ts | 12 ++-- .../ui/DeleteExpenseItemButton.test.tsx | 15 ++-- .../ui/DeleteExpenseItemButton.ui.tsx | 17 ++--- .../hooks/useEditExpenseItemButton.ts | 12 ++-- .../ui/EditExpenseItemButton.test.tsx | 31 ++++----- .../ui/EditExpenseItemButton.ui.tsx | 19 ++--- .../hooks/useAddExpensesListButton.ts | 8 +-- .../ui/AddExpensesListButton.test.tsx | 15 ++-- .../ui/AddExpensesListButton.ui.tsx | 10 +-- .../hooks/useDeleteExpensesListButton.ts | 2 +- .../ui/DeleteExpensesListButton.test.tsx | 15 ++-- .../ui/DeleteExpensesListButton.ui.tsx | 13 ++-- .../hooks/useEditExpensesListButton.ts | 8 +-- .../ui/EditExpensesListButton.test.tsx | 17 +++-- .../ui/EditExpensesListButton.ui.tsx | 13 ++-- .../hooks/useAddIncomeItemButton.ts | 13 ++-- .../ui/AddIncomeItemButton.test.tsx | 29 ++++---- .../ui/AddIncomeItemButton.ui.tsx | 17 ++--- .../hooks/useDeleteIncomeItemButton.ts | 12 ++-- .../ui/DeleteIncomeItemButton.test.tsx | 15 ++-- .../ui/DeleteIncomeItemButton.ui.tsx | 17 ++--- .../hooks/useIncomeItemButton.ts | 12 ++-- .../ui/EditIncomeItemButton.test.tsx | 31 ++++----- .../ui/EditIncomeItemButton.ui.tsx | 19 ++--- .../hooks/useAddIncomeListButton.ts | 8 +-- .../ui/AddIncomeListButton.test.tsx | 15 ++-- .../ui/AddIncomeListButton.ui.tsx | 10 +-- .../hooks/useIncomeListButton.ts | 2 +- .../ui/DeleteIncomeListButton.test.tsx | 17 +++-- .../ui/DeleteIncomeListButton.ui.tsx | 13 ++-- .../hooks/useIncomeListButton.ts | 8 +-- .../ui/EditIncomeListButton.test.tsx | 17 +++-- .../ui/EditIncomeListButton.ui.tsx | 13 ++-- .../pages/BankCard/ui/BankCardsPage.ui.tsx | 6 +- frontend/src/pages/Cash/ui/CashPage.ui.tsx | 6 +- .../src/pages/Expense/ui/ExpensePage.ui.tsx | 4 +- .../src/pages/Income/ui/IncomePage.ui.tsx | 4 +- frontend/src/shared/api/queryKeys.ts | 10 +-- .../context/AuthContext/AuthContext.ui.tsx | 20 +++--- frontend/src/shared/router/types.ts | 14 ++-- .../shared/ui/AuthRoute/ui/AuthRoute.ui.tsx | 4 +- frontend/src/shared/ui/Input/ui/Input.ui.tsx | 6 +- frontend/src/shared/ui/Modal/ui/Modal.ui.tsx | 12 ++-- .../src/shared/utils/formatters/currency.ts | 2 +- .../src/widgets/AppLayout/ui/AppLayout.ui.tsx | 7 +- .../auth/LoginForm/ui/LoginForm.ui.tsx | 4 +- .../auth/LoginForm/ui/hooks/useLoginForm.ts | 6 +- .../auth/RegisterForm/ui/RegisterForm.ui.tsx | 6 +- .../RegisterForm/ui/hooks/useRegisterForm.ts | 8 +-- .../BankCardsTable/ui/BankCardsTable.ui.tsx | 7 +- .../cash/CashTable/ui/CashTable.ui.tsx | 7 +- .../ui/ExpenseItemsTable.ui.tsx | 7 +- .../ExpensesTable/ui/ExpensesTable.ui.tsx | 2 +- .../ui/IncomeItemsTable.ui.tsx | 7 +- .../IncomeListTable/ui/IncomeListTable.ui.tsx | 2 +- 163 files changed, 1064 insertions(+), 1102 deletions(-) diff --git a/frontend/__mocks__/browser/data/expenses/items.ts b/frontend/__mocks__/browser/data/expenses/items.ts index 000991e..9c1ba68 100644 --- a/frontend/__mocks__/browser/data/expenses/items.ts +++ b/frontend/__mocks__/browser/data/expenses/items.ts @@ -1,26 +1,26 @@ export const items1 = [ { - id: '1', - expenseListId: '1', - title: 'Счет за интернет', - description: 'Ежемесячная плата за интернет', - date: '2024-04-01', amount: 500, - currency: 'RUB', count: 1, createdAt: '2024-04-01T12:00:00Z', + currency: 'RUB', + date: '2024-04-01', + description: 'Ежемесячная плата за интернет', + expenseListId: '1', + id: '1', + title: 'Счет за интернет', updatedAt: '2024-04-01T12:00:00Z', }, { - id: '2', - expenseListId: '1', - title: 'Покупка продуктов', - description: 'Продукты на неделю', - date: '2024-04-02', amount: 3000, - currency: 'RUB', count: 1, createdAt: '2024-04-02T12:00:00Z', + currency: 'RUB', + date: '2024-04-02', + description: 'Продукты на неделю', + expenseListId: '1', + id: '2', + title: 'Покупка продуктов', updatedAt: '2024-04-02T12:00:00Z', }, ]; @@ -31,42 +31,42 @@ export const items3 = null; export const items4 = [ { - id: '3', - expenseListId: '4', - title: 'Бензин', - description: null, - date: '2024-04-03', amount: 1500, - currency: 'RUB', count: null, createdAt: '2024-04-03T12:00:00Z', + currency: 'RUB', + date: '2024-04-03', + description: null, + expenseListId: '4', + id: '3', + title: 'Бензин', updatedAt: '2024-04-03T12:00:00Z', }, ]; export const items5 = [ { - id: '4', - expenseListId: '5', - title: 'Ноутбук', - description: 'Покупка нового ноутбука', - date: '2024-04-04', amount: 50000, - currency: 'RUB', count: 1, createdAt: '2024-04-04T12:00:00Z', + currency: 'RUB', + date: '2024-04-04', + description: 'Покупка нового ноутбука', + expenseListId: '5', + id: '4', + title: 'Ноутбук', updatedAt: '2024-04-04T12:00:00Z', }, { - id: '5', - expenseListId: '5', - title: 'Мышка', - description: 'Механическая мышка', - date: '2024-04-05', amount: 3000, - currency: 'RUB', count: 1, createdAt: '2024-04-05T12:00:00Z', + currency: 'RUB', + date: '2024-04-05', + description: 'Механическая мышка', + expenseListId: '5', + id: '5', + title: 'Мышка', updatedAt: '2024-04-05T12:00:00Z', }, ]; diff --git a/frontend/__mocks__/browser/data/expenses/lists.ts b/frontend/__mocks__/browser/data/expenses/lists.ts index 13318fe..31932b0 100644 --- a/frontend/__mocks__/browser/data/expenses/lists.ts +++ b/frontend/__mocks__/browser/data/expenses/lists.ts @@ -7,41 +7,41 @@ import { } from './items'; export const list1 = { - id: '1', - title: 'Расходы на быт', - items: items1, createdAt: '2024-03-28T10:00:00Z', + id: '1', + items: items1, + title: 'Расходы на быт', updatedAt: '2024-04-02T12:00:00Z', }; export const list2 = { - id: '2', - title: 'Дополнительные расходы', - items: items2, createdAt: '2024-04-01T10:00:00Z', + id: '2', + items: items2, + title: 'Дополнительные расходы', updatedAt: '2024-04-01T10:00:00Z', }; export const list3 = { - id: '3', - title: 'Кредиты', - items: items3, createdAt: '2024-04-01T11:00:00Z', + id: '3', + items: items3, + title: 'Кредиты', updatedAt: '2024-04-01T11:00:00Z', }; export const list4 = { - id: '4', - title: 'Автомобиль', - items: items4, createdAt: '2024-04-03T10:00:00Z', + id: '4', + items: items4, + title: 'Автомобиль', updatedAt: '2024-04-03T10:00:00Z', }; export const list5 = { - id: '5', - title: 'Техника', - items: items5, createdAt: '2024-04-04T10:00:00Z', + id: '5', + items: items5, + title: 'Техника', updatedAt: '2024-04-05T10:00:00Z', }; diff --git a/frontend/__mocks__/browser/handlers/expense/list/get.ts b/frontend/__mocks__/browser/handlers/expense/list/get.ts index adffdb0..2a58ec3 100644 --- a/frontend/__mocks__/browser/handlers/expense/list/get.ts +++ b/frontend/__mocks__/browser/handlers/expense/list/get.ts @@ -1,5 +1,3 @@ -import { http, HttpResponse } from 'msw'; - import { list1, list2, @@ -7,6 +5,7 @@ import { list4, list5, } from '@mocks/browser/data/expenses/lists'; +import { http, HttpResponse } from 'msw'; import type { paths } from '@/shared/api/schema'; diff --git a/frontend/__mocks__/browser/handlers/index.ts b/frontend/__mocks__/browser/handlers/index.ts index 9fb765b..433bfdc 100644 --- a/frontend/__mocks__/browser/handlers/index.ts +++ b/frontend/__mocks__/browser/handlers/index.ts @@ -1,3 +1,3 @@ -export { getExpenseList } from './expense/list/get'; -export { getExpenseItemListById } from './expense/list/:id/get'; export { loginHandler } from './auth/login/post'; +export { getExpenseItemListById } from './expense/list/:id/get'; +export { getExpenseList } from './expense/list/get'; diff --git a/frontend/__mocks__/browser/msw.ts b/frontend/__mocks__/browser/msw.ts index 1452c8a..67eeabc 100644 --- a/frontend/__mocks__/browser/msw.ts +++ b/frontend/__mocks__/browser/msw.ts @@ -1,8 +1,8 @@ import { setupWorker } from 'msw/browser'; import { - getExpenseList, getExpenseItemListById, + getExpenseList, loginHandler, } from './handlers'; diff --git a/frontend/__mocks__/jest/wrappers/ReactQueryWrapper.tsx b/frontend/__mocks__/jest/wrappers/ReactQueryWrapper.tsx index f089f9a..a993185 100644 --- a/frontend/__mocks__/jest/wrappers/ReactQueryWrapper.tsx +++ b/frontend/__mocks__/jest/wrappers/ReactQueryWrapper.tsx @@ -1,7 +1,7 @@ -import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; - import type { PropsWithChildren } from 'react'; +import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; + export const createReactQueryWrapper = () => { const queryClient = new QueryClient({ defaultOptions: { diff --git a/frontend/eslint.config.ts b/frontend/eslint.config.ts index 4da3d8a..c79bbf7 100644 --- a/frontend/eslint.config.ts +++ b/frontend/eslint.config.ts @@ -1,6 +1,7 @@ import pluginQuery from '@tanstack/eslint-plugin-query'; // @ts-expect-error fix package import config from 'eslint-config-ksv741'; +import perfectionist from 'eslint-plugin-perfectionist'; // eslint-disable-next-line import/no-anonymous-default-export export default [ @@ -9,6 +10,10 @@ export default [ ...config, { rules: { + '@stylistic/jsx-sort-props': 'off', + '@typescript-eslint/no-floating-promises': 'off', + '@typescript-eslint/strict-boolean-expressions': 'off', + 'func-style': 'off', 'import/no-extraneous-dependencies': ['error', { devDependencies: [ 'eslint.config.ts', @@ -23,71 +28,13 @@ export default [ '__mocks__/**', ], }], - 'import/order': [ - 'error', { - pathGroups: [ - { - pattern: '__mocks__/**', - group: 'builtin', - position: 'before', - }, - { - pattern: 'apps/**', - group: 'internal', - position: 'after', - }, - { - pattern: 'pages/**', - group: 'internal', - position: 'after', - }, - { - pattern: 'widgets/**', - group: 'internal', - position: 'after', - }, - { - pattern: 'features/**', - group: 'internal', - position: 'after', - }, - { - pattern: 'entities/**', - group: 'internal', - position: 'after', - }, - { - pattern: 'shared/**', - group: 'internal', - position: 'after', - }, - ], - distinctGroup: true, - groups: [ - 'builtin', - 'external', - 'internal', - 'parent', - 'sibling', - 'object', - 'index', - 'type', - ], - 'newlines-between': 'always', - alphabetize: { - order: 'asc', - caseInsensitive: true, - }, - }, - ], - '@typescript-eslint/strict-boolean-expressions': 'off', - '@typescript-eslint/no-floating-promises': 'off', - 'func-style': 'off', + 'import/order': 'off', 'jsx-a11y/click-events-have-key-events': 'off', - 'jsx-a11y/no-static-element-interactions': 'off', 'jsx-a11y/no-noninteractive-element-interactions': 'off', + 'jsx-a11y/no-static-element-interactions': 'off', }, }, + perfectionist.configs['recommended-natural'], { ignores: ['./src/shared/api/schema.ts'], }, diff --git a/frontend/jest.config.ts b/frontend/jest.config.ts index 2489993..99f5f91 100644 --- a/frontend/jest.config.ts +++ b/frontend/jest.config.ts @@ -1,6 +1,14 @@ import type { Config } from 'jest'; export default { + moduleNameMapper: { + '@/(.*)': '/src/$1', + '@mocks/(.*)': '/__mocks__/$1', + '\\.(css|scss|sass|less)$': 'identity-obj-proxy', + '\\.(jpg|jpeg|png|gif|webp|svg)$': '/__mocks__/jest/fileMock.js', + }, + setupFilesAfterEnv: ['/configs/jest/setupTests.ts'], + testEnvironment: '/configs/jest/jest-fixed-jsdom.ts', transform: { '^.+\\.(t|j)sx?$': ['@swc/jest', { jsc: { @@ -12,12 +20,4 @@ export default { }, }], }, - testEnvironment: '/configs/jest/jest-fixed-jsdom.ts', - setupFilesAfterEnv: ['/configs/jest/setupTests.ts'], - moduleNameMapper: { - '@/(.*)': '/src/$1', - '@mocks/(.*)': '/__mocks__/$1', - '\\.(css|scss|sass|less)$': 'identity-obj-proxy', - '\\.(jpg|jpeg|png|gif|webp|svg)$': '/__mocks__/jest/fileMock.js', - }, } as Config; diff --git a/frontend/rsbuild.config.ts b/frontend/rsbuild.config.ts index 1c235df..00ab7fc 100644 --- a/frontend/rsbuild.config.ts +++ b/frontend/rsbuild.config.ts @@ -4,6 +4,9 @@ import { pluginReact } from '@rsbuild/plugin-react'; import { pluginTypeCheck } from '@rsbuild/plugin-type-check'; export default defineConfig({ + html: { + title: 'Investments Control', + }, plugins: [ pluginReact(), pluginEslint({ @@ -15,17 +18,14 @@ export default defineConfig({ }), pluginTypeCheck(), ], - html: { - title: 'Investments Control', - }, server: { proxy: { [`${process.env.PUBLIC_API_BASE_URL}`]: { - target: process.env.BACKEND_BASE_URL, changeOrigin: true, pathRewrite: { [`^${process.env.PUBLIC_API_BASE_URL}`]: '', }, + target: process.env.BACKEND_BASE_URL, }, }, }, diff --git a/frontend/src/entity/account/api/login.ts b/frontend/src/entity/account/api/login.ts index fcb38cd..71c581a 100644 --- a/frontend/src/entity/account/api/login.ts +++ b/frontend/src/entity/account/api/login.ts @@ -1,7 +1,7 @@ -import { api } from '@/shared/api/client'; - import type { paths } from '@/shared/api/schema'; +import { api } from '@/shared/api/client'; + type LoginRequestBody = paths['/auth/login']['post']['requestBody']['content']['application/json']; type LoginSuccessResponse = paths['/auth/login']['post']['responses']['200']['content']['application/json']; diff --git a/frontend/src/entity/account/api/logout.ts b/frontend/src/entity/account/api/logout.ts index 7b171c8..c2f0770 100644 --- a/frontend/src/entity/account/api/logout.ts +++ b/frontend/src/entity/account/api/logout.ts @@ -1,7 +1,7 @@ -import { api } from '@/shared/api/client'; - import type { paths } from '@/shared/api/schema'; +import { api } from '@/shared/api/client'; + type LogoutSuccessResponse = paths['/auth/logout']['post']['responses']['200']['content']['application/json']; export async function logout() { diff --git a/frontend/src/entity/account/api/register.ts b/frontend/src/entity/account/api/register.ts index 76e7fc4..8eab999 100644 --- a/frontend/src/entity/account/api/register.ts +++ b/frontend/src/entity/account/api/register.ts @@ -1,7 +1,7 @@ -import { api } from '@/shared/api/client'; - import type { paths } from '@/shared/api/schema'; +import { api } from '@/shared/api/client'; + type RegisterRequestBody = paths['/auth/register']['post']['requestBody']['content']['application/json']; type RegisterSuccessResponse = paths['/auth/register']['post']['responses']['200']['content']['application/json']; diff --git a/frontend/src/entity/account/hooks/useLogin.ts b/frontend/src/entity/account/hooks/useLogin.ts index 877df9a..8cce479 100644 --- a/frontend/src/entity/account/hooks/useLogin.ts +++ b/frontend/src/entity/account/hooks/useLogin.ts @@ -13,16 +13,16 @@ export const useLogin = () => { return useMutation({ mutationFn: login, - onSuccess: async (data) => { - setAccessToken(data.accessToken); - localStorage.setItem('accessToken', data.accessToken); - await navigate(PAGES.Home); - }, onError: (error) => { // eslint-disable-next-line console.log('Неуспешный логин', error); throw error; }, + onSuccess: async (data) => { + setAccessToken(data.accessToken); + localStorage.setItem('accessToken', data.accessToken); + await navigate(PAGES.Home); + }, }); }; diff --git a/frontend/src/entity/account/index.ts b/frontend/src/entity/account/index.ts index 23f8cd8..8367278 100644 --- a/frontend/src/entity/account/index.ts +++ b/frontend/src/entity/account/index.ts @@ -1,3 +1,3 @@ export { useLogin } from './hooks/useLogin'; -export { useRegister } from './hooks/useRegister'; export { useLogout } from './hooks/useLogout'; +export { useRegister } from './hooks/useRegister'; diff --git a/frontend/src/entity/cards/api/addBankCard.ts b/frontend/src/entity/cards/api/addBankCard.ts index fe15a65..a6f9dc5 100644 --- a/frontend/src/entity/cards/api/addBankCard.ts +++ b/frontend/src/entity/cards/api/addBankCard.ts @@ -1,7 +1,7 @@ -import { api } from '@/shared/api/client'; - import type { paths } from '@/shared/api/schema'; +import { api } from '@/shared/api/client'; + export type AddBankCardBody = paths['/bank-card']['post']['requestBody']['content']['application/json']; export type AddBankCardResponse = paths['/bank-card']['post']['responses']['200']['content']['application/json']; diff --git a/frontend/src/entity/cards/api/deleteBankCard.ts b/frontend/src/entity/cards/api/deleteBankCard.ts index c9a4a87..c1370d9 100644 --- a/frontend/src/entity/cards/api/deleteBankCard.ts +++ b/frontend/src/entity/cards/api/deleteBankCard.ts @@ -1,7 +1,7 @@ -import { api } from '@/shared/api/client'; - import type { paths } from '@/shared/api/schema'; +import { api } from '@/shared/api/client'; + export type DeleteBankCardPath = paths['/bank-card/{id}']['delete']['parameters']['path']; export type DeleteBankCardResponse = paths['/bank-card/{id}']['delete']['responses']['200']['content']['application/json']; diff --git a/frontend/src/entity/cards/api/editBankCard.ts b/frontend/src/entity/cards/api/editBankCard.ts index 043701d..516c399 100644 --- a/frontend/src/entity/cards/api/editBankCard.ts +++ b/frontend/src/entity/cards/api/editBankCard.ts @@ -1,12 +1,12 @@ -import { api } from '@/shared/api/client'; - import type { paths } from '@/shared/api/schema'; -export type EditBankCardPath = paths['/bank-card/{id}']['patch']['parameters']['path']; +import { api } from '@/shared/api/client'; + export type EditBankCardBody = paths['/bank-card/{id}']['patch']['requestBody']['content']['application/json']; +export type EditBankCardPath = paths['/bank-card/{id}']['patch']['parameters']['path']; export type EditBankCardResponse = paths['/bank-card/{id}']['patch']['responses']['200']['content']['application/json']; -export async function editBankCard({ path, data }: { path: EditBankCardPath; data: EditBankCardBody }) { +export async function editBankCard({ data, path }: { data: EditBankCardBody; path: EditBankCardPath }) { const { data: result } = await api.patch(`/bank-card/${path.id}`, data); return result; diff --git a/frontend/src/entity/cards/api/getBankCards.ts b/frontend/src/entity/cards/api/getBankCards.ts index 87696d0..6ed2a25 100644 --- a/frontend/src/entity/cards/api/getBankCards.ts +++ b/frontend/src/entity/cards/api/getBankCards.ts @@ -1,7 +1,7 @@ -import { api } from '@/shared/api/client'; - import type { paths } from '@/shared/api/schema'; +import { api } from '@/shared/api/client'; + type BankCardsResponse = paths['/bank-card']['get']['responses']['200']['content']['application/json']; export async function getBankCards() { diff --git a/frontend/src/entity/cards/index.ts b/frontend/src/entity/cards/index.ts index 17c3778..a45c99c 100644 --- a/frontend/src/entity/cards/index.ts +++ b/frontend/src/entity/cards/index.ts @@ -1,17 +1,18 @@ -export { useBankCards } from './hooks/useBankCards'; -export { useAddBankCard } from './hooks/useAddBankCard'; -export { useDeleteBankCard } from './hooks/useDeleteBankCard'; -export { useEditBankCard } from './hooks/useEditBankCard'; - -export { AddBankCardForm } from './ui/AddBankCardForm'; -export { DeleteBankCardForm } from './ui/DeleteBankCardForm'; -export { EditBankCardForm } from './ui/EditBankCardForm'; - export type { AddBankCardBody, AddBankCardResponse } from './api/addBankCard'; export type { DeleteBankCardPath, DeleteBankCardResponse } from './api/deleteBankCard'; export type { EditBankCardBody, EditBankCardPath, EditBankCardResponse } from './api/editBankCard'; -export type { AddBankCardFormValues } from './ui/AddBankCardForm'; -export type { EditBankCardFormValues } from './ui/EditBankCardForm'; +export { useAddBankCard } from './hooks/useAddBankCard'; +export { useBankCards } from './hooks/useBankCards'; +export { useDeleteBankCard } from './hooks/useDeleteBankCard'; +export { useEditBankCard } from './hooks/useEditBankCard'; -export type { BankCards, BankCard } from './types'; +export type { BankCard, BankCards } from './types'; + +export type { AddBankCardFormValues } from './ui/AddBankCardForm'; +export { AddBankCardForm } from './ui/AddBankCardForm'; + +export { DeleteBankCardForm } from './ui/DeleteBankCardForm'; + +export type { EditBankCardFormValues } from './ui/EditBankCardForm'; +export { EditBankCardForm } from './ui/EditBankCardForm'; diff --git a/frontend/src/entity/cards/types/index.ts b/frontend/src/entity/cards/types/index.ts index 8534791..97592a4 100644 --- a/frontend/src/entity/cards/types/index.ts +++ b/frontend/src/entity/cards/types/index.ts @@ -1,4 +1,4 @@ import type { paths } from '@/shared/api/schema'; -export type BankCards = paths['/bank-card']['get']['responses']['200']['content']['application/json']; export type BankCard = paths['/bank-card/{id}']['get']['responses']['200']['content']['application/json']; +export type BankCards = paths['/bank-card']['get']['responses']['200']['content']['application/json']; diff --git a/frontend/src/entity/cards/ui/AddBankCardForm/ui/AddBankCardForm.test.tsx b/frontend/src/entity/cards/ui/AddBankCardForm/ui/AddBankCardForm.test.tsx index 18e4e6f..ecd0cc3 100644 --- a/frontend/src/entity/cards/ui/AddBankCardForm/ui/AddBankCardForm.test.tsx +++ b/frontend/src/entity/cards/ui/AddBankCardForm/ui/AddBankCardForm.test.tsx @@ -1,10 +1,10 @@ import { render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; -import AddBankCardForm from './AddBankCardForm.ui'; - import type { AddBankCardFormProps } from './AddBankCardForm.ui'; +import AddBankCardForm from './AddBankCardForm.ui'; + const renderForm = (props?: Partial) => { const onSubmit = jest.fn(); @@ -15,10 +15,10 @@ const renderForm = (props?: Partial) => { const submitButtonElem = screen.getByText('Добавить'); return { - nameInputElem, balanceInputElem, - submitButtonElem, + nameInputElem, onSubmit, + submitButtonElem, }; }; @@ -44,10 +44,10 @@ describe('Test AddBankCardForm', () => { test('should call onSubmit with values', async () => { const { - nameInputElem, balanceInputElem, - submitButtonElem, + nameInputElem, onSubmit, + submitButtonElem, } = renderForm(); await userEvent.type(nameInputElem, 'Тестовая карта'); @@ -57,8 +57,8 @@ describe('Test AddBankCardForm', () => { expect(onSubmit).toHaveBeenCalledTimes(1); expect(onSubmit).toHaveBeenCalledWith({ - name: 'Тестовая карта', balance: 500, + name: 'Тестовая карта', }); }); }); diff --git a/frontend/src/entity/cards/ui/AddBankCardForm/ui/AddBankCardForm.ui.tsx b/frontend/src/entity/cards/ui/AddBankCardForm/ui/AddBankCardForm.ui.tsx index c81b957..ec70dee 100644 --- a/frontend/src/entity/cards/ui/AddBankCardForm/ui/AddBankCardForm.ui.tsx +++ b/frontend/src/entity/cards/ui/AddBankCardForm/ui/AddBankCardForm.ui.tsx @@ -1,7 +1,3 @@ -import { Input } from '@/shared/ui/Input'; - -import classes from './AddBankCardForm.module.css'; - import type { FC, FormEventHandler, @@ -9,12 +5,9 @@ import type { RefObject, } from 'react'; -export type AddBankCardFormValues = { - name: string; - balance: number; -}; +import { Input } from '@/shared/ui/Input'; -type BaseFormProps = Omit, 'onSubmit'>; +import classes from './AddBankCardForm.module.css'; export type AddBankCardFormProps = BaseFormProps & { disabled?: boolean; @@ -22,11 +15,18 @@ export type AddBankCardFormProps = BaseFormProps & { ref?: RefObject; }; +export type AddBankCardFormValues = { + balance: number; + name: string; +}; + +type BaseFormProps = Omit, 'onSubmit'>; + const AddBankCardForm: FC = (props) => { const { - ref, disabled, onSubmit, + ref, ...formProps } = props; @@ -40,26 +40,26 @@ const AddBankCardForm: FC = (props) => { if (typeof name === 'string' && typeof balance === 'string') { onSubmit?.({ - name, balance: Number(balance), + name, }); } }; return (

Добавить карту

) => { @@ -28,8 +28,8 @@ const renderForm = (props?: Partial) => { const submitButtonElem = screen.getByText('Удалить'); return { - submitButtonElem, onSubmit, + submitButtonElem, }; }; @@ -43,8 +43,8 @@ describe('Test DeleteExpensesListForm', () => { test('should call onSubmit with values', async () => { const { - submitButtonElem, onSubmit, + submitButtonElem, } = renderForm(); await userEvent.click(submitButtonElem); diff --git a/frontend/src/entity/cards/ui/DeleteBankCardForm/ui/DeleteBankCardForm.ui.tsx b/frontend/src/entity/cards/ui/DeleteBankCardForm/ui/DeleteBankCardForm.ui.tsx index 9768147..002fb2e 100644 --- a/frontend/src/entity/cards/ui/DeleteBankCardForm/ui/DeleteBankCardForm.ui.tsx +++ b/frontend/src/entity/cards/ui/DeleteBankCardForm/ui/DeleteBankCardForm.ui.tsx @@ -1,4 +1,3 @@ -import type { BankCard } from '../../../types'; import type { FC, FormEventHandler, @@ -6,7 +5,7 @@ import type { RefObject, } from 'react'; -type BaseFormProps = Omit, 'onSubmit'>; +import type { BankCard } from '../../../types'; export type DeleteBankCardFormProps = BaseFormProps & { bankCard: BankCard; @@ -15,6 +14,8 @@ export type DeleteBankCardFormProps = BaseFormProps & { ref?: RefObject; }; +type BaseFormProps = Omit, 'onSubmit'>; + const DeleteBankCardForm: FC = (props) => { const { bankCard, @@ -30,7 +31,7 @@ const DeleteBankCardForm: FC = (props) => { }; return ( - +

Удалить список расходов

diff --git a/frontend/src/entity/cards/ui/EditBankCardForm/ui/EditBankCardForm.test.tsx b/frontend/src/entity/cards/ui/EditBankCardForm/ui/EditBankCardForm.test.tsx index 6598a7e..2854526 100644 --- a/frontend/src/entity/cards/ui/EditBankCardForm/ui/EditBankCardForm.test.tsx +++ b/frontend/src/entity/cards/ui/EditBankCardForm/ui/EditBankCardForm.test.tsx @@ -1,16 +1,16 @@ import { render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; -import EditBankCardForm from './EditBankCardForm.ui'; - import type { EditBankCardFormProps } from './EditBankCardForm.ui'; +import EditBankCardForm from './EditBankCardForm.ui'; + const editingBankCard = { + balance: 1000, + createdAt: '2025-08-29T07:57:40.503Z', id: 'af6da4e1-f24f-4b43-8556-fa885626897d', name: 'Тестовая карта', - balance: 1000, updatedAt: '2025-08-29T07:57:40.503Z', - createdAt: '2025-08-29T07:57:40.503Z', }; const renderForm = (props?: Partial) => { @@ -30,10 +30,10 @@ const renderForm = (props?: Partial) => { const submitButtonElem = screen.getByText('Сохранить'); return { - titleInputElem, balanceInputElem, - submitButtonElem, onSubmit, + submitButtonElem, + titleInputElem, }; }; @@ -47,8 +47,8 @@ describe('Test EditBankCardForm', () => { test('should inputs have default value', () => { const { - titleInputElem, balanceInputElem, + titleInputElem, } = renderForm(); expect(titleInputElem).toHaveValue('Тестовая карта'); expect(balanceInputElem).toHaveValue(1000); @@ -68,10 +68,10 @@ describe('Test EditBankCardForm', () => { test('should call onSubmit with values', async () => { const { - titleInputElem, balanceInputElem, - submitButtonElem, onSubmit, + submitButtonElem, + titleInputElem, } = renderForm(); await userEvent.clear(titleInputElem); @@ -84,8 +84,8 @@ describe('Test EditBankCardForm', () => { expect(onSubmit).toHaveBeenCalledTimes(1); expect(onSubmit).toHaveBeenCalledWith({ - name: 'Новое название карты', balance: 5000, + name: 'Новое название карты', }); }); }); diff --git a/frontend/src/entity/cards/ui/EditBankCardForm/ui/EditBankCardForm.ui.tsx b/frontend/src/entity/cards/ui/EditBankCardForm/ui/EditBankCardForm.ui.tsx index 2f37a7b..efee298 100644 --- a/frontend/src/entity/cards/ui/EditBankCardForm/ui/EditBankCardForm.ui.tsx +++ b/frontend/src/entity/cards/ui/EditBankCardForm/ui/EditBankCardForm.ui.tsx @@ -1,8 +1,3 @@ -import { Input } from '@/shared/ui/Input'; - -import classes from './EditBankCardForm.module.css'; - -import type { BankCard } from '@/entity/cards'; import type { FC, FormEventHandler, @@ -10,12 +5,11 @@ import type { RefObject, } from 'react'; -type BaseFormProps = Omit, 'onSubmit'>; +import type { BankCard } from '@/entity/cards'; -export type EditBankCardFormValues = { - name: string; - balance: number; -}; +import { Input } from '@/shared/ui/Input'; + +import classes from './EditBankCardForm.module.css'; export type EditBankCardFormProps = BaseFormProps & { bankCard: BankCard; @@ -24,6 +18,13 @@ export type EditBankCardFormProps = BaseFormProps & { ref?: RefObject; }; +export type EditBankCardFormValues = { + balance: number; + name: string; +}; + +type BaseFormProps = Omit, 'onSubmit'>; + const EditBankCardForm: FC = (props) => { const { bankCard, @@ -43,27 +44,27 @@ const EditBankCardForm: FC = (props) => { if (typeof name === 'string' && typeof balance === 'string') { onSubmit?.({ - name, balance: Number(balance), + name, }); } }; return (

Добавить карту

('/cash', data); diff --git a/frontend/src/entity/cash/api/deleteCash.ts b/frontend/src/entity/cash/api/deleteCash.ts index 9386fd3..032d940 100644 --- a/frontend/src/entity/cash/api/deleteCash.ts +++ b/frontend/src/entity/cash/api/deleteCash.ts @@ -1,7 +1,7 @@ -import { api } from '@/shared/api/client'; - import type { paths } from '@/shared/api/schema'; +import { api } from '@/shared/api/client'; + export type DeleteCashPath = paths['/cash/{id}']['delete']['parameters']['path']; export type DeleteCashResponse = paths['/cash/{id}']['delete']['responses']['200']['content']['application/json']; diff --git a/frontend/src/entity/cash/api/editCash.ts b/frontend/src/entity/cash/api/editCash.ts index 481e8ed..529bf6d 100644 --- a/frontend/src/entity/cash/api/editCash.ts +++ b/frontend/src/entity/cash/api/editCash.ts @@ -1,12 +1,12 @@ -import { api } from '@/shared/api/client'; - import type { paths } from '@/shared/api/schema'; -export type EditCashPath = paths['/cash/{id}']['patch']['parameters']['path']; +import { api } from '@/shared/api/client'; + export type EditCashBody = paths['/cash/{id}']['patch']['requestBody']['content']['application/json']; +export type EditCashPath = paths['/cash/{id}']['patch']['parameters']['path']; export type EditCashResponse = paths['/cash/{id}']['patch']['responses']['200']['content']['application/json']; -export async function editCash({ path, data }: { path: EditCashPath; data: EditCashBody }) { +export async function editCash({ data, path }: { data: EditCashBody; path: EditCashPath }) { const { data: result } = await api.patch(`/cash/${path.id}`, data); return result; diff --git a/frontend/src/entity/cash/api/getCash.ts b/frontend/src/entity/cash/api/getCash.ts index 7423df4..b90698b 100644 --- a/frontend/src/entity/cash/api/getCash.ts +++ b/frontend/src/entity/cash/api/getCash.ts @@ -1,7 +1,7 @@ -import { api } from '@/shared/api/client'; - import type { paths } from '@/shared/api/schema'; +import { api } from '@/shared/api/client'; + type CashResponse = paths['/cash']['get']['responses']['200']['content']['application/json']; export async function getCash() { diff --git a/frontend/src/entity/cash/index.ts b/frontend/src/entity/cash/index.ts index 933beb4..d3f8f40 100644 --- a/frontend/src/entity/cash/index.ts +++ b/frontend/src/entity/cash/index.ts @@ -1,16 +1,18 @@ +export type { AdCashResponse, AddCashBody } from './api/addCash'; +export type { DeleteCashPath, DeleteCashResponse } from './api/deleteCash'; +export type { EditCashBody, EditCashPath, EditCashResponse } from './api/editCash'; + export { useAddCash } from './hooks/useAddCash'; export { useCash } from './hooks/useCash'; export { useDeleteCash } from './hooks/useDeleteCash'; export { useEditCash } from './hooks/useEditCash'; +export type { CashItem, CashList } from './types'; + export { AddCashForm } from './ui/AddCashForm'; -export { DeleteCashForm } from './ui/DeleteCashForm'; -export { EditCashForm } from './ui/EditCashForm'; - -export type { CashList, CashItem } from './types'; - export type { AddCashFormValues } from './ui/AddCashForm'; + +export { DeleteCashForm } from './ui/DeleteCashForm'; + +export { EditCashForm } from './ui/EditCashForm'; export type { EditCashFormValues } from './ui/EditCashForm'; -export type { AddCashBody, AdCashResponse } from './api/addCash'; -export type { DeleteCashPath, DeleteCashResponse } from './api/deleteCash'; -export type { EditCashBody, EditCashPath, EditCashResponse } from './api/editCash'; diff --git a/frontend/src/entity/cash/types/index.ts b/frontend/src/entity/cash/types/index.ts index edbf3a2..a263e0a 100644 --- a/frontend/src/entity/cash/types/index.ts +++ b/frontend/src/entity/cash/types/index.ts @@ -1,4 +1,4 @@ import type { paths } from '@/shared/api/schema'; -export type CashList = paths['/cash']['get']['responses']['200']['content']['application/json']; export type CashItem = paths['/cash/{id}']['get']['responses']['200']['content']['application/json']; +export type CashList = paths['/cash']['get']['responses']['200']['content']['application/json']; diff --git a/frontend/src/entity/cash/ui/AddCashForm/ui/AddCashForm.test.tsx b/frontend/src/entity/cash/ui/AddCashForm/ui/AddCashForm.test.tsx index 9e42356..b1a0694 100644 --- a/frontend/src/entity/cash/ui/AddCashForm/ui/AddCashForm.test.tsx +++ b/frontend/src/entity/cash/ui/AddCashForm/ui/AddCashForm.test.tsx @@ -1,10 +1,10 @@ import { render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; -import AddCashForm from './AddCashForm.ui'; - import type { AddCashFormProps } from './AddCashForm.ui'; +import AddCashForm from './AddCashForm.ui'; + const renderForm = (props?: Partial) => { const onSubmit = jest.fn(); @@ -15,10 +15,10 @@ const renderForm = (props?: Partial) => { const submitButtonElem = screen.getByText('Добавить'); return { - nameInputElem, balanceInputElem, - submitButtonElem, + nameInputElem, onSubmit, + submitButtonElem, }; }; @@ -44,10 +44,10 @@ describe('Test AddCashForm', () => { test('should call onSubmit with values', async () => { const { - nameInputElem, balanceInputElem, - submitButtonElem, + nameInputElem, onSubmit, + submitButtonElem, } = renderForm(); await userEvent.type(nameInputElem, 'Наличные'); @@ -57,8 +57,8 @@ describe('Test AddCashForm', () => { expect(onSubmit).toHaveBeenCalledTimes(1); expect(onSubmit).toHaveBeenCalledWith({ - name: 'Наличные', balance: 500, + name: 'Наличные', }); }); }); diff --git a/frontend/src/entity/cash/ui/AddCashForm/ui/AddCashForm.ui.tsx b/frontend/src/entity/cash/ui/AddCashForm/ui/AddCashForm.ui.tsx index 602f386..2664789 100644 --- a/frontend/src/entity/cash/ui/AddCashForm/ui/AddCashForm.ui.tsx +++ b/frontend/src/entity/cash/ui/AddCashForm/ui/AddCashForm.ui.tsx @@ -1,7 +1,3 @@ -import { Input } from '@/shared/ui/Input'; - -import classes from './AddCashForm.module.css'; - import type { FC, FormEventHandler, @@ -9,12 +5,9 @@ import type { RefObject, } from 'react'; -export type AddCashFormValues = { - name: string; - balance: number; -}; +import { Input } from '@/shared/ui/Input'; -type BaseFormProps = Omit, 'onSubmit'>; +import classes from './AddCashForm.module.css'; export type AddCashFormProps = BaseFormProps & { disabled?: boolean; @@ -22,11 +15,18 @@ export type AddCashFormProps = BaseFormProps & { ref?: RefObject; }; +export type AddCashFormValues = { + balance: number; + name: string; +}; + +type BaseFormProps = Omit, 'onSubmit'>; + const AddCashForm: FC = (props) => { const { - ref, disabled, onSubmit, + ref, ...formProps } = props; @@ -40,26 +40,26 @@ const AddCashForm: FC = (props) => { if (typeof name === 'string' && typeof balance === 'string') { onSubmit?.({ - name, balance: Number(balance), + name, }); } }; return (

Добавить наличные

) => { @@ -28,8 +28,8 @@ const renderForm = (props?: Partial) => { const submitButtonElem = screen.getByText('Удалить'); return { - submitButtonElem, onSubmit, + submitButtonElem, }; }; @@ -43,8 +43,8 @@ describe('Test DeleteCashForm', () => { test('should call onSubmit with values', async () => { const { - submitButtonElem, onSubmit, + submitButtonElem, } = renderForm(); await userEvent.click(submitButtonElem); diff --git a/frontend/src/entity/cash/ui/DeleteCashForm/ui/DeleteCashForm.ui.tsx b/frontend/src/entity/cash/ui/DeleteCashForm/ui/DeleteCashForm.ui.tsx index 98091ca..5191ede 100644 --- a/frontend/src/entity/cash/ui/DeleteCashForm/ui/DeleteCashForm.ui.tsx +++ b/frontend/src/entity/cash/ui/DeleteCashForm/ui/DeleteCashForm.ui.tsx @@ -1,4 +1,3 @@ -import type { CashItem } from '../../../types'; import type { FC, FormEventHandler, @@ -6,7 +5,7 @@ import type { RefObject, } from 'react'; -type BaseFormProps = Omit, 'onSubmit'>; +import type { CashItem } from '../../../types'; export type DeleteCashFormProps = BaseFormProps & { cash: CashItem; @@ -15,6 +14,8 @@ export type DeleteCashFormProps = BaseFormProps & { ref?: RefObject; }; +type BaseFormProps = Omit, 'onSubmit'>; + const DeleteCashForm: FC = (props) => { const { cash, @@ -30,7 +31,7 @@ const DeleteCashForm: FC = (props) => { }; return ( - +

Удалить наличные

diff --git a/frontend/src/entity/cash/ui/EditCashForm/ui/EditCashForm.test.tsx b/frontend/src/entity/cash/ui/EditCashForm/ui/EditCashForm.test.tsx index 2e7bbae..b88116d 100644 --- a/frontend/src/entity/cash/ui/EditCashForm/ui/EditCashForm.test.tsx +++ b/frontend/src/entity/cash/ui/EditCashForm/ui/EditCashForm.test.tsx @@ -1,16 +1,16 @@ import { render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; -import EditCashForm from './EditCashForm.ui'; - import type { EditCashFormProps } from './EditCashForm.ui'; +import EditCashForm from './EditCashForm.ui'; + const editingCash = { + balance: 1000, + createdAt: '2025-08-29T07:57:40.503Z', id: 'af6da4e1-f24f-4b43-8556-fa885626897d', name: 'Наличные', - balance: 1000, updatedAt: '2025-08-29T07:57:40.503Z', - createdAt: '2025-08-29T07:57:40.503Z', }; const renderForm = (props?: Partial) => { @@ -30,10 +30,10 @@ const renderForm = (props?: Partial) => { const submitButtonElem = screen.getByText('Сохранить'); return { - titleInputElem, balanceInputElem, - submitButtonElem, onSubmit, + submitButtonElem, + titleInputElem, }; }; @@ -47,8 +47,8 @@ describe('Test EditCashForm', () => { test('should inputs have default value', () => { const { - titleInputElem, balanceInputElem, + titleInputElem, } = renderForm(); expect(titleInputElem).toHaveValue('Наличные'); expect(balanceInputElem).toHaveValue(1000); @@ -68,10 +68,10 @@ describe('Test EditCashForm', () => { test('should call onSubmit with values', async () => { const { - titleInputElem, balanceInputElem, - submitButtonElem, onSubmit, + submitButtonElem, + titleInputElem, } = renderForm(); await userEvent.clear(titleInputElem); @@ -84,8 +84,8 @@ describe('Test EditCashForm', () => { expect(onSubmit).toHaveBeenCalledTimes(1); expect(onSubmit).toHaveBeenCalledWith({ - name: 'Новое название наличных', balance: 5000, + name: 'Новое название наличных', }); }); }); diff --git a/frontend/src/entity/cash/ui/EditCashForm/ui/EditCashForm.ui.tsx b/frontend/src/entity/cash/ui/EditCashForm/ui/EditCashForm.ui.tsx index 0be6c42..a3fa0c3 100644 --- a/frontend/src/entity/cash/ui/EditCashForm/ui/EditCashForm.ui.tsx +++ b/frontend/src/entity/cash/ui/EditCashForm/ui/EditCashForm.ui.tsx @@ -1,8 +1,3 @@ -import { Input } from '@/shared/ui/Input'; - -import classes from './EditCashForm.module.css'; - -import type { CashItem } from '@/entity/cash'; import type { FC, FormEventHandler, @@ -10,12 +5,11 @@ import type { RefObject, } from 'react'; -type BaseFormProps = Omit, 'onSubmit'>; +import type { CashItem } from '@/entity/cash'; -export type EditCashFormValues = { - name: string; - balance: number; -}; +import { Input } from '@/shared/ui/Input'; + +import classes from './EditCashForm.module.css'; export type EditCashFormProps = BaseFormProps & { cash: CashItem; @@ -24,6 +18,13 @@ export type EditCashFormProps = BaseFormProps & { ref?: RefObject; }; +export type EditCashFormValues = { + balance: number; + name: string; +}; + +type BaseFormProps = Omit, 'onSubmit'>; + const EditCashForm: FC = (props) => { const { cash, @@ -43,27 +44,27 @@ const EditCashForm: FC = (props) => { if (typeof name === 'string' && typeof balance === 'string') { onSubmit?.({ - name, balance: Number(balance), + name, }); } }; return (

Редактировать наличные

{ const queryClient = useQueryClient(); diff --git a/frontend/src/entity/expenses/item/index.ts b/frontend/src/entity/expenses/item/index.ts index 06ce7e2..1602970 100644 --- a/frontend/src/entity/expenses/item/index.ts +++ b/frontend/src/entity/expenses/item/index.ts @@ -1,17 +1,17 @@ +export type { AddExpenseItemBody, AddExpenseItemPath, AddExpenseItemSuccessResponse } from './api/addExpenseItem'; +export type { DeleteExpenseItemPath, DeleteExpenseItemSuccessResponse } from './api/deleteExpenseItem'; +export type { EditExpenseItemBody, EditExpenseItemPath, EditExpenseItemSuccessResponse } from './api/editExpenseItem'; + export { useAddExpenseItem } from './hooks/useAddExpenseItem'; export { useDeleteExpenseItem } from './hooks/useDeleteExpenseItem'; export { useEditExpenseItem } from './hooks/useEditExpenseItem'; -export type { AddExpenseItemSuccessResponse, AddExpenseItemBody, AddExpenseItemPath } from './api/addExpenseItem'; -export type { DeleteExpenseItemPath, DeleteExpenseItemSuccessResponse } from './api/deleteExpenseItem'; -export type { EditExpenseItemBody, EditExpenseItemPath, EditExpenseItemSuccessResponse } from './api/editExpenseItem'; - +export type { ExpenseListItem } from './types'; export type { AddExpenseItemFormValues } from './ui/AddExpenseItemForm/AddExpenseItemForm.ui'; + export { default as AddExpenseItemForm } from './ui/AddExpenseItemForm/AddExpenseItemForm.ui'; - -export type { EditExpenseItemFormValues } from './ui/EditExpenseItemForm/EditExpenseItemForm.ui'; -export { default as EditExpenseItemForm } from './ui/EditExpenseItemForm/EditExpenseItemForm.ui'; - export { default as DeleteExpenseItemForm } from './ui/DeleteExpenseItemForm/DeleteExpenseItemForm.ui'; -export type { ExpenseListItem } from './types'; +export type { EditExpenseItemFormValues } from './ui/EditExpenseItemForm/EditExpenseItemForm.ui'; + +export { default as EditExpenseItemForm } from './ui/EditExpenseItemForm/EditExpenseItemForm.ui'; diff --git a/frontend/src/entity/expenses/item/ui/AddExpenseItemForm/AddExpenseItemForm.test.tsx b/frontend/src/entity/expenses/item/ui/AddExpenseItemForm/AddExpenseItemForm.test.tsx index 2d124ad..97ebd47 100644 --- a/frontend/src/entity/expenses/item/ui/AddExpenseItemForm/AddExpenseItemForm.test.tsx +++ b/frontend/src/entity/expenses/item/ui/AddExpenseItemForm/AddExpenseItemForm.test.tsx @@ -1,10 +1,10 @@ import { render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; -import AddExpenseItemForm from './AddExpenseItemForm.ui'; - import type { AddExpenseItemFormProps } from './AddExpenseItemForm.ui'; +import AddExpenseItemForm from './AddExpenseItemForm.ui'; + const renderForm = (props?: Partial) => { const onSubmit = jest.fn(); @@ -18,13 +18,13 @@ const renderForm = (props?: Partial) => { const submitButtonElem = screen.getByText('Добавить'); return { - titleInputElem, - descriptionInputElem, - dateInputElem, amountInputElem, countInputElem, - submitButtonElem, + dateInputElem, + descriptionInputElem, onSubmit, + submitButtonElem, + titleInputElem, }; }; @@ -50,13 +50,13 @@ describe('Test AddExpenseItemForm', () => { test('should call onSubmit with values', async () => { const { - titleInputElem, - descriptionInputElem, - dateInputElem, amountInputElem, countInputElem, - submitButtonElem, + dateInputElem, + descriptionInputElem, onSubmit, + submitButtonElem, + titleInputElem, } = renderForm(); await userEvent.type(titleInputElem, 'Название элемента'); @@ -69,12 +69,12 @@ describe('Test AddExpenseItemForm', () => { expect(onSubmit).toHaveBeenCalledTimes(1); expect(onSubmit).toHaveBeenCalledWith({ - title: 'Название элемента', - description: 'Описание элемента', - date: '2025-08-29T00:00:00.000Z', amount: 12, count: 1, currency: 'RUB', + date: '2025-08-29T00:00:00.000Z', + description: 'Описание элемента', + title: 'Название элемента', }); }); }); diff --git a/frontend/src/entity/expenses/item/ui/AddExpenseItemForm/AddExpenseItemForm.ui.tsx b/frontend/src/entity/expenses/item/ui/AddExpenseItemForm/AddExpenseItemForm.ui.tsx index 72a07c0..43d6025 100644 --- a/frontend/src/entity/expenses/item/ui/AddExpenseItemForm/AddExpenseItemForm.ui.tsx +++ b/frontend/src/entity/expenses/item/ui/AddExpenseItemForm/AddExpenseItemForm.ui.tsx @@ -1,7 +1,3 @@ -import { Input } from '@/shared/ui/Input'; - -import classes from './AddExpenseItemForm.module.css'; - import type { FC, FormEventHandler, @@ -9,16 +5,9 @@ import type { RefObject, } from 'react'; -export type AddExpenseItemFormValues = { - title: string; - description: string; - date: string; - amount: number; - count: number; - currency: string; -}; +import { Input } from '@/shared/ui/Input'; -type BaseFormProps = Omit, 'onSubmit'>; +import classes from './AddExpenseItemForm.module.css'; export type AddExpenseItemFormProps = BaseFormProps & { disabled?: boolean; @@ -26,6 +15,17 @@ export type AddExpenseItemFormProps = BaseFormProps & { ref?: RefObject; }; +export type AddExpenseItemFormValues = { + amount: number; + count: number; + currency: string; + date: string; + description: string; + title: string; +}; + +type BaseFormProps = Omit, 'onSubmit'>; + const AddExpenseItemForm: FC = (props) => { const { disabled, @@ -47,30 +47,30 @@ const AddExpenseItemForm: FC = (props) => { if (typeof title === 'string' && typeof date === 'string' && typeof amount === 'string' && typeof description === 'string' && typeof count === 'string') { onSubmit?.({ - title, - date: new Date(date).toISOString(), amount: Number(amount), - description, - currency: 'RUB', count: Number(count), + currency: 'RUB', + date: new Date(date).toISOString(), + description, + title, }); } }; return (

Добавить список расходов

= (props) => { /> diff --git a/frontend/src/entity/expenses/item/ui/DeleteExpenseItemForm/DeleteExpenseItemForm.test.tsx b/frontend/src/entity/expenses/item/ui/DeleteExpenseItemForm/DeleteExpenseItemForm.test.tsx index 38650b1..e211f90 100644 --- a/frontend/src/entity/expenses/item/ui/DeleteExpenseItemForm/DeleteExpenseItemForm.test.tsx +++ b/frontend/src/entity/expenses/item/ui/DeleteExpenseItemForm/DeleteExpenseItemForm.test.tsx @@ -1,21 +1,21 @@ import { render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; -import DeleteExpenseItemForm from './DeleteExpenseItemForm.ui'; - import type { DeleteExpenseItemFormProps } from './DeleteExpenseItemForm.ui'; +import DeleteExpenseItemForm from './DeleteExpenseItemForm.ui'; + const deletingItem = { - id: '51a44dc0-597b-49b9-85bb-e0bcd42db3f6', - title: 'Mock item', amount: 12, count: 12, - updatedAt: '2025-08-29T07:57:40.503Z', - expenseListId: '10cc093c-3875-4d33-a40a-df526266e262', createdAt: '2025-08-29T07:57:40.503Z', currency: 'RUB', date: '2025-08-22T00:00:03.000Z', description: 'Mock description', + expenseListId: '10cc093c-3875-4d33-a40a-df526266e262', + id: '51a44dc0-597b-49b9-85bb-e0bcd42db3f6', + title: 'Mock item', + updatedAt: '2025-08-29T07:57:40.503Z', }; const renderForm = (props?: Partial) => { @@ -33,8 +33,8 @@ const renderForm = (props?: Partial) => { const submitButtonElem = screen.getByText('Удалить'); return { - submitButtonElem, onSubmit, + submitButtonElem, }; }; @@ -48,8 +48,8 @@ describe('Test DeleteExpenseItemForm', () => { test('should call onSubmit with values', async () => { const { - submitButtonElem, onSubmit, + submitButtonElem, } = renderForm(); await userEvent.click(submitButtonElem); diff --git a/frontend/src/entity/expenses/item/ui/DeleteExpenseItemForm/DeleteExpenseItemForm.ui.tsx b/frontend/src/entity/expenses/item/ui/DeleteExpenseItemForm/DeleteExpenseItemForm.ui.tsx index e392269..6b389cc 100644 --- a/frontend/src/entity/expenses/item/ui/DeleteExpenseItemForm/DeleteExpenseItemForm.ui.tsx +++ b/frontend/src/entity/expenses/item/ui/DeleteExpenseItemForm/DeleteExpenseItemForm.ui.tsx @@ -1,4 +1,3 @@ -import type { ExpenseListItem } from '../../types'; import type { FC, FormEventHandler, @@ -6,21 +5,23 @@ import type { RefObject, } from 'react'; -type BaseFormProps = Omit, 'onSubmit'>; +import type { ExpenseListItem } from '../../types'; export type DeleteExpenseItemFormProps = BaseFormProps & { + disabled?: boolean; item: ExpenseListItem; onSubmit?: (item: ExpenseListItem) => Promise | void; - disabled?: boolean; ref?: RefObject; }; +type BaseFormProps = Omit, 'onSubmit'>; + const DeleteExpenseItemForm: FC = (props) => { const { + disabled, item, onSubmit, ref, - disabled, ...restProps } = props; const onFormSubmitHandler: FormEventHandler = (event) => { @@ -29,7 +30,7 @@ const DeleteExpenseItemForm: FC = (props) => { }; return ( - +

Удалить элемент ?

diff --git a/frontend/src/entity/expenses/item/ui/EditExpenseItemForm/EditExpenseItemForm.test.tsx b/frontend/src/entity/expenses/item/ui/EditExpenseItemForm/EditExpenseItemForm.test.tsx index 987bda5..cf32caf 100644 --- a/frontend/src/entity/expenses/item/ui/EditExpenseItemForm/EditExpenseItemForm.test.tsx +++ b/frontend/src/entity/expenses/item/ui/EditExpenseItemForm/EditExpenseItemForm.test.tsx @@ -1,21 +1,21 @@ import { render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; -import EditExpenseItemForm from './EditExpenseItemForm.ui'; - import type { EditExpenseItemFormProps } from './EditExpenseItemForm.ui'; +import EditExpenseItemForm from './EditExpenseItemForm.ui'; + const editingItem = { - id: '51a44dc0-597b-49b9-85bb-e0bcd42db3f6', - title: 'Mock item', amount: 12, count: 12, - updatedAt: '2025-08-29T07:57:40.503Z', - expenseListId: '10cc093c-3875-4d33-a40a-df526266e262', createdAt: '2025-08-29T07:57:40.503Z', currency: 'RUB', date: '2025-08-22T00:00:03.000Z', description: 'Mock description', + expenseListId: '10cc093c-3875-4d33-a40a-df526266e262', + id: '51a44dc0-597b-49b9-85bb-e0bcd42db3f6', + title: 'Mock item', + updatedAt: '2025-08-29T07:57:40.503Z', }; const renderForm = (props?: Partial) => { @@ -38,13 +38,13 @@ const renderForm = (props?: Partial) => { const submitButtonElem = screen.getByText('Сохранить'); return { - titleInputElem, - descriptionInputElem, - dateInputElem, amountInputElem, countInputElem, - submitButtonElem, + dateInputElem, + descriptionInputElem, onSubmit, + submitButtonElem, + titleInputElem, }; }; @@ -58,11 +58,11 @@ describe('Test EditExpenseItemForm', () => { test('should inputs have default value', () => { const { - titleInputElem, - descriptionInputElem, - dateInputElem, amountInputElem, countInputElem, + dateInputElem, + descriptionInputElem, + titleInputElem, } = renderForm(); expect(titleInputElem).toHaveValue('Mock item'); expect(descriptionInputElem).toHaveValue('Mock description'); @@ -85,13 +85,13 @@ describe('Test EditExpenseItemForm', () => { test('should call onSubmit with values', async () => { const { - titleInputElem, - descriptionInputElem, - dateInputElem, amountInputElem, countInputElem, - submitButtonElem, + dateInputElem, + descriptionInputElem, onSubmit, + submitButtonElem, + titleInputElem, } = renderForm(); await userEvent.clear(titleInputElem); @@ -113,12 +113,12 @@ describe('Test EditExpenseItemForm', () => { expect(onSubmit).toHaveBeenCalledTimes(1); expect(onSubmit).toHaveBeenCalledWith({ - title: 'Название элемента', - description: 'Описание элемента', - date: '2025-08-29T00:00:00.000Z', amount: 12, count: 1, currency: 'RUB', + date: '2025-08-29T00:00:00.000Z', + description: 'Описание элемента', + title: 'Название элемента', }); }); }); diff --git a/frontend/src/entity/expenses/item/ui/EditExpenseItemForm/EditExpenseItemForm.ui.tsx b/frontend/src/entity/expenses/item/ui/EditExpenseItemForm/EditExpenseItemForm.ui.tsx index 7aea2fb..6157bec 100644 --- a/frontend/src/entity/expenses/item/ui/EditExpenseItemForm/EditExpenseItemForm.ui.tsx +++ b/frontend/src/entity/expenses/item/ui/EditExpenseItemForm/EditExpenseItemForm.ui.tsx @@ -1,8 +1,3 @@ -import { Input } from '@/shared/ui/Input'; - -import classes from './EditExpenseItemForm.module.css'; - -import type { ExpenseListItem } from '../../types'; import type { FC, FormEventHandler, @@ -10,29 +5,35 @@ import type { RefObject, } from 'react'; +import { Input } from '@/shared/ui/Input'; + +import type { ExpenseListItem } from '../../types'; + +import classes from './EditExpenseItemForm.module.css'; + +export type EditExpenseItemFormProps = BaseFormProps & { + disabled?: boolean; + item: ExpenseListItem; + onSubmit?: (data: EditExpenseItemFormValues) => Promise | void; + ref?: RefObject; +}; + export type EditExpenseItemFormValues = { - title: string; - description: string; - date: string; amount: number; count: number; currency: string; + date: string; + description: string; + title: string; }; - type BaseFormProps = Omit, 'onSubmit'>; -export type EditExpenseItemFormProps = BaseFormProps & { - disabled?: boolean; - onSubmit?: (data: EditExpenseItemFormValues) => Promise | void; - ref?: RefObject; - item: ExpenseListItem; -}; const EditExpenseItemForm: FC = (props) => { const { disabled, + item, onSubmit, ref, - item, ...formProps } = props; @@ -49,21 +50,21 @@ const EditExpenseItemForm: FC = (props) => { if (typeof title === 'string' && typeof date === 'string' && typeof amount === 'string' && typeof description === 'string' && typeof count === 'string') { await onSubmit?.({ - title, - date: new Date(date).toISOString(), amount: Number(amount), - description, - currency: 'RUB', count: Number(count), + currency: 'RUB', + date: new Date(date).toISOString(), + description, + title, }); } }; return (

Добавить список расходов

diff --git a/frontend/src/entity/expenses/list/api/addExpensesList.ts b/frontend/src/entity/expenses/list/api/addExpensesList.ts index 609963c..80d4e01 100644 --- a/frontend/src/entity/expenses/list/api/addExpensesList.ts +++ b/frontend/src/entity/expenses/list/api/addExpensesList.ts @@ -1,9 +1,9 @@ -import { api } from '@/shared/api/client'; - import type { paths } from '@/shared/api/schema'; -export type AddExpenseListPath = paths['/expenses/list']['post']['parameters']['path']; +import { api } from '@/shared/api/client'; + export type AddExpenseListBody = paths['/expenses/list']['post']['requestBody']['content']['application/json']; +export type AddExpenseListPath = paths['/expenses/list']['post']['parameters']['path']; export type AddExpenseListSuccessResponse = paths['/expenses/list']['post']['responses']['200']['content']['application/json']; export async function addExpensesList(data: AddExpenseListBody) { diff --git a/frontend/src/entity/expenses/list/api/deleteExpensesList.ts b/frontend/src/entity/expenses/list/api/deleteExpensesList.ts index b19ac59..a2a2f28 100644 --- a/frontend/src/entity/expenses/list/api/deleteExpensesList.ts +++ b/frontend/src/entity/expenses/list/api/deleteExpensesList.ts @@ -1,7 +1,7 @@ -import { api } from '@/shared/api/client'; - import type { paths } from '@/shared/api/schema'; +import { api } from '@/shared/api/client'; + export type DeleteExpenseListPath = paths['/expenses/list/{id}']['delete']['parameters']['path']; export type DeleteExpenseSuccessResponse = paths['/expenses/list/{id}']['delete']['responses']['200']['content']['application/json']; diff --git a/frontend/src/entity/expenses/list/api/editExpensesList.ts b/frontend/src/entity/expenses/list/api/editExpensesList.ts index 1dc8af5..74e568f 100644 --- a/frontend/src/entity/expenses/list/api/editExpensesList.ts +++ b/frontend/src/entity/expenses/list/api/editExpensesList.ts @@ -1,14 +1,14 @@ -import { api } from '@/shared/api/client'; - import type { paths } from '@/shared/api/schema'; -export type EditExpenseListPath = paths['/expenses/list/{id}']['patch']['parameters']['path']; +import { api } from '@/shared/api/client'; + export type EditExpenseListBody = paths['/expenses/list/{id}']['patch']['requestBody']['content']['application/json']; +export type EditExpenseListPath = paths['/expenses/list/{id}']['patch']['parameters']['path']; export type EditExpenseListSuccessResponse = paths['/expenses/list/{id}']['patch']['responses']['200']['content']['application/json']; export async function editExpensesList({ data, path }: { - path: EditExpenseListPath; data: EditExpenseListBody; + path: EditExpenseListPath; }) { const { id } = path; const { data: result } = await api.patch(`/expenses/list/${id}`, data); diff --git a/frontend/src/entity/expenses/list/api/getExpenseList.ts b/frontend/src/entity/expenses/list/api/getExpenseList.ts index 98a4a38..0eca53d 100644 --- a/frontend/src/entity/expenses/list/api/getExpenseList.ts +++ b/frontend/src/entity/expenses/list/api/getExpenseList.ts @@ -1,7 +1,7 @@ -import { api } from '@/shared/api/client'; - import type { paths } from '@/shared/api/schema'; +import { api } from '@/shared/api/client'; + type ExpenseListPath = paths['/expenses/list/{id}']['get']['parameters']['path']; type ExpenseListResponse = paths['/expenses/list/{id}']['get']['responses']['200']['content']['application/json']; diff --git a/frontend/src/entity/expenses/list/api/getExpenseLists.ts b/frontend/src/entity/expenses/list/api/getExpenseLists.ts index 576f874..e23e26b 100644 --- a/frontend/src/entity/expenses/list/api/getExpenseLists.ts +++ b/frontend/src/entity/expenses/list/api/getExpenseLists.ts @@ -1,7 +1,7 @@ -import { api } from '@/shared/api/client'; - import type { paths } from '@/shared/api/schema'; +import { api } from '@/shared/api/client'; + type ExpensesListResponse = paths['/expenses/list']['get']['responses']['200']['content']['application/json']; export async function getExpenseLists() { diff --git a/frontend/src/entity/expenses/list/hooks/useExpenseList.ts b/frontend/src/entity/expenses/list/hooks/useExpenseList.ts index 3f0bae3..62f5707 100644 --- a/frontend/src/entity/expenses/list/hooks/useExpenseList.ts +++ b/frontend/src/entity/expenses/list/hooks/useExpenseList.ts @@ -2,10 +2,10 @@ import { useQuery } from '@tanstack/react-query'; import { QueryKeys } from '@/shared/api/queryKeys'; -import { getExpenseList } from '../api/getExpenseList'; - import type { ExpenseList } from '../types'; +import { getExpenseList } from '../api/getExpenseList'; + export const useExpenseList = (id: ExpenseList['id']) => useQuery({ queryFn: async () => getExpenseList({ id }), queryKey: [QueryKeys.ExpenseList, id], diff --git a/frontend/src/entity/expenses/list/index.ts b/frontend/src/entity/expenses/list/index.ts index 5338115..26d0ae1 100644 --- a/frontend/src/entity/expenses/list/index.ts +++ b/frontend/src/entity/expenses/list/index.ts @@ -1,10 +1,14 @@ -export type { ExpenseList } from './types'; -export { useDeleteExpensesList } from './hooks/useDeleteExpensesList'; -export { useAddExpensesList } from './hooks/useAddExpensesList'; -export { useExpensesList } from './hooks/useExpensesList'; -export { useEditExpensesList } from './hooks/useEditExpensesList'; +export type { AddExpenseListBody, AddExpenseListPath, AddExpenseListSuccessResponse } from './api/addExpensesList'; +export type { DeleteExpenseListPath, DeleteExpenseSuccessResponse } from './api/deleteExpensesList'; +export type { EditExpenseListBody, EditExpenseListPath, EditExpenseListSuccessResponse } from './api/editExpensesList'; +export { useAddExpensesList } from './hooks/useAddExpensesList'; +export { useDeleteExpensesList } from './hooks/useDeleteExpensesList'; +export { useEditExpensesList } from './hooks/useEditExpensesList'; export { useExpenseList } from './hooks/useExpenseList'; +export { useExpensesList } from './hooks/useExpensesList'; + +export type { ExpenseList } from './types'; export type { AddExpenseListFormValues } from './ui/AddExpensesListForm/ui/AddExpensesListForm.ui'; export { default as AddExpensesListForm } from './ui/AddExpensesListForm/ui/AddExpensesListForm.ui'; @@ -13,7 +17,3 @@ export { default as DeleteExpensesListForm } from './ui/DeleteExpensesListForm/u export type { EditExpenseListFormValues } from './ui/EditExpensesListForm/ui/EditExpensesListForm.ui'; export { default as EditExpensesListForm } from './ui/EditExpensesListForm/ui/EditExpensesListForm.ui'; - -export type { AddExpenseListPath, AddExpenseListBody, AddExpenseListSuccessResponse } from './api/addExpensesList'; -export type { DeleteExpenseListPath, DeleteExpenseSuccessResponse } from './api/deleteExpensesList'; -export type { EditExpenseListPath, EditExpenseListBody, EditExpenseListSuccessResponse } from './api/editExpensesList'; diff --git a/frontend/src/entity/expenses/list/ui/AddExpensesListForm/ui/AddExpensesListForm.test.tsx b/frontend/src/entity/expenses/list/ui/AddExpensesListForm/ui/AddExpensesListForm.test.tsx index 547969b..ed4fb91 100644 --- a/frontend/src/entity/expenses/list/ui/AddExpensesListForm/ui/AddExpensesListForm.test.tsx +++ b/frontend/src/entity/expenses/list/ui/AddExpensesListForm/ui/AddExpensesListForm.test.tsx @@ -1,10 +1,10 @@ import { render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; -import AddExpensesListForm from './AddExpensesListForm.ui'; - import type { AddExpenseListFormProps } from './AddExpensesListForm.ui'; +import AddExpensesListForm from './AddExpensesListForm.ui'; + const renderForm = (props?: Partial) => { const onSubmit = jest.fn(); @@ -14,9 +14,9 @@ const renderForm = (props?: Partial) => { const submitButtonElem = screen.getByText('Добавить'); return { - titleInputElem, - submitButtonElem, onSubmit, + submitButtonElem, + titleInputElem, }; }; @@ -42,9 +42,9 @@ describe('Test AddExpensesListForm', () => { test('should call onSubmit with values', async () => { const { - titleInputElem, - submitButtonElem, onSubmit, + submitButtonElem, + titleInputElem, } = renderForm(); await userEvent.type(titleInputElem, 'Название списка'); diff --git a/frontend/src/entity/expenses/list/ui/AddExpensesListForm/ui/AddExpensesListForm.ui.tsx b/frontend/src/entity/expenses/list/ui/AddExpensesListForm/ui/AddExpensesListForm.ui.tsx index 6e105a3..6d91e93 100644 --- a/frontend/src/entity/expenses/list/ui/AddExpensesListForm/ui/AddExpensesListForm.ui.tsx +++ b/frontend/src/entity/expenses/list/ui/AddExpensesListForm/ui/AddExpensesListForm.ui.tsx @@ -1,31 +1,31 @@ +import type { + FC, + FormEventHandler, + FormHTMLAttributes, + RefObject, +} from 'react'; + import { Input } from '@/shared/ui/Input'; import classes from './AddExpenseListForm.module.css'; -import type { - FormHTMLAttributes, - RefObject, - FormEventHandler, - FC, -} from 'react'; - -export type AddExpenseListFormValues = { - title: string; -}; - -type BaseFormProps = Omit, 'onSubmit'>; - export type AddExpenseListFormProps = BaseFormProps & { disabled?: boolean; onSubmit: (data: AddExpenseListFormValues) => Promise | void; ref?: RefObject; }; +export type AddExpenseListFormValues = { + title: string; +}; + +type BaseFormProps = Omit, 'onSubmit'>; + const AddExpensesListForm: FC = (props) => { const { - ref, disabled, onSubmit, + ref, ...restProps } = props; @@ -45,9 +45,9 @@ const AddExpensesListForm: FC = (props) => { return (

Добавить список расходов

diff --git a/frontend/src/entity/expenses/list/ui/DeleteExpensesListForm/ui/DeleteExpensesListForm.test.tsx b/frontend/src/entity/expenses/list/ui/DeleteExpensesListForm/ui/DeleteExpensesListForm.test.tsx index d62fb04..86a5c91 100644 --- a/frontend/src/entity/expenses/list/ui/DeleteExpensesListForm/ui/DeleteExpensesListForm.test.tsx +++ b/frontend/src/entity/expenses/list/ui/DeleteExpensesListForm/ui/DeleteExpensesListForm.test.tsx @@ -1,16 +1,16 @@ import { render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; -import DeleteExpensesListForm from './DeleteExpensesListForm.ui'; - import type { DeleteExpenseListFormProps } from './DeleteExpensesListForm.ui'; +import DeleteExpensesListForm from './DeleteExpensesListForm.ui'; + const deletingList = { - id: '10cc093c-3875-4d33-a40a-df526266e262', - title: 'Mock list', - items: [], - updatedAt: '2025-08-29T07:57:40.503Z', createdAt: '2025-08-29T07:57:40.503Z', + id: '10cc093c-3875-4d33-a40a-df526266e262', + items: [], + title: 'Mock list', + updatedAt: '2025-08-29T07:57:40.503Z', }; const renderForm = (props?: Partial) => { @@ -28,8 +28,8 @@ const renderForm = (props?: Partial) => { const submitButtonElem = screen.getByText('Удалить'); return { - submitButtonElem, onSubmit, + submitButtonElem, }; }; @@ -43,8 +43,8 @@ describe('Test DeleteExpensesListForm', () => { test('should call onSubmit with values', async () => { const { - submitButtonElem, onSubmit, + submitButtonElem, } = renderForm(); await userEvent.click(submitButtonElem); diff --git a/frontend/src/entity/expenses/list/ui/DeleteExpensesListForm/ui/DeleteExpensesListForm.ui.tsx b/frontend/src/entity/expenses/list/ui/DeleteExpensesListForm/ui/DeleteExpensesListForm.ui.tsx index f47e98c..4136860 100644 --- a/frontend/src/entity/expenses/list/ui/DeleteExpensesListForm/ui/DeleteExpensesListForm.ui.tsx +++ b/frontend/src/entity/expenses/list/ui/DeleteExpensesListForm/ui/DeleteExpensesListForm.ui.tsx @@ -1,4 +1,3 @@ -import type { ExpenseList } from '@/entity/expenses/list'; import type { FC, FormEventHandler, @@ -6,21 +5,23 @@ import type { RefObject, } from 'react'; -type BaseFormProps = Omit, 'onSubmit'>; +import type { ExpenseList } from '@/entity/expenses/list'; export type DeleteExpenseListFormProps = BaseFormProps & { disabled?: boolean; + list: ExpenseList; onSubmit?: (list: ExpenseList) => Promise | void; ref?: RefObject; - list: ExpenseList; }; +type BaseFormProps = Omit, 'onSubmit'>; + const DeleteExpensesListForm: FC = (props) => { const { - ref, disabled, - onSubmit, list, + onSubmit, + ref, ...restProps } = props; @@ -30,7 +31,7 @@ const DeleteExpensesListForm: FC = (props) => { }; return ( - +

Удалить список расходов

diff --git a/frontend/src/entity/expenses/list/ui/EditExpensesListForm/ui/EditExpensesListForm.test.tsx b/frontend/src/entity/expenses/list/ui/EditExpensesListForm/ui/EditExpensesListForm.test.tsx index 5c87511..4a212a9 100644 --- a/frontend/src/entity/expenses/list/ui/EditExpensesListForm/ui/EditExpensesListForm.test.tsx +++ b/frontend/src/entity/expenses/list/ui/EditExpensesListForm/ui/EditExpensesListForm.test.tsx @@ -1,16 +1,16 @@ import { render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; -import EditExpensesListForm from './EditExpensesListForm.ui'; - import type { EditExpensesListFormProps } from './EditExpensesListForm.ui'; +import EditExpensesListForm from './EditExpensesListForm.ui'; + const editingList = { - id: '10cc093c-3875-4d33-a40a-df526266e262', - title: 'Mock list', - items: [], - updatedAt: '2025-08-29T07:57:40.503Z', createdAt: '2025-08-29T07:57:40.503Z', + id: '10cc093c-3875-4d33-a40a-df526266e262', + items: [], + title: 'Mock list', + updatedAt: '2025-08-29T07:57:40.503Z', }; const renderForm = (props?: Partial) => { @@ -29,9 +29,9 @@ const renderForm = (props?: Partial) => { const submitButtonElem = screen.getByText('Сохранить'); return { - titleInputElem, - submitButtonElem, onSubmit, + submitButtonElem, + titleInputElem, }; }; @@ -64,9 +64,9 @@ describe('Test EditExpensesListForm', () => { test('should call onSubmit with values', async () => { const { - titleInputElem, - submitButtonElem, onSubmit, + submitButtonElem, + titleInputElem, } = renderForm(); await userEvent.clear(titleInputElem); diff --git a/frontend/src/entity/expenses/list/ui/EditExpensesListForm/ui/EditExpensesListForm.ui.tsx b/frontend/src/entity/expenses/list/ui/EditExpensesListForm/ui/EditExpensesListForm.ui.tsx index dc8ba79..04123f5 100644 --- a/frontend/src/entity/expenses/list/ui/EditExpensesListForm/ui/EditExpensesListForm.ui.tsx +++ b/frontend/src/entity/expenses/list/ui/EditExpensesListForm/ui/EditExpensesListForm.ui.tsx @@ -1,8 +1,3 @@ -import { Input } from '@/shared/ui/Input'; - -import classes from './EditExpenseListForm.module.css'; - -import type { ExpenseList } from '@/entity/expenses/list'; import type { FC, FormEventHandler, @@ -10,25 +5,31 @@ import type { RefObject, } from 'react'; +import type { ExpenseList } from '@/entity/expenses/list'; + +import { Input } from '@/shared/ui/Input'; + +import classes from './EditExpenseListForm.module.css'; + export type EditExpenseListFormValues = { title: string; }; -type BaseFormProps = Omit, 'onSubmit'>; - export type EditExpensesListFormProps = BaseFormProps & { disabled?: boolean; + list: ExpenseList; onSubmit: (data: EditExpenseListFormValues) => Promise | void; ref?: RefObject; - list: ExpenseList; }; +type BaseFormProps = Omit, 'onSubmit'>; + const EditExpensesListForm: FC = (props) => { const { - ref, disabled, - onSubmit, list, + onSubmit, + ref, ...restProps } = props; @@ -46,9 +47,9 @@ const EditExpensesListForm: FC = (props) => { return (

Редактировать список расходов

diff --git a/frontend/src/entity/incomes/item/api/addIncomeItem.ts b/frontend/src/entity/incomes/item/api/addIncomeItem.ts index 7d9a66c..a347295 100644 --- a/frontend/src/entity/incomes/item/api/addIncomeItem.ts +++ b/frontend/src/entity/incomes/item/api/addIncomeItem.ts @@ -1,7 +1,7 @@ -import { api } from '@/shared/api/client'; - import type { paths } from '@/shared/api/schema'; +import { api } from '@/shared/api/client'; + export type AddIncomeItemBody = paths['/incomes/list/{id}/items']['post']['requestBody']['content']['application/json']; export type AddIncomeItemPath = paths['/incomes/list/{id}/items']['post']['parameters']['path']; export type AddIncomeItemSuccessResponse = paths['/incomes/list/{id}/items']['post']['responses']['200']['content']['application/json']; diff --git a/frontend/src/entity/incomes/item/api/deleteIncomeItem.ts b/frontend/src/entity/incomes/item/api/deleteIncomeItem.ts index 183f500..1629f41 100644 --- a/frontend/src/entity/incomes/item/api/deleteIncomeItem.ts +++ b/frontend/src/entity/incomes/item/api/deleteIncomeItem.ts @@ -1,7 +1,7 @@ -import { api } from '@/shared/api/client'; - import type { paths } from '@/shared/api/schema'; +import { api } from '@/shared/api/client'; + export type DeleteIncomeItemPath = paths['/incomes/list/{listId}/items/{id}']['delete']['parameters']['path']; export type DeleteIncomeItemSuccessResponse = paths['/incomes/list/{id}/items']['post']['responses']['200']['content']['application/json']; diff --git a/frontend/src/entity/incomes/item/api/editIncomeItem.ts b/frontend/src/entity/incomes/item/api/editIncomeItem.ts index 6eabadc..1c29405 100644 --- a/frontend/src/entity/incomes/item/api/editIncomeItem.ts +++ b/frontend/src/entity/incomes/item/api/editIncomeItem.ts @@ -1,7 +1,7 @@ -import { api } from '@/shared/api/client'; - import type { paths } from '@/shared/api/schema'; +import { api } from '@/shared/api/client'; + export type EditIncomeItemBody = paths['/incomes/list/{listId}/items/{id}']['patch']['requestBody']['content']['application/json']; export type EditIncomeItemPath = paths['/incomes/list/{listId}/items/{id}']['patch']['parameters']['path']; export type EditIncomeItemSuccessResponse = paths['/incomes/list/{listId}/items/{id}']['patch']['responses']['200']['content']['application/json']; diff --git a/frontend/src/entity/incomes/item/hooks/useDeleteIncomeItem.ts b/frontend/src/entity/incomes/item/hooks/useDeleteIncomeItem.ts index 27ab4f8..365110e 100644 --- a/frontend/src/entity/incomes/item/hooks/useDeleteIncomeItem.ts +++ b/frontend/src/entity/incomes/item/hooks/useDeleteIncomeItem.ts @@ -2,10 +2,10 @@ import { useMutation, useQueryClient } from '@tanstack/react-query'; import { QueryKeys } from '@/shared/api/queryKeys'; -import { deleteIncomeItem } from '../api/deleteIncomeItem'; - import type { DeleteIncomeItemPath } from '../api/deleteIncomeItem'; +import { deleteIncomeItem } from '../api/deleteIncomeItem'; + export const useDeleteIncomeItem = (path: DeleteIncomeItemPath) => { const queryClient = useQueryClient(); diff --git a/frontend/src/entity/incomes/item/index.ts b/frontend/src/entity/incomes/item/index.ts index 3368861..0b5deea 100644 --- a/frontend/src/entity/incomes/item/index.ts +++ b/frontend/src/entity/incomes/item/index.ts @@ -1,17 +1,17 @@ +export type { AddIncomeItemBody, AddIncomeItemPath, AddIncomeItemSuccessResponse } from './api/addIncomeItem'; +export type { DeleteIncomeItemPath, DeleteIncomeItemSuccessResponse } from './api/deleteIncomeItem'; +export type { EditIncomeItemBody, EditIncomeItemPath, EditIncomeItemSuccessResponse } from './api/editIncomeItem'; + export { useAddIncomeItem } from './hooks/useAddIncomeItem'; export { useDeleteIncomeItem } from './hooks/useDeleteIncomeItem'; export { useEditIncomeItem } from './hooks/useEditIncomeItem'; -export type { AddIncomeItemPath, AddIncomeItemBody, AddIncomeItemSuccessResponse } from './api/addIncomeItem'; -export type { DeleteIncomeItemPath, DeleteIncomeItemSuccessResponse } from './api/deleteIncomeItem'; -export type { EditIncomeItemPath, EditIncomeItemBody, EditIncomeItemSuccessResponse } from './api/editIncomeItem'; - +export type { IncomeListItem } from './types'; export type { AddIncomeItemFormValues } from './ui/AddIncomeItemForm/AddIncomeItemForm.ui'; + export { default as AddIncomeItemForm } from './ui/AddIncomeItemForm/AddIncomeItemForm.ui'; - -export type { EditIncomeItemFormValues } from './ui/EditIncomeItemForm/EditIncomeItemForm.ui'; -export { default as EditIncomeItemForm } from './ui/EditIncomeItemForm/EditIncomeItemForm.ui'; - export { default as DeleteIncomeItemForm } from './ui/DeleteIncomeItemForm/DeleteIncomeItemForm.ui'; -export type { IncomeListItem } from './types'; +export type { EditIncomeItemFormValues } from './ui/EditIncomeItemForm/EditIncomeItemForm.ui'; + +export { default as EditIncomeItemForm } from './ui/EditIncomeItemForm/EditIncomeItemForm.ui'; diff --git a/frontend/src/entity/incomes/item/ui/AddIncomeItemForm/AddIncomeItemForm.test.tsx b/frontend/src/entity/incomes/item/ui/AddIncomeItemForm/AddIncomeItemForm.test.tsx index 152581e..aa2d766 100644 --- a/frontend/src/entity/incomes/item/ui/AddIncomeItemForm/AddIncomeItemForm.test.tsx +++ b/frontend/src/entity/incomes/item/ui/AddIncomeItemForm/AddIncomeItemForm.test.tsx @@ -1,10 +1,10 @@ import { render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; -import AddIncomeItemForm from './AddIncomeItemForm.ui'; - import type { AddIncomeItemFormProps } from './AddIncomeItemForm.ui'; +import AddIncomeItemForm from './AddIncomeItemForm.ui'; + const renderForm = (props?: Partial) => { const onSubmit = jest.fn(); @@ -17,12 +17,12 @@ const renderForm = (props?: Partial) => { const submitButtonElem = screen.getByText('Добавить'); return { - titleInputElem, - descriptionInputElem, - dateInputElem, amountInputElem, - submitButtonElem, + dateInputElem, + descriptionInputElem, onSubmit, + submitButtonElem, + titleInputElem, }; }; @@ -48,12 +48,12 @@ describe('Test AddIncomeItemForm', () => { test('should call onSubmit with values', async () => { const { - titleInputElem, - descriptionInputElem, - dateInputElem, amountInputElem, - submitButtonElem, + dateInputElem, + descriptionInputElem, onSubmit, + submitButtonElem, + titleInputElem, } = renderForm(); await userEvent.type(titleInputElem, 'Название элемента'); @@ -65,11 +65,11 @@ describe('Test AddIncomeItemForm', () => { expect(onSubmit).toHaveBeenCalledTimes(1); expect(onSubmit).toHaveBeenCalledWith({ - title: 'Название элемента', - description: 'Описание элемента', - date: '2025-08-29T00:00:00.000Z', amount: 12, currency: 'RUB', + date: '2025-08-29T00:00:00.000Z', + description: 'Описание элемента', + title: 'Название элемента', }); }); }); diff --git a/frontend/src/entity/incomes/item/ui/AddIncomeItemForm/AddIncomeItemForm.ui.tsx b/frontend/src/entity/incomes/item/ui/AddIncomeItemForm/AddIncomeItemForm.ui.tsx index beb7c40..206de29 100644 --- a/frontend/src/entity/incomes/item/ui/AddIncomeItemForm/AddIncomeItemForm.ui.tsx +++ b/frontend/src/entity/incomes/item/ui/AddIncomeItemForm/AddIncomeItemForm.ui.tsx @@ -1,7 +1,3 @@ -import { Input } from '@/shared/ui/Input'; - -import classes from './AddIncomeItemForm.module.css'; - import type { FC, FormEventHandler, @@ -9,15 +5,9 @@ import type { RefObject, } from 'react'; -export type AddIncomeItemFormValues = { - title: string; - description: string; - date: string; - amount: number; - currency: string; -}; +import { Input } from '@/shared/ui/Input'; -type BaseFormProps = Omit, 'onSubmit'>; +import classes from './AddIncomeItemForm.module.css'; export type AddIncomeItemFormProps = BaseFormProps & { disabled?: boolean; @@ -25,6 +15,16 @@ export type AddIncomeItemFormProps = BaseFormProps & { ref?: RefObject; }; +export type AddIncomeItemFormValues = { + amount: number; + currency: string; + date: string; + description: string; + title: string; +}; + +type BaseFormProps = Omit, 'onSubmit'>; + const AddIncomeItemForm: FC = (props) => { const { disabled, @@ -45,29 +45,29 @@ const AddIncomeItemForm: FC = (props) => { if (typeof title === 'string' && typeof date === 'string' && typeof amount === 'string' && typeof description === 'string') { onSubmit?.({ - title, - date: new Date(date).toISOString(), amount: Number(amount), - description, currency: 'RUB', + date: new Date(date).toISOString(), + description, + title, }); } }; return (

Добавить список доходов

= (props) => { /> diff --git a/frontend/src/entity/incomes/item/ui/DeleteIncomeItemForm/DeleteIncomeItemForm.test.tsx b/frontend/src/entity/incomes/item/ui/DeleteIncomeItemForm/DeleteIncomeItemForm.test.tsx index 31b9090..afda87e 100644 --- a/frontend/src/entity/incomes/item/ui/DeleteIncomeItemForm/DeleteIncomeItemForm.test.tsx +++ b/frontend/src/entity/incomes/item/ui/DeleteIncomeItemForm/DeleteIncomeItemForm.test.tsx @@ -1,20 +1,20 @@ import { render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; -import DeleteIncomeItemForm from './DeleteIncomeItemForm.ui'; - import type { DeleteIncomeItemFormProps } from './DeleteIncomeItemForm.ui'; +import DeleteIncomeItemForm from './DeleteIncomeItemForm.ui'; + const deletingItem = { - id: '51a44dc0-597b-49b9-85bb-e0bcd42db3f6', - title: 'Mock item', amount: 12, - updatedAt: '2025-08-29T07:57:40.503Z', - incomeListId: '10cc093c-3875-4d33-a40a-df526266e262', createdAt: '2025-08-29T07:57:40.503Z', currency: 'RUB', date: '2025-08-22T00:00:03.000Z', description: 'Mock description', + id: '51a44dc0-597b-49b9-85bb-e0bcd42db3f6', + incomeListId: '10cc093c-3875-4d33-a40a-df526266e262', + title: 'Mock item', + updatedAt: '2025-08-29T07:57:40.503Z', }; const renderForm = (props?: Partial) => { @@ -32,8 +32,8 @@ const renderForm = (props?: Partial) => { const submitButtonElem = screen.getByText('Удалить'); return { - submitButtonElem, onSubmit, + submitButtonElem, }; }; @@ -47,8 +47,8 @@ describe('Test DeleteIncomeItemForm', () => { test('should call onSubmit with values', async () => { const { - submitButtonElem, onSubmit, + submitButtonElem, } = renderForm(); await userEvent.click(submitButtonElem); diff --git a/frontend/src/entity/incomes/item/ui/DeleteIncomeItemForm/DeleteIncomeItemForm.ui.tsx b/frontend/src/entity/incomes/item/ui/DeleteIncomeItemForm/DeleteIncomeItemForm.ui.tsx index 6b9473c..8741b26 100644 --- a/frontend/src/entity/incomes/item/ui/DeleteIncomeItemForm/DeleteIncomeItemForm.ui.tsx +++ b/frontend/src/entity/incomes/item/ui/DeleteIncomeItemForm/DeleteIncomeItemForm.ui.tsx @@ -1,4 +1,3 @@ -import type { IncomeListItem } from '../../types'; import type { FC, FormEventHandler, @@ -6,21 +5,23 @@ import type { RefObject, } from 'react'; -type BaseFormProps = Omit, 'onSubmit'>; +import type { IncomeListItem } from '../../types'; export type DeleteIncomeItemFormProps = BaseFormProps & { + disabled?: boolean; item: IncomeListItem; onSubmit?: (item: IncomeListItem) => Promise | void; - disabled?: boolean; ref?: RefObject; }; +type BaseFormProps = Omit, 'onSubmit'>; + const DeleteIncomeItemForm: FC = (props) => { const { + disabled, item, onSubmit, ref, - disabled, ...restProps } = props; const onFormSubmitHandler: FormEventHandler = (event) => { @@ -29,7 +30,7 @@ const DeleteIncomeItemForm: FC = (props) => { }; return ( - +

Удалить элемент ?

diff --git a/frontend/src/entity/incomes/item/ui/EditIncomeItemForm/EditIncomeItemForm.test.tsx b/frontend/src/entity/incomes/item/ui/EditIncomeItemForm/EditIncomeItemForm.test.tsx index 3ee588f..88f01df 100644 --- a/frontend/src/entity/incomes/item/ui/EditIncomeItemForm/EditIncomeItemForm.test.tsx +++ b/frontend/src/entity/incomes/item/ui/EditIncomeItemForm/EditIncomeItemForm.test.tsx @@ -1,21 +1,21 @@ import { render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; -import EditIncomeItemForm from './EditIncomeItemForm.ui'; - import type { EditIncomeItemFormProps } from './EditIncomeItemForm.ui'; +import EditIncomeItemForm from './EditIncomeItemForm.ui'; + const editingItem = { - id: '51a44dc0-597b-49b9-85bb-e0bcd42db3f6', - title: 'Mock item', amount: 12, count: 12, - updatedAt: '2025-08-29T07:57:40.503Z', - incomeListId: '10cc093c-3875-4d33-a40a-df526266e262', createdAt: '2025-08-29T07:57:40.503Z', currency: 'RUB', date: '2025-08-22T00:00:03.000Z', description: 'Mock description', + id: '51a44dc0-597b-49b9-85bb-e0bcd42db3f6', + incomeListId: '10cc093c-3875-4d33-a40a-df526266e262', + title: 'Mock item', + updatedAt: '2025-08-29T07:57:40.503Z', }; const renderForm = (props?: Partial) => { @@ -37,12 +37,12 @@ const renderForm = (props?: Partial) => { const submitButtonElem = screen.getByText('Сохранить'); return { - titleInputElem, - descriptionInputElem, - dateInputElem, amountInputElem, - submitButtonElem, + dateInputElem, + descriptionInputElem, onSubmit, + submitButtonElem, + titleInputElem, }; }; @@ -56,10 +56,10 @@ describe('Test EditIncomeItemForm', () => { test('should inputs have default value', () => { const { - titleInputElem, - descriptionInputElem, - dateInputElem, amountInputElem, + dateInputElem, + descriptionInputElem, + titleInputElem, } = renderForm(); expect(titleInputElem).toHaveValue('Mock item'); expect(descriptionInputElem).toHaveValue('Mock description'); @@ -81,12 +81,12 @@ describe('Test EditIncomeItemForm', () => { test('should call onSubmit with values', async () => { const { - titleInputElem, - descriptionInputElem, - dateInputElem, amountInputElem, - submitButtonElem, + dateInputElem, + descriptionInputElem, onSubmit, + submitButtonElem, + titleInputElem, } = renderForm(); await userEvent.clear(titleInputElem); @@ -105,11 +105,11 @@ describe('Test EditIncomeItemForm', () => { expect(onSubmit).toHaveBeenCalledTimes(1); expect(onSubmit).toHaveBeenCalledWith({ - title: 'Название элемента', - description: 'Описание элемента', - date: '2025-08-29T00:00:00.000Z', amount: 12, currency: 'RUB', + date: '2025-08-29T00:00:00.000Z', + description: 'Описание элемента', + title: 'Название элемента', }); }); }); diff --git a/frontend/src/entity/incomes/item/ui/EditIncomeItemForm/EditIncomeItemForm.ui.tsx b/frontend/src/entity/incomes/item/ui/EditIncomeItemForm/EditIncomeItemForm.ui.tsx index b1d15ef..95c302d 100644 --- a/frontend/src/entity/incomes/item/ui/EditIncomeItemForm/EditIncomeItemForm.ui.tsx +++ b/frontend/src/entity/incomes/item/ui/EditIncomeItemForm/EditIncomeItemForm.ui.tsx @@ -1,8 +1,3 @@ -import { Input } from '@/shared/ui/Input'; - -import classes from './EditIncomeItemForm.module.css'; - -import type { IncomeListItem } from '../../types'; import type { FC, FormEventHandler, @@ -10,28 +5,34 @@ import type { RefObject, } from 'react'; -export type EditIncomeItemFormValues = { - title: string; - description: string; - date: string; - amount: number; - currency: string; -}; +import { Input } from '@/shared/ui/Input'; + +import type { IncomeListItem } from '../../types'; + +import classes from './EditIncomeItemForm.module.css'; -type BaseFormProps = Omit, 'onSubmit'>; export type EditIncomeItemFormProps = BaseFormProps & { disabled?: boolean; + item: IncomeListItem; onSubmit?: (data: EditIncomeItemFormValues) => Promise | void; ref?: RefObject; - item: IncomeListItem; }; +export type EditIncomeItemFormValues = { + amount: number; + currency: string; + date: string; + description: string; + title: string; +}; +type BaseFormProps = Omit, 'onSubmit'>; + const EditIncomeItemForm: FC = (props) => { const { disabled, + item, onSubmit, ref, - item, ...formProps } = props; @@ -47,20 +48,20 @@ const EditIncomeItemForm: FC = (props) => { if (typeof title === 'string' && typeof date === 'string' && typeof amount === 'string' && typeof description === 'string') { await onSubmit?.({ - title, - date: new Date(date).toISOString(), amount: Number(amount), - description, currency: 'RUB', + date: new Date(date).toISOString(), + description, + title, }); } }; return (

Изменить доход

diff --git a/frontend/src/entity/incomes/list/api/addIncomeList.ts b/frontend/src/entity/incomes/list/api/addIncomeList.ts index 76f0b90..afc8a3f 100644 --- a/frontend/src/entity/incomes/list/api/addIncomeList.ts +++ b/frontend/src/entity/incomes/list/api/addIncomeList.ts @@ -1,9 +1,9 @@ -import { api } from '@/shared/api/client'; - import type { paths } from '@/shared/api/schema'; -export type AddIncomeListPath = paths['/incomes/list']['post']['parameters']['path']; +import { api } from '@/shared/api/client'; + export type AddIncomeListBody = paths['/incomes/list']['post']['requestBody']['content']['application/json']; +export type AddIncomeListPath = paths['/incomes/list']['post']['parameters']['path']; export type AddIncomeListSuccessResponse = paths['/incomes/list']['post']['responses']['200']['content']['application/json']; export async function addIncomeList(data: AddIncomeListBody) { diff --git a/frontend/src/entity/incomes/list/api/deleteIncomeList.ts b/frontend/src/entity/incomes/list/api/deleteIncomeList.ts index 577351b..c79d99a 100644 --- a/frontend/src/entity/incomes/list/api/deleteIncomeList.ts +++ b/frontend/src/entity/incomes/list/api/deleteIncomeList.ts @@ -1,7 +1,7 @@ -import { api } from '@/shared/api/client'; - import type { paths } from '@/shared/api/schema'; +import { api } from '@/shared/api/client'; + export type DeleteIncomeListPath = paths['/incomes/list/{id}']['delete']['parameters']['path']; export type DeleteIncomeListSuccessResponse = paths['/incomes/list/{id}']['delete']['responses']['200']['content']['application/json']; diff --git a/frontend/src/entity/incomes/list/api/editIncomeList.ts b/frontend/src/entity/incomes/list/api/editIncomeList.ts index c8182df..4aaf1c0 100644 --- a/frontend/src/entity/incomes/list/api/editIncomeList.ts +++ b/frontend/src/entity/incomes/list/api/editIncomeList.ts @@ -1,14 +1,14 @@ -import { api } from '@/shared/api/client'; - import type { paths } from '@/shared/api/schema'; -export type EditIncomeListPath = paths['/incomes/list/{id}']['patch']['parameters']['path']; +import { api } from '@/shared/api/client'; + export type EditIncomeListBody = paths['/incomes/list/{id}']['patch']['requestBody']['content']['application/json']; +export type EditIncomeListPath = paths['/incomes/list/{id}']['patch']['parameters']['path']; export type EditIncomeListSuccessResponse = paths['/incomes/list/{id}']['patch']['responses']['200']['content']['application/json']; export async function editIncomeList({ data, path }: { - path: EditIncomeListPath; data: EditIncomeListBody; + path: EditIncomeListPath; }) { const { id } = path; const { data: result } = await api.patch(`/incomes/list/${id}`, data); diff --git a/frontend/src/entity/incomes/list/api/getIncomeList.ts b/frontend/src/entity/incomes/list/api/getIncomeList.ts index 0932f69..53734b4 100644 --- a/frontend/src/entity/incomes/list/api/getIncomeList.ts +++ b/frontend/src/entity/incomes/list/api/getIncomeList.ts @@ -1,7 +1,7 @@ -import { api } from '@/shared/api/client'; - import type { paths } from '@/shared/api/schema'; +import { api } from '@/shared/api/client'; + type IncomeListPath = paths['/incomes/list/{id}']['get']['parameters']['path']; type IncomeListResponse = paths['/incomes/list/{id}']['get']['responses']['200']['content']['application/json']; diff --git a/frontend/src/entity/incomes/list/api/getIncomeLists.ts b/frontend/src/entity/incomes/list/api/getIncomeLists.ts index bdcd908..98dac33 100644 --- a/frontend/src/entity/incomes/list/api/getIncomeLists.ts +++ b/frontend/src/entity/incomes/list/api/getIncomeLists.ts @@ -1,7 +1,7 @@ -import { api } from '@/shared/api/client'; - import type { paths } from '@/shared/api/schema'; +import { api } from '@/shared/api/client'; + type IncomesListResponse = paths['/incomes/list']['get']['responses']['200']['content']['application/json']; export async function getIncomeLists() { diff --git a/frontend/src/entity/incomes/list/hooks/useIncomeList.ts b/frontend/src/entity/incomes/list/hooks/useIncomeList.ts index 97195ce..72550d8 100644 --- a/frontend/src/entity/incomes/list/hooks/useIncomeList.ts +++ b/frontend/src/entity/incomes/list/hooks/useIncomeList.ts @@ -2,10 +2,10 @@ import { useQuery } from '@tanstack/react-query'; import { QueryKeys } from '@/shared/api/queryKeys'; -import { getIncomeList } from '../api/getIncomeList'; - import type { IncomeList } from '../types'; +import { getIncomeList } from '../api/getIncomeList'; + export const useIncomeList = (id: IncomeList['id']) => useQuery({ queryFn: async () => getIncomeList({ id }), queryKey: [QueryKeys.IncomesList, id], diff --git a/frontend/src/entity/incomes/list/index.ts b/frontend/src/entity/incomes/list/index.ts index 33932ac..be481e9 100644 --- a/frontend/src/entity/incomes/list/index.ts +++ b/frontend/src/entity/incomes/list/index.ts @@ -1,10 +1,14 @@ -export type { IncomeList } from './types'; -export { useDeleteIncomesList } from './hooks/useDeleteIncomesList'; -export { useAddIncomesList } from './hooks/useAddIncomesList'; -export { useIncomesList } from './hooks/useIncomesList'; -export { useEditIncomesList } from './hooks/useEditIncomesList'; +export type { AddIncomeListBody, AddIncomeListPath, AddIncomeListSuccessResponse } from './api/addIncomeList'; +export type { DeleteIncomeListPath, DeleteIncomeListSuccessResponse } from './api/deleteIncomeList'; +export type { EditIncomeListBody, EditIncomeListPath, EditIncomeListSuccessResponse } from './api/editIncomeList'; +export { useAddIncomesList } from './hooks/useAddIncomesList'; +export { useDeleteIncomesList } from './hooks/useDeleteIncomesList'; +export { useEditIncomesList } from './hooks/useEditIncomesList'; export { useIncomeList } from './hooks/useIncomeList'; +export { useIncomesList } from './hooks/useIncomesList'; + +export type { IncomeList } from './types'; export type { AddIncomeListFormValues } from './ui/AddIncomeListForm/ui/AddIncomeListForm.ui'; export { default as AddIncomeListForm } from './ui/AddIncomeListForm/ui/AddIncomeListForm.ui'; @@ -13,7 +17,3 @@ export { default as DeleteIncomeListForm } from './ui/DeleteIncomeListForm/ui/De export type { EditIncomeListFormValues } from './ui/EditIncomeListForm/ui/EditIncomeListForm.ui'; export { default as EditIncomeListForm } from './ui/EditIncomeListForm/ui/EditIncomeListForm.ui'; - -export type { AddIncomeListBody, AddIncomeListPath, AddIncomeListSuccessResponse } from './api/addIncomeList'; -export type { DeleteIncomeListPath, DeleteIncomeListSuccessResponse } from './api/deleteIncomeList'; -export type { EditIncomeListBody, EditIncomeListPath, EditIncomeListSuccessResponse } from './api/editIncomeList'; diff --git a/frontend/src/entity/incomes/list/ui/AddIncomeListForm/ui/AddIncomeListForm.test.tsx b/frontend/src/entity/incomes/list/ui/AddIncomeListForm/ui/AddIncomeListForm.test.tsx index 31dae73..2a28d2d 100644 --- a/frontend/src/entity/incomes/list/ui/AddIncomeListForm/ui/AddIncomeListForm.test.tsx +++ b/frontend/src/entity/incomes/list/ui/AddIncomeListForm/ui/AddIncomeListForm.test.tsx @@ -1,10 +1,10 @@ import { render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; -import AddIncomeListForm from './AddIncomeListForm.ui'; - import type { AddIncomeListFormProps } from './AddIncomeListForm.ui'; +import AddIncomeListForm from './AddIncomeListForm.ui'; + const renderForm = (props?: Partial) => { const onSubmit = jest.fn(); @@ -14,9 +14,9 @@ const renderForm = (props?: Partial) => { const submitButtonElem = screen.getByText('Добавить'); return { - titleInputElem, - submitButtonElem, onSubmit, + submitButtonElem, + titleInputElem, }; }; @@ -42,9 +42,9 @@ describe('Test AddIncomeListForm', () => { test('should call onSubmit with values', async () => { const { - titleInputElem, - submitButtonElem, onSubmit, + submitButtonElem, + titleInputElem, } = renderForm(); await userEvent.type(titleInputElem, 'Название списка'); diff --git a/frontend/src/entity/incomes/list/ui/AddIncomeListForm/ui/AddIncomeListForm.ui.tsx b/frontend/src/entity/incomes/list/ui/AddIncomeListForm/ui/AddIncomeListForm.ui.tsx index d9daaa7..b0982ca 100644 --- a/frontend/src/entity/incomes/list/ui/AddIncomeListForm/ui/AddIncomeListForm.ui.tsx +++ b/frontend/src/entity/incomes/list/ui/AddIncomeListForm/ui/AddIncomeListForm.ui.tsx @@ -1,31 +1,31 @@ +import type { + FC, + FormEventHandler, + FormHTMLAttributes, + RefObject, +} from 'react'; + import { Input } from '@/shared/ui/Input'; import classes from './AddIncomeListForm.module.css'; -import type { - FormHTMLAttributes, - RefObject, - FormEventHandler, - FC, -} from 'react'; - -export type AddIncomeListFormValues = { - title: string; -}; - -type BaseFormProps = Omit, 'onSubmit'>; - export type AddIncomeListFormProps = BaseFormProps & { disabled?: boolean; onSubmit: (data: AddIncomeListFormValues) => Promise | void; ref?: RefObject; }; +export type AddIncomeListFormValues = { + title: string; +}; + +type BaseFormProps = Omit, 'onSubmit'>; + const AddIncomeListForm: FC = (props) => { const { - ref, disabled, onSubmit, + ref, ...restProps } = props; @@ -45,9 +45,9 @@ const AddIncomeListForm: FC = (props) => { return (

Добавить список доходов

diff --git a/frontend/src/entity/incomes/list/ui/DeleteIncomeListForm/ui/DeleteIncomeListForm.test.tsx b/frontend/src/entity/incomes/list/ui/DeleteIncomeListForm/ui/DeleteIncomeListForm.test.tsx index 3e6c8ee..d365461 100644 --- a/frontend/src/entity/incomes/list/ui/DeleteIncomeListForm/ui/DeleteIncomeListForm.test.tsx +++ b/frontend/src/entity/incomes/list/ui/DeleteIncomeListForm/ui/DeleteIncomeListForm.test.tsx @@ -1,16 +1,16 @@ import { render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; -import DeleteIncomeListForm from './DeleteIncomeListForm.ui'; - import type { DeleteIncomeListFormProps } from './DeleteIncomeListForm.ui'; +import DeleteIncomeListForm from './DeleteIncomeListForm.ui'; + const deletingList = { - id: '10cc093c-3875-4d33-a40a-df526266e262', - title: 'Mock list', - items: [], - updatedAt: '2025-08-29T07:57:40.503Z', createdAt: '2025-08-29T07:57:40.503Z', + id: '10cc093c-3875-4d33-a40a-df526266e262', + items: [], + title: 'Mock list', + updatedAt: '2025-08-29T07:57:40.503Z', }; const renderForm = (props?: Partial) => { @@ -28,8 +28,8 @@ const renderForm = (props?: Partial) => { const submitButtonElem = screen.getByText('Удалить'); return { - submitButtonElem, onSubmit, + submitButtonElem, }; }; @@ -43,8 +43,8 @@ describe('Test DeleteIncomeListForm', () => { test('should call onSubmit with values', async () => { const { - submitButtonElem, onSubmit, + submitButtonElem, } = renderForm(); await userEvent.click(submitButtonElem); diff --git a/frontend/src/entity/incomes/list/ui/DeleteIncomeListForm/ui/DeleteIncomeListForm.ui.tsx b/frontend/src/entity/incomes/list/ui/DeleteIncomeListForm/ui/DeleteIncomeListForm.ui.tsx index 4be2577..0edc345 100644 --- a/frontend/src/entity/incomes/list/ui/DeleteIncomeListForm/ui/DeleteIncomeListForm.ui.tsx +++ b/frontend/src/entity/incomes/list/ui/DeleteIncomeListForm/ui/DeleteIncomeListForm.ui.tsx @@ -1,4 +1,3 @@ -import type { IncomeList } from '../../../types'; import type { FC, FormEventHandler, @@ -6,21 +5,23 @@ import type { RefObject, } from 'react'; -type BaseFormProps = Omit, 'onSubmit'>; +import type { IncomeList } from '../../../types'; export type DeleteIncomeListFormProps = BaseFormProps & { disabled?: boolean; + list: IncomeList; onSubmit?: (list: IncomeList) => Promise | void; ref?: RefObject; - list: IncomeList; }; +type BaseFormProps = Omit, 'onSubmit'>; + const DeleteIncomeListForm: FC = (props) => { const { - ref, disabled, - onSubmit, list, + onSubmit, + ref, ...restProps } = props; @@ -30,7 +31,7 @@ const DeleteIncomeListForm: FC = (props) => { }; return ( - +

Удалить список доходов

diff --git a/frontend/src/entity/incomes/list/ui/EditIncomeListForm/ui/EditIncomeListForm.test.tsx b/frontend/src/entity/incomes/list/ui/EditIncomeListForm/ui/EditIncomeListForm.test.tsx index 032e0a6..f0644c1 100644 --- a/frontend/src/entity/incomes/list/ui/EditIncomeListForm/ui/EditIncomeListForm.test.tsx +++ b/frontend/src/entity/incomes/list/ui/EditIncomeListForm/ui/EditIncomeListForm.test.tsx @@ -1,16 +1,16 @@ import { render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; -import EditIncomeListForm from './EditIncomeListForm.ui'; - import type { EditExpensesListFormProps } from './EditIncomeListForm.ui'; +import EditIncomeListForm from './EditIncomeListForm.ui'; + const editingList = { - id: '10cc093c-3875-4d33-a40a-df526266e262', - title: 'Mock list', - items: [], - updatedAt: '2025-08-29T07:57:40.503Z', createdAt: '2025-08-29T07:57:40.503Z', + id: '10cc093c-3875-4d33-a40a-df526266e262', + items: [], + title: 'Mock list', + updatedAt: '2025-08-29T07:57:40.503Z', }; const renderForm = (props?: Partial) => { @@ -29,9 +29,9 @@ const renderForm = (props?: Partial) => { const submitButtonElem = screen.getByText('Сохранить'); return { - titleInputElem, - submitButtonElem, onSubmit, + submitButtonElem, + titleInputElem, }; }; @@ -64,9 +64,9 @@ describe('Test EditIncomeListForm', () => { test('should call onSubmit with values', async () => { const { - titleInputElem, - submitButtonElem, onSubmit, + submitButtonElem, + titleInputElem, } = renderForm(); await userEvent.clear(titleInputElem); diff --git a/frontend/src/entity/incomes/list/ui/EditIncomeListForm/ui/EditIncomeListForm.ui.tsx b/frontend/src/entity/incomes/list/ui/EditIncomeListForm/ui/EditIncomeListForm.ui.tsx index 27eb8ab..e784f38 100644 --- a/frontend/src/entity/incomes/list/ui/EditIncomeListForm/ui/EditIncomeListForm.ui.tsx +++ b/frontend/src/entity/incomes/list/ui/EditIncomeListForm/ui/EditIncomeListForm.ui.tsx @@ -1,8 +1,3 @@ -import { Input } from '@/shared/ui/Input'; - -import classes from './EditIncomeListForm.module.css'; - -import type { IncomeList } from '../../../types'; import type { FC, FormEventHandler, @@ -10,25 +5,31 @@ import type { RefObject, } from 'react'; +import { Input } from '@/shared/ui/Input'; + +import type { IncomeList } from '../../../types'; + +import classes from './EditIncomeListForm.module.css'; + +export type EditExpensesListFormProps = BaseFormProps & { + disabled?: boolean; + list: IncomeList; + onSubmit: (data: EditIncomeListFormValues) => Promise | void; + ref?: RefObject; +}; + export type EditIncomeListFormValues = { title: string; }; type BaseFormProps = Omit, 'onSubmit'>; -export type EditExpensesListFormProps = BaseFormProps & { - disabled?: boolean; - onSubmit: (data: EditIncomeListFormValues) => Promise | void; - ref?: RefObject; - list: IncomeList; -}; - const EditExpensesListForm: FC = (props) => { const { - ref, disabled, - onSubmit, list, + onSubmit, + ref, ...restProps } = props; @@ -46,9 +47,9 @@ const EditExpensesListForm: FC = (props) => { return (

Редактировать список доходов

diff --git a/frontend/src/features/auth/LogoutButton/ui/LogoutButton.ui.tsx b/frontend/src/features/auth/LogoutButton/ui/LogoutButton.ui.tsx index 088ebd6..d4bd9d4 100644 --- a/frontend/src/features/auth/LogoutButton/ui/LogoutButton.ui.tsx +++ b/frontend/src/features/auth/LogoutButton/ui/LogoutButton.ui.tsx @@ -1,7 +1,7 @@ import { useLogout } from '@/entity/account'; const LogoutButton = () => { - const { mutate: logout, isPending } = useLogout(); + const { isPending, mutate: logout } = useLogout(); const onClickHandler = () => { logout(); @@ -10,8 +10,8 @@ const LogoutButton = () => { return ( diff --git a/frontend/src/features/bank-cards/AddBankCardButton/hooks/useAddBankCardButton.ts b/frontend/src/features/bank-cards/AddBankCardButton/hooks/useAddBankCardButton.ts index 0ed457b..6f8c7ec 100644 --- a/frontend/src/features/bank-cards/AddBankCardButton/hooks/useAddBankCardButton.ts +++ b/frontend/src/features/bank-cards/AddBankCardButton/hooks/useAddBankCardButton.ts @@ -1,9 +1,9 @@ import { type MouseEventHandler, useState } from 'react'; -import { useAddBankCard } from '@/entity/cards'; - import type { AddBankCardFormValues } from '@/entity/cards'; +import { useAddBankCard } from '@/entity/cards'; + type UseAddBankCardButtonArgs = { onClick?: MouseEventHandler; }; @@ -12,7 +12,7 @@ export const useAddBankCardButton = (args: UseAddBankCardButtonArgs) => { const { onClick } = args; const [isOpen, setIsOpen] = useState(false); - const { mutateAsync: addBankCardMutation, isPending } = useAddBankCard(); + const { isPending, mutateAsync: addBankCardMutation } = useAddBankCard(); const onCloseModalHandler = () => { setIsOpen(false); @@ -31,8 +31,8 @@ export const useAddBankCardButton = (args: UseAddBankCardButtonArgs) => { return { isOpen, isPending, - onCloseModalHandler, onClickHandler, + onCloseModalHandler, onFormSubmitHandler, }; }; diff --git a/frontend/src/features/bank-cards/AddBankCardButton/ui/AddBankCardButton.test.tsx b/frontend/src/features/bank-cards/AddBankCardButton/ui/AddBankCardButton.test.tsx index 50f2270..bac6cd6 100644 --- a/frontend/src/features/bank-cards/AddBankCardButton/ui/AddBankCardButton.test.tsx +++ b/frontend/src/features/bank-cards/AddBankCardButton/ui/AddBankCardButton.test.tsx @@ -1,14 +1,13 @@ +import { server } from '@mocks/jest/server'; +import { createReactQueryWrapper } from '@mocks/jest/wrappers'; import { render, screen, within } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import { http, HttpResponse } from 'msw'; -import { server } from '@mocks/jest/server'; -import { createReactQueryWrapper } from '@mocks/jest/wrappers'; +import type { AddBankCardBody, AddBankCardResponse } from '@/entity/cards'; import AddBankCardButton from './AddBankCardButton.ui'; -import type { AddBankCardBody, AddBankCardResponse } from '@/entity/cards'; - const renderButton = () => { render( , @@ -44,11 +43,11 @@ const submitHandler = (requestSpy: jest.Mock) => http.post & { ref?: Ref; }; const AddBankCardButton: FC = (props) => { - const { ref, onClick, ...restProps } = props; + const { onClick, ref, ...restProps } = props; const { isOpen, isPending, - onCloseModalHandler, onClickHandler, + onCloseModalHandler, onFormSubmitHandler, } = useAddBankCardButton({ onClick }); return ( <> - + diff --git a/frontend/src/features/bank-cards/DeleteBankCardButton/hooks/useDeleteBankCardButton.ts b/frontend/src/features/bank-cards/DeleteBankCardButton/hooks/useDeleteBankCardButton.ts index 42aefee..68773cd 100644 --- a/frontend/src/features/bank-cards/DeleteBankCardButton/hooks/useDeleteBankCardButton.ts +++ b/frontend/src/features/bank-cards/DeleteBankCardButton/hooks/useDeleteBankCardButton.ts @@ -1,9 +1,9 @@ import { useState } from 'react'; -import { useDeleteBankCard } from '@/entity/cards'; - import type { BankCard } from '@/entity/cards'; +import { useDeleteBankCard } from '@/entity/cards'; + type UseDeleteBankCardButtonArgs = { id: BankCard['id']; }; @@ -12,7 +12,7 @@ export const useDeleteBankCardButton = (args: UseDeleteBankCardButtonArgs) => { const { id } = args; const [isOpen, setIsOpen] = useState(false); - const { mutateAsync: deleteBankCardAsync, isPending } = useDeleteBankCard(); + const { isPending, mutateAsync: deleteBankCardAsync } = useDeleteBankCard(); const onClickHandler = () => { setIsOpen(true); diff --git a/frontend/src/features/bank-cards/DeleteBankCardButton/ui/DeleteBankCardButton.test.tsx b/frontend/src/features/bank-cards/DeleteBankCardButton/ui/DeleteBankCardButton.test.tsx index 4d97d15..ef02a95 100644 --- a/frontend/src/features/bank-cards/DeleteBankCardButton/ui/DeleteBankCardButton.test.tsx +++ b/frontend/src/features/bank-cards/DeleteBankCardButton/ui/DeleteBankCardButton.test.tsx @@ -1,21 +1,20 @@ +import { server } from '@mocks/jest/server'; +import { createReactQueryWrapper } from '@mocks/jest/wrappers'; import { render, screen, within } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import { http, HttpResponse } from 'msw'; -import { server } from '@mocks/jest/server'; -import { createReactQueryWrapper } from '@mocks/jest/wrappers'; - -import DeleteBankCardButton from './DeleteBankCardButton.ui'; - import type { BankCard } from '@/entity/cards'; import type { DeleteExpenseListPath } from '@/entity/expenses/list'; +import DeleteBankCardButton from './DeleteBankCardButton.ui'; + const deletingBankCard: BankCard = { + balance: 1000, + createdAt: '2025-08-29T07:57:40.503Z', id: 'af6da4e1-f24f-4b43-8556-fa885626897d', name: 'Тестовая карта', - balance: 1000, updatedAt: '2025-08-29T07:57:40.503Z', - createdAt: '2025-08-29T07:57:40.503Z', }; const renderButton = () => { diff --git a/frontend/src/features/bank-cards/DeleteBankCardButton/ui/DeleteBankCardButton.ui.tsx b/frontend/src/features/bank-cards/DeleteBankCardButton/ui/DeleteBankCardButton.ui.tsx index cc66fe4..5c813f8 100644 --- a/frontend/src/features/bank-cards/DeleteBankCardButton/ui/DeleteBankCardButton.ui.tsx +++ b/frontend/src/features/bank-cards/DeleteBankCardButton/ui/DeleteBankCardButton.ui.tsx @@ -1,11 +1,12 @@ +import type { ButtonHTMLAttributes, FC, Ref } from 'react'; + +import type { BankCard } from '@/entity/cards'; + import { DeleteBankCardForm } from '@/entity/cards'; import { Modal } from '@/shared/ui/Modal'; import { useDeleteBankCardButton } from '../hooks/useDeleteBankCardButton'; -import type { BankCard } from '@/entity/cards'; -import type { ButtonHTMLAttributes, FC, Ref } from 'react'; - export type DeleteBankCardButtonProps = ButtonHTMLAttributes & { bankCard: BankCard; ref?: Ref; @@ -14,26 +15,26 @@ export type DeleteBankCardButtonProps = ButtonHTMLAttributes const DeleteBankCardButton: FC = (props) => { const { bankCard, - ref, onClick, + ref, ...restProps } = props; const { isOpen, isPending, - onCloseModalHandler, onClickHandler, + onCloseModalHandler, onFormSubmitHandler, } = useDeleteBankCardButton({ id: bankCard.id }); return ( <> - - + { const { bankCard } = args; const [isOpen, setIsOpen] = useState(false); - const { mutateAsync: editBankCardAsync, isPending } = useEditBankCard(); + const { isPending, mutateAsync: editBankCardAsync } = useEditBankCard(); const onClickHandler = () => { setIsOpen(true); diff --git a/frontend/src/features/bank-cards/EditBankCardButton/ui/EditBankCardButton.test.tsx b/frontend/src/features/bank-cards/EditBankCardButton/ui/EditBankCardButton.test.tsx index cfcd72b..f2b2790 100644 --- a/frontend/src/features/bank-cards/EditBankCardButton/ui/EditBankCardButton.test.tsx +++ b/frontend/src/features/bank-cards/EditBankCardButton/ui/EditBankCardButton.test.tsx @@ -1,12 +1,9 @@ +import { server } from '@mocks/jest/server'; +import { createReactQueryWrapper } from '@mocks/jest/wrappers'; import { render, screen, within } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import { http, HttpResponse } from 'msw'; -import { server } from '@mocks/jest/server'; -import { createReactQueryWrapper } from '@mocks/jest/wrappers'; - -import EditBankCardButton from './EditBankCardButton.ui'; - import type { BankCard, EditBankCardBody, @@ -14,12 +11,14 @@ import type { EditBankCardResponse, } from '@/entity/cards'; +import EditBankCardButton from './EditBankCardButton.ui'; + const editingBankCard: BankCard = { + balance: 1000, + createdAt: '2025-08-29T07:57:40.503Z', id: 'af6da4e1-f24f-4b43-8556-fa885626897d', name: 'Тестовая карта', - balance: 1000, updatedAt: '2025-08-29T07:57:40.503Z', - createdAt: '2025-08-29T07:57:40.503Z', }; const fillForm = async (data: EditBankCardBody) => { @@ -64,11 +63,11 @@ const submitHandler = (requestSpy: jest.Mock) => http.patch & { bankCard: BankCard; ref?: Ref; @@ -13,26 +14,26 @@ export type EditBankCardButtonProps = ButtonHTMLAttributes & const EditBankCardButton: FC = (props) => { const { bankCard, - ref, onClick, + ref, ...restProps } = props; const { isOpen, isPending, - onCloseModalHandler, onClickHandler, + onCloseModalHandler, onFormSubmitHandler, } = useEditBankCardButton({ bankCard }); return ( <> - - + ; }; @@ -12,7 +12,7 @@ export const useAddCashButton = (args: UseAddCashButtonArgs) => { const { onClick } = args; const [isOpen, setIsOpen] = useState(false); - const { mutateAsync: addCashMutation, isPending } = useAddCash(); + const { isPending, mutateAsync: addCashMutation } = useAddCash(); const onCloseModalHandler = () => { setIsOpen(false); @@ -31,8 +31,8 @@ export const useAddCashButton = (args: UseAddCashButtonArgs) => { return { isOpen, isPending, - onCloseModalHandler, onClickHandler, + onCloseModalHandler, onFormSubmitHandler, }; }; diff --git a/frontend/src/features/cash/AddCashButton/ui/AddCashButton.test.tsx b/frontend/src/features/cash/AddCashButton/ui/AddCashButton.test.tsx index 7d8b912..8cf7c31 100644 --- a/frontend/src/features/cash/AddCashButton/ui/AddCashButton.test.tsx +++ b/frontend/src/features/cash/AddCashButton/ui/AddCashButton.test.tsx @@ -1,14 +1,13 @@ +import { server } from '@mocks/jest/server'; +import { createReactQueryWrapper } from '@mocks/jest/wrappers'; import { render, screen, within } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import { http, HttpResponse } from 'msw'; -import { server } from '@mocks/jest/server'; -import { createReactQueryWrapper } from '@mocks/jest/wrappers'; +import type { AdCashResponse, AddCashBody } from '@/entity/cash'; import AddCashButton from './AddCashButton.ui'; -import type { AddCashBody, AdCashResponse } from '@/entity/cash'; - const renderButton = () => { render( , @@ -44,11 +43,11 @@ const submitHandler = (requestSpy: jest.Mock) => http.post & { ref?: Ref; }; const AddCashButton: FC = (props) => { - const { ref, onClick, ...restProps } = props; + const { onClick, ref, ...restProps } = props; const { isOpen, isPending, - onCloseModalHandler, onClickHandler, + onCloseModalHandler, onFormSubmitHandler, } = useAddCashButton({ onClick }); return ( <> - + diff --git a/frontend/src/features/cash/DeleteCashButton/hooks/useDeleteCashButton.ts b/frontend/src/features/cash/DeleteCashButton/hooks/useDeleteCashButton.ts index 04837aa..86502ef 100644 --- a/frontend/src/features/cash/DeleteCashButton/hooks/useDeleteCashButton.ts +++ b/frontend/src/features/cash/DeleteCashButton/hooks/useDeleteCashButton.ts @@ -1,9 +1,9 @@ import { useState } from 'react'; -import { useDeleteCash } from '@/entity/cash'; - import type { CashItem } from '@/entity/cash'; +import { useDeleteCash } from '@/entity/cash'; + type UseDeleteCashButtonArgs = { id: CashItem['id']; }; @@ -12,7 +12,7 @@ export const useDeleteCashButton = (args: UseDeleteCashButtonArgs) => { const { id } = args; const [isOpen, setIsOpen] = useState(false); - const { mutateAsync: deleteCashAsync, isPending } = useDeleteCash(); + const { isPending, mutateAsync: deleteCashAsync } = useDeleteCash(); const onClickHandler = () => { setIsOpen(true); diff --git a/frontend/src/features/cash/DeleteCashButton/ui/DeleteCashButton.test.tsx b/frontend/src/features/cash/DeleteCashButton/ui/DeleteCashButton.test.tsx index 14ff6c4..1e8d176 100644 --- a/frontend/src/features/cash/DeleteCashButton/ui/DeleteCashButton.test.tsx +++ b/frontend/src/features/cash/DeleteCashButton/ui/DeleteCashButton.test.tsx @@ -1,21 +1,20 @@ +import { server } from '@mocks/jest/server'; +import { createReactQueryWrapper } from '@mocks/jest/wrappers'; import { render, screen, within } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import { http, HttpResponse } from 'msw'; -import { server } from '@mocks/jest/server'; -import { createReactQueryWrapper } from '@mocks/jest/wrappers'; - -import DeleteCashButton from './DeleteCashButton.ui'; - import type { CashItem } from '@/entity/cash'; import type { DeleteExpenseListPath } from '@/entity/expenses/list'; +import DeleteCashButton from './DeleteCashButton.ui'; + const deletingCash: CashItem = { + balance: 1000, + createdAt: '2025-08-29T07:57:40.503Z', id: 'af6da4e1-f24f-4b43-8556-fa885626897d', name: 'Наличные', - balance: 1000, updatedAt: '2025-08-29T07:57:40.503Z', - createdAt: '2025-08-29T07:57:40.503Z', }; const renderButton = () => { diff --git a/frontend/src/features/cash/DeleteCashButton/ui/DeleteCashButton.ui.tsx b/frontend/src/features/cash/DeleteCashButton/ui/DeleteCashButton.ui.tsx index 63eb8ff..612bd11 100644 --- a/frontend/src/features/cash/DeleteCashButton/ui/DeleteCashButton.ui.tsx +++ b/frontend/src/features/cash/DeleteCashButton/ui/DeleteCashButton.ui.tsx @@ -1,11 +1,12 @@ +import type { ButtonHTMLAttributes, FC, Ref } from 'react'; + +import type { CashItem } from '@/entity/cash'; + import { DeleteCashForm } from '@/entity/cash'; import { Modal } from '@/shared/ui/Modal'; import { useDeleteCashButton } from '../hooks/useDeleteCashButton'; -import type { CashItem } from '@/entity/cash'; -import type { ButtonHTMLAttributes, FC, Ref } from 'react'; - export type DeleteCashButtonProps = ButtonHTMLAttributes & { cash: CashItem; ref?: Ref; @@ -14,26 +15,26 @@ export type DeleteCashButtonProps = ButtonHTMLAttributes & { const DeleteCashButton: FC = (props) => { const { cash, - ref, onClick, + ref, ...restProps } = props; const { isOpen, isPending, - onCloseModalHandler, onClickHandler, + onCloseModalHandler, onFormSubmitHandler, } = useDeleteCashButton({ id: cash.id }); return ( <> - - + { const { cash } = args; const [isOpen, setIsOpen] = useState(false); - const { mutateAsync: editCashAsync, isPending } = useEditCash(); + const { isPending, mutateAsync: editCashAsync } = useEditCash(); const onClickHandler = () => { setIsOpen(true); diff --git a/frontend/src/features/cash/EditCashButton/ui/EditCashButton.test.tsx b/frontend/src/features/cash/EditCashButton/ui/EditCashButton.test.tsx index 4b8c85c..902a971 100644 --- a/frontend/src/features/cash/EditCashButton/ui/EditCashButton.test.tsx +++ b/frontend/src/features/cash/EditCashButton/ui/EditCashButton.test.tsx @@ -1,25 +1,24 @@ +import { server } from '@mocks/jest/server'; +import { createReactQueryWrapper } from '@mocks/jest/wrappers'; import { render, screen, within } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import { http, HttpResponse } from 'msw'; -import { server } from '@mocks/jest/server'; -import { createReactQueryWrapper } from '@mocks/jest/wrappers'; - -import EditCashButton from './EditCashButton.ui'; - import type { + CashItem, EditCashBody, EditCashPath, EditCashResponse, - CashItem, } from '@/entity/cash'; +import EditCashButton from './EditCashButton.ui'; + const editingCash: CashItem = { + balance: 1000, + createdAt: '2025-08-29T07:57:40.503Z', id: 'af6da4e1-f24f-4b43-8556-fa885626897d', name: 'Наличные', - balance: 1000, updatedAt: '2025-08-29T07:57:40.503Z', - createdAt: '2025-08-29T07:57:40.503Z', }; const fillForm = async (data: EditCashBody) => { @@ -64,11 +63,11 @@ const submitHandler = (requestSpy: jest.Mock) => http.patch & { cash: CashItem; ref?: Ref; @@ -13,26 +14,26 @@ export type EditCashButtonProps = ButtonHTMLAttributes & { const EditCashButton: FC = (props) => { const { cash, - ref, onClick, + ref, ...restProps } = props; const { isOpen, isPending, - onCloseModalHandler, onClickHandler, + onCloseModalHandler, onFormSubmitHandler, } = useEditCashButton({ cash }); return ( <> - - + { const { listId, onClick } = args; const [isOpen, setIsOpen] = useState(false); - const { mutateAsync: addExpenseItemMutation, isPending } = useAddExpenseItem({ id: listId }); + const { isPending, mutateAsync: addExpenseItemMutation } = useAddExpenseItem({ id: listId }); const onCloseModalHandler = () => { setIsOpen(false); }; @@ -33,9 +34,9 @@ export const useAddExpenseItemButton = (args: UseAddExpenseItemButtonArgs) => { return { isOpen, - onFormSubmitHandler, - onCloseModalHandler, isPending, onClickHandler, + onCloseModalHandler, + onFormSubmitHandler, }; }; diff --git a/frontend/src/features/expenses/items/AddExpenseItemButton/ui/AddExpenseItemButton.test.tsx b/frontend/src/features/expenses/items/AddExpenseItemButton/ui/AddExpenseItemButton.test.tsx index ba0407e..163497d 100644 --- a/frontend/src/features/expenses/items/AddExpenseItemButton/ui/AddExpenseItemButton.test.tsx +++ b/frontend/src/features/expenses/items/AddExpenseItemButton/ui/AddExpenseItemButton.test.tsx @@ -1,14 +1,13 @@ +import { server } from '@mocks/jest/server'; +import { createReactQueryWrapper } from '@mocks/jest/wrappers'; import { render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import { http, HttpResponse } from 'msw'; -import { server } from '@mocks/jest/server'; -import { createReactQueryWrapper } from '@mocks/jest/wrappers'; +import type { AddExpenseItemBody, AddExpenseItemPath, AddExpenseItemSuccessResponse } from '@/entity/expenses/item'; import AddExpenseItemButton from './AddExpenseItemButton.ui'; -import type { AddExpenseItemBody, AddExpenseItemPath, AddExpenseItemSuccessResponse } from '@/entity/expenses/item'; - const renderButton = () => { render( , @@ -32,7 +31,7 @@ const openModal = async () => { }; }; -const fillForm = async (data: { title: string; description: string; date: string; amount: string; count: string }) => { +const fillForm = async (data: { amount: string; count: string; date: string; description: string; title: string }) => { await userEvent.type(screen.getByLabelText('Название'), data.title); await userEvent.type(screen.getByLabelText('Описание'), data.description); await userEvent.type(screen.getByLabelText('Дата'), data.date); @@ -51,16 +50,16 @@ const submitHandler = (requestSpy: jest.Mock) => http.post< requestSpy(body); return HttpResponse.json({ - id: '51a44dc0-597b-49b9-85bb-e0bcd42db3f6', - title: 'Mock item', amount: 12, count: 12, - updatedAt: '2025-08-29T07:57:40.503Z', - expenseListId: '10cc093c-3875-4d33-a40a-df526266e262', createdAt: '2025-08-29T07:57:40.503Z', currency: 'RUB', date: '2025-08-22T00:00:03.000Z', description: 'Mock description', + expenseListId: '10cc093c-3875-4d33-a40a-df526266e262', + id: '51a44dc0-597b-49b9-85bb-e0bcd42db3f6', + title: 'Mock item', + updatedAt: '2025-08-29T07:57:40.503Z', }); }, ); @@ -96,11 +95,11 @@ describe('Test AddExpenseItemButton', () => { submitButtonElem = screen.getByText('Добавить'); await fillForm({ - title: 'Название элемента', - description: 'Описание элемента', - date: '2025-08-29', amount: '12', count: '1', + date: '2025-08-29', + description: 'Описание элемента', + title: 'Название элемента', }); }); @@ -108,12 +107,12 @@ describe('Test AddExpenseItemButton', () => { await userEvent.click(submitButtonElem); expect(requestSpy).toHaveBeenCalledTimes(1); expect(requestSpy).toHaveBeenCalledWith({ - title: 'Название элемента', - description: 'Описание элемента', - date: '2025-08-29T00:00:00.000Z', amount: 12, count: 1, currency: 'RUB', + date: '2025-08-29T00:00:00.000Z', + description: 'Описание элемента', + title: 'Название элемента', }); }); diff --git a/frontend/src/features/expenses/items/AddExpenseItemButton/ui/AddExpenseItemButton.ui.tsx b/frontend/src/features/expenses/items/AddExpenseItemButton/ui/AddExpenseItemButton.ui.tsx index c36c87c..66f78ca 100644 --- a/frontend/src/features/expenses/items/AddExpenseItemButton/ui/AddExpenseItemButton.ui.tsx +++ b/frontend/src/features/expenses/items/AddExpenseItemButton/ui/AddExpenseItemButton.ui.tsx @@ -1,23 +1,24 @@ +import type { ButtonHTMLAttributes, FC, RefObject } from 'react'; + +import type { ExpenseList } from '@/entity/expenses/list'; + import { AddExpenseItemForm } from '@/entity/expenses/item'; import { Modal } from '@/shared/ui/Modal'; import { useAddExpenseItemButton } from '../hooks/useAddExpenseItemButton'; -import type { ExpenseList } from '@/entity/expenses/list'; -import type { ButtonHTMLAttributes, FC, RefObject } from 'react'; - -type BaseButtonProps = ButtonHTMLAttributes; - type AddExpenseItemButtonProps = BaseButtonProps & { listId: ExpenseList['id']; ref?: RefObject; }; +type BaseButtonProps = ButtonHTMLAttributes; + const AddExpenseItemButton: FC = (props) => { const { listId, - ref, onClick, + ref, ...buttonProps } = props; @@ -32,15 +33,15 @@ const AddExpenseItemButton: FC = (props) => { return ( <> - + diff --git a/frontend/src/features/expenses/items/DeleteExpenseItemButton/hooks/useDeleteExpenseItemButton.ts b/frontend/src/features/expenses/items/DeleteExpenseItemButton/hooks/useDeleteExpenseItemButton.ts index 1bcb78f..0b730c8 100644 --- a/frontend/src/features/expenses/items/DeleteExpenseItemButton/hooks/useDeleteExpenseItemButton.ts +++ b/frontend/src/features/expenses/items/DeleteExpenseItemButton/hooks/useDeleteExpenseItemButton.ts @@ -1,9 +1,9 @@ +import type { MouseEventHandler } from 'react'; + import { useState } from 'react'; import { type ExpenseListItem, useDeleteExpenseItem } from '@/entity/expenses/item'; -import type { MouseEventHandler } from 'react'; - type UseDeleteExpenseItemButtonArgs = { item: ExpenseListItem; onClick?: MouseEventHandler; @@ -21,9 +21,9 @@ export const useDeleteExpenseItemButton = (args: UseDeleteExpenseItemButtonArgs) onClick?.(event); }; - const { mutateAsync: deleteExpenseItemMutation, isPending } = useDeleteExpenseItem({ - listId: item.expenseListId, + const { isPending, mutateAsync: deleteExpenseItemMutation } = useDeleteExpenseItem({ id: item.id, + listId: item.expenseListId, }); const onFormSubmitHandler = async () => { @@ -33,9 +33,9 @@ export const useDeleteExpenseItemButton = (args: UseDeleteExpenseItemButtonArgs) return { isOpen, - onCloseModalHandler, - onClickHandler, isPending, + onClickHandler, + onCloseModalHandler, onFormSubmitHandler, }; }; diff --git a/frontend/src/features/expenses/items/DeleteExpenseItemButton/ui/DeleteExpenseItemButton.test.tsx b/frontend/src/features/expenses/items/DeleteExpenseItemButton/ui/DeleteExpenseItemButton.test.tsx index 0fa2f40..04325cd 100644 --- a/frontend/src/features/expenses/items/DeleteExpenseItemButton/ui/DeleteExpenseItemButton.test.tsx +++ b/frontend/src/features/expenses/items/DeleteExpenseItemButton/ui/DeleteExpenseItemButton.test.tsx @@ -1,25 +1,24 @@ +import { server } from '@mocks/jest/server'; +import { createReactQueryWrapper } from '@mocks/jest/wrappers'; import { render, screen, within } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import { http, HttpResponse } from 'msw'; -import { server } from '@mocks/jest/server'; -import { createReactQueryWrapper } from '@mocks/jest/wrappers'; +import type { DeleteExpenseItemPath } from '@/entity/expenses/item'; import DeleteExpenseItemButton from './DeleteExpenseItemButton.ui'; -import type { DeleteExpenseItemPath } from '@/entity/expenses/item'; - const deletedItem = { - id: '51a44dc0-597b-49b9-85bb-e0bcd42db3f6', - title: 'Mock item', amount: 12, count: 12, - updatedAt: '2025-08-29T07:57:40.503Z', - expenseListId: '10cc093c-3875-4d33-a40a-df526266e262', createdAt: '2025-08-29T07:57:40.503Z', currency: 'RUB', date: '2025-08-22T00:00:03.000Z', description: 'Mock description', + expenseListId: '10cc093c-3875-4d33-a40a-df526266e262', + id: '51a44dc0-597b-49b9-85bb-e0bcd42db3f6', + title: 'Mock item', + updatedAt: '2025-08-29T07:57:40.503Z', }; const renderButton = () => { diff --git a/frontend/src/features/expenses/items/DeleteExpenseItemButton/ui/DeleteExpenseItemButton.ui.tsx b/frontend/src/features/expenses/items/DeleteExpenseItemButton/ui/DeleteExpenseItemButton.ui.tsx index 3421aa7..bb6813a 100644 --- a/frontend/src/features/expenses/items/DeleteExpenseItemButton/ui/DeleteExpenseItemButton.ui.tsx +++ b/frontend/src/features/expenses/items/DeleteExpenseItemButton/ui/DeleteExpenseItemButton.ui.tsx @@ -1,11 +1,12 @@ +import type { ButtonHTMLAttributes, FC, RefObject } from 'react'; + +import type { ExpenseListItem } from '@/entity/expenses/item'; + import { DeleteExpenseItemForm } from '@/entity/expenses/item'; import { Modal } from '@/shared/ui/Modal'; import { useDeleteExpenseItemButton } from '../hooks/useDeleteExpenseItemButton'; -import type { ExpenseListItem } from '@/entity/expenses/item'; -import type { ButtonHTMLAttributes, FC, RefObject } from 'react'; - type BaseButtonProps = ButtonHTMLAttributes; type DeleteExpenseItemButtonProps = BaseButtonProps & { @@ -15,30 +16,30 @@ type DeleteExpenseItemButtonProps = BaseButtonProps & { const DeleteExpenseItemButton: FC = (props) => { const { item, - ref, onClick, + ref, ...restProps } = props; const { isOpen, - onCloseModalHandler, - onClickHandler, isPending, + onClickHandler, + onCloseModalHandler, onFormSubmitHandler, } = useDeleteExpenseItemButton({ item, onClick }); return ( <> - + diff --git a/frontend/src/features/expenses/items/EditExpenseItemButton/hooks/useEditExpenseItemButton.ts b/frontend/src/features/expenses/items/EditExpenseItemButton/hooks/useEditExpenseItemButton.ts index bcc10a9..c3f23cf 100644 --- a/frontend/src/features/expenses/items/EditExpenseItemButton/hooks/useEditExpenseItemButton.ts +++ b/frontend/src/features/expenses/items/EditExpenseItemButton/hooks/useEditExpenseItemButton.ts @@ -1,8 +1,8 @@ +import type { MouseEventHandler } from 'react'; + import { useState } from 'react'; -import { type ExpenseListItem, useEditExpenseItem, type EditExpenseItemFormValues } from '@/entity/expenses/item'; - -import type { MouseEventHandler } from 'react'; +import { type EditExpenseItemFormValues, type ExpenseListItem, useEditExpenseItem } from '@/entity/expenses/item'; type UseAddExpenseItemButtonArgs = { item: ExpenseListItem; @@ -13,7 +13,7 @@ export const useEditExpenseItemButton = (args: UseAddExpenseItemButtonArgs) => { const { item, onClick } = args; const [isOpen, setIsOpen] = useState(false); - const { mutateAsync: editExpenseItemMutation, isPending } = useEditExpenseItem({ + const { isPending, mutateAsync: editExpenseItemMutation } = useEditExpenseItem({ id: item.id, listId: item.expenseListId, }); @@ -34,9 +34,9 @@ export const useEditExpenseItemButton = (args: UseAddExpenseItemButtonArgs) => { return { isOpen, - onFormSubmitHandler, - onCloseModalHandler, isPending, onClickHandler, + onCloseModalHandler, + onFormSubmitHandler, }; }; diff --git a/frontend/src/features/expenses/items/EditExpenseItemButton/ui/EditExpenseItemButton.test.tsx b/frontend/src/features/expenses/items/EditExpenseItemButton/ui/EditExpenseItemButton.test.tsx index 03366e2..110817e 100644 --- a/frontend/src/features/expenses/items/EditExpenseItemButton/ui/EditExpenseItemButton.test.tsx +++ b/frontend/src/features/expenses/items/EditExpenseItemButton/ui/EditExpenseItemButton.test.tsx @@ -1,29 +1,28 @@ +import { server } from '@mocks/jest/server'; +import { createReactQueryWrapper } from '@mocks/jest/wrappers'; import { render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import { http, HttpResponse } from 'msw'; -import { server } from '@mocks/jest/server'; -import { createReactQueryWrapper } from '@mocks/jest/wrappers'; - -import EditExpenseItemButton from './EditExpenseItemButton.ui'; - import type { EditExpenseItemBody, EditExpenseItemPath, EditExpenseItemSuccessResponse, } from '@/entity/expenses/item'; +import EditExpenseItemButton from './EditExpenseItemButton.ui'; + const editingItem = { - id: '51a44dc0-597b-49b9-85bb-e0bcd42db3f6', - title: 'Mock item', amount: 12, count: 12, - updatedAt: '2025-08-29T07:57:40.503Z', - expenseListId: '10cc093c-3875-4d33-a40a-df526266e262', createdAt: '2025-08-29T07:57:40.503Z', currency: 'RUB', date: '2025-08-22T00:00:03.000Z', description: 'Mock description', + expenseListId: '10cc093c-3875-4d33-a40a-df526266e262', + id: '51a44dc0-597b-49b9-85bb-e0bcd42db3f6', + title: 'Mock item', + updatedAt: '2025-08-29T07:57:40.503Z', }; const renderButton = () => { @@ -63,7 +62,7 @@ const submitHandler = (requestSpy: jest.Mock) => http.patch< }, ); -const fillForm = async (data: { title: string; description: string; date: string; amount: string; count: string }) => { +const fillForm = async (data: { amount: string; count: string; date: string; description: string; title: string }) => { const titleInputElem = screen.getByLabelText('Название'); await userEvent.clear(titleInputElem); await userEvent.type(titleInputElem, data.title); @@ -116,11 +115,11 @@ describe('TestEditExpenseItemButton', () => { submitButtonElem = screen.getByText('Сохранить'); await fillForm({ - title: 'Название элемента', - description: 'Описание элемента', - date: '2025-08-29', amount: '12', count: '1', + date: '2025-08-29', + description: 'Описание элемента', + title: 'Название элемента', }); }); @@ -128,12 +127,12 @@ describe('TestEditExpenseItemButton', () => { await userEvent.click(submitButtonElem); expect(requestSpy).toHaveBeenCalledTimes(1); expect(requestSpy).toHaveBeenCalledWith({ - title: 'Название элемента', - description: 'Описание элемента', - date: '2025-08-29T00:00:00.000Z', amount: 12, count: 1, currency: 'RUB', + date: '2025-08-29T00:00:00.000Z', + description: 'Описание элемента', + title: 'Название элемента', }); }); diff --git a/frontend/src/features/expenses/items/EditExpenseItemButton/ui/EditExpenseItemButton.ui.tsx b/frontend/src/features/expenses/items/EditExpenseItemButton/ui/EditExpenseItemButton.ui.tsx index 53cfb1f..a8c485f 100644 --- a/frontend/src/features/expenses/items/EditExpenseItemButton/ui/EditExpenseItemButton.ui.tsx +++ b/frontend/src/features/expenses/items/EditExpenseItemButton/ui/EditExpenseItemButton.ui.tsx @@ -1,11 +1,12 @@ +import type { ButtonHTMLAttributes, FC, RefObject } from 'react'; + +import type { ExpenseListItem } from '@/entity/expenses/item'; + import { EditExpenseItemForm } from '@/entity/expenses/item'; import { Modal } from '@/shared/ui/Modal'; import { useEditExpenseItemButton } from '../hooks/useEditExpenseItemButton'; -import type { ExpenseListItem } from '@/entity/expenses/item'; -import type { ButtonHTMLAttributes, FC, RefObject } from 'react'; - type BaseButtonProps = ButtonHTMLAttributes; type EditExpenseItemButtonProps = BaseButtonProps & { @@ -15,33 +16,33 @@ type EditExpenseItemButtonProps = BaseButtonProps & { const EditExpenseItemButton: FC = (props) => { const { - ref, item, onClick, + ref, ...restProps } = props; const { isOpen, - onCloseModalHandler, - onClickHandler, isPending, + onClickHandler, + onCloseModalHandler, onFormSubmitHandler, } = useEditExpenseItemButton({ item, onClick }); return ( <> - + diff --git a/frontend/src/features/expenses/list/AddExpensesListButton/hooks/useAddExpensesListButton.ts b/frontend/src/features/expenses/list/AddExpensesListButton/hooks/useAddExpensesListButton.ts index 77a9445..91d1ce0 100644 --- a/frontend/src/features/expenses/list/AddExpensesListButton/hooks/useAddExpensesListButton.ts +++ b/frontend/src/features/expenses/list/AddExpensesListButton/hooks/useAddExpensesListButton.ts @@ -1,9 +1,9 @@ import { type MouseEventHandler, useState } from 'react'; -import { useAddExpensesList } from '@/entity/expenses/list'; - import type { AddExpenseListFormValues } from '@/entity/expenses/list'; +import { useAddExpensesList } from '@/entity/expenses/list'; + type UseAddExpensesListButtonArgs = { onClick?: MouseEventHandler; }; @@ -12,7 +12,7 @@ export const useAddExpensesListButton = (args: UseAddExpensesListButtonArgs) => const { onClick } = args; const [isOpen, setIsOpen] = useState(false); - const { mutateAsync: addExpensesListMutation, isPending } = useAddExpensesList(); + const { isPending, mutateAsync: addExpensesListMutation } = useAddExpensesList(); const onCloseModalHandler = () => { setIsOpen(false); @@ -31,8 +31,8 @@ export const useAddExpensesListButton = (args: UseAddExpensesListButtonArgs) => return { isOpen, isPending, - onCloseModalHandler, onClickHandler, + onCloseModalHandler, onFormSubmitHandler, }; }; diff --git a/frontend/src/features/expenses/list/AddExpensesListButton/ui/AddExpensesListButton.test.tsx b/frontend/src/features/expenses/list/AddExpensesListButton/ui/AddExpensesListButton.test.tsx index 2e3d422..f6fa0f8 100644 --- a/frontend/src/features/expenses/list/AddExpensesListButton/ui/AddExpensesListButton.test.tsx +++ b/frontend/src/features/expenses/list/AddExpensesListButton/ui/AddExpensesListButton.test.tsx @@ -1,14 +1,13 @@ +import { server } from '@mocks/jest/server'; +import { createReactQueryWrapper } from '@mocks/jest/wrappers'; import { render, screen, within } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import { http, HttpResponse } from 'msw'; -import { server } from '@mocks/jest/server'; -import { createReactQueryWrapper } from '@mocks/jest/wrappers'; +import type { AddExpenseListBody, AddExpenseListSuccessResponse } from '@/entity/expenses/list'; import AddExpensesListButton from './AddExpensesListButton.ui'; -import type { AddExpenseListBody, AddExpenseListSuccessResponse } from '@/entity/expenses/list'; - const renderButton = () => { render( , @@ -43,11 +42,11 @@ const submitHandler = (requestSpy: jest.Mock) => http.post & { ref?: Ref; }; @@ -15,18 +15,18 @@ const AddExpensesListButton: FC = (props) => { const { isOpen, isPending, - onCloseModalHandler, onClickHandler, + onCloseModalHandler, onFormSubmitHandler, } = useAddExpensesListButton({ onClick }); return ( <> - - + diff --git a/frontend/src/features/expenses/list/DeleteExpensesListButton/hooks/useDeleteExpensesListButton.ts b/frontend/src/features/expenses/list/DeleteExpensesListButton/hooks/useDeleteExpensesListButton.ts index 6731847..9c26843 100644 --- a/frontend/src/features/expenses/list/DeleteExpensesListButton/hooks/useDeleteExpensesListButton.ts +++ b/frontend/src/features/expenses/list/DeleteExpensesListButton/hooks/useDeleteExpensesListButton.ts @@ -10,7 +10,7 @@ export const useDeleteExpensesListButton = (args: UseDeleteExpensesListButtonArg const { id } = args; const [isOpen, setIsOpen] = useState(false); - const { mutateAsync: deleteExpensesListAsync, isPending } = useDeleteExpensesList(); + const { isPending, mutateAsync: deleteExpensesListAsync } = useDeleteExpensesList(); const onClickHandler = () => { setIsOpen(true); diff --git a/frontend/src/features/expenses/list/DeleteExpensesListButton/ui/DeleteExpensesListButton.test.tsx b/frontend/src/features/expenses/list/DeleteExpensesListButton/ui/DeleteExpensesListButton.test.tsx index 33d4505..27e9f59 100644 --- a/frontend/src/features/expenses/list/DeleteExpensesListButton/ui/DeleteExpensesListButton.test.tsx +++ b/frontend/src/features/expenses/list/DeleteExpensesListButton/ui/DeleteExpensesListButton.test.tsx @@ -1,20 +1,19 @@ +import { server } from '@mocks/jest/server'; +import { createReactQueryWrapper } from '@mocks/jest/wrappers'; import { render, screen, within } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import { http, HttpResponse } from 'msw'; -import { server } from '@mocks/jest/server'; -import { createReactQueryWrapper } from '@mocks/jest/wrappers'; +import type { DeleteExpenseListPath } from '@/entity/expenses/list'; import DeleteExpensesListButton from './DeleteExpensesListButton.ui'; -import type { DeleteExpenseListPath } from '@/entity/expenses/list'; - const deletingList = { - id: '10cc093c-3875-4d33-a40a-df526266e262', - title: 'Mock list', - items: [], - updatedAt: '2025-08-29T07:57:40.503Z', createdAt: '2025-08-29T07:57:40.503Z', + id: '10cc093c-3875-4d33-a40a-df526266e262', + items: [], + title: 'Mock list', + updatedAt: '2025-08-29T07:57:40.503Z', }; const renderButton = () => { diff --git a/frontend/src/features/expenses/list/DeleteExpensesListButton/ui/DeleteExpensesListButton.ui.tsx b/frontend/src/features/expenses/list/DeleteExpensesListButton/ui/DeleteExpensesListButton.ui.tsx index c31a674..99e81d2 100644 --- a/frontend/src/features/expenses/list/DeleteExpensesListButton/ui/DeleteExpensesListButton.ui.tsx +++ b/frontend/src/features/expenses/list/DeleteExpensesListButton/ui/DeleteExpensesListButton.ui.tsx @@ -1,11 +1,12 @@ +import type { ButtonHTMLAttributes, Ref } from 'react'; + +import type { ExpenseList } from '@/entity/expenses/list'; + import { DeleteExpensesListForm } from '@/entity/expenses/list'; import { Modal } from '@/shared/ui/Modal'; import { useDeleteExpensesListButton } from '../hooks/useDeleteExpensesListButton'; -import type { ExpenseList } from '@/entity/expenses/list'; -import type { ButtonHTMLAttributes, Ref } from 'react'; - type DeleteExpensesListButtonProps = ButtonHTMLAttributes & { list: ExpenseList; ref?: Ref; @@ -17,18 +18,18 @@ const DeleteExpensesListButton = (props: DeleteExpensesListButtonProps) => { const { isOpen, isPending, - onCloseModalHandler, onClickHandler, + onCloseModalHandler, onFormSubmitHandler, } = useDeleteExpensesListButton({ id }); return ( <> - - + { setIsOpen(true); @@ -24,8 +24,8 @@ export const useEditExpensesListButton = (args: UseEditExpensesListButtonArgs) = const onFormSubmitHandler = async (data: EditExpenseListFormValues) => { await editExpensesListAsync({ - path: { id }, data, + path: { id }, }); setIsOpen(false); }; diff --git a/frontend/src/features/expenses/list/EditExpensesListButton/ui/EditExpensesListButton.test.tsx b/frontend/src/features/expenses/list/EditExpensesListButton/ui/EditExpensesListButton.test.tsx index 8e1dd99..2277c40 100644 --- a/frontend/src/features/expenses/list/EditExpensesListButton/ui/EditExpensesListButton.test.tsx +++ b/frontend/src/features/expenses/list/EditExpensesListButton/ui/EditExpensesListButton.test.tsx @@ -1,24 +1,23 @@ +import { server } from '@mocks/jest/server'; +import { createReactQueryWrapper } from '@mocks/jest/wrappers'; import { render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import { http, HttpResponse } from 'msw'; -import { server } from '@mocks/jest/server'; -import { createReactQueryWrapper } from '@mocks/jest/wrappers'; - -import EditExpensesListButton from './EditExpensesListButton.ui'; - import type { EditExpenseListBody, EditExpenseListPath, EditExpenseListSuccessResponse, } from '@/entity/expenses/list'; +import EditExpensesListButton from './EditExpensesListButton.ui'; + const editingList = { - id: '10cc093c-3875-4d33-a40a-df526266e262', - title: 'Mock list', - items: [], - updatedAt: '2025-08-29T07:57:40.503Z', createdAt: '2025-08-29T07:57:40.503Z', + id: '10cc093c-3875-4d33-a40a-df526266e262', + items: [], + title: 'Mock list', + updatedAt: '2025-08-29T07:57:40.503Z', }; const renderButton = () => { diff --git a/frontend/src/features/expenses/list/EditExpensesListButton/ui/EditExpensesListButton.ui.tsx b/frontend/src/features/expenses/list/EditExpensesListButton/ui/EditExpensesListButton.ui.tsx index 317e640..3686947 100644 --- a/frontend/src/features/expenses/list/EditExpensesListButton/ui/EditExpensesListButton.ui.tsx +++ b/frontend/src/features/expenses/list/EditExpensesListButton/ui/EditExpensesListButton.ui.tsx @@ -1,11 +1,12 @@ +import type { ButtonHTMLAttributes, FC, Ref } from 'react'; + +import type { ExpenseList } from '@/entity/expenses/list'; + import { EditExpensesListForm } from '@/entity/expenses/list'; import { Modal } from '@/shared/ui/Modal'; import { useEditExpensesListButton } from '../hooks/useEditExpensesListButton'; -import type { ExpenseList } from '@/entity/expenses/list'; -import type { ButtonHTMLAttributes, FC, Ref } from 'react'; - type EditExpensesListButtonProps = ButtonHTMLAttributes & { list: ExpenseList; ref?: Ref; @@ -17,18 +18,18 @@ const EditExpensesListButton: FC = (props) => { const { isOpen, isPending, - onCloseModalHandler, onClickHandler, + onCloseModalHandler, onFormSubmitHandler, } = useEditExpensesListButton({ id: list.id }); return ( <> - - + diff --git a/frontend/src/features/incomes/items/AddIncomeItemButton/hooks/useAddIncomeItemButton.ts b/frontend/src/features/incomes/items/AddIncomeItemButton/hooks/useAddIncomeItemButton.ts index 4ca1727..53367d8 100644 --- a/frontend/src/features/incomes/items/AddIncomeItemButton/hooks/useAddIncomeItemButton.ts +++ b/frontend/src/features/incomes/items/AddIncomeItemButton/hooks/useAddIncomeItemButton.ts @@ -1,10 +1,11 @@ -import { useState } from 'react'; +import type { ButtonHTMLAttributes, MouseEventHandler } from 'react'; -import { useAddIncomeItem } from '@/entity/incomes/item'; +import { useState } from 'react'; import type { AddIncomeItemFormValues } from '@/entity/incomes/item'; import type { IncomeList } from '@/entity/incomes/list'; -import type { ButtonHTMLAttributes, MouseEventHandler } from 'react'; + +import { useAddIncomeItem } from '@/entity/incomes/item'; type UseAddIncomeItemButtonArgs = { listId: IncomeList['id']; @@ -14,7 +15,7 @@ export const useAddIncomeItemButton = (args: UseAddIncomeItemButtonArgs) => { const { listId, onClick } = args; const [isOpen, setIsOpen] = useState(false); - const { mutateAsync: addIncomeItemMutation, isPending } = useAddIncomeItem({ id: listId }); + const { isPending, mutateAsync: addIncomeItemMutation } = useAddIncomeItem({ id: listId }); const onCloseModalHandler = () => { setIsOpen(false); }; @@ -33,9 +34,9 @@ export const useAddIncomeItemButton = (args: UseAddIncomeItemButtonArgs) => { return { isOpen, - onFormSubmitHandler, - onCloseModalHandler, isPending, onClickHandler, + onCloseModalHandler, + onFormSubmitHandler, }; }; diff --git a/frontend/src/features/incomes/items/AddIncomeItemButton/ui/AddIncomeItemButton.test.tsx b/frontend/src/features/incomes/items/AddIncomeItemButton/ui/AddIncomeItemButton.test.tsx index dfc9b35..315ada2 100644 --- a/frontend/src/features/incomes/items/AddIncomeItemButton/ui/AddIncomeItemButton.test.tsx +++ b/frontend/src/features/incomes/items/AddIncomeItemButton/ui/AddIncomeItemButton.test.tsx @@ -1,14 +1,13 @@ +import { server } from '@mocks/jest/server'; +import { createReactQueryWrapper } from '@mocks/jest/wrappers'; import { render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import { http, HttpResponse } from 'msw'; -import { server } from '@mocks/jest/server'; -import { createReactQueryWrapper } from '@mocks/jest/wrappers'; +import type { AddIncomeItemBody, AddIncomeItemPath, AddIncomeItemSuccessResponse } from '@/entity/incomes/item'; import AddIncomeItemButton from './AddIncomeItemButton.ui'; -import type { AddIncomeItemBody, AddIncomeItemPath, AddIncomeItemSuccessResponse } from '@/entity/incomes/item'; - const renderButton = () => { render( , @@ -32,7 +31,7 @@ const openModal = async () => { }; }; -const fillForm = async (data: { title: string; description: string; date: string; amount: string }) => { +const fillForm = async (data: { amount: string; date: string; description: string; title: string }) => { await userEvent.type(screen.getByLabelText('Название'), data.title); await userEvent.type(screen.getByLabelText('Описание'), data.description); await userEvent.type(screen.getByLabelText('Дата'), data.date); @@ -50,15 +49,15 @@ const submitHandler = (requestSpy: jest.Mock) => http.post< requestSpy(body); return HttpResponse.json({ - id: '51a44dc0-597b-49b9-85bb-e0bcd42db3f6', - title: 'Mock item', amount: 12, - updatedAt: '2025-08-29T07:57:40.503Z', - incomeListId: '10cc093c-3875-4d33-a40a-df526266e262', createdAt: '2025-08-29T07:57:40.503Z', currency: 'RUB', date: '2025-08-22T00:00:03.000Z', description: 'Mock description', + id: '51a44dc0-597b-49b9-85bb-e0bcd42db3f6', + incomeListId: '10cc093c-3875-4d33-a40a-df526266e262', + title: 'Mock item', + updatedAt: '2025-08-29T07:57:40.503Z', }); }, ); @@ -94,10 +93,10 @@ describe('Test AddIncomeItemButton', () => { submitButtonElem = screen.getByText('Добавить'); await fillForm({ - title: 'Название элемента', - description: 'Описание элемента', - date: '2025-08-29', amount: '12', + date: '2025-08-29', + description: 'Описание элемента', + title: 'Название элемента', }); }); @@ -105,11 +104,11 @@ describe('Test AddIncomeItemButton', () => { await userEvent.click(submitButtonElem); expect(requestSpy).toHaveBeenCalledTimes(1); expect(requestSpy).toHaveBeenCalledWith({ - title: 'Название элемента', - description: 'Описание элемента', - date: '2025-08-29T00:00:00.000Z', amount: 12, currency: 'RUB', + date: '2025-08-29T00:00:00.000Z', + description: 'Описание элемента', + title: 'Название элемента', }); }); diff --git a/frontend/src/features/incomes/items/AddIncomeItemButton/ui/AddIncomeItemButton.ui.tsx b/frontend/src/features/incomes/items/AddIncomeItemButton/ui/AddIncomeItemButton.ui.tsx index 9b10711..06d064c 100644 --- a/frontend/src/features/incomes/items/AddIncomeItemButton/ui/AddIncomeItemButton.ui.tsx +++ b/frontend/src/features/incomes/items/AddIncomeItemButton/ui/AddIncomeItemButton.ui.tsx @@ -1,23 +1,24 @@ +import type { ButtonHTMLAttributes, FC, RefObject } from 'react'; + +import type { IncomeList } from '@/entity/incomes/list'; + import { AddIncomeItemForm } from '@/entity/incomes/item'; import { Modal } from '@/shared/ui/Modal'; import { useAddIncomeItemButton } from '../hooks/useAddIncomeItemButton'; -import type { IncomeList } from '@/entity/incomes/list'; -import type { ButtonHTMLAttributes, FC, RefObject } from 'react'; - -type BaseButtonProps = ButtonHTMLAttributes; - type AddIncomeItemButtonProps = BaseButtonProps & { listId: IncomeList['id']; ref?: RefObject; }; +type BaseButtonProps = ButtonHTMLAttributes; + const AddIncomeItemButton: FC = (props) => { const { listId, - ref, onClick, + ref, ...buttonProps } = props; @@ -32,15 +33,15 @@ const AddIncomeItemButton: FC = (props) => { return ( <> - + diff --git a/frontend/src/features/incomes/items/DeleteIncomeItemButton/hooks/useDeleteIncomeItemButton.ts b/frontend/src/features/incomes/items/DeleteIncomeItemButton/hooks/useDeleteIncomeItemButton.ts index fae8267..530f3bf 100644 --- a/frontend/src/features/incomes/items/DeleteIncomeItemButton/hooks/useDeleteIncomeItemButton.ts +++ b/frontend/src/features/incomes/items/DeleteIncomeItemButton/hooks/useDeleteIncomeItemButton.ts @@ -1,9 +1,9 @@ +import type { MouseEventHandler } from 'react'; + import { useState } from 'react'; import { type IncomeListItem, useDeleteIncomeItem } from '@/entity/incomes/item'; -import type { MouseEventHandler } from 'react'; - type UseDeleteIncomeItemButtonArgs = { item: IncomeListItem; onClick?: MouseEventHandler; @@ -21,9 +21,9 @@ export const useDeleteIncomeItemButton = (args: UseDeleteIncomeItemButtonArgs) = onClick?.(event); }; - const { mutateAsync: deleteIncomeItemMutation, isPending } = useDeleteIncomeItem({ - listId: item.incomeListId, + const { isPending, mutateAsync: deleteIncomeItemMutation } = useDeleteIncomeItem({ id: item.id, + listId: item.incomeListId, }); const onFormSubmitHandler = async () => { @@ -33,9 +33,9 @@ export const useDeleteIncomeItemButton = (args: UseDeleteIncomeItemButtonArgs) = return { isOpen, - onCloseModalHandler, - onClickHandler, isPending, + onClickHandler, + onCloseModalHandler, onFormSubmitHandler, }; }; diff --git a/frontend/src/features/incomes/items/DeleteIncomeItemButton/ui/DeleteIncomeItemButton.test.tsx b/frontend/src/features/incomes/items/DeleteIncomeItemButton/ui/DeleteIncomeItemButton.test.tsx index 832aa17..6f19945 100644 --- a/frontend/src/features/incomes/items/DeleteIncomeItemButton/ui/DeleteIncomeItemButton.test.tsx +++ b/frontend/src/features/incomes/items/DeleteIncomeItemButton/ui/DeleteIncomeItemButton.test.tsx @@ -1,24 +1,23 @@ +import { server } from '@mocks/jest/server'; +import { createReactQueryWrapper } from '@mocks/jest/wrappers'; import { render, screen, within } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import { http, HttpResponse } from 'msw'; -import { server } from '@mocks/jest/server'; -import { createReactQueryWrapper } from '@mocks/jest/wrappers'; +import type { DeleteIncomeItemPath, IncomeListItem } from '@/entity/incomes/item'; import DeleteIncomeItemButton from './DeleteIncomeItemButton.ui'; -import type { DeleteIncomeItemPath, IncomeListItem } from '@/entity/incomes/item'; - const deletedItem: IncomeListItem = { - id: '51a44dc0-597b-49b9-85bb-e0bcd42db3f6', - title: 'Mock item', amount: 12, - updatedAt: '2025-08-29T07:57:40.503Z', - incomeListId: '10cc093c-3875-4d33-a40a-df526266e262', createdAt: '2025-08-29T07:57:40.503Z', currency: 'RUB', date: '2025-08-22T00:00:03.000Z', description: 'Mock description', + id: '51a44dc0-597b-49b9-85bb-e0bcd42db3f6', + incomeListId: '10cc093c-3875-4d33-a40a-df526266e262', + title: 'Mock item', + updatedAt: '2025-08-29T07:57:40.503Z', }; const renderButton = () => { diff --git a/frontend/src/features/incomes/items/DeleteIncomeItemButton/ui/DeleteIncomeItemButton.ui.tsx b/frontend/src/features/incomes/items/DeleteIncomeItemButton/ui/DeleteIncomeItemButton.ui.tsx index ca5a5e1..ef02771 100644 --- a/frontend/src/features/incomes/items/DeleteIncomeItemButton/ui/DeleteIncomeItemButton.ui.tsx +++ b/frontend/src/features/incomes/items/DeleteIncomeItemButton/ui/DeleteIncomeItemButton.ui.tsx @@ -1,11 +1,12 @@ +import type { ButtonHTMLAttributes, FC, RefObject } from 'react'; + +import type { IncomeListItem } from '@/entity/incomes/item'; + import { DeleteIncomeItemForm } from '@/entity/incomes/item'; import { Modal } from '@/shared/ui/Modal'; import { useDeleteIncomeItemButton } from '../hooks/useDeleteIncomeItemButton'; -import type { IncomeListItem } from '@/entity/incomes/item'; -import type { ButtonHTMLAttributes, FC, RefObject } from 'react'; - type BaseButtonProps = ButtonHTMLAttributes; type DeleteIncomeItemButtonProps = BaseButtonProps & { @@ -15,30 +16,30 @@ type DeleteIncomeItemButtonProps = BaseButtonProps & { const DeleteIncomeItemButton: FC = (props) => { const { item, - ref, onClick, + ref, ...restProps } = props; const { isOpen, - onCloseModalHandler, - onClickHandler, isPending, + onClickHandler, + onCloseModalHandler, onFormSubmitHandler, } = useDeleteIncomeItemButton({ item, onClick }); return ( <> - + diff --git a/frontend/src/features/incomes/items/EditIncomeItemButton/hooks/useIncomeItemButton.ts b/frontend/src/features/incomes/items/EditIncomeItemButton/hooks/useIncomeItemButton.ts index f74ff85..fd49c78 100644 --- a/frontend/src/features/incomes/items/EditIncomeItemButton/hooks/useIncomeItemButton.ts +++ b/frontend/src/features/incomes/items/EditIncomeItemButton/hooks/useIncomeItemButton.ts @@ -1,8 +1,8 @@ +import type { MouseEventHandler } from 'react'; + import { useState } from 'react'; -import { type IncomeListItem, useEditIncomeItem, type EditIncomeItemFormValues } from '@/entity/incomes/item'; - -import type { MouseEventHandler } from 'react'; +import { type EditIncomeItemFormValues, type IncomeListItem, useEditIncomeItem } from '@/entity/incomes/item'; type UseAddIncomeItemButtonArgs = { item: IncomeListItem; @@ -13,7 +13,7 @@ export const useIncomeItemButton = (args: UseAddIncomeItemButtonArgs) => { const { item, onClick } = args; const [isOpen, setIsOpen] = useState(false); - const { mutateAsync: editIncomeItemMutation, isPending } = useEditIncomeItem({ + const { isPending, mutateAsync: editIncomeItemMutation } = useEditIncomeItem({ id: item.id, listId: item.incomeListId, }); @@ -34,9 +34,9 @@ export const useIncomeItemButton = (args: UseAddIncomeItemButtonArgs) => { return { isOpen, - onFormSubmitHandler, - onCloseModalHandler, isPending, onClickHandler, + onCloseModalHandler, + onFormSubmitHandler, }; }; diff --git a/frontend/src/features/incomes/items/EditIncomeItemButton/ui/EditIncomeItemButton.test.tsx b/frontend/src/features/incomes/items/EditIncomeItemButton/ui/EditIncomeItemButton.test.tsx index 59a94de..8985cc9 100644 --- a/frontend/src/features/incomes/items/EditIncomeItemButton/ui/EditIncomeItemButton.test.tsx +++ b/frontend/src/features/incomes/items/EditIncomeItemButton/ui/EditIncomeItemButton.test.tsx @@ -1,12 +1,9 @@ +import { server } from '@mocks/jest/server'; +import { createReactQueryWrapper } from '@mocks/jest/wrappers'; import { render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import { http, HttpResponse } from 'msw'; -import { server } from '@mocks/jest/server'; -import { createReactQueryWrapper } from '@mocks/jest/wrappers'; - -import EditIncomeItemButton from './EditIncomeItemButton.ui'; - import type { EditIncomeItemBody, EditIncomeItemPath, @@ -14,16 +11,18 @@ import type { IncomeListItem, } from '@/entity/incomes/item'; +import EditIncomeItemButton from './EditIncomeItemButton.ui'; + const editingItem: IncomeListItem = { - id: '51a44dc0-597b-49b9-85bb-e0bcd42db3f6', - title: 'Mock item', amount: 12, - updatedAt: '2025-08-29T07:57:40.503Z', - incomeListId: '10cc093c-3875-4d33-a40a-df526266e262', createdAt: '2025-08-29T07:57:40.503Z', currency: 'RUB', date: '2025-08-22T00:00:03.000Z', description: 'Mock description', + id: '51a44dc0-597b-49b9-85bb-e0bcd42db3f6', + incomeListId: '10cc093c-3875-4d33-a40a-df526266e262', + title: 'Mock item', + updatedAt: '2025-08-29T07:57:40.503Z', }; const renderButton = () => { @@ -63,7 +62,7 @@ const submitHandler = (requestSpy: jest.Mock) => http.patch< }, ); -const fillForm = async (data: { title: string; description: string; date: string; amount: string }) => { +const fillForm = async (data: { amount: string; date: string; description: string; title: string }) => { const titleInputElem = screen.getByLabelText('Название'); await userEvent.clear(titleInputElem); await userEvent.type(titleInputElem, data.title); @@ -112,10 +111,10 @@ describe('TestEditIncomeItemButton', () => { submitButtonElem = screen.getByText('Сохранить'); await fillForm({ - title: 'Название элемента', - description: 'Описание элемента', - date: '2025-08-29', amount: '12', + date: '2025-08-29', + description: 'Описание элемента', + title: 'Название элемента', }); }); @@ -123,11 +122,11 @@ describe('TestEditIncomeItemButton', () => { await userEvent.click(submitButtonElem); expect(requestSpy).toHaveBeenCalledTimes(1); expect(requestSpy).toHaveBeenCalledWith({ - title: 'Название элемента', - description: 'Описание элемента', - date: '2025-08-29T00:00:00.000Z', amount: 12, currency: 'RUB', + date: '2025-08-29T00:00:00.000Z', + description: 'Описание элемента', + title: 'Название элемента', }); }); diff --git a/frontend/src/features/incomes/items/EditIncomeItemButton/ui/EditIncomeItemButton.ui.tsx b/frontend/src/features/incomes/items/EditIncomeItemButton/ui/EditIncomeItemButton.ui.tsx index 470bf77..26274e8 100644 --- a/frontend/src/features/incomes/items/EditIncomeItemButton/ui/EditIncomeItemButton.ui.tsx +++ b/frontend/src/features/incomes/items/EditIncomeItemButton/ui/EditIncomeItemButton.ui.tsx @@ -1,11 +1,12 @@ +import type { ButtonHTMLAttributes, FC, RefObject } from 'react'; + +import type { IncomeListItem } from '@/entity/incomes/item'; + import { EditIncomeItemForm } from '@/entity/incomes/item'; import { Modal } from '@/shared/ui/Modal'; import { useIncomeItemButton } from '../hooks/useIncomeItemButton'; -import type { IncomeListItem } from '@/entity/incomes/item'; -import type { ButtonHTMLAttributes, FC, RefObject } from 'react'; - type BaseButtonProps = ButtonHTMLAttributes; type EditIncomeItemButtonProps = BaseButtonProps & { @@ -15,33 +16,33 @@ type EditIncomeItemButtonProps = BaseButtonProps & { const EditIncomeItemButton: FC = (props) => { const { - ref, item, onClick, + ref, ...restProps } = props; const { isOpen, - onCloseModalHandler, - onClickHandler, isPending, + onClickHandler, + onCloseModalHandler, onFormSubmitHandler, } = useIncomeItemButton({ item, onClick }); return ( <> - + diff --git a/frontend/src/features/incomes/list/AddIncomeListButton/hooks/useAddIncomeListButton.ts b/frontend/src/features/incomes/list/AddIncomeListButton/hooks/useAddIncomeListButton.ts index 1845a56..c1b9d12 100644 --- a/frontend/src/features/incomes/list/AddIncomeListButton/hooks/useAddIncomeListButton.ts +++ b/frontend/src/features/incomes/list/AddIncomeListButton/hooks/useAddIncomeListButton.ts @@ -1,9 +1,9 @@ import { type MouseEventHandler, useState } from 'react'; -import { useAddIncomesList } from '@/entity/incomes/list'; - import type { AddExpenseListFormValues } from '@/entity/expenses/list'; +import { useAddIncomesList } from '@/entity/incomes/list'; + type UseAddIncomeListButtonArgs = { onClick?: MouseEventHandler; }; @@ -12,7 +12,7 @@ export const useAddIncomeListButton = (args: UseAddIncomeListButtonArgs) => { const { onClick } = args; const [isOpen, setIsOpen] = useState(false); - const { mutateAsync: addIncomeListMutation, isPending } = useAddIncomesList(); + const { isPending, mutateAsync: addIncomeListMutation } = useAddIncomesList(); const onCloseModalHandler = () => { setIsOpen(false); @@ -31,8 +31,8 @@ export const useAddIncomeListButton = (args: UseAddIncomeListButtonArgs) => { return { isOpen, isPending, - onCloseModalHandler, onClickHandler, + onCloseModalHandler, onFormSubmitHandler, }; }; diff --git a/frontend/src/features/incomes/list/AddIncomeListButton/ui/AddIncomeListButton.test.tsx b/frontend/src/features/incomes/list/AddIncomeListButton/ui/AddIncomeListButton.test.tsx index 12773dd..f2dc294 100644 --- a/frontend/src/features/incomes/list/AddIncomeListButton/ui/AddIncomeListButton.test.tsx +++ b/frontend/src/features/incomes/list/AddIncomeListButton/ui/AddIncomeListButton.test.tsx @@ -1,14 +1,13 @@ +import { server } from '@mocks/jest/server'; +import { createReactQueryWrapper } from '@mocks/jest/wrappers'; import { render, screen, within } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import { http, HttpResponse } from 'msw'; -import { server } from '@mocks/jest/server'; -import { createReactQueryWrapper } from '@mocks/jest/wrappers'; +import type { AddExpenseListBody, AddExpenseListSuccessResponse } from '@/entity/expenses/list'; import AddIncomeListButton from './AddIncomeListButton.ui'; -import type { AddExpenseListBody, AddExpenseListSuccessResponse } from '@/entity/expenses/list'; - const renderButton = () => { render( , @@ -43,11 +42,11 @@ const submitHandler = (requestSpy: jest.Mock) => http.post & { ref?: Ref; }; @@ -15,18 +15,18 @@ const AddIncomeListButton: FC = (props) => { const { isOpen, isPending, - onCloseModalHandler, onClickHandler, + onCloseModalHandler, onFormSubmitHandler, } = useAddIncomeListButton({ onClick }); return ( <> - - + diff --git a/frontend/src/features/incomes/list/DeleteIncomeListButton/hooks/useIncomeListButton.ts b/frontend/src/features/incomes/list/DeleteIncomeListButton/hooks/useIncomeListButton.ts index d150ba2..8460583 100644 --- a/frontend/src/features/incomes/list/DeleteIncomeListButton/hooks/useIncomeListButton.ts +++ b/frontend/src/features/incomes/list/DeleteIncomeListButton/hooks/useIncomeListButton.ts @@ -10,7 +10,7 @@ export const useIncomeListButton = (args: UseDeleteIncomeListButtonArgs) => { const { id } = args; const [isOpen, setIsOpen] = useState(false); - const { mutateAsync: deleteIncomeListAsync, isPending } = useDeleteIncomesList(); + const { isPending, mutateAsync: deleteIncomeListAsync } = useDeleteIncomesList(); const onClickHandler = () => { setIsOpen(true); diff --git a/frontend/src/features/incomes/list/DeleteIncomeListButton/ui/DeleteIncomeListButton.test.tsx b/frontend/src/features/incomes/list/DeleteIncomeListButton/ui/DeleteIncomeListButton.test.tsx index baf00ba..528b6af 100644 --- a/frontend/src/features/incomes/list/DeleteIncomeListButton/ui/DeleteIncomeListButton.test.tsx +++ b/frontend/src/features/incomes/list/DeleteIncomeListButton/ui/DeleteIncomeListButton.test.tsx @@ -1,21 +1,20 @@ +import { server } from '@mocks/jest/server'; +import { createReactQueryWrapper } from '@mocks/jest/wrappers'; import { render, screen, within } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import { http, HttpResponse } from 'msw'; -import { server } from '@mocks/jest/server'; -import { createReactQueryWrapper } from '@mocks/jest/wrappers'; - -import DeleteIncomeListButton from './DeleteIncomeListButton.ui'; - import type { DeleteExpenseListPath } from '@/entity/expenses/list'; import type { IncomeList } from '@/entity/incomes/list'; +import DeleteIncomeListButton from './DeleteIncomeListButton.ui'; + const deletingList: IncomeList = { - id: '10cc093c-3875-4d33-a40a-df526266e262', - title: 'Mock list', - items: [], - updatedAt: '2025-08-29T07:57:40.503Z', createdAt: '2025-08-29T07:57:40.503Z', + id: '10cc093c-3875-4d33-a40a-df526266e262', + items: [], + title: 'Mock list', + updatedAt: '2025-08-29T07:57:40.503Z', }; const renderButton = () => { diff --git a/frontend/src/features/incomes/list/DeleteIncomeListButton/ui/DeleteIncomeListButton.ui.tsx b/frontend/src/features/incomes/list/DeleteIncomeListButton/ui/DeleteIncomeListButton.ui.tsx index ec51c11..25ba79e 100644 --- a/frontend/src/features/incomes/list/DeleteIncomeListButton/ui/DeleteIncomeListButton.ui.tsx +++ b/frontend/src/features/incomes/list/DeleteIncomeListButton/ui/DeleteIncomeListButton.ui.tsx @@ -1,11 +1,12 @@ +import type { ButtonHTMLAttributes, Ref } from 'react'; + +import type { IncomeList } from '@/entity/incomes/list'; + import { DeleteIncomeListForm } from '@/entity/incomes/list'; import { Modal } from '@/shared/ui/Modal'; import { useIncomeListButton } from '../hooks/useIncomeListButton'; -import type { IncomeList } from '@/entity/incomes/list'; -import type { ButtonHTMLAttributes, Ref } from 'react'; - type DeleteIncomeListButtonProps = ButtonHTMLAttributes & { list: IncomeList; ref?: Ref; @@ -17,18 +18,18 @@ const DeleteIncomeListButton = (props: DeleteIncomeListButtonProps) => { const { isOpen, isPending, - onCloseModalHandler, onClickHandler, + onCloseModalHandler, onFormSubmitHandler, } = useIncomeListButton({ id }); return ( <> - - + { const { id } = args; const [isOpen, setIsOpen] = useState(false); - const { mutateAsync: editIncomeListAsync, isPending } = useEditIncomesList(); + const { isPending, mutateAsync: editIncomeListAsync } = useEditIncomesList(); const onClickHandler = () => { setIsOpen(true); @@ -24,8 +24,8 @@ export const useIncomeListButton = (args: UseEditIncomeListButtonArgs) => { const onFormSubmitHandler = async (data: EditIncomeListFormValues) => { await editIncomeListAsync({ - path: { id }, data, + path: { id }, }); setIsOpen(false); }; diff --git a/frontend/src/features/incomes/list/EditIncomeListButton/ui/EditIncomeListButton.test.tsx b/frontend/src/features/incomes/list/EditIncomeListButton/ui/EditIncomeListButton.test.tsx index 4d47ffe..beb307e 100644 --- a/frontend/src/features/incomes/list/EditIncomeListButton/ui/EditIncomeListButton.test.tsx +++ b/frontend/src/features/incomes/list/EditIncomeListButton/ui/EditIncomeListButton.test.tsx @@ -1,24 +1,23 @@ +import { server } from '@mocks/jest/server'; +import { createReactQueryWrapper } from '@mocks/jest/wrappers'; import { render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import { http, HttpResponse } from 'msw'; -import { server } from '@mocks/jest/server'; -import { createReactQueryWrapper } from '@mocks/jest/wrappers'; - -import EditIncomeListButton from './EditIncomeListButton.ui'; - import type { EditExpenseListBody, EditExpenseListPath, EditExpenseListSuccessResponse, } from '@/entity/expenses/list'; +import EditIncomeListButton from './EditIncomeListButton.ui'; + const editingList = { - id: '10cc093c-3875-4d33-a40a-df526266e262', - title: 'Mock list', - items: null, - updatedAt: '2025-08-29T07:57:40.503Z', createdAt: '2025-08-29T07:57:40.503Z', + id: '10cc093c-3875-4d33-a40a-df526266e262', + items: null, + title: 'Mock list', + updatedAt: '2025-08-29T07:57:40.503Z', }; const renderButton = () => { diff --git a/frontend/src/features/incomes/list/EditIncomeListButton/ui/EditIncomeListButton.ui.tsx b/frontend/src/features/incomes/list/EditIncomeListButton/ui/EditIncomeListButton.ui.tsx index fa6f2fd..99e2918 100644 --- a/frontend/src/features/incomes/list/EditIncomeListButton/ui/EditIncomeListButton.ui.tsx +++ b/frontend/src/features/incomes/list/EditIncomeListButton/ui/EditIncomeListButton.ui.tsx @@ -1,11 +1,12 @@ +import type { ButtonHTMLAttributes, FC, Ref } from 'react'; + +import type { IncomeList } from '@/entity/incomes/list'; + import { EditIncomeListForm } from '@/entity/incomes/list'; import { Modal } from '@/shared/ui/Modal'; import { useIncomeListButton } from '../hooks/useIncomeListButton'; -import type { IncomeList } from '@/entity/incomes/list'; -import type { ButtonHTMLAttributes, FC, Ref } from 'react'; - type EditIncomeListButtonProps = ButtonHTMLAttributes & { list: IncomeList; ref?: Ref; @@ -17,18 +18,18 @@ const EditIncomeListButton: FC = (props) => { const { isOpen, isPending, - onCloseModalHandler, onClickHandler, + onCloseModalHandler, onFormSubmitHandler, } = useIncomeListButton({ id: list.id }); return ( <> - - + diff --git a/frontend/src/pages/BankCard/ui/BankCardsPage.ui.tsx b/frontend/src/pages/BankCard/ui/BankCardsPage.ui.tsx index 64dd903..9fc3df4 100644 --- a/frontend/src/pages/BankCard/ui/BankCardsPage.ui.tsx +++ b/frontend/src/pages/BankCard/ui/BankCardsPage.ui.tsx @@ -1,13 +1,13 @@ +import type { FC } from 'react'; + import { useBankCards } from '@/entity/cards'; import { AddBankCardButton } from '@/features/bank-cards/AddBankCardButton'; import { Spinner } from '@/shared/ui/Spinner'; import { AppLayout } from '@/widgets/AppLayout'; import { BankCardsTable } from '@/widgets/bank-cards/BankCardsTable'; -import type { FC } from 'react'; - const BankCardsPage: FC = () => { - const { isPending, data: bankCards } = useBankCards(); + const { data: bankCards, isPending } = useBankCards(); const renderContent = () => { if (isPending) { diff --git a/frontend/src/pages/Cash/ui/CashPage.ui.tsx b/frontend/src/pages/Cash/ui/CashPage.ui.tsx index cc7a9c6..0029301 100644 --- a/frontend/src/pages/Cash/ui/CashPage.ui.tsx +++ b/frontend/src/pages/Cash/ui/CashPage.ui.tsx @@ -1,13 +1,13 @@ +import type { FC } from 'react'; + import { useCash } from '@/entity/cash'; import { AddCashButton } from '@/features/cash/AddCashButton'; import { Spinner } from '@/shared/ui/Spinner'; import { AppLayout } from '@/widgets/AppLayout'; import { CashTable } from '@/widgets/cash/CashTable'; -import type { FC } from 'react'; - const CashPage: FC = () => { - const { isPending, data: cashList } = useCash(); + const { data: cashList, isPending } = useCash(); const renderContent = () => { if (isPending) { diff --git a/frontend/src/pages/Expense/ui/ExpensePage.ui.tsx b/frontend/src/pages/Expense/ui/ExpensePage.ui.tsx index 183a143..99ea944 100644 --- a/frontend/src/pages/Expense/ui/ExpensePage.ui.tsx +++ b/frontend/src/pages/Expense/ui/ExpensePage.ui.tsx @@ -1,13 +1,13 @@ import { useParams } from 'react-router'; +import type { ExpensePageParams } from '@/shared/router'; + import { useExpenseList } from '@/entity/expenses/list'; import { AddExpenseItemButton } from '@/features/expenses/items/AddExpenseItemButton'; import { Spinner } from '@/shared/ui/Spinner'; import { AppLayout } from '@/widgets/AppLayout'; import { ExpenseItemsTable } from '@/widgets/expenses/ExpenseItemsTable'; -import type { ExpensePageParams } from '@/shared/router'; - const ExpensePage = () => { // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion const { id } = useParams() as ExpensePageParams; diff --git a/frontend/src/pages/Income/ui/IncomePage.ui.tsx b/frontend/src/pages/Income/ui/IncomePage.ui.tsx index beef050..8434620 100644 --- a/frontend/src/pages/Income/ui/IncomePage.ui.tsx +++ b/frontend/src/pages/Income/ui/IncomePage.ui.tsx @@ -1,13 +1,13 @@ import { useParams } from 'react-router'; +import type { IncomePageParams } from '@/shared/router'; + import { useIncomeList } from '@/entity/incomes/list'; import { AddIncomeItemButton } from '@/features/incomes/items/AddIncomeItemButton'; import { Spinner } from '@/shared/ui/Spinner'; import { AppLayout } from '@/widgets/AppLayout'; import { IncomeItemsTable } from '@/widgets/incomes/IncomeItemsTable'; -import type { IncomePageParams } from '@/shared/router'; - const IncomePage = () => { // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion const { id } = useParams() as IncomePageParams; diff --git a/frontend/src/shared/api/queryKeys.ts b/frontend/src/shared/api/queryKeys.ts index 8ced31c..b69b5f5 100644 --- a/frontend/src/shared/api/queryKeys.ts +++ b/frontend/src/shared/api/queryKeys.ts @@ -1,10 +1,10 @@ // eslint-disable-next-line @typescript-eslint/naming-convention export enum QueryKeys { - BankCards = 'BankCards', BankCard = 'BankCard', - ExpensesList = 'ExpensesList', - ExpenseList = 'ExpenseList', - IncomesList = 'IncomesList', - IncomeList = 'IncomeList', + BankCards = 'BankCards', Cash = 'Cash', + ExpenseList = 'ExpenseList', + ExpensesList = 'ExpensesList', + IncomeList = 'IncomeList', + IncomesList = 'IncomesList', } diff --git a/frontend/src/shared/context/AuthContext/AuthContext.ui.tsx b/frontend/src/shared/context/AuthContext/AuthContext.ui.tsx index c9ef3b4..4fc9d8b 100644 --- a/frontend/src/shared/context/AuthContext/AuthContext.ui.tsx +++ b/frontend/src/shared/context/AuthContext/AuthContext.ui.tsx @@ -1,9 +1,3 @@ -import { - createContext, - useMemo, - useState, -} from 'react'; - import type { Dispatch, FC, @@ -11,6 +5,12 @@ import type { SetStateAction, } from 'react'; +import { + createContext, + useMemo, + useState, +} from 'react'; + export type AuthContextType = { accessToken: string; setAccessToken: Dispatch>; @@ -18,13 +18,13 @@ export type AuthContextType = { // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion export const AuthContext = createContext(null as unknown as AuthContextType); -function getInitialToken() { - return localStorage.getItem('accessToken') ?? ''; -} - type AuthContextProviderProps = { children: ReactNode; }; + +function getInitialToken() { + return localStorage.getItem('accessToken') ?? ''; +} export const AuthContextProvider: FC = (props) => { const { children } = props; diff --git a/frontend/src/shared/router/types.ts b/frontend/src/shared/router/types.ts index f2ed95d..c15617d 100644 --- a/frontend/src/shared/router/types.ts +++ b/frontend/src/shared/router/types.ts @@ -1,13 +1,13 @@ export enum PAGES { - Home = '/', - Login = '/login', - Register = '/register', - Expenses = '/expenses', - Expense = '/expenses/:id', - Incomes = '/incomes', - Income = '/incomes/:id', BankCards = '/bank-cards', Cash = '/cash', + Expense = '/expenses/:id', + Expenses = '/expenses', + Home = '/', + Income = '/incomes/:id', + Incomes = '/incomes', + Login = '/login', + Register = '/register', } export type ExpensePageParams = { diff --git a/frontend/src/shared/ui/AuthRoute/ui/AuthRoute.ui.tsx b/frontend/src/shared/ui/AuthRoute/ui/AuthRoute.ui.tsx index 148cc49..634baf3 100644 --- a/frontend/src/shared/ui/AuthRoute/ui/AuthRoute.ui.tsx +++ b/frontend/src/shared/ui/AuthRoute/ui/AuthRoute.ui.tsx @@ -1,10 +1,10 @@ +import type { NavigateProps } from 'react-router'; + import { type FC, useContext } from 'react'; import { Navigate, Outlet } from 'react-router'; import { AuthContext } from '@/shared/context/AuthContext'; -import type { NavigateProps } from 'react-router'; - type AuthRouteProps = { needAuth?: boolean; to?: NavigateProps['to']; diff --git a/frontend/src/shared/ui/Input/ui/Input.ui.tsx b/frontend/src/shared/ui/Input/ui/Input.ui.tsx index 25b0cde..03f18f6 100644 --- a/frontend/src/shared/ui/Input/ui/Input.ui.tsx +++ b/frontend/src/shared/ui/Input/ui/Input.ui.tsx @@ -1,13 +1,13 @@ -import classes from './Input.styles.module.css'; - import type { FC, HTMLProps } from 'react'; +import classes from './Input.styles.module.css'; + type InputProps = HTMLProps & { label: string; }; const Input: FC = (props) => { - const { label, id, ...rest } = props; + const { id, label, ...rest } = props; return (