@n1xyz/wallet-widget 0.0.27 → 0.0.29
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Modal/NTSFlow/views/CreateSessionView.js +1 -2
- package/dist/Modal/NTSFlow/views/CreateSessionView.js.map +1 -1
- package/dist/Modal/NordFlow/context/DepositContext.js +1 -2
- package/dist/Modal/NordFlow/context/DepositContext.js.map +1 -1
- package/dist/Modal/NordFlow/hooks/useTestnetFaucet.d.ts +17 -0
- package/dist/Modal/NordFlow/hooks/useTestnetFaucet.js +162 -0
- package/dist/Modal/NordFlow/hooks/useTestnetFaucet.js.map +1 -0
- package/dist/Modal/NordFlow/screens/02-ChainSelectionScreen.d.ts +1 -0
- package/dist/Modal/NordFlow/screens/02-ChainSelectionScreen.js +66 -0
- package/dist/Modal/NordFlow/screens/02-ChainSelectionScreen.js.map +1 -0
- package/dist/Modal/NordFlow/screens/03-AmountInputScreen.d.ts +5 -0
- package/dist/Modal/NordFlow/screens/03-AmountInputScreen.js +74 -0
- package/dist/Modal/NordFlow/screens/03-AmountInputScreen.js.map +1 -0
- package/dist/Modal/NordFlow/screens/04-DepositProgressScreen.d.ts +1 -0
- package/dist/Modal/NordFlow/screens/04-DepositProgressScreen.js +29 -0
- package/dist/Modal/NordFlow/screens/04-DepositProgressScreen.js.map +1 -0
- package/dist/Modal/NordFlow/screens/05-DepositSuccessScreen.d.ts +1 -0
- package/dist/Modal/NordFlow/screens/05-DepositSuccessScreen.js +144 -0
- package/dist/Modal/NordFlow/screens/05-DepositSuccessScreen.js.map +1 -0
- package/dist/Modal/NordFlow/screens/06-AuthLoadingScreen.d.ts +1 -0
- package/dist/Modal/NordFlow/screens/06-AuthLoadingScreen.js +35 -0
- package/dist/Modal/NordFlow/screens/06-AuthLoadingScreen.js.map +1 -0
- package/dist/Modal/NordFlow/screens/07-FinalSuccessScreen.d.ts +5 -0
- package/dist/Modal/NordFlow/screens/07-FinalSuccessScreen.js +39 -0
- package/dist/Modal/NordFlow/screens/07-FinalSuccessScreen.js.map +1 -0
- package/dist/Modal/NordFlow/screens/08-ErrorScreen.d.ts +1 -0
- package/dist/Modal/NordFlow/screens/08-ErrorScreen.js +68 -0
- package/dist/Modal/NordFlow/screens/08-ErrorScreen.js.map +1 -0
- package/dist/Provider/hooks/useNordUserInitialization.js +18 -56
- package/dist/Provider/hooks/useNordUserInitialization.js.map +1 -1
- package/dist/Provider/types.d.ts +0 -2
- package/dist/Provider/types.js.map +1 -1
- package/dist/animations/N1Loader.d.ts +11 -0
- package/dist/animations/N1Loader.js +42 -0
- package/dist/animations/N1Loader.js.map +1 -0
- package/dist/animations/N1Loader.json +1 -0
- package/dist/animations/Processing.d.ts +11 -0
- package/dist/animations/Processing.js +42 -0
- package/dist/animations/Processing.js.map +1 -0
- package/dist/animations/Processing.json +1 -0
- package/dist/fonts/apk-galeria/APK-Galeria-Bold-Italic-Trial.otf +0 -0
- package/dist/fonts/apk-galeria/APK-Galeria-Bold-Trial.otf +0 -0
- package/dist/fonts/apk-galeria/APK-Galeria-Extra-Bold-Italic-Trial.otf +0 -0
- package/dist/fonts/apk-galeria/APK-Galeria-Extra-Bold-Trial.otf +0 -0
- package/dist/fonts/apk-galeria/APK-Galeria-Light-Italic-Trial.otf +0 -0
- package/dist/fonts/apk-galeria/APK-Galeria-Light-Trial.otf +0 -0
- package/dist/fonts/apk-galeria/APK-Galeria-Medium-Italic-Trial.otf +0 -0
- package/dist/fonts/apk-galeria/APK-Galeria-Medium-Trial.otf +0 -0
- package/dist/fonts/apk-galeria/APK-Galeria-Regular-Italic-Trial.otf +0 -0
- package/dist/fonts/apk-galeria/APK-Galeria-Regular-Trial.otf +0 -0
- package/dist/fonts/apk-galeria/APK-Galeria-Semi-Bold-Italic-Trial.otf +0 -0
- package/dist/fonts/apk-galeria/APK-Galeria-Semi-Bold-Trial.otf +0 -0
- package/dist/fonts/apk-galeria/APK-Galeria-Thin-Italic-Trial.otf +0 -0
- package/dist/fonts/apk-galeria/APK-Galeria-Thin-Trial.otf +0 -0
- package/dist/utils/dynamicNord.d.ts +2 -0
- package/dist/utils/dynamicNord.js +59 -0
- package/dist/utils/dynamicNord.js.map +1 -0
- package/dist/utils/ed25519.d.ts +8 -0
- package/dist/utils/ed25519.js +87 -0
- package/dist/utils/ed25519.js.map +1 -0
- package/package.json +12 -12
|
@@ -51,7 +51,7 @@ export function CreateSessionView() {
|
|
|
51
51
|
var _b = useState(false), isPressed = _b[0], setIsPressed = _b[1];
|
|
52
52
|
var _c = useState(null), NTSComponents = _c[0], setNTSComponents = _c[1];
|
|
53
53
|
var _d = useState(null), keyPair = _d[0], setKeyPair = _d[1];
|
|
54
|
-
var _e = useN1WalletInternalContext(), setViewMode = _e.setViewMode, setUsername = _e.setUsername, setStartClosingLogin = _e.setStartClosingLogin, setIsConnected = _e.setIsConnected, dynamicWallet = _e.dynamicWallet, handleError = _e.handleError, setSessionPubKey = _e.setSessionPubKey, setSignMessageWithSessionKey = _e.setSignMessageWithSessionKey, dynamicHandleLogOut = _e.dynamicHandleLogOut, setDynamicWallet = _e.setDynamicWallet, setAddress = _e.setAddress
|
|
54
|
+
var _e = useN1WalletInternalContext(), setViewMode = _e.setViewMode, setUsername = _e.setUsername, setStartClosingLogin = _e.setStartClosingLogin, setIsConnected = _e.setIsConnected, dynamicWallet = _e.dynamicWallet, handleError = _e.handleError, setSessionPubKey = _e.setSessionPubKey, setSignMessageWithSessionKey = _e.setSignMessageWithSessionKey, dynamicHandleLogOut = _e.dynamicHandleLogOut, setDynamicWallet = _e.setDynamicWallet, setAddress = _e.setAddress;
|
|
55
55
|
var _f = useN1WalletContext(), ntsInterface = _f.ntsInterface, walletPubKey = _f.walletPubKey, address = _f.address;
|
|
56
56
|
// Initialize NTS SDK and generate key pair
|
|
57
57
|
useEffect(function () {
|
|
@@ -139,7 +139,6 @@ export function CreateSessionView() {
|
|
|
139
139
|
},
|
|
140
140
|
],
|
|
141
141
|
};
|
|
142
|
-
setSignMessageWithWalletKey(function () { return signWithWallet; });
|
|
143
142
|
tx = new NTSComponents.Transaction(transactionData, walletPubKey);
|
|
144
143
|
return [4 /*yield*/, tx.signWithWalletFunction(signWithWallet)];
|
|
145
144
|
case 2:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CreateSessionView.js","sourceRoot":"","sources":["../../../../src/Modal/NTSFlow/views/CreateSessionView.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useEffect, useState } from 'react';\nimport { ANIMATION_EASE } from '../../NordFlow/constants';\nimport { WalletError, WalletErrorCode } from '../../../errors/types';\nimport {\n createWebSession,\n generateSessionKeyPair,\n getUser,\n storeSessionKeysInLocalStorage,\n} from '../../../Logic/utils';\nimport {\n useN1WalletContext,\n useN1WalletInternalContext,\n} from '../../../Provider/hooks';\nimport { N1ModalViewMode } from '../../../Provider/types';\nimport { logger } from '../../../utils/logger';\nimport { BackButton } from '../components/BackButton';\nimport { ModalHeader } from '../components/ModalHeader';\nimport { signEd25519 } from '@n1xyz/nts-sdk';\n\nexport function CreateSessionView() {\n const [isHovered, setIsHovered] = useState(false);\n const [isPressed, setIsPressed] = useState(false);\n\n const [NTSComponents, setNTSComponents] = useState<any>(null);\n const [keyPair, setKeyPair] = useState<{\n publicKey: Uint8Array;\n privateKey: Uint8Array;\n } | null>(null);\n\n const {\n setViewMode,\n setUsername,\n setStartClosingLogin,\n setIsConnected,\n dynamicWallet,\n handleError,\n setSessionPubKey,\n setSignMessageWithSessionKey,\n dynamicHandleLogOut,\n setDynamicWallet,\n setAddress,\n setSignMessageWithWalletKey,\n } = useN1WalletInternalContext();\n\n const { ntsInterface, walletPubKey, address } = useN1WalletContext();\n\n // Initialize NTS SDK and generate key pair\n useEffect(() => {\n const loadNTSSDK = async () => {\n try {\n const { Transaction, AdminAction, CoreApps } = await import(\n '@n1xyz/nts-sdk'\n );\n setNTSComponents({ Transaction, AdminAction, CoreApps });\n const newKeyPair = await generateSessionKeyPair();\n setKeyPair(newKeyPair);\n } catch (error) {\n handleError(\n new WalletError(\n WalletErrorCode.CONNECTION_FAILED,\n 'Failed to initialize NTS SDK',\n { originalError: error }\n )\n );\n }\n };\n loadNTSSDK();\n }, [handleError]);\n\n const signWithWallet = async (msg: string): Promise<Uint8Array> => {\n try {\n if (!dynamicWallet) {\n throw new WalletError(\n WalletErrorCode.WALLET_NOT_FOUND,\n 'Wallet not found for signing'\n );\n }\n\n if (dynamicWallet.chain === 'SOL') {\n const signature = await dynamicWallet.signMessage(msg);\n const binaryString = atob(signature);\n const signatureUint8Array = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n signatureUint8Array[i] = binaryString.charCodeAt(i);\n }\n return signatureUint8Array;\n }\n\n const sig = (await dynamicWallet.signMessage(msg)) as string;\n logger.debug('Wallet signature received', { signature: sig });\n return Uint8Array.from(Buffer.from(sig.slice(2), 'hex'));\n } catch (error) {\n throw new WalletError(\n WalletErrorCode.USER_REJECTED,\n 'Failed to sign message with wallet',\n { originalError: error }\n );\n }\n };\n\n const handleSign = async () => {\n logger.debug('handleSign');\n\n if (!NTSComponents || !keyPair) {\n logger.warn('Required components not initialized');\n return;\n }\n\n setViewMode(N1ModalViewMode.Signing);\n\n try {\n const sessionKeyHex = Buffer.from(keyPair.publicKey).toString('hex');\n logger.debug('Generated session key', { sessionKey: sessionKeyHex });\n\n // Create and sign transaction that registers the session key with Core\n const transactionData = {\n appId: NTSComponents.CoreApps.Admin,\n action: NTSComponents.AdminAction.addSessionKey,\n framework: 'ts',\n data: [\n {\n sessionKey: sessionKeyHex,\n appId: 'hub',\n },\n ],\n };\n\n setSignMessageWithWalletKey(() => signWithWallet);\n const tx = new NTSComponents.Transaction(transactionData, walletPubKey!);\n await tx.signWithWalletFunction(signWithWallet);\n try {\n const txRes = await ntsInterface.sendTransaction(\n tx,\n tx.signature!,\n walletPubKey\n );\n if (txRes.success) {\n logger.debug('txRes', txRes);\n } else {\n logger.debug('txRes', txRes);\n throw new WalletError(\n WalletErrorCode.TRANSACTION_FAILED,\n 'Transaction failed'\n );\n }\n } catch (_) {\n throw new WalletError(\n WalletErrorCode.TRANSACTION_FAILED,\n 'Transaction did not succeed'\n );\n }\n\n // Create session signing function\n const signFn = async (message: Uint8Array) => {\n try {\n return await signEd25519(message, keyPair.privateKey as Uint8Array);\n } catch (_) {\n logger.error('Error signing with Ed25519:', _);\n throw _;\n }\n };\n\n // Store session keys\n logger.debug('Storing session keys');\n storeSessionKeysInLocalStorage({\n privKey: keyPair.privateKey as Uint8Array,\n publicKey: keyPair.publicKey as Uint8Array,\n walletPublicKey: address,\n chainName: dynamicWallet!.chain,\n });\n setSessionPubKey(keyPair.publicKey);\n setSignMessageWithSessionKey(() => signFn);\n\n // Initialize web session with Argus who verifies that the session is\n // registered with Core, and if so, grants you access to its user metadata db\n await createWebSession(signFn, keyPair.publicKey, walletPubKey);\n\n // Check for existing user\n // TODO: handle case for auth.users, currently user.name is a wallet_only_users namespacing\n const user = await getUser();\n if (user?.name) {\n logger.info('Existing user found, completing login');\n setUsername(user.name);\n localStorage.setItem(`n1_${address}_username`, user.name);\n setStartClosingLogin(true);\n setIsConnected(true);\n } else {\n logger.info('No user found, transitioning to user creation');\n setViewMode(N1ModalViewMode.CreatingUser);\n }\n } catch (error: any) {\n logger.error('Session creation failed:', error);\n if (error.name === 'WalletError') {\n handleError(error);\n } else {\n handleError(\n new WalletError(\n WalletErrorCode.CONNECTION_FAILED,\n 'Failed to create session',\n { originalError: JSON.stringify(error) }\n )\n );\n }\n\n setViewMode(N1ModalViewMode.CreateSession);\n }\n };\n\n return (\n <div className=\"bg-n1-ww-gray-50 dark:bg-n1-ww-gray-950 relative border border-n1-ww-gray-200 dark:border-n1-ww-gray-800 rounded-md transition-[max-width,transform,opacity] duration-[3000ms] ease-[cubic-bezier(0.16,1,0.3,1)] w-full max-w-sm m-4 origin-center will-change-[max-width,transform,opacity]\">\n <div className=\"p-6 border-b border-n1-ww-gray-200 dark:border-n1-ww-gray-800\">\n <ModalHeader />\n </div>\n\n <div className=\"p-6 overflow-hidden relative\">\n <div className=\"space-y-4\">\n <div className=\"text-center\">\n <h3 className=\"text-xl font-medium text-n1-ww-gray-900 dark:text-white mb-2\">\n Create Session\n </h3>\n <p className=\"text-n1-ww-gray-500 dark:text-n1-ww-gray-400\">\n Please authenticate to create a new session.\n </p>\n </div>\n\n <button\n onClick={handleSign}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => {\n setIsHovered(false);\n setIsPressed(false);\n }}\n onMouseDown={() => setIsPressed(true)}\n onMouseUp={() => setIsPressed(false)}\n disabled={!NTSComponents || !keyPair}\n className={`\n group relative w-full overflow-hidden rounded-md border-2 bg-n1-ww-gray-100 dark:bg-neutral-950 py-4 text-left\n transition-all duration-300 ${ANIMATION_EASE}\n ${!NTSComponents || !keyPair\n ? 'cursor-not-allowed border-n1-ww-gray-200 dark:border-n1-ww-gray-800 opacity-50'\n : 'cursor-pointer border-n1-ww-gray-200 dark:border-n1-ww-gray-800 hover:border-n1-ww-gray-400 dark:hover:border-white/60'\n }\n `}\n style={{\n transform:\n isPressed && (!NTSComponents || !keyPair)\n ? 'scale(0.98)'\n : isHovered && (!NTSComponents || !keyPair)\n ? 'scale(0.99)'\n : 'scale(1)',\n }}\n >\n <div className=\"relative z-[200] pl-4 isolate\">\n <div className=\"flex items-center justify-start\">\n <span\n className={`\n text-base font-medium tracking-wide transition-colors duration-300 ${ANIMATION_EASE}\n text-n1-ww-gray-500 dark:text-neutral-400 group-hover:text-n1-ww-gray-900 dark:group-hover:text-white\n `}\n >\n Authenticate\n </span>\n </div>\n </div>\n </button>\n\n <BackButton\n onClick={() => {\n logger.debug('BackButton clicked');\n setDynamicWallet(null);\n setAddress('');\n dynamicHandleLogOut();\n setViewMode(N1ModalViewMode.Connect);\n }}\n />\n </div>\n </div>\n </div>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"CreateSessionView.js","sourceRoot":"","sources":["../../../../src/Modal/NTSFlow/views/CreateSessionView.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useEffect, useState } from 'react';\nimport { ANIMATION_EASE } from '../../NordFlow/constants';\nimport { WalletError, WalletErrorCode } from '../../../errors/types';\nimport {\n createWebSession,\n generateSessionKeyPair,\n getUser,\n storeSessionKeysInLocalStorage,\n} from '../../../Logic/utils';\nimport {\n useN1WalletContext,\n useN1WalletInternalContext,\n} from '../../../Provider/hooks';\nimport { N1ModalViewMode } from '../../../Provider/types';\nimport { logger } from '../../../utils/logger';\nimport { BackButton } from '../components/BackButton';\nimport { ModalHeader } from '../components/ModalHeader';\nimport { signEd25519 } from '@n1xyz/nts-sdk';\n\nexport function CreateSessionView() {\n const [isHovered, setIsHovered] = useState(false);\n const [isPressed, setIsPressed] = useState(false);\n\n const [NTSComponents, setNTSComponents] = useState<any>(null);\n const [keyPair, setKeyPair] = useState<{\n publicKey: Uint8Array;\n privateKey: Uint8Array;\n } | null>(null);\n\n const {\n setViewMode,\n setUsername,\n setStartClosingLogin,\n setIsConnected,\n dynamicWallet,\n handleError,\n setSessionPubKey,\n setSignMessageWithSessionKey,\n dynamicHandleLogOut,\n setDynamicWallet,\n setAddress,\n } = useN1WalletInternalContext();\n\n const { ntsInterface, walletPubKey, address } = useN1WalletContext();\n\n // Initialize NTS SDK and generate key pair\n useEffect(() => {\n const loadNTSSDK = async () => {\n try {\n const { Transaction, AdminAction, CoreApps } = await import(\n '@n1xyz/nts-sdk'\n );\n setNTSComponents({ Transaction, AdminAction, CoreApps });\n const newKeyPair = await generateSessionKeyPair();\n setKeyPair(newKeyPair);\n } catch (error) {\n handleError(\n new WalletError(\n WalletErrorCode.CONNECTION_FAILED,\n 'Failed to initialize NTS SDK',\n { originalError: error }\n )\n );\n }\n };\n loadNTSSDK();\n }, [handleError]);\n\n const signWithWallet = async (msg: string): Promise<Uint8Array> => {\n try {\n if (!dynamicWallet) {\n throw new WalletError(\n WalletErrorCode.WALLET_NOT_FOUND,\n 'Wallet not found for signing'\n );\n }\n\n if (dynamicWallet.chain === 'SOL') {\n const signature = await dynamicWallet.signMessage(msg);\n const binaryString = atob(signature);\n const signatureUint8Array = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n signatureUint8Array[i] = binaryString.charCodeAt(i);\n }\n return signatureUint8Array;\n }\n\n const sig = (await dynamicWallet.signMessage(msg)) as string;\n logger.debug('Wallet signature received', { signature: sig });\n return Uint8Array.from(Buffer.from(sig.slice(2), 'hex'));\n } catch (error) {\n throw new WalletError(\n WalletErrorCode.USER_REJECTED,\n 'Failed to sign message with wallet',\n { originalError: error }\n );\n }\n };\n\n const handleSign = async () => {\n logger.debug('handleSign');\n\n if (!NTSComponents || !keyPair) {\n logger.warn('Required components not initialized');\n return;\n }\n\n setViewMode(N1ModalViewMode.Signing);\n\n try {\n const sessionKeyHex = Buffer.from(keyPair.publicKey).toString('hex');\n logger.debug('Generated session key', { sessionKey: sessionKeyHex });\n\n // Create and sign transaction that registers the session key with Core\n const transactionData = {\n appId: NTSComponents.CoreApps.Admin,\n action: NTSComponents.AdminAction.addSessionKey,\n framework: 'ts',\n data: [\n {\n sessionKey: sessionKeyHex,\n appId: 'hub',\n },\n ],\n };\n\n const tx = new NTSComponents.Transaction(transactionData, walletPubKey!);\n await tx.signWithWalletFunction(signWithWallet);\n try {\n const txRes = await ntsInterface.sendTransaction(\n tx,\n tx.signature!,\n walletPubKey\n );\n if (txRes.success) {\n logger.debug('txRes', txRes);\n } else {\n logger.debug('txRes', txRes);\n throw new WalletError(\n WalletErrorCode.TRANSACTION_FAILED,\n 'Transaction failed'\n );\n }\n } catch (_) {\n throw new WalletError(\n WalletErrorCode.TRANSACTION_FAILED,\n 'Transaction did not succeed'\n );\n }\n\n // Create session signing function\n const signFn = async (message: Uint8Array) => {\n try {\n return await signEd25519(message, keyPair.privateKey as Uint8Array);\n } catch (_) {\n logger.error('Error signing with Ed25519:', _);\n throw _;\n }\n };\n\n // Store session keys\n logger.debug('Storing session keys');\n storeSessionKeysInLocalStorage({\n privKey: keyPair.privateKey as Uint8Array,\n publicKey: keyPair.publicKey as Uint8Array,\n walletPublicKey: address,\n chainName: dynamicWallet!.chain,\n });\n setSessionPubKey(keyPair.publicKey);\n setSignMessageWithSessionKey(() => signFn);\n\n // Initialize web session with Argus who verifies that the session is\n // registered with Core, and if so, grants you access to its user metadata db\n await createWebSession(signFn, keyPair.publicKey, walletPubKey);\n\n // Check for existing user\n // TODO: handle case for auth.users, currently user.name is a wallet_only_users namespacing\n const user = await getUser();\n if (user?.name) {\n logger.info('Existing user found, completing login');\n setUsername(user.name);\n localStorage.setItem(`n1_${address}_username`, user.name);\n setStartClosingLogin(true);\n setIsConnected(true);\n } else {\n logger.info('No user found, transitioning to user creation');\n setViewMode(N1ModalViewMode.CreatingUser);\n }\n } catch (error: any) {\n logger.error('Session creation failed:', error);\n if (error.name === 'WalletError') {\n handleError(error);\n } else {\n handleError(\n new WalletError(\n WalletErrorCode.CONNECTION_FAILED,\n 'Failed to create session',\n { originalError: JSON.stringify(error) }\n )\n );\n }\n\n setViewMode(N1ModalViewMode.CreateSession);\n }\n };\n\n return (\n <div className=\"bg-n1-ww-gray-50 dark:bg-n1-ww-gray-950 relative border border-n1-ww-gray-200 dark:border-n1-ww-gray-800 rounded-md transition-[max-width,transform,opacity] duration-[3000ms] ease-[cubic-bezier(0.16,1,0.3,1)] w-full max-w-sm m-4 origin-center will-change-[max-width,transform,opacity]\">\n <div className=\"p-6 border-b border-n1-ww-gray-200 dark:border-n1-ww-gray-800\">\n <ModalHeader />\n </div>\n\n <div className=\"p-6 overflow-hidden relative\">\n <div className=\"space-y-4\">\n <div className=\"text-center\">\n <h3 className=\"text-xl font-medium text-n1-ww-gray-900 dark:text-white mb-2\">\n Create Session\n </h3>\n <p className=\"text-n1-ww-gray-500 dark:text-n1-ww-gray-400\">\n Please authenticate to create a new session.\n </p>\n </div>\n\n <button\n onClick={handleSign}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => {\n setIsHovered(false);\n setIsPressed(false);\n }}\n onMouseDown={() => setIsPressed(true)}\n onMouseUp={() => setIsPressed(false)}\n disabled={!NTSComponents || !keyPair}\n className={`\n group relative w-full overflow-hidden rounded-md border-2 bg-n1-ww-gray-100 dark:bg-neutral-950 py-4 text-left\n transition-all duration-300 ${ANIMATION_EASE}\n ${!NTSComponents || !keyPair\n ? 'cursor-not-allowed border-n1-ww-gray-200 dark:border-n1-ww-gray-800 opacity-50'\n : 'cursor-pointer border-n1-ww-gray-200 dark:border-n1-ww-gray-800 hover:border-n1-ww-gray-400 dark:hover:border-white/60'\n }\n `}\n style={{\n transform:\n isPressed && (!NTSComponents || !keyPair)\n ? 'scale(0.98)'\n : isHovered && (!NTSComponents || !keyPair)\n ? 'scale(0.99)'\n : 'scale(1)',\n }}\n >\n <div className=\"relative z-[200] pl-4 isolate\">\n <div className=\"flex items-center justify-start\">\n <span\n className={`\n text-base font-medium tracking-wide transition-colors duration-300 ${ANIMATION_EASE}\n text-n1-ww-gray-500 dark:text-neutral-400 group-hover:text-n1-ww-gray-900 dark:group-hover:text-white\n `}\n >\n Authenticate\n </span>\n </div>\n </div>\n </button>\n\n <BackButton\n onClick={() => {\n logger.debug('BackButton clicked');\n setDynamicWallet(null);\n setAddress('');\n dynamicHandleLogOut();\n setViewMode(N1ModalViewMode.Connect);\n }}\n />\n </div>\n </div>\n </div>\n );\n}\n"]}
|
|
@@ -51,7 +51,7 @@ export var DepositProvider = function (_a) {
|
|
|
51
51
|
// Get flow state context
|
|
52
52
|
var _b = useFlowStateContext(), state = _b.state, context = _b.context, transition = _b.transition, updateContext = _b.updateContext;
|
|
53
53
|
// Get wallet context
|
|
54
|
-
var _c = useN1WalletContext(), address = _c.address, nord = _c.nord,
|
|
54
|
+
var _c = useN1WalletContext(), address = _c.address, nord = _c.nord, signMessageWithSessionKey = _c.signMessageWithSessionKey, nordUser = _c.nordUser;
|
|
55
55
|
var sessionMode = useN1WalletInternalContext().sessionMode;
|
|
56
56
|
// chain
|
|
57
57
|
var _d = useState(context.selectedChain), selectedChain = _d[0], setSelectedChain = _d[1];
|
|
@@ -231,7 +231,6 @@ export var DepositProvider = function (_a) {
|
|
|
231
231
|
transition,
|
|
232
232
|
handleError,
|
|
233
233
|
nord,
|
|
234
|
-
signMessageWithWalletKey,
|
|
235
234
|
signMessageWithSessionKey,
|
|
236
235
|
nordUser,
|
|
237
236
|
]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DepositContext.js","sourceRoot":"","sources":["../../../../src/Modal/NordFlow/context/DepositContext.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAc,EAAE,aAAa,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACnG,OAAO,EACL,cAAc,GAEf,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EACL,kBAAkB,EAClB,0BAA0B,GAC3B,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAE/C,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAErC,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAiBpD,0CAA0C;AAC1C,IAAM,cAAc,GAAG,aAAa,CAAkC,SAAS,CAAC,CAAC;AAOjF;;GAEG;AACH,MAAM,CAAC,IAAM,eAAe,GAAmC,UAAC,EAE/D;QADC,QAAQ,cAAA;IAER,yBAAyB;IACnB,IAAA,KAKF,mBAAmB,EAAE,EAJvB,KAAK,WAAA,EACL,OAAO,aAAA,EACP,UAAU,gBAAA,EACV,aAAa,mBACU,CAAC;IAE1B,qBAAqB;IACf,IAAA,KAMF,kBAAkB,EAAE,EALtB,OAAO,aAAA,EACP,IAAI,UAAA,EACJ,wBAAwB,8BAAA,EACxB,yBAAyB,+BAAA,EACzB,QAAQ,cACc,CAAC;IACjB,IAAA,WAAW,GAAK,0BAA0B,EAAE,YAAjC,CAAkC;IAErD,QAAQ;IACF,IAAA,KAAoC,QAAQ,CAChD,OAAO,CAAC,aAAa,CACtB,EAFM,aAAa,QAAA,EAAE,gBAAgB,QAErC,CAAC;IAEF,wBAAwB;IAClB,IAAA,KAAsB,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,EAA7C,MAAM,QAAA,EAAE,SAAS,QAA4B,CAAC;IAC/C,IAAA,KAAkC,QAAQ,CAAC,KAAK,CAAC,EAAhD,YAAY,QAAA,EAAE,eAAe,QAAmB,CAAC;IAClD,IAAA,KAAoC,QAAQ,CAAgB,OAAO,CAAC,aAAa,CAAC,EAAjF,aAAa,QAAA,EAAE,gBAAgB,QAAkD,CAAC;IACnF,IAAA,KAA4C,QAAQ,CAA2B,IAAI,CAAC,EAAnF,iBAAiB,QAAA,EAAE,oBAAoB,QAA4C,CAAC;IAG3F,OAAO;IACD,IAAA,KAA8B,QAAQ,CAAkC,SAAS,CAAC,EAAjF,UAAU,QAAA,EAAE,aAAa,QAAwD,CAAC;IACnF,IAAA,KAA0C,QAAQ,CAAgB,IAAI,CAAC,EAAtE,gBAAgB,QAAA,EAAE,mBAAmB,QAAiC,CAAC;IACxE,IAAA,KAA4C,QAAQ,CAAgB,IAAI,CAAC,EAAxE,iBAAiB,QAAA,EAAE,oBAAoB,QAAiC,CAAC;IAEhF,oCAAoC;IACpC,IAAM,cAAc,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IAGvC;;OAEG;IACH,IAAM,WAAW,GAAG,WAAW,CAC7B,UAAC,KAAY;QACX,MAAM,CAAC,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;QACnC,UAAU,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,KAAK,OAAA,EAAE,CAAC,CAAC;IACzC,CAAC,EACD,CAAC,UAAU,CAAC,CACb,CAAC;IAEF;;OAEG;IACH,IAAM,WAAW,GAAG,WAAW,CAAC;;;;;;oBAE5B,wCAAwC;oBACxC,oBAAoB,CAClB,0DAA0D,CAC3D,CAAC;oBAEF,IAAI,CAAC,QAAQ,EAAE,CAAC;wBACd,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;oBAClD,CAAC;oBAED,yDAAyD;oBACzD,oBAAoB,CAAC,mCAAmC,CAAC,CAAC;oBAGpD,aAAa,GAAG,QAAQ,CAAC,aAAa,CAAC;oBAC7C,IAAI,CAAC,aAAa,EAAE,CAAC;wBACnB,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;oBACzD,CAAC;oBAED,sBAAsB;oBACtB,qBAAM,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,EAAA;;oBAD5C,sBAAsB;oBACtB,SAA4C,CAAC;oBAC7C,qBAAM,QAAQ,CAAC,eAAe,EAAE,EAAA;;oBAAhC,SAAgC,CAAC;oBAG3B,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAC;oBACrC,IAAI,CAAC,SAAS,EAAE,CAAC;wBACf,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;oBAC5D,CAAC;oBAED,MAAM,CAAC,KAAK,CAAC,gCAAgC,EAAE;wBAC7C,SAAS,EAAE,SAAS,CAAC,QAAQ,EAAE;qBAChC,CAAC,CAAC;oBAEH,0CAA0C;oBAC1C,IAAI,OAAO,EAAE,CAAC;wBACN,YAAY,GAAG,uBAAgB,OAAO,CAAE,CAAC;wBAC/C,YAAY,CAAC,OAAO,CAAC,YAAY,EAAE,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC;wBACzD,MAAM,CAAC,KAAK,CAAC,kCAAkC,EAAE,EAAE,GAAG,EAAE,YAAY,EAAE,CAAC,CAAC;oBAC1E,CAAC;oBAED,mCAAmC;oBACnC,aAAa,CAAC,SAAS,CAAC,CAAC;oBAEzB,6CAA6C;oBAC7C,UAAU,CAAC;wBACT,UAAU,CAAC,SAAS,CAAC,aAAa,EAAE,EAAE,gBAAgB,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC;oBACxF,CAAC,EAAE,GAAG,CAAC,CAAC;;;;oBAGR,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,OAAK,CAAC,CAAC;oBAC9C,aAAa,CAAC,OAAO,CAAC,CAAC;oBACvB,mBAAmB,CACjB,OAAK,YAAY,KAAK,CAAC,CAAC,CAAC,OAAK,CAAC,OAAO,CAAC,CAAC,CAAC,wBAAwB,CAClE,CAAC;;;;;SAEL,EAAE,CAAC,aAAa,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;IAEnD;;OAEG;IACH,IAAM,YAAY,GAAG,WAAW,CAC9B,UAAC,SAAiB;QAChB,SAAS,CAAC,SAAS,CAAC,CAAC;QACrB,IAAI,KAAK,KAAK,SAAS,CAAC,YAAY,EAAE,CAAC;YACrC,aAAa,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;QACvC,CAAC;aAAM,CAAC;YACN,UAAU,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC,EACD,CAAC,KAAK,EAAE,UAAU,EAAE,aAAa,CAAC,CACnC,CAAC;IAEF;;OAEG;IACH,IAAM,YAAY,GAAG,WAAW,CAAC;;;;;oBAC/B,IAAI,YAAY;wBAAE,sBAAO;oBAEzB,MAAM,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;oBAEzC,IAAI,CAAC,MAAM,IAAI,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;wBACvC,WAAW,CAAC,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC;wBACzC,sBAAO;oBACT,CAAC;oBAED,eAAe,CAAC,IAAI,CAAC,CAAC;oBACtB,UAAU,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;;;;oBAG/B,SAAS,GAAG,IAAK,CAAC,MAAM,CAAC,IAAI,CAAC,UAAC,CAAM,IAAK,OAAA,CAAC,CAAC,MAAM,KAAK,MAAM,EAAnB,CAAmB,CAAC,CAAC;oBAExD,qBAAM,QAAQ,CAAC,UAAU,CACpC,UAAU,CAAC,MAAM,CAAC,EAClB,SAAU,CAAC,OAAO,CACnB,EAAA;;oBAHK,IAAI,GAAG,SAGZ;oBAEG,kBAAkB,GAAG,KAAK,CAAC;oBACtB,CAAC,GAAG,CAAC;;;yBAAE,CAAA,CAAC,GAAG,EAAE,CAAA;oBACL,qBAAM,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAA,EAAA;;oBAAjD,MAAM,GAAG,SAAwC;oBACvD,IAAI,MAAM,EAAE,CAAC;wBACX,kBAAkB,GAAG,IAAI,CAAC;wBAC1B,wBAAM;oBACR,CAAC;oBACD,qBAAM,IAAI,OAAO,CAAC,UAAC,OAAO,IAAK,OAAA,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,EAAzB,CAAyB,CAAC,EAAA;;oBAAzD,SAAyD,CAAC;;;oBANpC,CAAC,EAAE,CAAA;;;oBAS3B,IAAI,CAAC,kBAAkB,EAAE,CAAC;wBACxB,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;oBACxD,CAAC;oBAED,MAAM,CAAC,KAAK,CAAC,kCAAkC,EAAE,IAAI,CAAC,CAAC;oBAGjD,MAAM,GAAsB;wBAChC,OAAO,EAAE,IAAI;wBACb,aAAa,EAAE,IAAI;wBACnB,MAAM,QAAA;wBACN,WAAW,EAAE,MAAM;wBACnB,WAAW,EAAE,OAAO,IAAI,aAAa;wBACrC,SAAS,EAAE,kBAAkB;wBAC7B,WAAW,EAAE,aAAc;wBAC3B,MAAM,EAAE,WAAW;wBACnB,WAAW,EAAE,cAAc,CAAC,IAAI,CAAC;qBAClC,CAAC;oBAEF,uCAAuC;oBACvC,gBAAgB,CAAC,IAAI,CAAC,CAAC;oBACvB,oBAAoB,CAAC,MAAM,CAAC,CAAC;oBAC7B,MAAM,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;oBACnD,UAAU,CAAC,SAAS,CAAC,eAAe,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC;;;;oBAErF,MAAM,CAAC,IAAI,CAAC,8DAA8D,EAAE,cAAY,CAAC,CAAC;oBAC1F,eAAe,CAAC,KAAK,CAAC,CAAC;oBACjB,YAAY,GAAG,cAAY,YAAY,KAAK;wBAChD,CAAC,CAAC,cAAY,CAAC,OAAO;wBACtB,CAAC,CAAC,2BAA2B,CAAC;oBAEhC,UAAU,CAAC,SAAS,CAAC,YAAY,EAAE;wBACjC,YAAY,EAAE,YAAY;qBAC3B,CAAC,CAAC;oBACH,sBAAO,CAAC,aAAa;;;;SAExB,EAAE;QACD,YAAY;QACZ,aAAa;QACb,MAAM;QACN,OAAO;QACP,WAAW;QACX,UAAU;QACV,WAAW;QACX,IAAI;QACJ,wBAAwB;QACxB,yBAAyB;QACzB,QAAQ;KACT,CAAC,CAAC;IAEH;;OAEG;IACH,IAAM,eAAe,GAAG,WAAW,CAAC;QAClC,kEAAkE;QAClE,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;YAC7B,8DAA8D;YAC9D,UAAU,CAAC,SAAS,CAAC,aAAa,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC,CAAC;QACxF,CAAC;aAAM,CAAC;YACN,sDAAsD;YACtD,IAAM,YAAY,GAAG,uBAAgB,OAAO,CAAE,CAAC;YAC/C,IAAM,eAAe,GAAG,YAAY,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;YAE3D,IAAI,eAAe,KAAK,IAAI,EAAE,CAAC;gBAC7B,wFAAwF;gBACxF,UAAU,CAAC,SAAS,CAAC,aAAa,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC,CAAC;YACxF,CAAC;iBAAM,CAAC;gBACN,2FAA2F;gBAC3F,UAAU,CAAC,SAAS,CAAC,YAAY,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC;YAC/D,CAAC;QACH,CAAC;IACH,CAAC,EAAE,CAAC,OAAO,CAAC,gBAAgB,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;IAMpD,2BAA2B;IAC3B,IAAM,YAAY,GAAwB;QACxC,MAAM,QAAA;QACN,YAAY,cAAA;QACZ,aAAa,eAAA;QACb,iBAAiB,mBAAA;QACjB,UAAU,YAAA;QACV,gBAAgB,kBAAA;QAChB,iBAAiB,mBAAA;QACjB,YAAY,cAAA;QACZ,YAAY,cAAA;QACZ,eAAe,iBAAA;QACf,WAAW,aAAA;KACZ,CAAC;IAGF;;OAEG;IACH,SAAS,CAAC;QACR,IAAM,WAAW,GAAG,cAAc,CAAC,OAAO,CAAC;QAE3C,yEAAyE;QACzE,IAAI,OAAO,CAAC,aAAa,KAAK,WAAW,CAAC,aAAa,EAAE,CAAC;YACxD,gBAAgB,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QAC1C,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,KAAK,WAAW,CAAC,MAAM,EAAE,CAAC;YAC1C,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC5B,CAAC;QAED,IAAI,OAAO,CAAC,aAAa,KAAK,WAAW,CAAC,aAAa,EAAE,CAAC;YACxD,gBAAgB,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QAC1C,CAAC;QAED,wCAAwC;QACxC,cAAc,CAAC,OAAO,GAAG,OAAO,CAAC;IACnC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAId,OAAO,CACL,KAAC,cAAc,CAAC,QAAQ,IAAC,KAAK,EAAE,YAAY,YACzC,QAAQ,GACe,CAC3B,CAAC;AACJ,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,IAAM,iBAAiB,GAAG;IAC/B,IAAM,OAAO,GAAG,UAAU,CAAC,cAAc,CAAC,CAAC;IAC3C,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;IAC7E,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC","sourcesContent":["import React, { createContext, useCallback, useContext, useEffect, useRef, useState } from 'react';\nimport {\n getExplorerUrl,\n TransactionResult,\n} from '../../../Logic/transactionManager';\nimport {\n useN1WalletContext,\n useN1WalletInternalContext,\n} from '../../../Provider/hooks';\nimport { N1SessionMode } from '../../../Provider/types';\nimport { logger } from '../../../utils/logger';\nimport { AVAILABLE_CHAINS } from '../constants';\nimport { FlowState } from '../types';\nimport { isNordConfigured } from '../utils/nordUtils';\nimport { useFlowStateContext } from './FlowContext';\n\n// Define the shape of the deposit context value\nexport interface DepositContextValue {\n amount: string;\n isDepositing: boolean;\n transactionId: string | null;\n transactionResult: TransactionResult | null;\n authStatus: 'loading' | 'success' | 'error';\n authErrorMessage: string | null;\n authStatusMessage: string | null;\n updateAmount: (newAmount: string) => void;\n startDeposit: () => Promise<void>;\n completeDeposit: () => void;\n performAuth: () => Promise<void>;\n}\n\n// Create the context with a default value\nconst DepositContext = createContext<DepositContextValue | undefined>(undefined);\n\n// Props for the provider component\ninterface DepositProviderProps {\n children: React.ReactNode;\n}\n\n/**\n * Provider component for the deposit context\n */\nexport const DepositProvider: React.FC<DepositProviderProps> = ({\n children,\n}) => {\n // Get flow state context\n const {\n state,\n context,\n transition,\n updateContext,\n } = useFlowStateContext();\n\n // Get wallet context\n const {\n address,\n nord,\n signMessageWithWalletKey,\n signMessageWithSessionKey,\n nordUser,\n } = useN1WalletContext();\n const { sessionMode } = useN1WalletInternalContext();\n\n // chain\n const [selectedChain, setSelectedChain] = useState<string | null>(\n context.selectedChain\n );\n\n // transaction & deposit\n const [amount, setAmount] = useState(context.amount);\n const [isDepositing, setIsDepositing] = useState(false);\n const [transactionId, setTransactionId] = useState<string | null>(context.transactionId);\n const [transactionResult, setTransactionResult] = useState<TransactionResult | null>(null);\n\n\n // auth\n const [authStatus, setAuthStatus] = useState<'loading' | 'success' | 'error'>('loading');\n const [authErrorMessage, setAuthErrorMessage] = useState<string | null>(null);\n const [authStatusMessage, setAuthStatusMessage] = useState<string | null>(null);\n\n // Use refs to track previous values\n const prevContextRef = useRef(context);\n\n\n /**\n * Handle an error by transitioning to error state\n */\n const handleError = useCallback(\n (error: Error) => {\n logger.error('Flow error:', error);\n transition(FlowState.ERROR, { error });\n },\n [transition]\n );\n\n /**\n * Authenticate session\n */\n const performAuth = useCallback(async () => {\n try {\n // Step 1: Tell user to sign transaction\n setAuthStatusMessage(\n 'Please sign the transaction to authenticate your session'\n );\n\n if (!nordUser) {\n throw new Error('Nord user is not initialized');\n }\n\n // Step 2: Call nordUser.refreshSession and get sessionId\n setAuthStatusMessage('Session is being authenticated...');\n\n // Get the session public key from the nordUser\n const sessionPubKey = nordUser.sessionPubKey;\n if (!sessionPubKey) {\n throw new Error('Session public key is not available');\n }\n\n // Refresh the session\n await nordUser.refreshSession(sessionPubKey);\n await nordUser.updateAccountId();\n\n // Get the sessionId after refresh\n const sessionId = nordUser.sessionId;\n if (!sessionId) {\n throw new Error('Failed to get session ID after refresh');\n }\n\n logger.debug('Session refreshed successfully', {\n sessionId: sessionId.toString(),\n });\n\n // Step 3: Store sessionId in localStorage\n if (address) {\n const sessionIdKey = `n1_sessionId_${address}`;\n localStorage.setItem(sessionIdKey, sessionId.toString());\n logger.debug('Stored sessionId in localStorage', { key: sessionIdKey });\n }\n\n // Step 4: Update status to success\n setAuthStatus('success');\n\n // updateContext({ hasActiveSession: true });\n setTimeout(() => {\n transition(FlowState.FINAL_SUCCESS, { hasActiveSession: true, hasNordAccount: true });\n }, 100);\n\n } catch (error) {\n console.error('Authentication error:', error);\n setAuthStatus('error');\n setAuthErrorMessage(\n error instanceof Error ? error.message : 'Unknown error occurred'\n );\n }\n }, [updateContext, transition, address, nordUser]);\n\n /**\n * Update amount for deposit\n */\n const updateAmount = useCallback(\n (newAmount: string) => {\n setAmount(newAmount);\n if (state === FlowState.AMOUNT_INPUT) {\n updateContext({ amount: newAmount });\n } else {\n transition(state, { amount: newAmount });\n }\n },\n [state, transition, updateContext]\n );\n\n /**\n * Start deposit process\n */\n const startDeposit = useCallback(async () => {\n if (isDepositing) return;\n\n logger.debug('Starting deposit process');\n\n if (!amount || parseFloat(amount) <= 0) {\n handleError(new Error('Invalid amount'));\n return;\n }\n\n setIsDepositing(true);\n transition(FlowState.DEPOSIT_PROGRESS);\n\n try {\n const usdcToken = nord!.tokens.find((t: any) => t.symbol === 'USDC');\n\n const txId = await nordUser.depositSpl(\n parseFloat(amount),\n usdcToken!.tokenId\n );\n\n let accountInitialized = false;\n for (let i = 0; i < 70; i++) {\n const exists = await nord?.getUser({ pubkey: address });\n if (exists) {\n accountInitialized = true;\n break;\n }\n await new Promise((resolve) => setTimeout(resolve, 5000));\n }\n\n if (!accountInitialized) {\n throw new Error('Account failed to intialize on N1.');\n }\n\n logger.debug('Deposit successful using Nord-TS', txId);\n\n // Create transaction result object immediately after successful deposit\n const result: TransactionResult = {\n success: true,\n transactionId: txId,\n amount,\n tokenSymbol: 'USDC',\n fromAddress: address || 'Your Wallet',\n toAddress: 'Exchange Account',\n networkName: selectedChain!,\n status: 'Completed',\n explorerUrl: getExplorerUrl(txId),\n };\n\n // Update state with transaction result\n setTransactionId(txId);\n setTransactionResult(result);\n logger.debug('Transaction completed successfully');\n transition(FlowState.DEPOSIT_SUCCESS, { transactionId: txId, hasNordAccount: true });\n } catch (depositError) {\n logger.warn('Error using depositSpl, falling back to mock implementation:', depositError);\n setIsDepositing(false);\n const errorMessage = depositError instanceof Error\n ? depositError.message\n : 'Failed to process deposit';\n\n transition(FlowState.AMOUNT_INPUT, {\n depositError: errorMessage\n });\n return; // Exit early\n }\n }, [\n isDepositing,\n selectedChain,\n amount,\n address,\n sessionMode,\n transition,\n handleError,\n nord,\n signMessageWithWalletKey,\n signMessageWithSessionKey,\n nordUser,\n ]);\n\n /**\n * Complete the deposit process and move to the next screen\n */\n const completeDeposit = useCallback(() => {\n // Check if user has an active session to determine the next state\n if (context.hasActiveSession) {\n // If user has an active session, go directly to FINAL_SUCCESS\n transition(FlowState.FINAL_SUCCESS, { hasNordAccount: true, hasActiveSession: true });\n } else {\n // Check if there's a sessionId stored in localStorage\n const sessionIdKey = `n1_sessionId_${address}`;\n const storedSessionId = localStorage.getItem(sessionIdKey);\n\n if (storedSessionId !== null) {\n // If we have a sessionId in localStorage (even if it's 0), go directly to FINAL_SUCCESS\n transition(FlowState.FINAL_SUCCESS, { hasNordAccount: true, hasActiveSession: true });\n } else {\n // If user doesn't have an active session and no sessionId in localStorage, go to NORD_AUTH\n transition(FlowState.AUTH_LOADING, { hasNordAccount: true });\n }\n }\n }, [context.hasActiveSession, transition, address]);\n\n\n\n\n\n // Create the context value\n const contextValue: DepositContextValue = {\n amount,\n isDepositing,\n transactionId,\n transactionResult,\n authStatus,\n authErrorMessage,\n authStatusMessage,\n updateAmount,\n startDeposit,\n completeDeposit,\n performAuth,\n };\n\n\n /**\n * Update state based on context changes\n */\n useEffect(() => {\n const prevContext = prevContextRef.current;\n\n // Only update state if the relevant context values have actually changed\n if (context.selectedChain !== prevContext.selectedChain) {\n setSelectedChain(context.selectedChain);\n }\n\n if (context.amount !== prevContext.amount) {\n setAmount(context.amount);\n }\n\n if (context.transactionId !== prevContext.transactionId) {\n setTransactionId(context.transactionId);\n }\n\n // Update the ref to the current context\n prevContextRef.current = context;\n }, [context]);\n\n\n\n return (\n <DepositContext.Provider value={contextValue}>\n {children}\n </DepositContext.Provider>\n );\n};\n\n/**\n * Hook to use the deposit context\n */\nexport const useDepositContext = (): DepositContextValue => {\n const context = useContext(DepositContext);\n if (context === undefined) {\n throw new Error('useDepositContext must be used within a DepositProvider');\n }\n return context;\n}; "]}
|
|
1
|
+
{"version":3,"file":"DepositContext.js","sourceRoot":"","sources":["../../../../src/Modal/NordFlow/context/DepositContext.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { createContext, useCallback, useContext, useEffect, useRef, useState } from 'react';\nimport {\n getExplorerUrl,\n TransactionResult,\n} from '../../../Logic/transactionManager';\nimport {\n useN1WalletContext,\n useN1WalletInternalContext,\n} from '../../../Provider/hooks';\nimport { N1SessionMode } from '../../../Provider/types';\nimport { logger } from '../../../utils/logger';\nimport { AVAILABLE_CHAINS } from '../constants';\nimport { FlowState } from '../types';\nimport { isNordConfigured } from '../utils/nordUtils';\nimport { useFlowStateContext } from './FlowContext';\n\n// Define the shape of the deposit context value\nexport interface DepositContextValue {\n amount: string;\n isDepositing: boolean;\n transactionId: string | null;\n transactionResult: TransactionResult | null;\n authStatus: 'loading' | 'success' | 'error';\n authErrorMessage: string | null;\n authStatusMessage: string | null;\n updateAmount: (newAmount: string) => void;\n startDeposit: () => Promise<void>;\n completeDeposit: () => void;\n performAuth: () => Promise<void>;\n}\n\n// Create the context with a default value\nconst DepositContext = createContext<DepositContextValue | undefined>(undefined);\n\n// Props for the provider component\ninterface DepositProviderProps {\n children: React.ReactNode;\n}\n\n/**\n * Provider component for the deposit context\n */\nexport const DepositProvider: React.FC<DepositProviderProps> = ({\n children,\n}) => {\n // Get flow state context\n const {\n state,\n context,\n transition,\n updateContext,\n } = useFlowStateContext();\n\n // Get wallet context\n const {\n address,\n nord,\n signMessageWithSessionKey,\n nordUser,\n } = useN1WalletContext();\n const { sessionMode } = useN1WalletInternalContext();\n\n // chain\n const [selectedChain, setSelectedChain] = useState<string | null>(\n context.selectedChain\n );\n\n // transaction & deposit\n const [amount, setAmount] = useState(context.amount);\n const [isDepositing, setIsDepositing] = useState(false);\n const [transactionId, setTransactionId] = useState<string | null>(context.transactionId);\n const [transactionResult, setTransactionResult] = useState<TransactionResult | null>(null);\n\n\n // auth\n const [authStatus, setAuthStatus] = useState<'loading' | 'success' | 'error'>('loading');\n const [authErrorMessage, setAuthErrorMessage] = useState<string | null>(null);\n const [authStatusMessage, setAuthStatusMessage] = useState<string | null>(null);\n\n // Use refs to track previous values\n const prevContextRef = useRef(context);\n\n\n /**\n * Handle an error by transitioning to error state\n */\n const handleError = useCallback(\n (error: Error) => {\n logger.error('Flow error:', error);\n transition(FlowState.ERROR, { error });\n },\n [transition]\n );\n\n /**\n * Authenticate session\n */\n const performAuth = useCallback(async () => {\n try {\n // Step 1: Tell user to sign transaction\n setAuthStatusMessage(\n 'Please sign the transaction to authenticate your session'\n );\n\n if (!nordUser) {\n throw new Error('Nord user is not initialized');\n }\n\n // Step 2: Call nordUser.refreshSession and get sessionId\n setAuthStatusMessage('Session is being authenticated...');\n\n // Get the session public key from the nordUser\n const sessionPubKey = nordUser.sessionPubKey;\n if (!sessionPubKey) {\n throw new Error('Session public key is not available');\n }\n\n // Refresh the session\n await nordUser.refreshSession(sessionPubKey);\n await nordUser.updateAccountId();\n\n // Get the sessionId after refresh\n const sessionId = nordUser.sessionId;\n if (!sessionId) {\n throw new Error('Failed to get session ID after refresh');\n }\n\n logger.debug('Session refreshed successfully', {\n sessionId: sessionId.toString(),\n });\n\n // Step 3: Store sessionId in localStorage\n if (address) {\n const sessionIdKey = `n1_sessionId_${address}`;\n localStorage.setItem(sessionIdKey, sessionId.toString());\n logger.debug('Stored sessionId in localStorage', { key: sessionIdKey });\n }\n\n // Step 4: Update status to success\n setAuthStatus('success');\n\n // updateContext({ hasActiveSession: true });\n setTimeout(() => {\n transition(FlowState.FINAL_SUCCESS, { hasActiveSession: true, hasNordAccount: true });\n }, 100);\n\n } catch (error) {\n console.error('Authentication error:', error);\n setAuthStatus('error');\n setAuthErrorMessage(\n error instanceof Error ? error.message : 'Unknown error occurred'\n );\n }\n }, [updateContext, transition, address, nordUser]);\n\n /**\n * Update amount for deposit\n */\n const updateAmount = useCallback(\n (newAmount: string) => {\n setAmount(newAmount);\n if (state === FlowState.AMOUNT_INPUT) {\n updateContext({ amount: newAmount });\n } else {\n transition(state, { amount: newAmount });\n }\n },\n [state, transition, updateContext]\n );\n\n /**\n * Start deposit process\n */\n const startDeposit = useCallback(async () => {\n if (isDepositing) return;\n\n logger.debug('Starting deposit process');\n\n if (!amount || parseFloat(amount) <= 0) {\n handleError(new Error('Invalid amount'));\n return;\n }\n\n setIsDepositing(true);\n transition(FlowState.DEPOSIT_PROGRESS);\n\n try {\n const usdcToken = nord!.tokens.find((t: any) => t.symbol === 'USDC');\n\n const txId = await nordUser.depositSpl(\n parseFloat(amount),\n usdcToken!.tokenId\n );\n\n let accountInitialized = false;\n for (let i = 0; i < 70; i++) {\n const exists = await nord?.getUser({ pubkey: address });\n if (exists) {\n accountInitialized = true;\n break;\n }\n await new Promise((resolve) => setTimeout(resolve, 5000));\n }\n\n if (!accountInitialized) {\n throw new Error('Account failed to intialize on N1.');\n }\n\n logger.debug('Deposit successful using Nord-TS', txId);\n\n // Create transaction result object immediately after successful deposit\n const result: TransactionResult = {\n success: true,\n transactionId: txId,\n amount,\n tokenSymbol: 'USDC',\n fromAddress: address || 'Your Wallet',\n toAddress: 'Exchange Account',\n networkName: selectedChain!,\n status: 'Completed',\n explorerUrl: getExplorerUrl(txId),\n };\n\n // Update state with transaction result\n setTransactionId(txId);\n setTransactionResult(result);\n logger.debug('Transaction completed successfully');\n transition(FlowState.DEPOSIT_SUCCESS, { transactionId: txId, hasNordAccount: true });\n } catch (depositError) {\n logger.warn('Error using depositSpl, falling back to mock implementation:', depositError);\n setIsDepositing(false);\n const errorMessage = depositError instanceof Error\n ? depositError.message\n : 'Failed to process deposit';\n\n transition(FlowState.AMOUNT_INPUT, {\n depositError: errorMessage\n });\n return; // Exit early\n }\n }, [\n isDepositing,\n selectedChain,\n amount,\n address,\n sessionMode,\n transition,\n handleError,\n nord,\n signMessageWithSessionKey,\n nordUser,\n ]);\n\n /**\n * Complete the deposit process and move to the next screen\n */\n const completeDeposit = useCallback(() => {\n // Check if user has an active session to determine the next state\n if (context.hasActiveSession) {\n // If user has an active session, go directly to FINAL_SUCCESS\n transition(FlowState.FINAL_SUCCESS, { hasNordAccount: true, hasActiveSession: true });\n } else {\n // Check if there's a sessionId stored in localStorage\n const sessionIdKey = `n1_sessionId_${address}`;\n const storedSessionId = localStorage.getItem(sessionIdKey);\n\n if (storedSessionId !== null) {\n // If we have a sessionId in localStorage (even if it's 0), go directly to FINAL_SUCCESS\n transition(FlowState.FINAL_SUCCESS, { hasNordAccount: true, hasActiveSession: true });\n } else {\n // If user doesn't have an active session and no sessionId in localStorage, go to NORD_AUTH\n transition(FlowState.AUTH_LOADING, { hasNordAccount: true });\n }\n }\n }, [context.hasActiveSession, transition, address]);\n\n\n\n\n\n // Create the context value\n const contextValue: DepositContextValue = {\n amount,\n isDepositing,\n transactionId,\n transactionResult,\n authStatus,\n authErrorMessage,\n authStatusMessage,\n updateAmount,\n startDeposit,\n completeDeposit,\n performAuth,\n };\n\n\n /**\n * Update state based on context changes\n */\n useEffect(() => {\n const prevContext = prevContextRef.current;\n\n // Only update state if the relevant context values have actually changed\n if (context.selectedChain !== prevContext.selectedChain) {\n setSelectedChain(context.selectedChain);\n }\n\n if (context.amount !== prevContext.amount) {\n setAmount(context.amount);\n }\n\n if (context.transactionId !== prevContext.transactionId) {\n setTransactionId(context.transactionId);\n }\n\n // Update the ref to the current context\n prevContextRef.current = context;\n }, [context]);\n\n\n\n return (\n <DepositContext.Provider value={contextValue}>\n {children}\n </DepositContext.Provider>\n );\n};\n\n/**\n * Hook to use the deposit context\n */\nexport const useDepositContext = (): DepositContextValue => {\n const context = useContext(DepositContext);\n if (context === undefined) {\n throw new Error('useDepositContext must be used within a DepositProvider');\n }\n return context;\n}; \n"]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
interface UseTestnetFaucetParams {
|
|
2
|
+
enabled: boolean;
|
|
3
|
+
balance: number;
|
|
4
|
+
minDeposit: number;
|
|
5
|
+
}
|
|
6
|
+
interface UseTestnetFaucetResult {
|
|
7
|
+
isFaucetLoading: boolean;
|
|
8
|
+
faucetError: string | null;
|
|
9
|
+
showFaucetSuccess: boolean;
|
|
10
|
+
showFaucetOverlay: boolean;
|
|
11
|
+
requestTestnetTokens: () => Promise<void>;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Centralizes the faucet orchestration logic so it can be toggled from the widget entry point.
|
|
15
|
+
*/
|
|
16
|
+
export declare function useTestnetFaucet({ enabled, balance, minDeposit, }: UseTestnetFaucetParams): UseTestnetFaucetResult;
|
|
17
|
+
export {};
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
11
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
|
|
12
|
+
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
13
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
14
|
+
function step(op) {
|
|
15
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
16
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
17
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
18
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
19
|
+
switch (op[0]) {
|
|
20
|
+
case 0: case 1: t = op; break;
|
|
21
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
22
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
23
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
24
|
+
default:
|
|
25
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
26
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
27
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
28
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
29
|
+
if (t[2]) _.ops.pop();
|
|
30
|
+
_.trys.pop(); continue;
|
|
31
|
+
}
|
|
32
|
+
op = body.call(thisArg, _);
|
|
33
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
34
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
38
|
+
import { useN1WalletContext, useN1WalletInternalContext, } from '../../../Provider/hooks';
|
|
39
|
+
import { useFlowStateContext } from '../context/FlowContext';
|
|
40
|
+
/**
|
|
41
|
+
* Centralizes the faucet orchestration logic so it can be toggled from the widget entry point.
|
|
42
|
+
*/
|
|
43
|
+
export function useTestnetFaucet(_a) {
|
|
44
|
+
var _this = this;
|
|
45
|
+
var enabled = _a.enabled, balance = _a.balance, minDeposit = _a.minDeposit;
|
|
46
|
+
var address = useN1WalletContext().address;
|
|
47
|
+
var faucetUrl = useN1WalletInternalContext().faucetUrl;
|
|
48
|
+
var context = useFlowStateContext().context;
|
|
49
|
+
var faucetFiredRef = useRef(false);
|
|
50
|
+
var prevBalanceRef = useRef(balance);
|
|
51
|
+
var _b = useState(false), isFaucetLoading = _b[0], setIsFaucetLoading = _b[1];
|
|
52
|
+
var _c = useState(null), faucetError = _c[0], setFaucetError = _c[1];
|
|
53
|
+
var _d = useState(false), tokensObtained = _d[0], setTokensObtained = _d[1];
|
|
54
|
+
var _e = useState(false), showFaucetSuccess = _e[0], setShowFaucetSuccess = _e[1];
|
|
55
|
+
var refreshBalance = useCallback(function () { return __awaiter(_this, void 0, void 0, function () {
|
|
56
|
+
return __generator(this, function (_a) {
|
|
57
|
+
return [2 /*return*/];
|
|
58
|
+
});
|
|
59
|
+
}); }, []);
|
|
60
|
+
var shouldShowFaucet = useMemo(function () {
|
|
61
|
+
return enabled && Boolean(faucetUrl) && !tokensObtained;
|
|
62
|
+
}, [enabled, faucetUrl, tokensObtained]);
|
|
63
|
+
var showFaucetOverlay = useMemo(function () {
|
|
64
|
+
if (!shouldShowFaucet) {
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
return ((isFaucetLoading || faucetError !== null) ||
|
|
68
|
+
showFaucetSuccess);
|
|
69
|
+
}, [shouldShowFaucet, isFaucetLoading, faucetError, showFaucetSuccess]);
|
|
70
|
+
var requestTestnetTokens = useCallback(function () { return __awaiter(_this, void 0, void 0, function () {
|
|
71
|
+
var response, errorData, error_1;
|
|
72
|
+
return __generator(this, function (_a) {
|
|
73
|
+
switch (_a.label) {
|
|
74
|
+
case 0:
|
|
75
|
+
if (!shouldShowFaucet || !address || !faucetUrl)
|
|
76
|
+
return [2 /*return*/];
|
|
77
|
+
if (faucetFiredRef.current)
|
|
78
|
+
return [2 /*return*/];
|
|
79
|
+
faucetFiredRef.current = true;
|
|
80
|
+
_a.label = 1;
|
|
81
|
+
case 1:
|
|
82
|
+
_a.trys.push([1, 7, 8, 9]);
|
|
83
|
+
setIsFaucetLoading(true);
|
|
84
|
+
setFaucetError(null);
|
|
85
|
+
setShowFaucetSuccess(false);
|
|
86
|
+
return [4 /*yield*/, fetch(faucetUrl, {
|
|
87
|
+
method: 'POST',
|
|
88
|
+
headers: {
|
|
89
|
+
'Content-Type': 'application/json',
|
|
90
|
+
},
|
|
91
|
+
body: JSON.stringify({ address: address }),
|
|
92
|
+
})];
|
|
93
|
+
case 2:
|
|
94
|
+
response = _a.sent();
|
|
95
|
+
if (!!response.ok) return [3 /*break*/, 4];
|
|
96
|
+
return [4 /*yield*/, response
|
|
97
|
+
.json()
|
|
98
|
+
.catch(function () { return ({ error: 'Failed to request tokens' }); })];
|
|
99
|
+
case 3:
|
|
100
|
+
errorData = _a.sent();
|
|
101
|
+
throw new Error(errorData.error || 'Failed to request tokens');
|
|
102
|
+
case 4: return [4 /*yield*/, response.json().catch(function () { return ({}); })];
|
|
103
|
+
case 5:
|
|
104
|
+
_a.sent();
|
|
105
|
+
setTokensObtained(true);
|
|
106
|
+
setShowFaucetSuccess(true);
|
|
107
|
+
return [4 /*yield*/, refreshBalance()];
|
|
108
|
+
case 6:
|
|
109
|
+
_a.sent();
|
|
110
|
+
setShowFaucetSuccess(false);
|
|
111
|
+
return [3 /*break*/, 9];
|
|
112
|
+
case 7:
|
|
113
|
+
error_1 = _a.sent();
|
|
114
|
+
console.error('Faucet error:', error_1);
|
|
115
|
+
setFaucetError(error_1 instanceof Error ? error_1.message : 'Failed to request tokens');
|
|
116
|
+
faucetFiredRef.current = false;
|
|
117
|
+
return [3 /*break*/, 9];
|
|
118
|
+
case 8:
|
|
119
|
+
setIsFaucetLoading(false);
|
|
120
|
+
return [7 /*endfinally*/];
|
|
121
|
+
case 9: return [2 /*return*/];
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
}); }, [shouldShowFaucet, address, faucetUrl, refreshBalance]);
|
|
125
|
+
useEffect(function () {
|
|
126
|
+
if (!shouldShowFaucet ||
|
|
127
|
+
isFaucetLoading ||
|
|
128
|
+
faucetError ||
|
|
129
|
+
showFaucetSuccess ||
|
|
130
|
+
context.depositError != null ||
|
|
131
|
+
faucetFiredRef.current) {
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
requestTestnetTokens();
|
|
135
|
+
}, [
|
|
136
|
+
shouldShowFaucet,
|
|
137
|
+
isFaucetLoading,
|
|
138
|
+
faucetError,
|
|
139
|
+
showFaucetSuccess,
|
|
140
|
+
context.depositError,
|
|
141
|
+
requestTestnetTokens,
|
|
142
|
+
]);
|
|
143
|
+
useEffect(function () {
|
|
144
|
+
if (balance > prevBalanceRef.current && balance >= minDeposit) {
|
|
145
|
+
setTokensObtained(false);
|
|
146
|
+
setShowFaucetSuccess(false);
|
|
147
|
+
}
|
|
148
|
+
else if (balance < minDeposit / 2) {
|
|
149
|
+
faucetFiredRef.current = false;
|
|
150
|
+
setTokensObtained(false);
|
|
151
|
+
}
|
|
152
|
+
prevBalanceRef.current = balance;
|
|
153
|
+
}, [balance, minDeposit]);
|
|
154
|
+
return {
|
|
155
|
+
isFaucetLoading: isFaucetLoading,
|
|
156
|
+
faucetError: faucetError,
|
|
157
|
+
showFaucetSuccess: showFaucetSuccess,
|
|
158
|
+
showFaucetOverlay: showFaucetOverlay,
|
|
159
|
+
requestTestnetTokens: requestTestnetTokens,
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=useTestnetFaucet.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useTestnetFaucet.js","sourceRoot":"","sources":["../../../../src/Modal/NordFlow/hooks/useTestnetFaucet.ts"],"names":[],"mappings":"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","sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport {\n useN1WalletContext,\n useN1WalletInternalContext,\n} from '../../../Provider/hooks';\nimport { useFlowStateContext } from '../context/FlowContext';\n\ninterface UseTestnetFaucetParams {\n enabled: boolean;\n balance: number;\n minDeposit: number;\n}\n\ninterface UseTestnetFaucetResult {\n isFaucetLoading: boolean;\n faucetError: string | null;\n showFaucetSuccess: boolean;\n showFaucetOverlay: boolean;\n requestTestnetTokens: () => Promise<void>;\n}\n\n/**\n * Centralizes the faucet orchestration logic so it can be toggled from the widget entry point.\n */\nexport function useTestnetFaucet({\n enabled,\n balance,\n minDeposit,\n}: UseTestnetFaucetParams): UseTestnetFaucetResult {\n const { address } = useN1WalletContext();\n const { faucetUrl } = useN1WalletInternalContext();\n const { context } = useFlowStateContext();\n\n const faucetFiredRef = useRef(false);\n const prevBalanceRef = useRef(balance);\n\n const [isFaucetLoading, setIsFaucetLoading] = useState(false);\n const [faucetError, setFaucetError] = useState<string | null>(null);\n const [tokensObtained, setTokensObtained] = useState(false);\n const [showFaucetSuccess, setShowFaucetSuccess] = useState(false);\n\n const refreshBalance = useCallback(async () => {\n // TODO: implement when balance fetching is wired up\n }, []);\n\n const shouldShowFaucet = useMemo(() => {\n return enabled && Boolean(faucetUrl) && !tokensObtained;\n }, [enabled, faucetUrl, tokensObtained]);\n\n const showFaucetOverlay = useMemo(() => {\n if (!shouldShowFaucet) {\n return false;\n }\n\n return (\n (isFaucetLoading || faucetError !== null) ||\n showFaucetSuccess\n );\n }, [shouldShowFaucet, isFaucetLoading, faucetError, showFaucetSuccess]);\n\n const requestTestnetTokens = useCallback(async () => {\n if (!shouldShowFaucet || !address || !faucetUrl) return;\n if (faucetFiredRef.current) return;\n\n faucetFiredRef.current = true;\n\n try {\n setIsFaucetLoading(true);\n setFaucetError(null);\n setShowFaucetSuccess(false);\n\n const response = await fetch(faucetUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ address }),\n });\n\n if (!response.ok) {\n const errorData = await response\n .json()\n .catch(() => ({ error: 'Failed to request tokens' }));\n throw new Error(errorData.error || 'Failed to request tokens');\n }\n\n await response.json().catch(() => ({}));\n setTokensObtained(true);\n setShowFaucetSuccess(true);\n\n await refreshBalance();\n setShowFaucetSuccess(false);\n } catch (error) {\n console.error('Faucet error:', error);\n setFaucetError(\n error instanceof Error ? error.message : 'Failed to request tokens'\n );\n faucetFiredRef.current = false;\n } finally {\n setIsFaucetLoading(false);\n }\n }, [shouldShowFaucet, address, faucetUrl, refreshBalance]);\n\n useEffect(() => {\n if (\n !shouldShowFaucet ||\n isFaucetLoading ||\n faucetError ||\n showFaucetSuccess ||\n context.depositError != null ||\n faucetFiredRef.current\n ) {\n return;\n }\n\n requestTestnetTokens();\n }, [\n shouldShowFaucet,\n isFaucetLoading,\n faucetError,\n showFaucetSuccess,\n context.depositError,\n requestTestnetTokens,\n ]);\n\n useEffect(() => {\n if (balance > prevBalanceRef.current && balance >= minDeposit) {\n setTokensObtained(false);\n setShowFaucetSuccess(false);\n } else if (balance < minDeposit / 2) {\n faucetFiredRef.current = false;\n setTokensObtained(false);\n }\n\n prevBalanceRef.current = balance;\n }, [balance, minDeposit]);\n\n return {\n isFaucetLoading,\n faucetError,\n showFaucetSuccess,\n showFaucetOverlay,\n requestTestnetTokens,\n };\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function ChainSelectionScreen(): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useState } from 'react';
|
|
3
|
+
import Logo from '../../../components/Logo';
|
|
4
|
+
import { SolanaLogo } from '../../../components/logos';
|
|
5
|
+
import { SolanaNetwork } from '../../../config/solana';
|
|
6
|
+
import { logger } from '../../../utils/logger';
|
|
7
|
+
import { ChainButton } from '../components/ChainButton';
|
|
8
|
+
import { EVMChainsButton } from '../components/EVMChainsButton';
|
|
9
|
+
import { MoreButton } from '../components/MoreButton';
|
|
10
|
+
import { useFlowStateContext } from '../context/FlowContext';
|
|
11
|
+
import { FlowState } from '../types';
|
|
12
|
+
// Custom N1Logo wrapper that responds to the group hover state
|
|
13
|
+
var N1Logo = function (_a) {
|
|
14
|
+
var _b = _a.size, size = _b === void 0 ? 38 : _b;
|
|
15
|
+
return (_jsx("div", { className: "text-white group-hover:text-red-500 transition-colors duration-200", children: _jsx(Logo, { size: size }) }));
|
|
16
|
+
};
|
|
17
|
+
export function ChainSelectionScreen() {
|
|
18
|
+
var transition = useFlowStateContext().transition;
|
|
19
|
+
var _a = useState(false), isLoading = _a[0], setIsLoading = _a[1];
|
|
20
|
+
// Only allow devnet, gray out other chains
|
|
21
|
+
var handleChainSelect = function (chainId) {
|
|
22
|
+
logger.debug('Chain selected in ChainSelectionScreen:', chainId);
|
|
23
|
+
// Only allow devnet to be selected
|
|
24
|
+
if (chainId === 'devnet') {
|
|
25
|
+
setIsLoading(true);
|
|
26
|
+
transition(FlowState.AMOUNT_INPUT, { selectedChain: chainId });
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
logger.debug('Chain not allowed:', chainId);
|
|
30
|
+
// Could show a toast or message here
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
// Define the 4 options as requested
|
|
34
|
+
var chainsWithNetworkInfo = [
|
|
35
|
+
{
|
|
36
|
+
id: 'devnet',
|
|
37
|
+
name: 'Devnet',
|
|
38
|
+
logo: (_jsx("div", { className: "flex items-center justify-center", style: { width: 48, height: 48 }, children: _jsx(N1Logo, {}) })),
|
|
39
|
+
network: SolanaNetwork.DEVNET,
|
|
40
|
+
disabled: false, // Only devnet is clickable
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
id: 'solana',
|
|
44
|
+
name: 'Solana',
|
|
45
|
+
logo: (_jsx("div", { className: "flex items-center justify-center", style: { width: 48, height: 48 }, children: _jsx(SolanaLogo, { width: 36, height: 36 }) })),
|
|
46
|
+
network: SolanaNetwork.MAINNET,
|
|
47
|
+
disabled: true,
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
id: 'evm-chains',
|
|
51
|
+
name: 'EVM Chains',
|
|
52
|
+
logo: '', // Not needed as we're using EVMChainsButton
|
|
53
|
+
network: '', // Empty string instead of null
|
|
54
|
+
disabled: true,
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
id: 'more',
|
|
58
|
+
name: 'More',
|
|
59
|
+
logo: '', // Not needed as we're using MoreButton
|
|
60
|
+
network: '', // Empty string instead of null
|
|
61
|
+
disabled: true,
|
|
62
|
+
},
|
|
63
|
+
];
|
|
64
|
+
return (_jsx("div", { className: "overflow-hidden relative", children: isLoading ? (_jsx("div", { className: "flex justify-center items-center py-8", children: _jsx("div", { className: "n1-ww-animate-spin rounded-full h-8 w-8 border-b-2 border-n1-ww-border" }) })) : (_jsxs("div", { className: "space-y-8", children: [_jsxs("div", { className: "grid grid-cols-2 gap-4", children: [_jsx(ChainButton, { chain: chainsWithNetworkInfo[0], onClick: function () { return handleChainSelect(chainsWithNetworkInfo[0].id); }, disabled: chainsWithNetworkInfo[0].disabled }, chainsWithNetworkInfo[0].id), _jsx(ChainButton, { chain: chainsWithNetworkInfo[1], onClick: function () { return handleChainSelect(chainsWithNetworkInfo[1].id); }, disabled: chainsWithNetworkInfo[1].disabled }, chainsWithNetworkInfo[1].id)] }), _jsxs("div", { className: "grid grid-cols-2 gap-4", children: [_jsx(EVMChainsButton, { chain: chainsWithNetworkInfo[2], onClick: function () { return handleChainSelect(chainsWithNetworkInfo[2].id); }, disabled: chainsWithNetworkInfo[2].disabled }, chainsWithNetworkInfo[2].id), _jsx(MoreButton, { chain: chainsWithNetworkInfo[3], onClick: function () { return handleChainSelect(chainsWithNetworkInfo[3].id); }, disabled: chainsWithNetworkInfo[3].disabled }, chainsWithNetworkInfo[3].id)] })] })) }));
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=02-ChainSelectionScreen.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"02-ChainSelectionScreen.js","sourceRoot":"","sources":["../../../../src/Modal/NordFlow/screens/02-ChainSelectionScreen.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useState } from 'react';\nimport Logo from '../../../components/Logo';\nimport { SolanaLogo } from '../../../components/logos';\nimport { SolanaNetwork } from '../../../config/solana';\nimport { logger } from '../../../utils/logger';\nimport { ChainButton } from '../components/ChainButton';\nimport { EVMChainsButton } from '../components/EVMChainsButton';\nimport { MoreButton } from '../components/MoreButton';\nimport { useFlowStateContext } from '../context/FlowContext';\nimport { FlowState } from '../types';\n\n// Custom N1Logo wrapper that responds to the group hover state\nconst N1Logo = ({ size = 38 }) => (\n <div className=\"text-white group-hover:text-red-500 transition-colors duration-200\">\n <Logo size={size} />\n </div>\n);\n\nexport function ChainSelectionScreen() {\n const { transition } = useFlowStateContext();\n const [isLoading, setIsLoading] = useState(false);\n\n // Only allow devnet, gray out other chains\n const handleChainSelect = (chainId: string) => {\n logger.debug('Chain selected in ChainSelectionScreen:', chainId);\n\n // Only allow devnet to be selected\n if (chainId === 'devnet') {\n setIsLoading(true);\n transition(FlowState.AMOUNT_INPUT, { selectedChain: chainId });\n } else {\n logger.debug('Chain not allowed:', chainId);\n // Could show a toast or message here\n }\n };\n\n // Define the 4 options as requested\n const chainsWithNetworkInfo = [\n {\n id: 'devnet',\n name: 'Devnet',\n logo: (\n <div\n className=\"flex items-center justify-center\"\n style={{ width: 48, height: 48 }}\n >\n <N1Logo />\n </div>\n ),\n network: SolanaNetwork.DEVNET,\n disabled: false, // Only devnet is clickable\n },\n {\n id: 'solana',\n name: 'Solana',\n logo: (\n <div\n className=\"flex items-center justify-center\"\n style={{ width: 48, height: 48 }}\n >\n <SolanaLogo width={36} height={36} />\n </div>\n ),\n network: SolanaNetwork.MAINNET,\n disabled: true,\n },\n {\n id: 'evm-chains',\n name: 'EVM Chains',\n logo: '', // Not needed as we're using EVMChainsButton\n network: '', // Empty string instead of null\n disabled: true,\n },\n {\n id: 'more',\n name: 'More',\n logo: '', // Not needed as we're using MoreButton\n network: '', // Empty string instead of null\n disabled: true,\n },\n ];\n\n return (\n <div className=\"overflow-hidden relative\">\n\n {isLoading ? (\n <div className=\"flex justify-center items-center py-8\">\n <div className=\"n1-ww-animate-spin rounded-full h-8 w-8 border-b-2 border-n1-ww-border\"></div>\n </div>\n ) : (\n <div className=\"space-y-8\">\n {/* First row: Devnet, Solana */}\n <div className=\"grid grid-cols-2 gap-4\">\n <ChainButton\n key={chainsWithNetworkInfo[0].id}\n chain={chainsWithNetworkInfo[0]}\n onClick={() => handleChainSelect(chainsWithNetworkInfo[0].id)}\n disabled={chainsWithNetworkInfo[0].disabled}\n />\n <ChainButton\n key={chainsWithNetworkInfo[1].id}\n chain={chainsWithNetworkInfo[1]}\n onClick={() => handleChainSelect(chainsWithNetworkInfo[1].id)}\n disabled={chainsWithNetworkInfo[1].disabled}\n />\n </div>\n\n {/* Second row: EVM Chains, More */}\n <div className=\"grid grid-cols-2 gap-4\">\n <EVMChainsButton\n key={chainsWithNetworkInfo[2].id}\n chain={chainsWithNetworkInfo[2]}\n onClick={() => handleChainSelect(chainsWithNetworkInfo[2].id)}\n disabled={chainsWithNetworkInfo[2].disabled}\n />\n <MoreButton\n key={chainsWithNetworkInfo[3].id}\n chain={chainsWithNetworkInfo[3]}\n onClick={() => handleChainSelect(chainsWithNetworkInfo[3].id)}\n disabled={chainsWithNetworkInfo[3].disabled}\n />\n </div>\n </div>\n )}\n </div>\n );\n}\n"]}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useState } from 'react';
|
|
3
|
+
import { useN1WalletContext } from '../../../Provider/hooks';
|
|
4
|
+
import { ImageWithFallback } from '../components';
|
|
5
|
+
import { ANIMATION_EASE } from '../constants';
|
|
6
|
+
import { formatAmount, isNordConfigured } from '../utils/nordUtils';
|
|
7
|
+
import { useDepositContext } from '../context/DepositContext';
|
|
8
|
+
import { useFlowStateContext } from '../context/FlowContext';
|
|
9
|
+
import { useTestnetFaucet } from '../hooks/useTestnetFaucet';
|
|
10
|
+
import { WaitingMessage } from '../components/WaitingMessage';
|
|
11
|
+
export function AmountInputScreen(_a) {
|
|
12
|
+
var _b = _a.isTestnet, isTestnet = _b === void 0 ? false : _b;
|
|
13
|
+
var context = useFlowStateContext().context;
|
|
14
|
+
var _c = useDepositContext(), updateAmount = _c.updateAmount, startDeposit = _c.startDeposit;
|
|
15
|
+
var nord = useN1WalletContext().nord;
|
|
16
|
+
// Hard code amount to 100
|
|
17
|
+
var amount = '100';
|
|
18
|
+
// Hard code balance to 0 to allow faucet to trigger
|
|
19
|
+
var balance = 100;
|
|
20
|
+
// Force the amount to be 100 on component mount only, not on every render
|
|
21
|
+
useEffect(function () {
|
|
22
|
+
updateAmount('100');
|
|
23
|
+
// Empty dependency array ensures this only runs once on mount
|
|
24
|
+
}, [updateAmount]);
|
|
25
|
+
var _d = useState(false), isHovered = _d[0], setIsHovered = _d[1];
|
|
26
|
+
// Get token information from Nord if available
|
|
27
|
+
var _e = useState('USDC'), tokenSymbol = _e[0], setTokenSymbol = _e[1];
|
|
28
|
+
var _f = useState('https://res.cloudinary.com/dl3ia3pko/image/upload/v1745874373/usdc_ma4igc.svg'), tokenLogo = _f[0], setTokenLogo = _f[1];
|
|
29
|
+
var _g = useState(6), tokenDecimals = _g[0], setTokenDecimals = _g[1];
|
|
30
|
+
// Try to get token information from Nord
|
|
31
|
+
useEffect(function () {
|
|
32
|
+
if (nord && isNordConfigured(nord)) {
|
|
33
|
+
try {
|
|
34
|
+
// Find the USDC token or the first token
|
|
35
|
+
var usdcToken = nord.tokens.find(function (t) { return t.symbol === 'USDC'; }) || nord.tokens[0];
|
|
36
|
+
if (usdcToken) {
|
|
37
|
+
setTokenSymbol(usdcToken.symbol);
|
|
38
|
+
// Use a default logo if not available
|
|
39
|
+
// setTokenLogo(`/images/tokens/${usdcToken.symbol.toLowerCase()}.svg`);
|
|
40
|
+
setTokenLogo('https://res.cloudinary.com/dl3ia3pko/image/upload/v1745874373/usdc_ma4igc.svg');
|
|
41
|
+
setTokenDecimals(usdcToken.decimals);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
console.warn('Error getting token information from Nord:', error);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}, [nord]);
|
|
49
|
+
// Removed handleAmountChange since we don't want user to edit the amount
|
|
50
|
+
// todo:fix
|
|
51
|
+
var isValidAmount = true;
|
|
52
|
+
var hardcodedMinDeposit = 100;
|
|
53
|
+
var _h = useTestnetFaucet({
|
|
54
|
+
enabled: isTestnet,
|
|
55
|
+
balance: balance,
|
|
56
|
+
minDeposit: hardcodedMinDeposit,
|
|
57
|
+
}), showFaucetOverlay = _h.showFaucetOverlay, isFaucetLoading = _h.isFaucetLoading, faucetError = _h.faucetError, showFaucetSuccess = _h.showFaucetSuccess, requestTestnetTokens = _h.requestTestnetTokens;
|
|
58
|
+
// Format the balance with the appropriate number of decimal places
|
|
59
|
+
var formattedBalance = formatAmount(balance, tokenDecimals);
|
|
60
|
+
return (_jsxs("div", { className: "overflow-hidden relative", children: [isTestnet && showFaucetOverlay && (_jsx("div", { className: "absolute inset-0 z-10 bg-neutral-900/80 backdrop-blur-md flex flex-col items-center justify-center p-6", children: isFaucetLoading ? (_jsx(WaitingMessage, { loaderSize: 52, message: {
|
|
61
|
+
visible: true,
|
|
62
|
+
title: 'Obtaining Testnet Tokens',
|
|
63
|
+
subtitle: 'Please wait while we request testnet tokens for your wallet...',
|
|
64
|
+
isTyping: false,
|
|
65
|
+
} })) : showFaucetSuccess ? (_jsxs(_Fragment, { children: [_jsx("div", { className: "text-green-500 text-5xl mb-4 n1-ww-animate-fade-up", children: "\u2713" }), _jsxs("div", { className: "space-y-2 text-center", children: [_jsx("h3", { className: "text-xl text-white font-semibold", children: "Tokens Obtained Successfully" }), _jsx("p", { className: "text-sm text-green-400", children: "Your wallet has been funded with testnet tokens." }), _jsx("p", { className: "text-sm text-neutral-400 mt-2", children: "Please wait while your balance updates..." })] })] })) : faucetError ? (_jsxs(_Fragment, { children: [_jsx("div", { className: "text-red-500 text-5xl mb-4 n1-ww-animate-fade-up", children: "\u26A0\uFE0F" }), _jsxs("div", { className: "space-y-2 text-center", children: [_jsx("h3", { className: "text-xl text-white font-semibold", children: "Failed to Get Tokens" }), _jsx("p", { className: "text-sm text-red-400", children: faucetError }), _jsx("button", { onClick: requestTestnetTokens, className: "mt-4 px-4 py-2 bg-n1-ww-main text-white rounded-sm hover:bg-n1-ww-main/90 transition-colors", children: "Try Again" })] })] })) : null })), _jsx("h2", { className: "text-xl text-white font-semibold mb-6 text-center", children: "Enter Amount" }), _jsxs("div", { className: "space-y-6", children: [_jsxs("div", { className: "relative border-2 border-n1-ww-border bg-n1-ww-gray-900 rounded-sm p-0 overflow-hidden n1-ww-animate-fade-up", style: { animationDelay: '0.1s' }, children: [_jsxs("div", { className: "flex items-center justify-between p-4 border-b border-n1-ww-border bg-black/10", children: [_jsxs("div", { className: "flex items-center space-x-3", children: [_jsx("div", { className: "w-8 h-8 rounded-full overflow-hidden bg-n1-ww-gray-800 flex items-center justify-center shadow-sm", children: _jsx(ImageWithFallback, { src: tokenLogo, alt: tokenSymbol, width: 24, height: 24, fallbackText: tokenSymbol.charAt(0), fallbackClassName: "w-6 h-6 rounded-full flex items-center justify-center", fallbackBgColor: "bg-blue-900", fallbackTextColor: "text-blue-300" }) }), _jsx("span", { className: "text-white font-medium", children: tokenSymbol })] }), _jsx("div", { className: "text-xs rounded-sm bg-n1-ww-gray-800 px-2 py-1 text-n1-ww-gray-300", children: "Fixed Amount" })] }), isTestnet && (_jsx("div", { className: "mb-4 w-full flex items-center justify-center", children: _jsxs("div", { className: "bg-yellow-900/40 border border-n1-ww-border text-yellow-200 rounded px-3 py-2 text-sm text-center max-w-xl mx-auto shadow-sm", children: [_jsx("span", { className: "font-semibold", children: "Testnet Only:" }), " Please make sure your wallet is set to ", _jsx("span", { className: "font-semibold", children: "testnet mode" }), " before proceeding. ", _jsx("a", { href: "https://docs.phantom.com/developer-powertools/testnet-mode", target: "_blank", rel: "noopener noreferrer", className: "underline text-yellow-200 hover:text-yellow-100 transition-colors", children: "Learn how to switch to testnet" }), "."] }) })), _jsxs("div", { className: "relative p-6 flex flex-col items-center", children: [_jsxs("div", { className: "relative flex items-baseline justify-center w-full", children: [_jsx("span", { className: "text-4xl font-bold text-white mr-1 n1-ww-animate-fade-up", style: { animationDelay: '0.2s' }, children: amount }), _jsx("span", { className: "text-xl text-neutral-400 ml-1 n1-ww-animate-fade-up", style: { animationDelay: '0.3s' }, children: tokenSymbol })] }), _jsx("div", { className: "w-16 h-1 bg-n1-ww-gray-800 rounded-full mt-4 mb-2" }), _jsx("div", { className: "flex justify-center items-center text-sm mt-2 w-full n1-ww-animate-fade-up", style: { animationDelay: '0.4s' }, children: _jsxs("span", { className: "text-neutral-400", children: ["Balance: ", formattedBalance, " ", tokenSymbol] }) })] })] }), context.depositError && (_jsx("div", { className: "bg-red-900/30 text-red-400 p-3 rounded-sm text-sm border border-n1-ww-border n1-ww-animate-fade-up", style: { animationDelay: '0.5s' }, children: context.depositError })), _jsx("button", { onClick: startDeposit, disabled: !isValidAmount, onMouseEnter: function () { return setIsHovered(true); }, onMouseLeave: function () { return setIsHovered(false); }, className: "\n group relative w-full overflow-hidden rounded-sm border-2 bg-neutral-950 py-4 text-center\n transition-all duration-300 ".concat(ANIMATION_EASE, " n1-ww-animate-fade-up\n ").concat(isValidAmount
|
|
66
|
+
? 'cursor-pointer border-n1-ww-border hover:border-n1-ww-border'
|
|
67
|
+
: 'cursor-not-allowed border-n1-ww-border opacity-50', "\n "), style: {
|
|
68
|
+
transform: isHovered && isValidAmount ? 'scale(0.99)' : 'scale(1)',
|
|
69
|
+
animationDelay: '0.6s'
|
|
70
|
+
}, children: _jsx("span", { className: "\n text-base font-medium tracking-wide transition-colors duration-300 ".concat(ANIMATION_EASE, "\n ").concat(isValidAmount
|
|
71
|
+
? 'text-n1-ww-gray-300 group-hover:text-white'
|
|
72
|
+
: 'text-n1-ww-gray-600', "\n "), children: "Continue" }) })] })] }));
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=03-AmountInputScreen.js.map
|