feat: raw deals dnd between statuses
This commit is contained in:
92
src/app/deals/contexts/BoardsContext.tsx
Normal file
92
src/app/deals/contexts/BoardsContext.tsx
Normal file
@ -0,0 +1,92 @@
|
||||
"use client";
|
||||
|
||||
import React, {
|
||||
createContext,
|
||||
FC,
|
||||
useContext,
|
||||
useEffect,
|
||||
useState,
|
||||
} from "react";
|
||||
import { useProjectsContext } from "@/app/deals/contexts/ProjectsContext";
|
||||
import useBoards from "@/app/deals/hooks/useBoards";
|
||||
import useDeals from "@/app/deals/hooks/useDeals";
|
||||
import useStatuses from "@/app/deals/hooks/useStatuses";
|
||||
import { BoardSchema } from "@/types/BoardSchema";
|
||||
import { DealSchema } from "@/types/DealSchema";
|
||||
import { StatusSchema } from "@/types/StatusSchema";
|
||||
|
||||
type BoardsContextState = {
|
||||
boards: BoardSchema[];
|
||||
setBoards: React.Dispatch<React.SetStateAction<BoardSchema[]>>;
|
||||
selectedBoard: BoardSchema | null;
|
||||
setSelectedBoard: React.Dispatch<React.SetStateAction<BoardSchema | null>>;
|
||||
statuses: StatusSchema[];
|
||||
setStatuses: React.Dispatch<React.SetStateAction<StatusSchema[]>>;
|
||||
deals: DealSchema[];
|
||||
setDeals: React.Dispatch<React.SetStateAction<DealSchema[]>>;
|
||||
};
|
||||
|
||||
const BoardsContext = createContext<BoardsContextState | undefined>(undefined);
|
||||
|
||||
const useBoardsContextState = () => {
|
||||
const { boards, setBoards } = useBoards();
|
||||
const [selectedBoard, setSelectedBoard] = useState<BoardSchema | null>(
|
||||
null
|
||||
);
|
||||
const { selectedProject: project } = useProjectsContext();
|
||||
const { statuses, setStatuses } = useStatuses();
|
||||
const { deals, setDeals } = useDeals();
|
||||
|
||||
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]);
|
||||
|
||||
return {
|
||||
boards,
|
||||
setBoards,
|
||||
selectedBoard,
|
||||
setSelectedBoard,
|
||||
statuses,
|
||||
setStatuses,
|
||||
deals,
|
||||
setDeals,
|
||||
};
|
||||
};
|
||||
|
||||
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