refactoring

This commit is contained in:
2025-03-10 23:35:05 +04:00
parent ea80e92c18
commit f8ae7c62a2
17 changed files with 280 additions and 266 deletions

View File

@@ -0,0 +1,116 @@
import React, { createContext, FC, useContext, useEffect, useState } from "react";
import { BoardSchema, BoardService } from "../client";
import { useProjectsContext } from "./ProjectsContext.tsx";
import { modals } from "@mantine/modals";
import { notifications } from "../shared/lib/notifications.ts";
import useBoards from "../pages/CardsPage/hooks/useBoards.tsx";
type BoardsContextState = {
boards: BoardSchema[],
refetchBoards: () => void,
selectedBoard: BoardSchema | null,
setSelectedBoard: React.Dispatch<React.SetStateAction<BoardSchema | null>>,
onCreateBoardClick: () => void,
onEditBoardClick: (board: BoardSchema) => void,
onDeleteBoardClick: (board: BoardSchema) => void,
};
const BoardsContext = createContext<BoardsContextState | undefined>(undefined);
const useBoardsContextState = () => {
const { boards, refetchBoards } = useBoards();
const [selectedBoard, setSelectedBoard] = useState<BoardSchema | null>(null);
const { selectedProject: project } = useProjectsContext();
useEffect(() => {
if (boards.length > 0 && selectedBoard === null) {
setSelectedBoard(boards[0]);
return;
}
if (selectedBoard) {
let newBoard = boards.find(board => board.id === selectedBoard.id);
if (!newBoard && boards.length > 0) {
newBoard = boards[0];
}
setSelectedBoard(newBoard ?? null);
}
}, [boards]);
const onEditBoardClick = (board: BoardSchema) => {
if (!project) return;
modals.openContextModal({
modal: "boardModal",
title: "Редактирование доски",
withCloseButton: false,
innerProps: {
projectId: project.id,
board,
refetchBoards,
},
});
};
const onCreateBoardClick = () => {
if (!project) return;
modals.openContextModal({
modal: "boardModal",
title: "Добавление доски",
withCloseButton: false,
innerProps: {
projectId: project.id,
refetchBoards,
},
});
};
const onDeleteBoardClick = (board: BoardSchema) => {
if (!board) return;
BoardService.deleteBoard({
boardId: board.id,
})
.then(({ ok, message }) => {
if (!ok) {
notifications.error({ message });
return;
}
refetchBoards();
})
.catch(err => console.log(err));
};
return {
boards,
refetchBoards,
selectedBoard,
setSelectedBoard,
onCreateBoardClick,
onEditBoardClick,
onDeleteBoardClick,
};
};
type BoardsContextProviderProps = {
children: React.ReactNode;
};
export const BoardsContextProvider: FC<BoardsContextProviderProps> = ({ children }) => {
const state = useBoardsContextState();
return (
<BoardsContext.Provider value={state}>
{children}
</BoardsContext.Provider>
);
};
export const useBoardsContext = () => {
const context = useContext(BoardsContext);
if (!context) {
throw new Error(
"useBoardsContext must be used within a BoardsContextProvider",
);
}
return context;
};