refactoring
This commit is contained in:
116
src/contexts/BoardsContext.tsx
Normal file
116
src/contexts/BoardsContext.tsx
Normal 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;
|
||||
};
|
||||
Reference in New Issue
Block a user