'use client'
import { __awaiter } from '../../../../../../_virtual/_tslib.js';
import { useContext, useCallback } from 'react';
import { DynamicError } from '@dynamic-labs/utils';
import '../../../../context/DynamicContext/DynamicContext.js';
import '../../../../store/state/loadingAndLifecycle/loadingAndLifecycle.js';
import '@dynamic-labs/iconic';
import '@dynamic-labs/wallet-connector-core';
import 'react/jsx-runtime';
import { useViewContext } from '../../../../context/ViewContext/ViewContext.js';
import '../../../../shared/logger.js';
import '@dynamic-labs/wallet-book';
import '../../../constants/colors.js';
import '../../../constants/values.js';
import '@dynamic-labs/sdk-api-core';
import '../../../../shared/consts/index.js';
import { dynamicEvents } from '../../../../events/dynamicEvents.js';
import '../../../../context/CaptchaContext/CaptchaContext.js';
import '../../../../context/ErrorContext/ErrorContext.js';
import '@dynamic-labs/multi-wallet';
import 'react-international-phone';
import '../../../../store/state/nonce/nonce.js';
import '@dynamic-labs-sdk/client/core';
import '../../../../client/client.js';
import '@dynamic-labs-sdk/client';
import '../../../../config/ApiEndpoint.js';
import '@dynamic-labs/locale';
import '../../../../store/state/dynamicContextProps/dynamicContextProps.js';
import '../../../../store/state/primaryWalletId/primaryWalletId.js';
import '../../../../store/state/connectedWalletsInfo/connectedWalletsInfo.js';
import '../../../../context/AccessDeniedContext/AccessDeniedContext.js';
import '../../../../context/AccountExistsContext/AccountExistsContext.js';
import '../../../../context/UserWalletsContext/UserWalletsContext.js';
import '../../../../store/state/authMode/authMode.js';
import '../../../../context/VerificationContext/VerificationContext.js';
import 'react-dom';
import '../../../functions/compareChains/compareChains.js';
import '../../../../views/Passkey/utils/findPrimaryEmbeddedChain/findPrimaryEmbeddedChain.js';
import '../../../../context/ThemeContext/ThemeContext.js';
import '../useUpdateUser/userFieldsSchema.js';
import 'bs58';
import '@dynamic-labs/types';
import '../../../../context/SocialRedirectContext/SocialRedirectContext.js';
import '../../../../context/LoadingContext/LoadingContext.js';
import '../../../../context/WalletContext/WalletContext.js';
import '../../useEmbeddedWallet/useSecureEnclaveEmbeddedWallet/constants.js';
import 'yup';
import '../../../../context/MockContext/MockContext.js';
import '../../../../views/CollectUserDataView/useFields.js';
import '../../../../context/FieldsStateContext/FieldsStateContext.js';
import { UserFieldEditorContext } from '../../../../context/UserFieldEditorContext/UserFieldEditorContext.js';
import { validateUpdateRequest } from './validateUpdateRequest/validateUpdateRequest.js';
import '@dynamic-labs/rpc-providers';
import '../../../../store/state/walletOptions/walletOptions.js';
import 'react-i18next';
import '../../../../components/Accordion/components/AccordionItem/AccordionItem.js';
import '../../../../components/Alert/Alert.js';
import '../../../../components/ShadowDOM/ShadowDOM.js';
import '../../../../components/IconButton/IconButton.js';
import '../../../../components/InlineWidget/InlineWidget.js';
import '../../../../components/Input/Input.js';
import '../../../../components/IsBrowser/IsBrowser.js';
import '../../../../components/MenuList/Dropdown/Dropdown.js';
import '../../../../components/OverlayCard/OverlayCard.js';
import '../../../../components/Transition/ZoomTransition/ZoomTransition.js';
import '../../../../components/Transition/SlideInUpTransition/SlideInUpTransition.js';
import '../../../../components/Transition/OpacityTransition/OpacityTransition.js';
import '../../../../components/PasskeyCreatedSuccessBanner/PasskeyCreatedSuccessBanner.js';
import '../../../../components/Popper/Popper/Popper.js';
import '../../../../components/Popper/PopperContext/PopperContext.js';
import 'react-focus-lock';
import 'qrcode';
import 'formik';
import '../../useSubdomainCheck/useSubdomainCheck.js';
import '../../../../context/WalletGroupContext/WalletGroupContext.js';
import '../../../../context/IpConfigurationContext/IpConfigurationContext.js';
import '../../../../context/ConnectWithOtpContext/ConnectWithOtpContext.js';
import '../../../../widgets/DynamicBridgeWidget/views/WalletsView/components/SecondaryWallets/SecondaryWallets.js';
import '@hcaptcha/react-hcaptcha';
import '../../../../widgets/DynamicWidget/context/DynamicWidgetContext.js';
import '../../../../widgets/DynamicWidget/helpers/convertExchangeKeyAndProviderEnum.js';
import '../../../../views/ExchangeWhitelistWarning/ExchangeWhitelistWarning.js';
import '../../../../context/ErrorContext/hooks/useErrorText/useErrorText.js';
import '../../../../context/FooterAnimationContext/index.js';
import '../../../../views/MfaChooseDeviceView/useGetMfaOptions/useGetMfaOptions.js';
import '../../../../context/PasskeyContext/PasskeyContext.js';
import '../../../../context/OnrampContext/OnrampContext.js';
import '../../../../store/state/sendBalances.js';
import '../../../../store/state/connectorsInitializing/connectorsInitializing.js';
import '../../../../components/OverlayCardBase/OverlayCardTarget/OverlayCardTarget.js';
import '../../../../widgets/DynamicWidget/components/DynamicWidgetHeader/DynamicWidgetHeader.js';
import '../../../../views/TransactionConfirmationView/TransactionConfirmationView.js';
import '../../../../widgets/DynamicWidget/components/PasskeyCard/PasskeyCard.js';
import '../../../../widgets/DynamicWidget/views/CryptoComOnramp/CryptoComOnramp.js';
import '../../../../../index.js';
import '../../../../widgets/DynamicWidget/views/ReceiveWalletFunds/ReceiveWalletFunds.js';
import '../../../../store/state/tokenBalances.js';
import '../../../../store/state/multichainBalances.js';
import '../../../../shared/utils/functions/getInitialUrl/getInitialUrl.js';
import { useInternalDynamicContext } from '../../../../context/DynamicContext/useDynamicContext/useInternalDynamicContext/useInternalDynamicContext.js';

/** Saves the values updated by the user */
const saveUserValues = (_a, setShowAuthFlow_1, pushView_1, resolve_1, reject_1) => __awaiter(void 0, [_a, setShowAuthFlow_1, pushView_1, resolve_1, reject_1], void 0, function* ({ fields: newValues, updateUserResult: { isEmailVerificationRequired, isSmsVerificationRequired, }, }, setShowAuthFlow, pushView, resolve, reject) {
    // If no verification is needed, we are done
    if (!isEmailVerificationRequired && !isSmsVerificationRequired) {
        resolve(newValues);
        return;
    }
    // Show verification view
    setShowAuthFlow(true, {
        ignoreIfIsEmbeddedWidget: false,
        performMultiWalletChecks: false,
    });
    if (isEmailVerificationRequired) {
        pushView('verify-email');
        // Subscribe to email verification result
        dynamicEvents.once('emailVerificationResult', (wasSuccessful, newEmail) => {
            // Make sure we're using the correct, updated email. User might have changed it mid-OTP
            newValues.email = newEmail;
            wasSuccessful
                ? resolve(newValues)
                : reject('Failed to verify email, no fields were updated');
        });
        return;
    }
    pushView('verify-sms');
    // Subscribe to sms verification result
    dynamicEvents.once('smsVerificationResult', (wasSuccessful, { phone: newPhone }) => {
        // Make sure we're using the correct, updated phone number. User might have changed it mid-OTP
        newValues.phoneNumber = newPhone;
        wasSuccessful
            ? resolve(newValues)
            : reject('Failed to verify phone number, no fields were updated');
    });
});
// eslint-disable-next-line multiline-comment-style
/** This hook allows to open the widget modal and expose any fields for editing.
 * The fields must have been previously enabled in the dashboard
 */
const useUpdateUserWithModal = (updateUser) => {
    const { user, projectSettings, setShowAuthFlow } = useInternalDynamicContext();
    const { pushView } = useViewContext();
    const editorContext = useContext(UserFieldEditorContext);
    if (!editorContext)
        throw new DynamicError('useUserUpdateRequest can only be used inside the context of DynamicContextProvider');
    const { open: promptUserForValues } = editorContext;
    const updateUserWithModal = useCallback((fields, options) => new Promise((resolve, reject) => {
        // Catch invalid requests
        const errorResponse = validateUpdateRequest(fields, user, projectSettings);
        if (errorResponse) {
            reject(errorResponse);
            return;
        }
        // Get user values
        promptUserForValues({
            fields,
            submitText: options === null || options === void 0 ? void 0 : options.submitText,
            subtitle: options === null || options === void 0 ? void 0 : options.subtitle,
            title: options === null || options === void 0 ? void 0 : options.title,
        }, updateUser)
            .then((updateValues) => saveUserValues(updateValues, setShowAuthFlow, pushView, resolve, reject))
            .catch((error) => {
            if (/email already exists/gi.test(error))
                throw error;
            reject(error);
        });
    }), [
        user,
        projectSettings,
        promptUserForValues,
        updateUser,
        setShowAuthFlow,
        pushView,
    ]);
    return updateUserWithModal;
};

export { useUpdateUserWithModal };
