refactor: crud objects in contexts

This commit is contained in:
2025-08-23 11:20:32 +04:00
parent f2084ae3d4
commit 6ad813ea1d
25 changed files with 120 additions and 128 deletions

View File

@ -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,
},
});
};

View File

@ -11,7 +11,7 @@ type Props = {
};
const StatusMobile: FC<Props> = ({ status, board }) => {
const { onUpdateStatus, onDeleteStatus } = useBoardStatusesContext();
const { statusesCrud } = useBoardStatusesContext();
const startEditing = () => {
modals.openContextModal({
@ -19,7 +19,7 @@ const StatusMobile: FC<Props> = ({ 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<Props> = ({ status, board }) => {
<StatusMenu
status={status}
board={board}
onDeleteStatus={onDeleteStatus}
onDeleteStatus={statusesCrud.onDelete}
handleEdit={startEditing}
withChangeOrderButton={false}
/>

View File

@ -12,7 +12,7 @@ type Props = {
};
const StatusesDrawerBody: FC<Props> = ({ onClose }) => {
const { onUpdateStatus, board, statuses } = useBoardStatusesContext();
const { statusesCrud, board, statuses } = useBoardStatusesContext();
const renderDraggable = () => (
<Box p={"xs"}>
@ -36,7 +36,7 @@ const StatusesDrawerBody: FC<Props> = ({ onClose }) => {
};
const onDragEnd = (itemId: number, newLexorank: string) =>
onUpdateStatus(itemId, { lexorank: newLexorank });
statusesCrud.onUpdate(itemId, { lexorank: newLexorank });
return (
<>

View File

@ -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<React.SetStateAction<StatusSchema[]>>;
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,
};
};

View File

@ -10,7 +10,7 @@ type Props = {
};
const BoardMobile: FC<Props> = ({ board }) => {
const { onUpdateBoard, onDeleteBoard } = useProjectBoardsContext();
const { boardsCrud } = useProjectBoardsContext();
const startEditing = () => {
modals.openContextModal({
@ -18,7 +18,7 @@ const BoardMobile: FC<Props> = ({ 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<Props> = ({ board }) => {
<BoardMenu
board={board}
startEditing={startEditing}
onDeleteBoard={onDeleteBoard}
onDeleteBoard={boardsCrud.onDelete}
/>
</Group>
);

View File

@ -12,8 +12,7 @@ type Props = {
};
const BoardsDrawerBody: FC<Props> = ({ onClose }) => {
const { boards, onUpdateBoard, project, onCreateBoard } =
useProjectBoardsContext();
const { boards, boardsCrud, project } = useProjectBoardsContext();
const renderDraggable = () => (
<Box p={"xs"}>
@ -34,7 +33,7 @@ const BoardsDrawerBody: FC<Props> = ({ onClose }) => {
};
const onDragEnd = (itemId: number, newLexorank: string) => {
onUpdateBoard(itemId, { lexorank: newLexorank });
boardsCrud.onUpdate(itemId, { lexorank: newLexorank });
};
return (
@ -59,7 +58,7 @@ const BoardsDrawerBody: FC<Props> = ({ onClose }) => {
dragHandleStyle={{ width: "auto" }}
vertical
/>
<CreateBoardButton onCreateBoard={onCreateBoard} />
<CreateBoardButton onCreateBoard={boardsCrud.onCreate} />
</>
);
};

View File

@ -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<React.SetStateAction<BoardSchema[]>>;
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,
};
};

View File

@ -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,
},
});
};

View File

@ -11,7 +11,7 @@ type Props = {
};
const ProjectMenu: FC<Props> = ({ project, startEditing }) => {
const { onDeleteProject } = useProjectsContext();
const { projectsCrud } = useProjectsContext();
return (
<Menu>
@ -36,7 +36,7 @@ const ProjectMenu: FC<Props> = ({ project, startEditing }) => {
<Menu.Item
onClick={e => {
e.stopPropagation();
onDeleteProject(project);
projectsCrud.onDelete(project);
}}>
<Group wrap={"nowrap"}>
<IconTrash />

View File

@ -17,7 +17,7 @@ const ProjectMobile: FC<Props> = ({
setSelectedProjectId,
closeDrawer,
}) => {
const { onUpdateProject } = useProjectsContext();
const { projectsCrud } = useProjectsContext();
const startEditing = () => {
modals.openContextModal({
@ -25,7 +25,7 @@ const ProjectMobile: FC<Props> = ({
title: "Редактирование проекта",
withCloseButton: true,
innerProps: {
onComplete: name => onUpdateProject(project.id, { name }),
onComplete: name => projectsCrud.onUpdate(project.id, { name }),
defaultValue: project.name,
},
});