import { createContext, useContext } from "react"; import type { AssetAccount, AssetAccountsQuery, AssetAccountRef, TradeQuoteAssetKind, LinkedAccount, LinkedAccountRef, LinkedAccountStatusRef, PresentationBackground, PresentationStyle, Service, Trade, TradeRef, TradesQuery, TradeQuote, TradeQuotesRequest, TradeAssetKind, } from "./types"; export type CandleContextValue = { presentCandleTradeExecutionSheet: < GainedAssetKind extends TradeQuoteAssetKind, LostAssetKind extends TradeQuoteAssetKind >(input: { tradeQuote: TradeQuote; presentationBackground?: PresentationBackground; completion?: ( result: | ({ kind: "success" } & Trade) | { kind: "failure"; error: Error } ) => void; }) => void; presentCandleLinkSheet: (input: { services?: Service[]; cornerRadius?: number; customerName?: string; showSandbox?: boolean; showDynamicLoading?: boolean; presentationBackground?: PresentationBackground; presentationStyle?: PresentationStyle; onSuccess: (account: LinkedAccount) => void; }) => void; getLinkedAccounts: () => Promise; getLinkedAccount: (ref: LinkedAccountRef) => Promise; unlinkAccount: (ref: LinkedAccountRef) => Promise; createUser: (input: { appUserID: string }) => Promise; deleteUser: () => Promise; getAssetAccounts: (query?: AssetAccountsQuery) => Promise<{ assetAccounts: AssetAccount[]; linkedAccounts: LinkedAccountStatusRef[]; }>; getAssetAccount: (ref: AssetAccountRef) => Promise; getTrades: (query?: TradesQuery) => Promise<{ trades: Trade[]; linkedAccounts: LinkedAccountStatusRef[]; }>; getTrade: (input: TradeRef) => Promise>; getTradeQuotes: < GainedAssetKind extends TradeQuoteAssetKind, LostAssetKind extends TradeQuoteAssetKind >( request: TradeQuotesRequest ) => Promise<{ tradeQuotes: TradeQuote[]; linkedAccounts: LinkedAccountStatusRef[]; }>; /** * This programmatic API is only available for customers on the Candle Enterprise Plan. * You can always execute trades by calling `presentCandleTradeExecutionSheet` which obtains user permission for the action. */ executeTrade: < GainedAssetKind extends TradeQuoteAssetKind, LostAssetKind extends TradeQuoteAssetKind >( tradeQuote: TradeQuote ) => Promise>; }; export const CandleContext = createContext(null); export const useCandle = () => { const ctx = useContext(CandleContext); if (ctx === null) { throw new Error( "`useCandle` must be used within a . Wrap your app's root with ." ); } return ctx; };