diff --git a/src/pages/_app.tsx b/src/pages/_app.tsx index 6e8cea4cbd..ae4df5aeba 100644 --- a/src/pages/_app.tsx +++ b/src/pages/_app.tsx @@ -41,6 +41,7 @@ import { WalletConnectProvider } from '@/services/walletconnect/WalletConnectCon import useABTesting from '@/services/tracking/useAbTesting' import { AbTest } from '@/services/tracking/abTesting' import { useNotificationTracking } from '@/components/settings/PushNotifications/hooks/useNotificationTracking' +import MobilePairingModal from '@/services/pairing/QRModal' const GATEWAY_URL = IS_PRODUCTION || cgwDebugStorage.get() ? GATEWAY_URL_PRODUCTION : GATEWAY_URL_STAGING @@ -121,6 +122,8 @@ const WebCoreApp = ({ + + diff --git a/src/services/pairing/QRModal.tsx b/src/services/pairing/QRModal.tsx index b363838046..47b2e18b14 100644 --- a/src/services/pairing/QRModal.tsx +++ b/src/services/pairing/QRModal.tsx @@ -1,95 +1,55 @@ -import { useState } from 'react' import { Dialog, DialogContent, DialogTitle, IconButton } from '@mui/material' -import { createRoot } from 'react-dom/client' import CloseIcon from '@mui/icons-material/Close' import PairingQRCode from '@/components/common/PairingDetails/PairingQRCode' import PairingDescription from '@/components/common/PairingDetails/PairingDescription' -import { StoreHydrator } from '@/store' -import { AppProviders } from '@/pages/_app' import { PAIRING_MODULE_LABEL } from '@/services/pairing/module' -import css from './styles.module.css' import PairingDeprecationWarning from '@/components/common/PairingDetails/PairingDeprecationWarning' +import ExternalStore from '@/services/ExternalStore' -const WRAPPER_ID = 'safe-mobile-qr-modal' -const QR_CODE_SIZE = 200 +const { useStore: useCloseCallback, setStore: setCloseCallback } = new ExternalStore<() => void>() -const renderWrapper = () => { - if (typeof document === 'undefined') { - return - } - - const wrapper = document.createElement('div') - wrapper.setAttribute('id', WRAPPER_ID) - - document.body.appendChild(wrapper) - - return wrapper -} - -const open = (uri: string, cb: () => void) => { - const wrapper = renderWrapper() - - if (!wrapper) { - return - } - - const root = createRoot(wrapper) - - root.render() +export const open = (cb: () => void) => { + setCloseCallback(() => cb) } -const close = () => { - if (typeof document === 'undefined') { - return - } - - const wrapper = document.getElementById(WRAPPER_ID) - if (wrapper) { - document.body.removeChild(wrapper) - document.body.style.overflow = '' - } +export const close = () => { + setCloseCallback(undefined) } -const Modal = ({ uri, cb }: { uri: string; cb: () => void }) => { - const [open, setOpen] = useState(true) +const QRModal = () => { + const closeCallback = useCloseCallback() + const open = !!closeCallback const handleClose = () => { - cb() - setOpen(false) + closeCallback?.() + setCloseCallback(undefined) close() } + if (!open) return null + return ( - - - - - {PAIRING_MODULE_LABEL} - - - - - - - -
- -
-
-
-
+ + + {PAIRING_MODULE_LABEL} + + + + + + + +
+ +
+
) } -const QRModal = { - open, - close, -} - export default QRModal diff --git a/src/services/pairing/module.ts b/src/services/pairing/module.ts index fe5eba715c..add033b65c 100644 --- a/src/services/pairing/module.ts +++ b/src/services/pairing/module.ts @@ -5,6 +5,7 @@ import type { ITxData } from '@walletconnect/types' import { getPairingConnector, PAIRING_MODULE_STORAGE_ID } from '@/services/pairing/connector' import local from '@/services/local-storage/local' import { killPairingSession } from '@/services/pairing/utils' +import * as QRModal from '@/services/pairing/QRModal' enum ProviderEvents { ACCOUNTS_CHANGED = 'accountsChanged', @@ -44,8 +45,6 @@ const pairingModule = (): WalletInit => { const { default: WalletConnect } = await import('@walletconnect/client') - const { default: QRModal } = await import('@/services/pairing/QRModal') - const { Subject, fromEvent } = await import('rxjs') const { takeUntil, take } = await import('rxjs/operators') @@ -131,7 +130,7 @@ const pairingModule = (): WalletInit => { return new Promise((resolve, reject) => { if (!this.connector.connected) { this.connector.createSession().then(() => { - QRModal.open(this.connector.uri, () => + QRModal.open(() => reject( new ProviderRpcError({ code: 4001, diff --git a/src/services/pairing/styles.module.css b/src/services/pairing/styles.module.css deleted file mode 100644 index d1e8523d06..0000000000 --- a/src/services/pairing/styles.module.css +++ /dev/null @@ -1,3 +0,0 @@ -.modal { - z-index: var(--onboard-modal-z-index) !important; -}