import React, { createContext, FC, useContext, useEffect, useState } from "react"; import { CardSchema, CardService } from "../../../client"; type CardPageContextState = { selectedCard?: CardSchema; setSelectedCard: (card: CardSchema | undefined) => void; refetchCards: () => void; refetchCard: () => void; }; const CardPageContext = createContext( undefined, ); type CardPageContextStateProps = { refetchCards: () => void; defaultCardId?: number; } const useCardPageContextState = (props: CardPageContextStateProps) => { const { refetchCards, defaultCardId } = props; const [selectedCard, setSelectedCard] = useState(undefined); const refetchCard = () => { const cardId = selectedCard?.id ?? defaultCardId; if (!cardId) return; CardService.getCardById({ cardId }).then(card => { setSelectedCard(card); }); }; useEffect(() => { refetchCard(); }, []); return { selectedCard, setSelectedCard, refetchCards, refetchCard, }; }; type CardPageContextProviderProps = { children: React.ReactNode; } & CardPageContextStateProps; export const CardPageContextProvider: FC = ({ children, ...props }) => { const state = useCardPageContextState(props); return ( {children} ); }; export const useCardPageContext = () => { const context = useContext(CardPageContext); if (!context) { throw new Error( "useCardPageContext must be used within a CardPageContextProvider", ); } return context; };