import { createContext, FC, useContext, useEffect, useState } from "react"; import { DealSchema, DealService } from "../../../client"; type DealPageContextState = { selectedDeal?: DealSchema; setSelectedDeal: (deal: DealSchema | undefined) => void; refetchDeals: () => Promise; refetchDeal: () => void; }; const DealPageContext = createContext( undefined, ); type DealPageContextStateProps = { refetchDeals: () => Promise; defaultDealId?: number; } const useDealPageContextState = (props: DealPageContextStateProps) => { const { refetchDeals, defaultDealId } = props; const [selectedDeal, setSelectedDeal] = useState( undefined, ); const refetchDeal = () => { const dealId = selectedDeal?.id ?? defaultDealId; if (!dealId) return; DealService.getDealById({ dealId }).then(deal => { setSelectedDeal(deal); }); }; useEffect(() => { refetchDeal(); }, []); return { selectedDeal, setSelectedDeal, refetchDeals, refetchDeal, }; }; type DealPageContextProviderProps = { children: React.ReactNode; refetchDeals: () => Promise; defaultDealId?: number; }; export const DealPageContextProvider: FC = ({ children, refetchDeals, defaultDealId, }) => { const state = useDealPageContextState({ refetchDeals, defaultDealId }); return ( {children} ); }; export const useDealPageContext = () => { const context = useContext(DealPageContext); if (!context) { throw new Error( "useDealPageContext must be used within a DealPageContextProvider", ); } return context; };