From 41f8d19d498f6b3ac0aa369ad49a460c463e8cf0 Mon Sep 17 00:00:00 2001 From: AlexSserb Date: Thu, 7 Aug 2025 10:13:08 +0400 Subject: [PATCH] feat: board deletion --- src/app/deals/components/Board/Board.tsx | 4 +-- src/app/deals/contexts/BoardsContext.tsx | 27 +++++++++++++- src/lib/client/@tanstack/react-query.gen.ts | 21 +++++++++-- src/lib/client/sdk.gen.ts | 21 +++++++++-- src/lib/client/types.gen.ts | 40 +++++++++++++++++++++ src/lib/client/zod.gen.ts | 20 +++++++++++ 6 files changed, 126 insertions(+), 7 deletions(-) diff --git a/src/app/deals/components/Board/Board.tsx b/src/app/deals/components/Board/Board.tsx index 144fe93..b4d5a8e 100644 --- a/src/app/deals/components/Board/Board.tsx +++ b/src/app/deals/components/Board/Board.tsx @@ -10,7 +10,7 @@ type Props = { const Board: FC = ({ board }) => { const [isHovered, setIsHovered] = useState(false); - const { selectedBoard } = useBoardsContext(); + const { selectedBoard, onDeleteBoardClick } = useBoardsContext(); return ( = ({ board }) => { Переименовать - + onDeleteBoardClick(board.id)}> Удалить diff --git a/src/app/deals/contexts/BoardsContext.tsx b/src/app/deals/contexts/BoardsContext.tsx index 173b505..ab6e329 100644 --- a/src/app/deals/contexts/BoardsContext.tsx +++ b/src/app/deals/contexts/BoardsContext.tsx @@ -12,7 +12,10 @@ import { LexoRank } from "lexorank"; import { useProjectsContext } from "@/app/deals/contexts/ProjectsContext"; import useBoardsList from "@/hooks/useBoardsList"; import { BoardSchema } from "@/lib/client"; -import { createBoardMutation } from "@/lib/client/@tanstack/react-query.gen"; +import { + createBoardMutation, + deleteBoardMutation, +} from "@/lib/client/@tanstack/react-query.gen"; import { notifications } from "@/lib/notifications"; import { getMaxByLexorank, getNewLexorank } from "@/utils/lexorank"; @@ -23,6 +26,7 @@ type BoardsContextState = { setSelectedBoard: React.Dispatch>; refetchBoards: () => void; onCreateBoardClick: (name: string) => void; + onDeleteBoardClick: (boardId: number) => void; }; const BoardsContext = createContext(undefined); @@ -86,6 +90,26 @@ const useBoardsContextState = () => { }); }; + const deleteBoard = useMutation({ + ...deleteBoardMutation(), + onError: error => { + console.error(error); + notifications.error({ + message: error.response?.data?.detail as string | undefined, + }); + refetchBoards(); + }, + }); + + const onDeleteBoardClick = (boardId: number) => { + deleteBoard.mutate({ + path: { + boardId, + }, + }); + setBoards(boards => boards.filter(board => board.id !== boardId)); + }; + return { boards, setBoards, @@ -93,6 +117,7 @@ const useBoardsContextState = () => { setSelectedBoard, refetchBoards, onCreateBoardClick, + onDeleteBoardClick, }; }; diff --git a/src/lib/client/@tanstack/react-query.gen.ts b/src/lib/client/@tanstack/react-query.gen.ts index c3e0142..5a2a195 100644 --- a/src/lib/client/@tanstack/react-query.gen.ts +++ b/src/lib/client/@tanstack/react-query.gen.ts @@ -1,8 +1,8 @@ // This file is auto-generated by @hey-api/openapi-ts -import { type Options, getBoards, createBoard, updateBoard, getDeals, updateDeal, getProjects, getStatuses, updateStatus } from '../sdk.gen'; +import { type Options, getBoards, createBoard, deleteBoard, updateBoard, getDeals, updateDeal, getProjects, getStatuses, updateStatus } from '../sdk.gen'; import { queryOptions, type UseMutationOptions } from '@tanstack/react-query'; -import type { GetBoardsData, CreateBoardData, CreateBoardError, CreateBoardResponse2, UpdateBoardData, UpdateBoardError, UpdateBoardResponse2, GetDealsData, UpdateDealData, UpdateDealError, UpdateDealResponse2, GetProjectsData, GetStatusesData, UpdateStatusData, UpdateStatusError, UpdateStatusResponse2 } from '../types.gen'; +import type { GetBoardsData, CreateBoardData, CreateBoardError, CreateBoardResponse2, DeleteBoardData, DeleteBoardError, DeleteBoardResponse2, UpdateBoardData, UpdateBoardError, UpdateBoardResponse2, GetDealsData, UpdateDealData, UpdateDealError, UpdateDealResponse2, GetProjectsData, GetStatusesData, UpdateStatusData, UpdateStatusError, UpdateStatusResponse2 } from '../types.gen'; import type { AxiosError } from 'axios'; import { client as _heyApiClient } from '../client.gen'; @@ -94,6 +94,23 @@ export const createBoardMutation = (options?: Partial>) return mutationOptions; }; +/** + * Delete Board + */ +export const deleteBoardMutation = (options?: Partial>): UseMutationOptions, Options> => { + const mutationOptions: UseMutationOptions, Options> = { + mutationFn: async (localOptions) => { + const { data } = await deleteBoard({ + ...options, + ...localOptions, + throwOnError: true + }); + return data; + } + }; + return mutationOptions; +}; + /** * Update Board */ diff --git a/src/lib/client/sdk.gen.ts b/src/lib/client/sdk.gen.ts index 3398095..5e01aa2 100644 --- a/src/lib/client/sdk.gen.ts +++ b/src/lib/client/sdk.gen.ts @@ -1,8 +1,8 @@ // This file is auto-generated by @hey-api/openapi-ts import type { Options as ClientOptions, TDataShape, Client } from './client'; -import type { GetBoardsData, GetBoardsResponses, GetBoardsErrors, CreateBoardData, CreateBoardResponses, CreateBoardErrors, UpdateBoardData, UpdateBoardResponses, UpdateBoardErrors, GetDealsData, GetDealsResponses, GetDealsErrors, UpdateDealData, UpdateDealResponses, UpdateDealErrors, GetProjectsData, GetProjectsResponses, GetStatusesData, GetStatusesResponses, GetStatusesErrors, UpdateStatusData, UpdateStatusResponses, UpdateStatusErrors } from './types.gen'; -import { zGetBoardsData, zGetBoardsResponse2, zCreateBoardData, zCreateBoardResponse2, zUpdateBoardData, zUpdateBoardResponse2, zGetDealsData, zGetDealsResponse2, zUpdateDealData, zUpdateDealResponse2, zGetProjectsData, zGetProjectsResponse2, zGetStatusesData, zGetStatusesResponse2, zUpdateStatusData, zUpdateStatusResponse2 } from './zod.gen'; +import type { GetBoardsData, GetBoardsResponses, GetBoardsErrors, CreateBoardData, CreateBoardResponses, CreateBoardErrors, DeleteBoardData, DeleteBoardResponses, DeleteBoardErrors, UpdateBoardData, UpdateBoardResponses, UpdateBoardErrors, GetDealsData, GetDealsResponses, GetDealsErrors, UpdateDealData, UpdateDealResponses, UpdateDealErrors, GetProjectsData, GetProjectsResponses, GetStatusesData, GetStatusesResponses, GetStatusesErrors, UpdateStatusData, UpdateStatusResponses, UpdateStatusErrors } from './types.gen'; +import { zGetBoardsData, zGetBoardsResponse2, zCreateBoardData, zCreateBoardResponse2, zDeleteBoardData, zDeleteBoardResponse2, zUpdateBoardData, zUpdateBoardResponse2, zGetDealsData, zGetDealsResponse2, zUpdateDealData, zUpdateDealResponse2, zGetProjectsData, zGetProjectsResponse2, zGetStatusesData, zGetStatusesResponse2, zUpdateStatusData, zUpdateStatusResponse2 } from './zod.gen'; import { client as _heyApiClient } from './client.gen'; export type Options = ClientOptions & { @@ -57,6 +57,23 @@ export const createBoard = (options: Optio }); }; +/** + * Delete Board + */ +export const deleteBoard = (options: Options) => { + return (options.client ?? _heyApiClient).delete({ + requestValidator: async (data) => { + return await zDeleteBoardData.parseAsync(data); + }, + responseType: 'json', + responseValidator: async (data) => { + return await zDeleteBoardResponse2.parseAsync(data); + }, + url: '/board/{boardId}', + ...options + }); +}; + /** * Update Board */ diff --git a/src/lib/client/types.gen.ts b/src/lib/client/types.gen.ts index ff21a3e..52dfea5 100644 --- a/src/lib/client/types.gen.ts +++ b/src/lib/client/types.gen.ts @@ -76,6 +76,16 @@ export type DealSchema = { statusId: number; }; +/** + * DeleteBoardResponse + */ +export type DeleteBoardResponse = { + /** + * Message + */ + message: string; +}; + /** * GetBoardsResponse */ @@ -328,6 +338,36 @@ export type CreateBoardResponses = { export type CreateBoardResponse2 = CreateBoardResponses[keyof CreateBoardResponses]; +export type DeleteBoardData = { + body?: never; + path: { + /** + * Boardid + */ + boardId: number; + }; + query?: never; + url: '/board/{boardId}'; +}; + +export type DeleteBoardErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; + +export type DeleteBoardError = DeleteBoardErrors[keyof DeleteBoardErrors]; + +export type DeleteBoardResponses = { + /** + * Successful Response + */ + 200: DeleteBoardResponse; +}; + +export type DeleteBoardResponse2 = DeleteBoardResponses[keyof DeleteBoardResponses]; + export type UpdateBoardData = { body: UpdateBoardRequest; path: { diff --git a/src/lib/client/zod.gen.ts b/src/lib/client/zod.gen.ts index 6b1ac0d..d2896c1 100644 --- a/src/lib/client/zod.gen.ts +++ b/src/lib/client/zod.gen.ts @@ -45,6 +45,13 @@ export const zDealSchema = z.object({ statusId: z.int() }); +/** + * DeleteBoardResponse + */ +export const zDeleteBoardResponse = z.object({ + message: z.string() +}); + /** * GetBoardsResponse */ @@ -221,6 +228,19 @@ export const zCreateBoardData = z.object({ */ export const zCreateBoardResponse2 = zCreateBoardResponse; +export const zDeleteBoardData = z.object({ + body: z.optional(z.never()), + path: z.object({ + boardId: z.int() + }), + query: z.optional(z.never()) +}); + +/** + * Successful Response + */ +export const zDeleteBoardResponse2 = zDeleteBoardResponse; + export const zUpdateBoardData = z.object({ body: zUpdateBoardRequest, path: z.object({