import { type ComponentType, type SetStateAction } from 'react';
import { type BridgeCustomerNext, type BridgeCustomerState } from '../../modals/CheckoutModal/VirtualFiatAccount/BridgeCustomer';
import { type BridgeKycNext, type BridgeKycState } from '../../modals/CheckoutModal/VirtualFiatAccount/BridgeKyc';
import { type ErrorScreenState } from '../../modals/CheckoutModal/VirtualFiatAccount/ErrorScreen';
import { type VirtualFiatAccountNext, type VirtualFiatAccountState } from '../../modals/CheckoutModal/VirtualFiatAccount/VirtualFiatAccount';
import { type DynamicTargetAssetCandidate, FunCheckoutStartingStep, type FunkitActiveCheckoutItem } from '../../providers/FunkitCheckoutContext';
import { type FunkitTextCustomizationsConfig } from '../../providers/FunkitConfigContext';
import { type PerpsTransferNext, type PerpsTransferState } from '../PolymarketPerpsTransfer/PerpsTransferStep';
import { type BrokerageSuccessState } from './Brokerage/BrokerageSuccessModal';
import { type BrokerageTwoFANext, type BrokerageTwoFAState } from './Brokerage/BrokerageTwoFA';
import { type ConnectExchangeNext, type ConnectExchangeState } from './Brokerage/ConnectExchange';
import { type SelectBrokerageNext, type SelectBrokerageState } from './Brokerage/SelectBrokerage';
import { type CheckoutCompleteNext, type CheckoutCompleteState } from './CheckoutComplete/CheckoutComplete';
import { type ConfirmationStepNext, type ConfirmationStepState } from './ConfirmationStep/ConfirmationStep';
import { FunCheckoutStep } from './FunCheckoutStep';
import { type InputAmountNext, type InputAmountState } from './InputAmount/InputAmount';
import { type LightningInvoiceNext, type LightningInvoiceState } from './LightningInvoice/LightningInvoice';
import { type LoadingAccountNext, type LoadingAccountState } from './LoadingAccount';
import { type MeldCurrencySelectNext, type MeldCurrencySelectState } from './MeldCurrencySelect/MeldCurrencySelect';
import { type MeldQuotesNext, type MeldQuotesState } from './MeldQuotes/MeldQuotes';
import { type MeldRedirectNext, type MeldRedirectState } from './MeldRedirect/MeldRedirect';
import { type SelectAssetNext, type SelectAssetState } from './SelectAsset/SelectAsset';
import { type SourceChangeNext, type SourceChangeState } from './SourceChange/SourceChange';
import { type SwappedIframeNext, type SwappedIframeState } from './SwappedIframe';
import { type TransferTokenNext, type TransferTokenState } from './TransferToken/TransferToken';
import { type FiatAccountDetailNext, type FiatAccountDetailState } from './VirtualFiatAccount/FiatAccountDetail';
import { type KycIframeNext, type KycIframeState } from './VirtualFiatAccount/KycIframe';
import { type WithdrawalCompleteNext, type WithdrawalCompleteState } from './Withdrawal/WithdrawalComplete';
import { type WithdrawalEnterAmountNext, type WithdrawalEnterAmountState } from './Withdrawal/WithdrawalEnterAmount';
export { FunCheckoutStep };
export interface CheckoutModalCommonState {
    checkoutId: string;
    /** Handles soft hiding of the dialog (without removing it from the DOM) */
    isSoftHidden: boolean;
    /** Whether checkout should not be allowed to continue due to security reasons*/
    isBlocked?: boolean;
    startingStep: FunCheckoutStartingStep;
    targetChainId: string;
    showWalletOptions?: boolean;
    hideBottomDivider: boolean;
}
export interface ModalStepComponentProps<S extends FunCheckoutStep = FunCheckoutStep> {
    modalState: CheckoutModalState<S>;
    onBack(): void;
    onClose(options?: {
        isNewDeposit?: boolean;
    }): void;
    onAnimationComplete(callback: () => void): void;
    onNext(payload: NextPayload<S>): void;
    /** Navigate directly to an arbitrary step state (animates + pushes history). */
    onStepChange(state: CheckoutModalState): void;
    setModalState(state: SetStateAction<CheckoutModalState<S>>): void;
}
/**
 * Props passed to a `sourceChangeScreen.customTopComponent` so it can navigate
 * the checkout modal (e.g. jump to a different step).
 */
export interface SourceChangeTopComponentProps {
    onStepChange: (state: CheckoutModalState) => void;
    modalState: CheckoutModalState;
    /**
     * The active checkout's routing id. Passed in (rather than read via
     * `useCheckoutContext`) because a custom top component may be bundled
     * separately from `@funkit/connect` (e.g. `@funkit/connect/clients/*`), where
     * the checkout context is a different instance and would read as empty.
     */
    dynamicRoutingId?: string;
    /**
     * Apply a destination candidate (target token + routing id + optional
     * recipient) in one atomic update — the same selection path the
     * SourceChange target-asset dropdown uses.
     */
    applyDynamicTargetAssetCandidate: (candidate: DynamicTargetAssetCandidate) => void;
}
export declare function extractCommonState(state: CheckoutModalState): CheckoutModalCommonState;
interface ModalStepInput<S extends FunCheckoutStep> {
    state: CheckoutModalState<S>;
    apiKey: string;
    isSourceNavWidgetEnabled: boolean;
}
export type ModalStepInfo<S extends FunCheckoutStep> = {
    Component: ComponentType<ModalStepComponentProps<S>>;
    disableBack?: (info: ModalStepInput<S>) => boolean;
    /** Hides the bottom section (portal target for bottom bar content) */
    hideBottomSection?: (state: CheckoutModalState<S>) => boolean;
    /** Hides the close button in the Dialog Title element */
    hideClose?: (startingStep?: FunCheckoutStartingStep) => boolean;
    /** Hides the entire topbar including back button, close button, and title */
    hideTopbar?: (state: CheckoutModalState<S>) => boolean;
    onBack?(state: CheckoutModalState<S>, prevState: CheckoutModalState): CheckoutModalState;
    onNext(state: CheckoutModalState<S>, payload: NextPayload<S>): CheckoutModalState;
    showFullHeight?: boolean;
    /** Defaults to checkoutItem.initSettings.config.modalTitle (returning undefined uses default) */
    title?(textCustomizations: FunkitTextCustomizationsConfig, state: CheckoutModalState<S>): string | undefined;
    /** If title is not defined in config nor with the title() function, this is used instead. Defaults to 'Checkout' */
    fallbackTitle?: string;
};
export declare const CheckoutModalSteps: {
    [S in FunCheckoutStep]: ModalStepInfo<S>;
};
export type CheckoutModalState<S extends FunCheckoutStep = FunCheckoutStep> = {
    [T in S]: {
        [FunCheckoutStep.CHECKOUT_COMPLETE]: CheckoutCompleteState;
        [FunCheckoutStep.CONFIRMATION]: ConfirmationStepState;
        [FunCheckoutStep.INPUT_AMOUNT]: InputAmountState;
        [FunCheckoutStep.LOADING_ACCOUNT]: LoadingAccountState;
        [FunCheckoutStep.SELECT_ASSET]: SelectAssetState;
        [FunCheckoutStep.SOURCE_CHANGE]: SourceChangeState;
        [FunCheckoutStep.TRANSFER_TOKEN]: TransferTokenState;
        [FunCheckoutStep.LIGHTNING_INVOICE]: LightningInvoiceState;
        [FunCheckoutStep.CREATE_FIAT_ACCOUNT]: VirtualFiatAccountState;
        [FunCheckoutStep.BRIDGE_KYC]: BridgeKycState;
        [FunCheckoutStep.KYC_IFRAME]: KycIframeState;
        [FunCheckoutStep.BRIDGE_CUSTOMER]: BridgeCustomerState;
        [FunCheckoutStep.FIAT_ACCOUNT_DETAIL]: FiatAccountDetailState;
        [FunCheckoutStep.ERROR_SCREEN]: ErrorScreenState;
        [FunCheckoutStep.MELD_QUOTES]: MeldQuotesState;
        [FunCheckoutStep.MELD_REDIRECT]: MeldRedirectState;
        [FunCheckoutStep.MELD_CURRENCY_SELECT]: MeldCurrencySelectState;
        [FunCheckoutStep.SELECT_BROKERAGE]: SelectBrokerageState;
        [FunCheckoutStep.CONNECT_EXCHANGE]: ConnectExchangeState;
        [FunCheckoutStep.BROKERAGE_TWO_FA]: BrokerageTwoFAState;
        [FunCheckoutStep.BROKERAGE_SUCCESS]: BrokerageSuccessState;
        [FunCheckoutStep.SWAPPED_IFRAME]: SwappedIframeState;
        [FunCheckoutStep.PERPS_TRANSFER]: PerpsTransferState;
        [FunCheckoutStep.WITHDRAWAL_ENTER_AMOUNT]: WithdrawalEnterAmountState;
        [FunCheckoutStep.WITHDRAWAL_COMPLETE]: WithdrawalCompleteState;
    }[T] & {
        step: T;
        previousStep?: FunCheckoutStep | null;
    };
}[S];
export type NextPayload<S extends FunCheckoutStep = FunCheckoutStep> = {
    [FunCheckoutStep.CHECKOUT_COMPLETE]: CheckoutCompleteNext;
    [FunCheckoutStep.CONFIRMATION]: ConfirmationStepNext;
    [FunCheckoutStep.INPUT_AMOUNT]: InputAmountNext;
    [FunCheckoutStep.LOADING_ACCOUNT]: LoadingAccountNext;
    [FunCheckoutStep.SELECT_ASSET]: SelectAssetNext;
    [FunCheckoutStep.SOURCE_CHANGE]: SourceChangeNext;
    [FunCheckoutStep.TRANSFER_TOKEN]: TransferTokenNext;
    [FunCheckoutStep.LIGHTNING_INVOICE]: LightningInvoiceNext;
    [FunCheckoutStep.CREATE_FIAT_ACCOUNT]: VirtualFiatAccountNext;
    [FunCheckoutStep.BRIDGE_KYC]: BridgeKycNext;
    [FunCheckoutStep.KYC_IFRAME]: KycIframeNext;
    [FunCheckoutStep.BRIDGE_CUSTOMER]: BridgeCustomerNext;
    [FunCheckoutStep.FIAT_ACCOUNT_DETAIL]: FiatAccountDetailNext;
    [FunCheckoutStep.ERROR_SCREEN]: null;
    [FunCheckoutStep.MELD_QUOTES]: MeldQuotesNext;
    [FunCheckoutStep.MELD_REDIRECT]: MeldRedirectNext;
    [FunCheckoutStep.MELD_CURRENCY_SELECT]: MeldCurrencySelectNext;
    [FunCheckoutStep.SELECT_BROKERAGE]: SelectBrokerageNext;
    [FunCheckoutStep.CONNECT_EXCHANGE]: ConnectExchangeNext;
    [FunCheckoutStep.BROKERAGE_TWO_FA]: BrokerageTwoFANext;
    [FunCheckoutStep.BROKERAGE_SUCCESS]: null;
    [FunCheckoutStep.SWAPPED_IFRAME]: SwappedIframeNext;
    [FunCheckoutStep.PERPS_TRANSFER]: PerpsTransferNext;
    [FunCheckoutStep.WITHDRAWAL_ENTER_AMOUNT]: WithdrawalEnterAmountNext;
    [FunCheckoutStep.WITHDRAWAL_COMPLETE]: WithdrawalCompleteNext;
}[S] & {
    /** Whether screen transition should change direction to simulate back transition. Only applies if there is a history entry in the stack*/
    reverseAnimation?: boolean;
    skipAnimation?: boolean;
    wipeHistory?: boolean;
    /** When set, finds the closest matching step in history and rolls back to it instead of creating a new history entry */
    navigateToHistoryStep?: boolean;
    /** Whether the current step should be popped from the history stack, so it's skipped when going back */
    popCurrentStep?: boolean;
};
export declare function useCheckoutModalTransition(checkoutItem: FunkitActiveCheckoutItem, onClose: () => void): {
    animation: import("../../hooks/useAnimatedNavigation").AnimationState;
    modalState: CheckoutModalState<FunCheckoutStep>;
    onBack: () => void;
    onCloseWrapper: (options?: {
        isNewDeposit?: boolean;
    }) => void;
    onNext: (payload: NextPayload) => void;
    /** Only use as a last resort. Prefer next/back for proper navigation */
    onStepChange: (nextState: CheckoutModalState) => void;
    setModalState: import("react").Dispatch<SetStateAction<CheckoutModalState<FunCheckoutStep>>>;
    hasHistoryEntry: boolean;
    isStepReady: boolean;
};
export declare function useTitleConfig<S extends FunCheckoutStep>(checkoutItem: FunkitActiveCheckoutItem, state: CheckoutModalState<S>): {
    disableBack: boolean;
    hideBottomSection: boolean;
    hideClose: boolean;
    hideTopbar: boolean;
    showFullHeight: boolean;
    title: string;
};
