diff --git a/src/app/deals/components/shared/Board/Board.tsx b/src/app/deals/components/shared/Board/Board.tsx index 60c7104..d384393 100644 --- a/src/app/deals/components/shared/Board/Board.tsx +++ b/src/app/deals/components/shared/Board/Board.tsx @@ -13,7 +13,7 @@ type Props = { }; const Board: FC = ({ board }) => { - const { selectedBoard, onUpdateBoard, onDeleteBoard } = useBoardsContext(); + const { selectedBoard, boardsCrud } = useBoardsContext(); const isMobile = useIsMobile(); const [isHovered, setIsHovered] = useState(false); @@ -30,7 +30,9 @@ const Board: FC = ({ board }) => { onMouseLeave={() => setIsHovered(false)}> onUpdateBoard(board.id, { name: value })} + onComplete={value => + boardsCrud.onUpdate(board.id, { name: value }) + } inputStyles={{ input: { height: 24, @@ -49,7 +51,7 @@ const Board: FC = ({ board }) => { isHovered={ selectedBoard?.id === board.id || isHovered } - onDeleteBoard={onDeleteBoard} + onDeleteBoard={boardsCrud.onDelete} board={board} startEditing={startEditing} /> diff --git a/src/app/deals/components/shared/Boards/Boards.tsx b/src/app/deals/components/shared/Boards/Boards.tsx index 09e562a..1484739 100644 --- a/src/app/deals/components/shared/Boards/Boards.tsx +++ b/src/app/deals/components/shared/Boards/Boards.tsx @@ -11,13 +11,13 @@ import { BoardSchema } from "@/lib/client"; import styles from "./Boards.module.css"; const Boards = () => { - const { boards, setSelectedBoardId, onUpdateBoard } = useBoardsContext(); + const { boards, setSelectedBoardId, boardsCrud } = useBoardsContext(); const isMobile = useIsMobile(); const renderBoard = (board: BoardSchema) => ; const onDragEnd = (itemId: number, newLexorank: string) => { - onUpdateBoard(itemId, { lexorank: newLexorank }); + boardsCrud.onUpdate(itemId, { lexorank: newLexorank }); }; const selectBoard = (board: BoardSchema) => { diff --git a/src/app/deals/components/shared/CreateBoardButton/CreateBoardButton.tsx b/src/app/deals/components/shared/CreateBoardButton/CreateBoardButton.tsx index bdefaf5..3c5b92d 100644 --- a/src/app/deals/components/shared/CreateBoardButton/CreateBoardButton.tsx +++ b/src/app/deals/components/shared/CreateBoardButton/CreateBoardButton.tsx @@ -5,13 +5,13 @@ import InPlaceInput from "@/components/ui/InPlaceInput/InPlaceInput"; import styles from "./CreateBoardButton.module.css"; const CreateBoardButton = () => { - const { onCreateBoard } = useBoardsContext(); + const { boardsCrud } = useBoardsContext(); return ( ( { - const { onCreateStatus } = useStatusesContext(); + const { statusesCrud } = useStatusesContext(); const isMobile = useIsMobile(); return ( @@ -15,7 +15,7 @@ const CreateStatusButton = () => { (
= ({ status, isDragging }) => { - const { onUpdateStatus, onDeleteStatus, refetchStatuses } = - useStatusesContext(); + const { statusesCrud, refetchStatuses } = useStatusesContext(); const { selectedBoard } = useBoardsContext(); const handleSave = (value: string) => { const newValue = value.trim(); if (newValue && newValue !== status.name) { - onUpdateStatus(status.id, { name: newValue }); + statusesCrud.onUpdate(status.id, { name: newValue }); } }; @@ -55,7 +54,7 @@ const StatusColumnHeader: FC = ({ status, isDragging }) => { status={status} handleEdit={startEditing} refetchStatuses={refetchStatuses} - onDeleteStatus={onDeleteStatus} + onDeleteStatus={statusesCrud.onDelete} /> )} diff --git a/src/app/deals/contexts/BoardsContext.tsx b/src/app/deals/contexts/BoardsContext.tsx index ff1b379..83b546b 100644 --- a/src/app/deals/contexts/BoardsContext.tsx +++ b/src/app/deals/contexts/BoardsContext.tsx @@ -2,9 +2,9 @@ import React, { createContext, FC, useContext, useState } from "react"; import { useProjectsContext } from "@/app/deals/contexts/ProjectsContext"; +import { BoardsCrud, useBoardsCrud } from "@/hooks/useBoardsCrud"; import useBoardsList from "@/hooks/useBoardsList"; -import { useBoardsOperations } from "@/hooks/useBoardsOperations"; -import { BoardSchema, UpdateBoardSchema } from "@/lib/client"; +import { BoardSchema } from "@/lib/client"; type BoardsContextState = { boards: BoardSchema[]; @@ -12,9 +12,7 @@ type BoardsContextState = { selectedBoard: BoardSchema | null; setSelectedBoardId: React.Dispatch>; refetchBoards: () => void; - onCreateBoard: (name: string) => void; - onUpdateBoard: (boardId: number, board: UpdateBoardSchema) => void; - onDeleteBoard: (board: BoardSchema) => void; + boardsCrud: BoardsCrud; isEditorDrawerOpened: boolean; setIsEditorDrawerOpened: React.Dispatch>; }; @@ -39,7 +37,7 @@ const useBoardsContextState = () => { setSelectedBoardId(boards[0].id); } - const { onCreate, onUpdate, onDelete } = useBoardsOperations({ + const boardsCrud = useBoardsCrud({ boards, setBoards, refetchBoards, @@ -52,9 +50,7 @@ const useBoardsContextState = () => { selectedBoard, setSelectedBoardId, refetchBoards, - onCreateBoard: onCreate, - onUpdateBoard: onUpdate, - onDeleteBoard: onDelete, + boardsCrud, isEditorDrawerOpened, setIsEditorDrawerOpened, }; diff --git a/src/app/deals/contexts/ProjectsContext.tsx b/src/app/deals/contexts/ProjectsContext.tsx index 44392e8..76d1a59 100644 --- a/src/app/deals/contexts/ProjectsContext.tsx +++ b/src/app/deals/contexts/ProjectsContext.tsx @@ -1,18 +1,16 @@ "use client"; import React, { createContext, FC, useContext, useState } from "react"; +import { ProjectsCrud, useProjectsCrud } from "@/hooks/useProjectsCrud"; import useProjectsList from "@/hooks/useProjectsList"; -import { useProjectsOperations } from "@/hooks/useProjectsOperations"; -import { ProjectSchema, UpdateProjectSchema } from "@/lib/client"; +import { ProjectSchema } from "@/lib/client"; type ProjectsContextState = { selectedProject: ProjectSchema | null; setSelectedProjectId: React.Dispatch>; refetchProjects: () => Promise; projects: ProjectSchema[]; - onCreateProject: (name: string) => void; - onUpdateProject: (projectId: number, project: UpdateProjectSchema) => void; - onDeleteProject: (project: ProjectSchema) => void; + projectsCrud: ProjectsCrud; }; const ProjectsContext = createContext( @@ -36,7 +34,7 @@ const useProjectsContextState = () => { setSelectedProjectId(projects[0].id); } - const { onCreate, onUpdate, onDelete } = useProjectsOperations({ + const projectsCrud = useProjectsCrud({ projects, setProjects, refetchProjects, @@ -47,9 +45,7 @@ const useProjectsContextState = () => { selectedProject, refetchProjects, setSelectedProjectId, - onCreateProject: onCreate, - onUpdateProject: onUpdate, - onDeleteProject: onDelete, + projectsCrud, }; }; diff --git a/src/app/deals/contexts/StatusesContext.tsx b/src/app/deals/contexts/StatusesContext.tsx index 2f12034..dc4b147 100644 --- a/src/app/deals/contexts/StatusesContext.tsx +++ b/src/app/deals/contexts/StatusesContext.tsx @@ -2,17 +2,15 @@ import React, { createContext, FC, useContext } from "react"; import { useBoardsContext } from "@/app/deals/contexts/BoardsContext"; +import { StatusesCrud, useStatusesCrud } from "@/hooks/useStatusesCrud"; import useStatusesList from "@/hooks/useStatusesList"; -import { useStatusesOperations } from "@/hooks/useStatusesOperations"; -import { StatusSchema, UpdateStatusSchema } from "@/lib/client"; +import { StatusSchema } from "@/lib/client"; type StatusesContextState = { statuses: StatusSchema[]; setStatuses: React.Dispatch>; refetchStatuses: () => void; - onCreateStatus: (name: string) => void; - onUpdateStatus: (statusId: number, status: UpdateStatusSchema) => void; - onDeleteStatus: (status: StatusSchema) => void; + statusesCrud: StatusesCrud; }; const StatusesContext = createContext( @@ -29,7 +27,7 @@ const useStatusesContextState = () => { boardId: selectedBoard?.id, }); - const { onCreate, onUpdate, onDelete } = useStatusesOperations({ + const statusesCrud = useStatusesCrud({ statuses, setStatuses, refetchStatuses, @@ -40,9 +38,7 @@ const useStatusesContextState = () => { statuses, setStatuses, refetchStatuses, - onCreateStatus: onCreate, - onUpdateStatus: onUpdate, - onDeleteStatus: onDelete, + statusesCrud, }; }; diff --git a/src/app/deals/drawers/BoardStatusesEditorDrawer/components/CreateStatusButton.tsx b/src/app/deals/drawers/BoardStatusesEditorDrawer/components/CreateStatusButton.tsx index ec1abd9..9ae6dce 100644 --- a/src/app/deals/drawers/BoardStatusesEditorDrawer/components/CreateStatusButton.tsx +++ b/src/app/deals/drawers/BoardStatusesEditorDrawer/components/CreateStatusButton.tsx @@ -5,7 +5,7 @@ import { modals } from "@mantine/modals"; import { useBoardStatusesContext } from "@/app/deals/drawers/BoardStatusesEditorDrawer/contexts/BoardStatusesContext"; const CreateStatusButton: FC = () => { - const { onCreateStatus } = useBoardStatusesContext(); + const { statusesCrud } = useBoardStatusesContext(); const onStartCreating = () => { modals.openContextModal({ @@ -13,7 +13,7 @@ const CreateStatusButton: FC = () => { title: "Создание колонки", withCloseButton: true, innerProps: { - onComplete: onCreateStatus, + onComplete: statusesCrud.onCreate, }, }); }; diff --git a/src/app/deals/drawers/BoardStatusesEditorDrawer/components/StatusMobile.tsx b/src/app/deals/drawers/BoardStatusesEditorDrawer/components/StatusMobile.tsx index 6bd6ea7..92acfaf 100644 --- a/src/app/deals/drawers/BoardStatusesEditorDrawer/components/StatusMobile.tsx +++ b/src/app/deals/drawers/BoardStatusesEditorDrawer/components/StatusMobile.tsx @@ -11,7 +11,7 @@ type Props = { }; const StatusMobile: FC = ({ status, board }) => { - const { onUpdateStatus, onDeleteStatus } = useBoardStatusesContext(); + const { statusesCrud } = useBoardStatusesContext(); const startEditing = () => { modals.openContextModal({ @@ -19,7 +19,7 @@ const StatusMobile: FC = ({ status, board }) => { title: "Редактирование статуса", withCloseButton: true, innerProps: { - onComplete: name => onUpdateStatus(status.id, { name }), + onComplete: name => statusesCrud.onUpdate(status.id, { name }), defaultValue: status.name, }, }); @@ -38,7 +38,7 @@ const StatusMobile: FC = ({ status, board }) => { diff --git a/src/app/deals/drawers/BoardStatusesEditorDrawer/components/StatusesDrawerBody.tsx b/src/app/deals/drawers/BoardStatusesEditorDrawer/components/StatusesDrawerBody.tsx index 6b71467..064c703 100644 --- a/src/app/deals/drawers/BoardStatusesEditorDrawer/components/StatusesDrawerBody.tsx +++ b/src/app/deals/drawers/BoardStatusesEditorDrawer/components/StatusesDrawerBody.tsx @@ -12,7 +12,7 @@ type Props = { }; const StatusesDrawerBody: FC = ({ onClose }) => { - const { onUpdateStatus, board, statuses } = useBoardStatusesContext(); + const { statusesCrud, board, statuses } = useBoardStatusesContext(); const renderDraggable = () => ( @@ -36,7 +36,7 @@ const StatusesDrawerBody: FC = ({ onClose }) => { }; const onDragEnd = (itemId: number, newLexorank: string) => - onUpdateStatus(itemId, { lexorank: newLexorank }); + statusesCrud.onUpdate(itemId, { lexorank: newLexorank }); return ( <> diff --git a/src/app/deals/drawers/BoardStatusesEditorDrawer/contexts/BoardStatusesContext.tsx b/src/app/deals/drawers/BoardStatusesEditorDrawer/contexts/BoardStatusesContext.tsx index 3334d92..79037e4 100644 --- a/src/app/deals/drawers/BoardStatusesEditorDrawer/contexts/BoardStatusesContext.tsx +++ b/src/app/deals/drawers/BoardStatusesEditorDrawer/contexts/BoardStatusesContext.tsx @@ -1,18 +1,16 @@ "use client"; import React, { createContext, FC, useContext } from "react"; +import { StatusesCrud, useStatusesCrud } from "@/hooks/useStatusesCrud"; import useStatusesList from "@/hooks/useStatusesList"; -import { useStatusesOperations } from "@/hooks/useStatusesOperations"; -import { BoardSchema, StatusSchema, UpdateStatusSchema } from "@/lib/client"; +import { BoardSchema, StatusSchema } from "@/lib/client"; type BoardStatusesContextState = { board: BoardSchema; statuses: StatusSchema[]; setStatuses: React.Dispatch>; refetchStatuses: () => void; - onCreateStatus: (name: string) => void; - onUpdateStatus: (statusId: number, status: UpdateStatusSchema) => void; - onDeleteStatus: (status: StatusSchema) => void; + statusesCrud: StatusesCrud; }; const BoardStatusesContext = createContext< @@ -32,7 +30,7 @@ const useBoardStatusesContextState = ({ board }: Props) => { boardId: board.id, }); - const { onCreate, onUpdate, onDelete } = useStatusesOperations({ + const statusesCrud = useStatusesCrud({ statuses, setStatuses, refetchStatuses, @@ -44,9 +42,7 @@ const useBoardStatusesContextState = ({ board }: Props) => { statuses, setStatuses, refetchStatuses, - onCreateStatus: onCreate, - onUpdateStatus: onUpdate, - onDeleteStatus: onDelete, + statusesCrud, }; }; diff --git a/src/app/deals/drawers/ProjectBoardsEditorDrawer/components/BoardMobile.tsx b/src/app/deals/drawers/ProjectBoardsEditorDrawer/components/BoardMobile.tsx index ded2bd7..6325169 100644 --- a/src/app/deals/drawers/ProjectBoardsEditorDrawer/components/BoardMobile.tsx +++ b/src/app/deals/drawers/ProjectBoardsEditorDrawer/components/BoardMobile.tsx @@ -10,7 +10,7 @@ type Props = { }; const BoardMobile: FC = ({ board }) => { - const { onUpdateBoard, onDeleteBoard } = useProjectBoardsContext(); + const { boardsCrud } = useProjectBoardsContext(); const startEditing = () => { modals.openContextModal({ @@ -18,7 +18,7 @@ const BoardMobile: FC = ({ board }) => { title: "Редактирование доски", withCloseButton: true, innerProps: { - onComplete: name => onUpdateBoard(board.id, { name }), + onComplete: name => boardsCrud.onUpdate(board.id, { name }), defaultValue: board.name, }, }); @@ -37,7 +37,7 @@ const BoardMobile: FC = ({ board }) => { ); diff --git a/src/app/deals/drawers/ProjectBoardsEditorDrawer/components/BoardsDrawerBody.tsx b/src/app/deals/drawers/ProjectBoardsEditorDrawer/components/BoardsDrawerBody.tsx index b41fa96..2bc701e 100644 --- a/src/app/deals/drawers/ProjectBoardsEditorDrawer/components/BoardsDrawerBody.tsx +++ b/src/app/deals/drawers/ProjectBoardsEditorDrawer/components/BoardsDrawerBody.tsx @@ -12,8 +12,7 @@ type Props = { }; const BoardsDrawerBody: FC = ({ onClose }) => { - const { boards, onUpdateBoard, project, onCreateBoard } = - useProjectBoardsContext(); + const { boards, boardsCrud, project } = useProjectBoardsContext(); const renderDraggable = () => ( @@ -34,7 +33,7 @@ const BoardsDrawerBody: FC = ({ onClose }) => { }; const onDragEnd = (itemId: number, newLexorank: string) => { - onUpdateBoard(itemId, { lexorank: newLexorank }); + boardsCrud.onUpdate(itemId, { lexorank: newLexorank }); }; return ( @@ -59,7 +58,7 @@ const BoardsDrawerBody: FC = ({ onClose }) => { dragHandleStyle={{ width: "auto" }} vertical /> - + ); }; diff --git a/src/app/deals/drawers/ProjectBoardsEditorDrawer/contexts/ProjectBoardsContext.tsx b/src/app/deals/drawers/ProjectBoardsEditorDrawer/contexts/ProjectBoardsContext.tsx index 51bfda3..e85e12d 100644 --- a/src/app/deals/drawers/ProjectBoardsEditorDrawer/contexts/ProjectBoardsContext.tsx +++ b/src/app/deals/drawers/ProjectBoardsEditorDrawer/contexts/ProjectBoardsContext.tsx @@ -1,18 +1,16 @@ "use client"; import React, { createContext, FC, useContext } from "react"; +import { BoardsCrud, useBoardsCrud } from "@/hooks/useBoardsCrud"; import useBoardsList from "@/hooks/useBoardsList"; -import { useBoardsOperations } from "@/hooks/useBoardsOperations"; -import { BoardSchema, ProjectSchema, UpdateBoardSchema } from "@/lib/client"; +import { BoardSchema, ProjectSchema } from "@/lib/client"; type ProjectBoardsContextState = { boards: BoardSchema[]; setBoards: React.Dispatch>; project: ProjectSchema; refetchBoards: () => void; - onCreateBoard: (name: string) => void; - onUpdateBoard: (boardId: number, board: UpdateBoardSchema) => void; - onDeleteBoard: (board: BoardSchema) => void; + boardsCrud: BoardsCrud; }; const ProjectBoardsContext = createContext< @@ -30,7 +28,7 @@ const useProjectBoardsContextState = ({ project }: Props) => { refetch: refetchBoards, } = useBoardsList({ projectId: project?.id }); - const { onCreate, onUpdate, onDelete } = useBoardsOperations({ + const boardsCrud = useBoardsCrud({ boards, setBoards, refetchBoards, @@ -42,9 +40,7 @@ const useProjectBoardsContextState = ({ project }: Props) => { setBoards, project, refetchBoards, - onCreateBoard: onCreate, - onUpdateBoard: onUpdate, - onDeleteBoard: onDelete, + boardsCrud, }; }; diff --git a/src/app/deals/drawers/ProjectsEditorDrawer/components/CreateProjectButton.tsx b/src/app/deals/drawers/ProjectsEditorDrawer/components/CreateProjectButton.tsx index bb07c9f..5503bdd 100644 --- a/src/app/deals/drawers/ProjectsEditorDrawer/components/CreateProjectButton.tsx +++ b/src/app/deals/drawers/ProjectsEditorDrawer/components/CreateProjectButton.tsx @@ -5,7 +5,7 @@ import { modals } from "@mantine/modals"; import { useProjectsContext } from "@/app/deals/contexts/ProjectsContext"; const CreateProjectButton: FC = () => { - const { onCreateProject } = useProjectsContext(); + const { projectsCrud } = useProjectsContext(); const onStartCreating = () => { modals.openContextModal({ @@ -13,7 +13,7 @@ const CreateProjectButton: FC = () => { title: "Создание проекта", withCloseButton: true, innerProps: { - onComplete: onCreateProject, + onComplete: projectsCrud.onCreate, }, }); }; diff --git a/src/app/deals/drawers/ProjectsEditorDrawer/components/ProjectMenu.tsx b/src/app/deals/drawers/ProjectsEditorDrawer/components/ProjectMenu.tsx index 271ff80..bbaa447 100644 --- a/src/app/deals/drawers/ProjectsEditorDrawer/components/ProjectMenu.tsx +++ b/src/app/deals/drawers/ProjectsEditorDrawer/components/ProjectMenu.tsx @@ -11,7 +11,7 @@ type Props = { }; const ProjectMenu: FC = ({ project, startEditing }) => { - const { onDeleteProject } = useProjectsContext(); + const { projectsCrud } = useProjectsContext(); return ( @@ -36,7 +36,7 @@ const ProjectMenu: FC = ({ project, startEditing }) => { { e.stopPropagation(); - onDeleteProject(project); + projectsCrud.onDelete(project); }}> diff --git a/src/app/deals/drawers/ProjectsEditorDrawer/components/ProjectMobile.tsx b/src/app/deals/drawers/ProjectsEditorDrawer/components/ProjectMobile.tsx index 7c8ffce..62b244b 100644 --- a/src/app/deals/drawers/ProjectsEditorDrawer/components/ProjectMobile.tsx +++ b/src/app/deals/drawers/ProjectsEditorDrawer/components/ProjectMobile.tsx @@ -17,7 +17,7 @@ const ProjectMobile: FC = ({ setSelectedProjectId, closeDrawer, }) => { - const { onUpdateProject } = useProjectsContext(); + const { projectsCrud } = useProjectsContext(); const startEditing = () => { modals.openContextModal({ @@ -25,7 +25,7 @@ const ProjectMobile: FC = ({ title: "Редактирование проекта", withCloseButton: true, innerProps: { - onComplete: name => onUpdateProject(project.id, { name }), + onComplete: name => projectsCrud.onUpdate(project.id, { name }), defaultValue: project.name, }, }); diff --git a/src/app/deals/hooks/useDealsAndStatusesDnd.ts b/src/app/deals/hooks/useDealsAndStatusesDnd.ts index b03aefb..654e77c 100644 --- a/src/app/deals/hooks/useDealsAndStatusesDnd.ts +++ b/src/app/deals/hooks/useDealsAndStatusesDnd.ts @@ -24,7 +24,7 @@ const useDealsAndStatusesDnd = (): ReturnType => { const swiperRef = useRef(null); const [activeDeal, setActiveDeal] = useState(null); const [activeStatus, setActiveStatus] = useState(null); - const { statuses, setStatuses, onUpdateStatus } = useStatusesContext(); + const { statuses, setStatuses, statusesCrud } = useStatusesContext(); const { deals, setDeals, updateDeal } = useDealsContext(); const sortedStatuses = useMemo(() => sortByLexorank(statuses), [statuses]); const isMobile = useIsMobile(); @@ -229,7 +229,7 @@ const useDealsAndStatusesDnd = (): ReturnType => { }; const onStatusDragEnd = (statusId: number, lexorank: string) => { - onUpdateStatus(statusId, { lexorank }); + statusesCrud.onUpdate(statusId, { lexorank }); }; const handleDealDragEnd = (activeId: number | string, over: Over) => { diff --git a/src/hooks/base/index.ts b/src/hooks/baseCrud/index.ts similarity index 100% rename from src/hooks/base/index.ts rename to src/hooks/baseCrud/index.ts diff --git a/src/hooks/baseCrud/types.ts b/src/hooks/baseCrud/types.ts new file mode 100644 index 0000000..efb14dc --- /dev/null +++ b/src/hooks/baseCrud/types.ts @@ -0,0 +1,32 @@ +import { Options } from "@/lib/client"; + +export type BaseEntity = { + id: number; + name: string; + lexorank?: string; +}; + +export type CreateMutationOptions = Options<{ + body: any; + query: undefined; + path: undefined; + url: string; +}>; + +export type UpdateMutationOptions = Options<{ + body: any; + query: undefined; + path: { + pk: number; + }; + url: string; +}>; + +export type DeleteMutationOptions = Options<{ + body: undefined; + query: undefined; + path: { + pk: number; + }; + url: string; +}>; diff --git a/src/hooks/base/useCrudOperations.tsx b/src/hooks/baseCrud/useCrudOperations.tsx similarity index 83% rename from src/hooks/base/useCrudOperations.tsx rename to src/hooks/baseCrud/useCrudOperations.tsx index 2309e72..d96a2aa 100644 --- a/src/hooks/base/useCrudOperations.tsx +++ b/src/hooks/baseCrud/useCrudOperations.tsx @@ -3,46 +3,23 @@ import { useMutation, UseMutationOptions } from "@tanstack/react-query"; import { AxiosError } from "axios"; import { Text } from "@mantine/core"; import { modals } from "@mantine/modals"; -import { HttpValidationError, Options } from "@/lib/client"; +import { + BaseEntity, + CreateMutationOptions, + DeleteMutationOptions, + UpdateMutationOptions, +} from "@/hooks/baseCrud/types"; +import { HttpValidationError } from "@/lib/client"; import { notifications } from "@/lib/notifications"; import { sortByLexorank } from "@/utils/lexorank"; -type BaseEntity = { - id: number; - name: string; - lexorank?: string; +type CrudOperations = { + onCreate: (name: string) => void; + onUpdate: (id: number, update: TUpdate) => void; + onDelete: (entity: TEntity) => void; }; -type CreateMutationOptions = Options<{ - body: any; - query: undefined; - path: undefined; - url: string; -}>; - -type UpdateMutationOptions = Options<{ - body: any; - query: undefined; - path: { - pk: number; - }; - url: string; -}>; - -type DeleteMutationOptions = Options<{ - body: undefined; - query: undefined; - path: { - pk: number; - }; - url: string; -}>; - -type UseEntityOperationsProps< - TEntity extends BaseEntity, - TUpdate, - TCreate, -> = { +type UseEntityOperationsProps = { entities: TEntity[]; setEntities: React.Dispatch>; refetch: () => void; @@ -80,7 +57,10 @@ const useCrudOperations = < getCreateEntity, getUpdateEntity, getDeleteConfirmTitle, -}: UseEntityOperationsProps) => { +}: UseEntityOperationsProps): CrudOperations< + TEntity, + TUpdate +> => { const onError = (error: AxiosError) => { console.error(error); notifications.error({ diff --git a/src/hooks/useBoardsOperations.tsx b/src/hooks/useBoardsCrud.tsx similarity index 91% rename from src/hooks/useBoardsOperations.tsx rename to src/hooks/useBoardsCrud.tsx index 04cf015..56bf338 100644 --- a/src/hooks/useBoardsOperations.tsx +++ b/src/hooks/useBoardsCrud.tsx @@ -1,6 +1,6 @@ import React from "react"; import { LexoRank } from "lexorank"; -import { useCrudOperations } from "@/hooks/base"; +import { useCrudOperations } from "@/hooks/baseCrud"; import { BoardSchema, CreateBoardSchema, @@ -20,18 +20,18 @@ type UseBoardsOperationsProps = { projectId?: number; }; -type BoardsOperations = { +export type BoardsCrud = { onCreate: (name: string) => void; onUpdate: (boardId: number, board: UpdateBoardSchema) => void; onDelete: (board: BoardSchema) => void; }; -export const useBoardsOperations = ({ +export const useBoardsCrud = ({ boards, setBoards, refetchBoards, projectId, -}: UseBoardsOperationsProps): BoardsOperations => { +}: UseBoardsOperationsProps): BoardsCrud => { return useCrudOperations( { entities: boards, diff --git a/src/hooks/useProjectsOperations.tsx b/src/hooks/useProjectsCrud.tsx similarity index 89% rename from src/hooks/useProjectsOperations.tsx rename to src/hooks/useProjectsCrud.tsx index a59a3d8..6455e06 100644 --- a/src/hooks/useProjectsOperations.tsx +++ b/src/hooks/useProjectsCrud.tsx @@ -1,5 +1,5 @@ import React from "react"; -import { useCrudOperations } from "@/hooks/base"; +import { useCrudOperations } from "@/hooks/baseCrud"; import { CreateProjectSchema, ProjectSchema, @@ -17,17 +17,17 @@ type Props = { refetchProjects: () => void; }; -type ProjectsOperations = { +export type ProjectsCrud = { onCreate: (name: string) => void; onUpdate: (projectId: number, project: UpdateProjectSchema) => void; onDelete: (project: ProjectSchema) => void; }; -export const useProjectsOperations = ({ +export const useProjectsCrud = ({ projects, setProjects, refetchProjects, -}: Props): ProjectsOperations => { +}: Props): ProjectsCrud => { return useCrudOperations< ProjectSchema, UpdateProjectSchema, diff --git a/src/hooks/useStatusesOperations.tsx b/src/hooks/useStatusesCrud.tsx similarity index 92% rename from src/hooks/useStatusesOperations.tsx rename to src/hooks/useStatusesCrud.tsx index e1df050..463c467 100644 --- a/src/hooks/useStatusesOperations.tsx +++ b/src/hooks/useStatusesCrud.tsx @@ -1,6 +1,6 @@ import React from "react"; import { LexoRank } from "lexorank"; -import { useCrudOperations } from "@/hooks/base"; +import { useCrudOperations } from "@/hooks/baseCrud"; import { CreateStatusSchema, StatusSchema, @@ -20,18 +20,18 @@ type Props = { boardId?: number; }; -type StatusesOperations = { +export type StatusesCrud = { onCreate: (name: string) => void; onUpdate: (statusId: number, status: UpdateStatusSchema) => void; onDelete: (status: StatusSchema) => void; }; -export const useStatusesOperations = ({ +export const useStatusesCrud = ({ statuses, setStatuses, refetchStatuses, boardId, -}: Props): StatusesOperations => { +}: Props): StatusesCrud => { return useCrudOperations< StatusSchema, UpdateStatusSchema,