feat: board deletion
This commit is contained in:
@ -10,7 +10,7 @@ type Props = {
|
||||
|
||||
const Board: FC<Props> = ({ board }) => {
|
||||
const [isHovered, setIsHovered] = useState(false);
|
||||
const { selectedBoard } = useBoardsContext();
|
||||
const { selectedBoard, onDeleteBoardClick } = useBoardsContext();
|
||||
|
||||
return (
|
||||
<Group
|
||||
@ -47,7 +47,7 @@ const Board: FC<Props> = ({ board }) => {
|
||||
<Text>Переименовать</Text>
|
||||
</Group>
|
||||
</Menu.Item>
|
||||
<Menu.Item>
|
||||
<Menu.Item onClick={() => onDeleteBoardClick(board.id)}>
|
||||
<Group wrap={"nowrap"}>
|
||||
<IconTrash />
|
||||
<Text>Удалить</Text>
|
||||
|
||||
@ -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<React.SetStateAction<BoardSchema | null>>;
|
||||
refetchBoards: () => void;
|
||||
onCreateBoardClick: (name: string) => void;
|
||||
onDeleteBoardClick: (boardId: number) => void;
|
||||
};
|
||||
|
||||
const BoardsContext = createContext<BoardsContextState | undefined>(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,
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
@ -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<Options<CreateBoardData>>)
|
||||
return mutationOptions;
|
||||
};
|
||||
|
||||
/**
|
||||
* Delete Board
|
||||
*/
|
||||
export const deleteBoardMutation = (options?: Partial<Options<DeleteBoardData>>): UseMutationOptions<DeleteBoardResponse2, AxiosError<DeleteBoardError>, Options<DeleteBoardData>> => {
|
||||
const mutationOptions: UseMutationOptions<DeleteBoardResponse2, AxiosError<DeleteBoardError>, Options<DeleteBoardData>> = {
|
||||
mutationFn: async (localOptions) => {
|
||||
const { data } = await deleteBoard({
|
||||
...options,
|
||||
...localOptions,
|
||||
throwOnError: true
|
||||
});
|
||||
return data;
|
||||
}
|
||||
};
|
||||
return mutationOptions;
|
||||
};
|
||||
|
||||
/**
|
||||
* Update Board
|
||||
*/
|
||||
|
||||
@ -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<TData extends TDataShape = TDataShape, ThrowOnError extends boolean = boolean> = ClientOptions<TData, ThrowOnError> & {
|
||||
@ -57,6 +57,23 @@ export const createBoard = <ThrowOnError extends boolean = false>(options: Optio
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* Delete Board
|
||||
*/
|
||||
export const deleteBoard = <ThrowOnError extends boolean = false>(options: Options<DeleteBoardData, ThrowOnError>) => {
|
||||
return (options.client ?? _heyApiClient).delete<DeleteBoardResponses, DeleteBoardErrors, ThrowOnError>({
|
||||
requestValidator: async (data) => {
|
||||
return await zDeleteBoardData.parseAsync(data);
|
||||
},
|
||||
responseType: 'json',
|
||||
responseValidator: async (data) => {
|
||||
return await zDeleteBoardResponse2.parseAsync(data);
|
||||
},
|
||||
url: '/board/{boardId}',
|
||||
...options
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* Update Board
|
||||
*/
|
||||
|
||||
@ -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: {
|
||||
|
||||
@ -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({
|
||||
|
||||
Reference in New Issue
Block a user