import { proxy } from 'valtio'; import type { ModalCtrlState } from '../types/controllerTypes'; import { ClientCtrl } from './ClientCtrl'; import { OptionsCtrl } from './OptionsCtrl'; import { AccountCtrl } from './AccountCtrl'; import { RouterCtrl } from './RouterCtrl'; import { WcConnectionCtrl } from './WcConnectionCtrl'; // -- types -------------------------------------------------------- // export interface OpenOptions { route?: 'ConnectWallet' | 'Qrcode' | 'WalletExplorer'; } // -- initial state ------------------------------------------------ // const state = proxy({ open: false, }); // -- controller --------------------------------------------------- // export const ModalCtrl = { state, async open(options?: OpenOptions) { return new Promise((resolve) => { const { isDataLoaded } = OptionsCtrl.state; const { isConnected } = AccountCtrl.state; const { initialized } = ClientCtrl.state; WcConnectionCtrl.setPairingEnabled(true); if (isConnected) { // If already connected, do nothing return; } else if (options?.route) { RouterCtrl.replace(options.route); } else { RouterCtrl.replace('ConnectWallet'); } // Open modal if async data is ready if (initialized && isDataLoaded) { state.open = true; resolve(); } // Otherwise (slow network) re-attempt open checks else { const interval = setInterval(() => { if (ClientCtrl.state.initialized && OptionsCtrl.state.isDataLoaded) { clearInterval(interval); state.open = true; resolve(); } }, 200); } }); }, close() { state.open = false; }, };