@vechain/vechain-kit 2.4.2 → 3.0.0-rc.1

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.
Files changed (136) hide show
  1. package/dist/AccountModal-CK-qcPlQ.js +1 -0
  2. package/dist/AccountModal-ChuVFqPc.js +20 -0
  3. package/dist/AccountModal-ChuVFqPc.js.map +1 -0
  4. package/dist/AccountModal-DNK0IbiE.cjs +1 -0
  5. package/dist/AccountModal-DjAS4w6z.cjs +20 -0
  6. package/dist/AccountModal-DjAS4w6z.cjs.map +1 -0
  7. package/dist/BaseModal-CWAI9-Bi.js +2 -0
  8. package/dist/BaseModal-CWAI9-Bi.js.map +1 -0
  9. package/dist/BaseModal-yevRjczw.cjs +2 -0
  10. package/dist/BaseModal-yevRjczw.cjs.map +1 -0
  11. package/dist/ConnectModal-BXbiUwnz.js +1 -0
  12. package/dist/ConnectModal-C50EF9gE.js +2 -0
  13. package/dist/ConnectModal-C50EF9gE.js.map +1 -0
  14. package/dist/ConnectModal-CvkkVALe.cjs +1 -0
  15. package/dist/ConnectModal-DmIkWb1i.cjs +2 -0
  16. package/dist/ConnectModal-DmIkWb1i.cjs.map +1 -0
  17. package/dist/DisconnectConfirmContent-B4qahKqQ.cjs +2 -0
  18. package/dist/DisconnectConfirmContent-B4qahKqQ.cjs.map +1 -0
  19. package/dist/DisconnectConfirmContent-C9qLnI-m.js +2 -0
  20. package/dist/DisconnectConfirmContent-C9qLnI-m.js.map +1 -0
  21. package/dist/LegalDocumentsModal-5sNOrJI9.js +1 -0
  22. package/dist/LegalDocumentsModal-aWgfKwIL.js +2 -0
  23. package/dist/LegalDocumentsModal-aWgfKwIL.js.map +1 -0
  24. package/dist/LegalDocumentsModal-fnhM40y6.cjs +2 -0
  25. package/dist/LegalDocumentsModal-fnhM40y6.cjs.map +1 -0
  26. package/dist/LegalDocumentsModal-g54lP0U7.cjs +1 -0
  27. package/dist/PrivyCrossAppProvider-B6oIXeWL.js +2 -0
  28. package/dist/PrivyCrossAppProvider-B6oIXeWL.js.map +1 -0
  29. package/dist/PrivyCrossAppProvider-C6aL4Qor.cjs +1 -0
  30. package/dist/PrivyCrossAppProvider-Ccu2yH99.js +1 -0
  31. package/dist/PrivyCrossAppProvider-DSuzrbqs.cjs +2 -0
  32. package/dist/PrivyCrossAppProvider-DSuzrbqs.cjs.map +1 -0
  33. package/dist/PrivyWalletProvider-BkqWSj75.cjs +2 -0
  34. package/dist/PrivyWalletProvider-BkqWSj75.cjs.map +1 -0
  35. package/dist/PrivyWalletProvider-DToo_u0W.js +2 -0
  36. package/dist/PrivyWalletProvider-DToo_u0W.js.map +1 -0
  37. package/dist/ShareButtons-B92JZp47.js +2 -0
  38. package/dist/ShareButtons-B92JZp47.js.map +1 -0
  39. package/dist/ShareButtons-CRMNerbz.cjs +2 -0
  40. package/dist/ShareButtons-CRMNerbz.cjs.map +1 -0
  41. package/dist/UpgradeSmartAccountModal-BAzmVxeJ.js +2 -0
  42. package/dist/UpgradeSmartAccountModal-BAzmVxeJ.js.map +1 -0
  43. package/dist/UpgradeSmartAccountModal-BGjTzYAm.cjs +1 -0
  44. package/dist/UpgradeSmartAccountModal-CpZo27Uk.js +1 -0
  45. package/dist/UpgradeSmartAccountModal-IMcihO0d.cjs +2 -0
  46. package/dist/UpgradeSmartAccountModal-IMcihO0d.cjs.map +1 -0
  47. package/dist/VechainKitThemeProvider-BM5258oA.cjs +75 -0
  48. package/dist/VechainKitThemeProvider-BM5258oA.cjs.map +1 -0
  49. package/dist/VechainKitThemeProvider-Di9a04Es.js +75 -0
  50. package/dist/VechainKitThemeProvider-Di9a04Es.js.map +1 -0
  51. package/dist/assets/index.cjs +1 -1
  52. package/dist/assets/index.d.cts +1 -1
  53. package/dist/assets/{index.d.mts → index.d.ts} +1 -1
  54. package/dist/assets/index.js +1 -0
  55. package/dist/{assets-BL24r-Yp.mjs → assets-CXk1qRDd.js} +5 -5
  56. package/dist/assets-CXk1qRDd.js.map +1 -0
  57. package/dist/{assets-DNJsQD7_.cjs → assets-YPd7adzM.cjs} +7 -7
  58. package/dist/assets-YPd7adzM.cjs.map +1 -0
  59. package/dist/chunk-DjWAcSYV.cjs +1 -0
  60. package/dist/components/index.cjs +1 -0
  61. package/dist/components/index.d.cts +6 -0
  62. package/dist/components/index.d.ts +6 -0
  63. package/dist/components/index.js +1 -0
  64. package/dist/components-QKLypcU1.cjs +2 -0
  65. package/dist/components-QKLypcU1.cjs.map +1 -0
  66. package/dist/components-k36uDisW.js +2 -0
  67. package/dist/components-k36uDisW.js.map +1 -0
  68. package/dist/hooks/index.cjs +1 -0
  69. package/dist/hooks/index.d.cts +6 -0
  70. package/dist/hooks/index.d.ts +6 -0
  71. package/dist/hooks/index.js +1 -0
  72. package/dist/hooks-C8eXQYIN.cjs +8 -0
  73. package/dist/hooks-C8eXQYIN.cjs.map +1 -0
  74. package/dist/hooks-DuTew9oP.js +8 -0
  75. package/dist/hooks-DuTew9oP.js.map +1 -0
  76. package/dist/{index-CpRbZET6.d.mts → index-BGQS0a81.d.ts} +564 -1581
  77. package/dist/index-BGQS0a81.d.ts.map +1 -0
  78. package/dist/index-Bqw0Cz5n.d.cts +587 -0
  79. package/dist/index-Bqw0Cz5n.d.cts.map +1 -0
  80. package/dist/index-BugHmddr.d.ts +587 -0
  81. package/dist/index-BugHmddr.d.ts.map +1 -0
  82. package/dist/{index-D4rz985m.d.cts → index-C8wbz8af.d.cts} +561 -1578
  83. package/dist/index-C8wbz8af.d.cts.map +1 -0
  84. package/dist/{index-CWViOs1U.d.mts → index-COoeacay.d.ts} +5 -5
  85. package/dist/index-COoeacay.d.ts.map +1 -0
  86. package/dist/{index-u3CPquCV.d.cts → index-CmGg4iaS.d.cts} +4 -4
  87. package/dist/{index-CWViOs1U.d.mts.map → index-CmGg4iaS.d.cts.map} +1 -1
  88. package/dist/index-DI_IPiLX.d.ts +324 -0
  89. package/dist/index-DI_IPiLX.d.ts.map +1 -0
  90. package/dist/index-DVxlUr9t.d.cts +324 -0
  91. package/dist/index-DVxlUr9t.d.cts.map +1 -0
  92. package/dist/index.cjs +1 -221
  93. package/dist/index.d.cts +6 -3
  94. package/dist/index.d.ts +6 -0
  95. package/dist/index.js +1 -0
  96. package/dist/network-Cs9YqDJ1.d.cts +536 -0
  97. package/dist/network-Cs9YqDJ1.d.cts.map +1 -0
  98. package/dist/network-yA5VWcPq.d.ts +536 -0
  99. package/dist/network-yA5VWcPq.d.ts.map +1 -0
  100. package/dist/providers/index.cjs +1 -0
  101. package/dist/providers/index.d.cts +3 -0
  102. package/dist/providers/index.d.ts +3 -0
  103. package/dist/providers/index.js +1 -0
  104. package/dist/providers-DImdr6Kk.cjs +124 -0
  105. package/dist/providers-DImdr6Kk.cjs.map +1 -0
  106. package/dist/providers-kA0lotaM.js +124 -0
  107. package/dist/providers-kA0lotaM.js.map +1 -0
  108. package/dist/ssrUtils-C_5ZY26i.cjs +2 -0
  109. package/dist/ssrUtils-C_5ZY26i.cjs.map +1 -0
  110. package/dist/ssrUtils-DSwxhTtm.js +2 -0
  111. package/dist/ssrUtils-DSwxhTtm.js.map +1 -0
  112. package/dist/utils/index.cjs +1 -1
  113. package/dist/utils/index.d.cts +2 -2
  114. package/dist/utils/index.d.ts +3 -0
  115. package/dist/utils/index.js +1 -0
  116. package/dist/utils-B2Eg9TD3.js +2 -0
  117. package/dist/utils-B2Eg9TD3.js.map +1 -0
  118. package/dist/utils-jW13BhAb.cjs +2 -0
  119. package/dist/utils-jW13BhAb.cjs.map +1 -0
  120. package/package.json +46 -9
  121. package/dist/assets/index.mjs +0 -1
  122. package/dist/assets-BL24r-Yp.mjs.map +0 -1
  123. package/dist/assets-DNJsQD7_.cjs.map +0 -1
  124. package/dist/index-CpRbZET6.d.mts.map +0 -1
  125. package/dist/index-D4rz985m.d.cts.map +0 -1
  126. package/dist/index-u3CPquCV.d.cts.map +0 -1
  127. package/dist/index.cjs.map +0 -1
  128. package/dist/index.d.mts +0 -3
  129. package/dist/index.mjs +0 -221
  130. package/dist/index.mjs.map +0 -1
  131. package/dist/utils/index.d.mts +0 -3
  132. package/dist/utils/index.mjs +0 -1
  133. package/dist/utils-BQ9mZctf.cjs +0 -2
  134. package/dist/utils-BQ9mZctf.cjs.map +0 -1
  135. package/dist/utils-BxZj2QIg.mjs +0 -2
  136. package/dist/utils-BxZj2QIg.mjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConnectModal-DmIkWb1i.cjs","names":["IconButton","Icon","LuCircleHelp","useVeChainKitConfig","error","BaseModal","StickyHeaderContainer","ModalHeader","ModalCloseButton","Container","ModalBody","VStack","Icon","LuMail","Text","HStack","PinInput","PinInputField","ModalFooter","Button","useVeChainKitConfig","GridItem","VStack","InputGroup","InputLeftElement","Icon","LuMail","Input","Button","Button","Icon","HStack","Text","useLoginWithOAuth","GridItem","FcGoogle","useLoginWithOAuth","GridItem","LuGithub","useVeChainKitConfig","HStack","Circle","Icon","FcGoogle","FaXTwitter","FaDiscord","LuPlus","useOptionalPrivy","GridItem","VechainLogoLight","VechainLogoDark","useLoginWithVeChain","GridItem","VechainLogoLight","VechainLogoDark","useLoginWithPasskey","GridItem","LuFingerprint","useOptionalDAppKitWalletModal","useVeChainKitConfig","useOptionalDAppKitWallet","GridItem","VeWorldLogoLight","VeWorldLogoDark","LuWallet","Icon","LuArrowRight","GridItem","LuEllipsis","Icon","LuArrowRight","useVeChainKitConfig","useOptionalPrivy","useLoginModalContent","Stack","Grid","Button","useWallet","useVeChainKitConfig","useFetchAppInfo","StickyHeaderContainer","ModalHeader","ModalCloseButton","HStack","Image","ModalBody","Text","ModalFooter","React","StickyHeaderContainer","ModalHeader","ModalBackButton","ModalCloseButton","ModalBody","VStack","Spinner","Text","ModalFooter","Button","Icon","LuRefreshCw","StickyHeaderContainer","ModalHeader","ModalBackButton","ModalCloseButton","ModalBody","VStack","motion","Icon","LuCircleAlert","Text","ModalFooter","Button","LuRefreshCw","useCrossAppConnectionCache","useOptionalPrivyCrossAppSdk","isRejectionError","Box","StickyHeaderContainer","ModalHeader","ModalBackButton","ModalCloseButton","ModalBody","VStack","Spinner","Button","Image","Text","ModalFooter","FAQContent","BaseModal","useVeChainKitConfig","useConnectModal","useFetchAppInfo","Popover","PopoverTrigger","Button","Icon","LuChevronDown","PopoverContent","PopoverBody","PopoverFooter","HStack"],"sources":["../src/components/common/ModalFAQButton.tsx","../src/components/EmailCodeVerificationModal/EmailCodeVerificationModal.tsx","../src/components/ConnectModal/Components/EmailLoginButton.tsx","../src/components/ConnectModal/Components/ConnectionButton.tsx","../src/components/ConnectModal/Components/LoginWithGoogleButton.tsx","../src/components/ConnectModal/Components/LoginWithGithubButton.tsx","../src/components/WalletButton/SocialIcons.tsx","../src/components/ConnectModal/Components/VeChainWithPrivyLoginButton.tsx","../src/components/ConnectModal/Components/VeChainLoginButton.tsx","../src/components/ConnectModal/Components/PasskeyLoginButton.tsx","../src/components/ConnectModal/Components/DappKitButton.tsx","../src/components/ConnectModal/Components/PrivyButton.tsx","../src/components/ConnectModal/Components/ConnectionOptionsStack.tsx","../src/components/ConnectModal/Components/EcosystemButton.tsx","../src/components/ConnectModal/Contents/MainContent.tsx","../src/components/ConnectModal/Contents/LoadingContent.tsx","../src/components/ConnectModal/Contents/ErrorContent.tsx","../src/components/ConnectModal/Contents/EcosystemContent.tsx","../src/components/ConnectModal/ConnectModal.tsx","../src/components/ConnectModal/ConnectPopover.tsx"],"sourcesContent":["import { IconButton, IconButtonProps, Icon } from '@chakra-ui/react';\nimport { LuCircleHelp } from 'react-icons/lu';\n\ntype FAQButtonProps = {\n onClick: () => void;\n} & Partial<IconButtonProps>;\n\nexport const ModalFAQButton = ({ onClick, ...props }: FAQButtonProps) => {\n return (\n <IconButton\n aria-label=\"FAQ\"\n icon={<Icon as={LuCircleHelp} fontSize={'17px'} />}\n size=\"sm\"\n variant=\"vechainKitHeaderIconButtons\"\n position=\"absolute\"\n lineHeight={'normal'}\n left=\"10px\"\n top=\"8px\"\n onClick={onClick}\n {...props}\n />\n );\n};\n","import {\n Button,\n VStack,\n Text,\n HStack,\n PinInput,\n PinInputField,\n Icon,\n ModalFooter,\n ModalBody,\n ModalHeader,\n ModalCloseButton,\n Container,\n useToken,\n} from '@chakra-ui/react';\nimport { LuMail } from 'react-icons/lu';\nimport { BaseModal, StickyHeaderContainer } from '../common';\nimport { useEffect, useState } from 'react';\nimport { useCreateWallet, useLoginWithEmail } from '@privy-io/react-auth';\nimport { useTranslation } from 'react-i18next';\n// Direct import to avoid circular dependency through barrel exports\nimport { useVeChainKitConfig } from '../../providers/VeChainKitContext';\n\ntype Props = {\n email: string;\n onResend: () => void;\n isLoading: boolean;\n isOpen: boolean;\n onClose: () => void;\n};\n\nexport const EmailCodeVerificationModal = ({\n email,\n onResend,\n isLoading,\n isOpen,\n onClose,\n}: Props) => {\n const { t } = useTranslation();\n const { darkMode: isDark } = useVeChainKitConfig();\n \n const textSecondary = useToken('colors', 'vechain-kit-text-secondary');\n const [code, setCode] = useState('');\n const [error, setError] = useState<string | null>(null);\n\n const { createWallet } = useCreateWallet();\n const { loginWithCode } = useLoginWithEmail({\n onComplete: async ({ isNewUser }) => {\n // When using initOAuth Privy does not create an embedded wallet automatically.\n // So we need to create a wallet manually.\n if (isNewUser) {\n await createWallet();\n }\n },\n });\n\n useEffect(() => {\n if (code.length === 6) {\n loginWithCode({ code })\n .then(() => {\n onClose();\n })\n .catch((error) => {\n setError(error.message);\n });\n }\n }, [code]);\n\n return (\n <BaseModal isOpen={isOpen} onClose={onClose} trapFocus={false}>\n <StickyHeaderContainer>\n <ModalHeader alignItems={'center'} display={'flex'} gap={2}>\n {t('Enter confirmation code')}\n </ModalHeader>\n <ModalCloseButton />\n </StickyHeaderContainer>\n\n <Container maxW={'container.lg'}>\n <ModalBody>\n <VStack spacing={2}>\n <Icon\n as={LuMail}\n w=\"48px\"\n h=\"48px\"\n color={textSecondary}\n />\n\n <Text\n fontSize=\"xs\"\n color={textSecondary}\n textAlign=\"center\"\n >\n {t(\n 'Please check {{email}} for an email from privy.io and enter your code below.',\n {\n email,\n },\n )}\n </Text>\n <HStack spacing={2} justify=\"center\" mt={4}>\n <PinInput\n value={code}\n onChange={setCode}\n otp\n size=\"lg\"\n isInvalid={!!error}\n errorBorderColor=\"#ef4444\"\n >\n <PinInputField\n borderRadius=\"12px\"\n border={`1px solid ${\n isDark ? '#ffffff29' : '#ebebeb'\n }`}\n _hover={{\n border: `1px solid ${\n isDark ? '#ffffff40' : '#e0e0e0'\n }`,\n }}\n _focus={{\n border: `1px solid ${\n isDark ? '#ffffff60' : '#d0d0d0'\n }`,\n boxShadow: 'none',\n }}\n backgroundColor={\n isDark ? 'transparent' : '#ffffff'\n }\n />\n <PinInputField\n borderRadius=\"12px\"\n border={`1px solid ${\n isDark ? '#ffffff29' : '#ebebeb'\n }`}\n _hover={{\n border: `1px solid ${\n isDark ? '#ffffff40' : '#e0e0e0'\n }`,\n }}\n _focus={{\n border: `1px solid ${\n isDark ? '#ffffff60' : '#d0d0d0'\n }`,\n boxShadow: 'none',\n }}\n backgroundColor={\n isDark ? 'transparent' : '#ffffff'\n }\n />\n <PinInputField\n borderRadius=\"12px\"\n border={`1px solid ${\n isDark ? '#ffffff29' : '#ebebeb'\n }`}\n _hover={{\n border: `1px solid ${\n isDark ? '#ffffff40' : '#e0e0e0'\n }`,\n }}\n _focus={{\n border: `1px solid ${\n isDark ? '#ffffff60' : '#d0d0d0'\n }`,\n boxShadow: 'none',\n }}\n backgroundColor={\n isDark ? 'transparent' : '#ffffff'\n }\n />\n <PinInputField\n borderRadius=\"12px\"\n border={`1px solid ${\n isDark ? '#ffffff29' : '#ebebeb'\n }`}\n _hover={{\n border: `1px solid ${\n isDark ? '#ffffff40' : '#e0e0e0'\n }`,\n }}\n _focus={{\n border: `1px solid ${\n isDark ? '#ffffff60' : '#d0d0d0'\n }`,\n boxShadow: 'none',\n }}\n backgroundColor={\n isDark ? 'transparent' : '#ffffff'\n }\n />\n <PinInputField\n borderRadius=\"12px\"\n border={`1px solid ${\n isDark ? '#ffffff29' : '#ebebeb'\n }`}\n _hover={{\n border: `1px solid ${\n isDark ? '#ffffff40' : '#e0e0e0'\n }`,\n }}\n _focus={{\n border: `1px solid ${\n isDark ? '#ffffff60' : '#d0d0d0'\n }`,\n boxShadow: 'none',\n }}\n backgroundColor={\n isDark ? 'transparent' : '#ffffff'\n }\n />\n <PinInputField\n borderRadius=\"12px\"\n border={`1px solid ${\n isDark ? '#ffffff29' : '#ebebeb'\n }`}\n _hover={{\n border: `1px solid ${\n isDark ? '#ffffff40' : '#e0e0e0'\n }`,\n }}\n _focus={{\n border: `1px solid ${\n isDark ? '#ffffff60' : '#d0d0d0'\n }`,\n boxShadow: 'none',\n }}\n backgroundColor={\n isDark ? 'transparent' : '#ffffff'\n }\n />\n </PinInput>\n </HStack>\n {error && (\n <Text color=\"#ef4444\" fontSize=\"xs\">\n {error}\n </Text>\n )}\n </VStack>\n </ModalBody>\n <ModalFooter>\n <Text\n w=\"100%\"\n textAlign=\"center\"\n fontSize=\"14px\"\n color={isDark ? 'whiteAlpha.700' : 'gray.600'}\n >\n {t(\"Didn't get an email?\")}{' '}\n <Button\n variant=\"link\"\n color=\"blue.500\"\n fontSize=\"14px\"\n onClick={onResend}\n isLoading={isLoading}\n >\n {t('Resend code')}\n </Button>\n </Text>\n </ModalFooter>\n </Container>\n </BaseModal>\n );\n};\n","import {\n Button,\n GridItem,\n Icon,\n Input,\n InputGroup,\n InputLeftElement,\n useDisclosure,\n VStack,\n} from '@chakra-ui/react';\nimport { useLoginWithEmail } from '@privy-io/react-auth';\nimport { useState } from 'react';\nimport { LuMail } from 'react-icons/lu';\nimport { EmailCodeVerificationModal } from '../../EmailCodeVerificationModal/EmailCodeVerificationModal';\nimport { useTranslation } from 'react-i18next';\n// Direct import to avoid circular dependency through barrel exports\nimport { useVeChainKitConfig } from '../../../providers/VeChainKitContext';\n\nexport const EmailLoginButton = () => {\n const { t } = useTranslation();\n const { darkMode: isDark } = useVeChainKitConfig();\n\n // Email login\n const [email, setEmail] = useState('');\n\n const { sendCode, state: emailState } = useLoginWithEmail({});\n\n const emailCodeVerificationModal = useDisclosure();\n\n const handleSendCode = async () => {\n await sendCode({ email });\n // onClose();\n emailCodeVerificationModal.onOpen();\n };\n\n return (\n <>\n <GridItem colSpan={4} w={'full'}>\n <VStack spacing={3} w=\"full\">\n <InputGroup size=\"lg\" w=\"full\">\n <InputLeftElement\n pointerEvents=\"none\"\n height=\"100%\"\n pl={4}\n >\n <Icon\n as={LuMail}\n color={\n isDark ? 'whiteAlpha.600' : 'blackAlpha.700'\n }\n w={'20px'}\n h={'20px'}\n />\n </InputLeftElement>\n <Input\n placeholder={t('your@email.com')}\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n fontSize={'16px'}\n fontWeight={'400'}\n backgroundColor={isDark ? 'transparent' : '#ffffff'}\n border={`1px solid ${\n isDark ? '#ffffff0a' : '#ebebeb'\n }`}\n p={6}\n borderRadius={16}\n w={'full'}\n pl={12}\n />\n <Button\n aria-label=\"Send code\"\n position=\"absolute\"\n right={2}\n top=\"50%\"\n transform=\"translateY(-50%)\"\n zIndex={2}\n variant=\"ghost\"\n size=\"sm\"\n px={6}\n borderRadius=\"full\"\n isLoading={emailState.status === 'sending-code'}\n onClick={handleSendCode}\n >\n {t('Submit')}\n </Button>\n </InputGroup>\n </VStack>\n </GridItem>\n\n <EmailCodeVerificationModal\n isOpen={emailCodeVerificationModal.isOpen}\n onClose={emailCodeVerificationModal.onClose}\n onResend={() => sendCode({ email })}\n email={email}\n isLoading={emailState.status === 'sending-code'}\n />\n </>\n );\n};\n","import { Button, ButtonProps, HStack, Icon, Text } from '@chakra-ui/react';\nimport { ReactElement } from 'react';\nimport { IconType } from 'react-icons';\n\ninterface ConnectionButtonProps {\n isDark: boolean;\n onClick: () => void;\n text?: string;\n icon?: IconType;\n customIcon?: ReactElement;\n rightIcon?: ReactElement;\n style?: ButtonProps;\n variant?: string;\n iconWidth?: string;\n}\n\nexport const ConnectionButton = ({\n onClick,\n text,\n icon,\n customIcon,\n rightIcon,\n style,\n variant = 'loginIn',\n iconWidth = '25px',\n}: ConnectionButtonProps) => {\n // If text not provided we just show a button with an icon\n if (!text) {\n return (\n <Button {...style} variant={variant} w={'full'} onClick={onClick}>\n {customIcon ? (\n customIcon\n ) : (\n <Icon as={icon} w={'20px'} h={'20px'} />\n )}\n </Button>\n );\n }\n\n if (text) {\n return (\n <Button {...style} variant={variant} w={'full'} onClick={onClick}>\n <HStack w={'full'} justify={'flex-start'} gap={2}>\n {customIcon ? (\n customIcon\n ) : (\n <Icon as={icon} w={iconWidth} h={iconWidth} />\n )}\n <Text opacity={0.9}>{text}</Text>\n </HStack>\n {rightIcon}\n </Button>\n );\n }\n\n return null;\n};\n","import { GridItem } from '@chakra-ui/react';\nimport { FcGoogle } from 'react-icons/fc';\n// Import directly to avoid circular dependency with components barrel\nimport { ConnectionButton } from './ConnectionButton';\nimport { useTranslation } from 'react-i18next';\nimport { useLoginWithOAuth } from '../../../hooks';\n\ntype Props = {\n isDark: boolean;\n gridColumn?: number;\n};\n\nexport const LoginWithGoogleButton = ({ isDark, gridColumn }: Props) => {\n const { t } = useTranslation();\n const { initOAuth } = useLoginWithOAuth();\n\n return (\n <GridItem colSpan={gridColumn ?? 4} w={'full'}>\n <ConnectionButton\n isDark={isDark}\n onClick={async () => {\n await initOAuth({\n provider: 'google',\n });\n }}\n icon={FcGoogle}\n text={t('Continue with Google')}\n />\n </GridItem>\n );\n};\n","import { GridItem } from '@chakra-ui/react';\nimport { LuGithub } from 'react-icons/lu';\n// Import directly to avoid circular dependency with components barrel\nimport { ConnectionButton } from './ConnectionButton';\nimport { useTranslation } from 'react-i18next';\nimport { useLoginWithOAuth } from '../../../hooks';\n\ntype Props = {\n isDark: boolean;\n gridColumn?: number;\n};\n\nexport const LoginWithGithubButton = ({ isDark, gridColumn }: Props) => {\n const { t } = useTranslation();\n const { initOAuth } = useLoginWithOAuth();\n\n return (\n <GridItem colSpan={gridColumn ?? 4} w={'full'}>\n <ConnectionButton\n isDark={isDark}\n onClick={async () => {\n await initOAuth({\n provider: 'github',\n });\n }}\n icon={LuGithub}\n text={t('Continue with Github')}\n />\n </GridItem>\n );\n};\n","import { HStack, Circle, Icon, useMediaQuery } from '@chakra-ui/react';\n// Direct import to avoid circular dependency through barrel exports\nimport { useVeChainKitConfig } from '../../providers/VeChainKitContext';\nimport { FcGoogle } from 'react-icons/fc';\nimport { FaDiscord, FaXTwitter } from 'react-icons/fa6';\nimport { LuPlus } from 'react-icons/lu';\n\nexport const SocialIcons = () => {\n const iconSize = 25;\n const { darkMode } = useVeChainKitConfig();\n const marginLeft = iconSize / 2;\n const [isSmallScreen] = useMediaQuery('(max-width: 280px)');\n const [isMediumScreen] = useMediaQuery('(max-width: 380px)');\n\n return (\n <HStack spacing={0} ml={0}>\n <Circle\n size={`${iconSize}px`}\n borderRadius=\"full\"\n bg={'#F8F8F8'}\n p={2}\n alignItems=\"center\"\n justifyContent=\"center\"\n zIndex={3}\n >\n <Icon as={FcGoogle} fontSize={'20px'} />\n </Circle>\n {!isSmallScreen && (\n <Circle\n ml={`-${marginLeft}px`}\n size={`${iconSize}px`}\n borderRadius=\"full\"\n bg={'black'}\n p={2}\n alignItems=\"center\"\n justifyContent=\"center\"\n zIndex={2}\n >\n <Icon as={FaXTwitter} color={'white'} fontSize={'20px'} />\n </Circle>\n )}\n {!isSmallScreen && !isMediumScreen && (\n <Circle\n ml={`-${marginLeft}px`}\n zIndex={1}\n size={`${iconSize}px`}\n borderRadius=\"full\"\n bg={'#5865F2'}\n p={2}\n alignItems=\"center\"\n justifyContent=\"center\"\n >\n <Icon as={FaDiscord} color={'white'} fontSize={'20px'} />\n </Circle>\n )}\n <Icon\n zIndex={1}\n as={LuPlus}\n color={darkMode ? 'black' : 'white'}\n fontSize={'15px'}\n />\n </HStack>\n );\n};\n","import { GridItem } from '@chakra-ui/react';\nimport { VechainLogoDark, VechainLogoLight } from '../../../assets';\n// Import directly to avoid circular dependency with components barrel\nimport { ConnectionButton } from './ConnectionButton';\nimport { SocialIcons } from '../../WalletButton/SocialIcons';\n// Use optional hook to handle missing PrivyProvider gracefully\nimport { useOptionalPrivy } from '../../../hooks/api/privy/useOptionalPrivy';\nimport { useTranslation } from 'react-i18next';\nimport { IconType } from 'react-icons';\n\ntype Props = {\n isDark: boolean;\n gridColumn?: number;\n};\n\n/// This button is used to login with VeChain using Privy on\n/// platforms like VeBetterDAO and VeChain Kit Homepage.\n/// It is a very specific scenario.\nexport const VeChainWithPrivyLoginButton = ({ isDark, gridColumn }: Props) => {\n const { t } = useTranslation();\n const { login: viewMoreLogin } = useOptionalPrivy();\n\n return (\n <GridItem colSpan={gridColumn ? gridColumn : 4} w={'full'}>\n <ConnectionButton\n isDark={isDark}\n onClick={viewMoreLogin}\n icon={\n isDark\n ? (VechainLogoLight as IconType)\n : (VechainLogoDark as IconType)\n }\n text={t('Use social login with VeChain')}\n variant={'loginWithVechain'}\n rightIcon={<SocialIcons />}\n />\n </GridItem>\n );\n};\n","import { GridItem } from '@chakra-ui/react';\nimport { VechainLogoDark, VechainLogoLight } from '../../../assets';\n// Import directly to avoid circular dependency with components barrel\nimport { ConnectionButton } from './ConnectionButton';\nimport { SocialIcons } from '../../WalletButton/SocialIcons';\nimport { useLoginWithVeChain } from '../../../hooks';\nimport { useTranslation } from 'react-i18next';\nimport { IconType } from 'react-icons';\n// Import from types/modal to avoid circular dependency\nimport type { ConnectModalContentsTypes } from '../../../types/modal';\nimport React from 'react';\n\ntype Props = {\n isDark: boolean;\n gridColumn?: number;\n setCurrentContent: React.Dispatch<\n React.SetStateAction<ConnectModalContentsTypes>\n >;\n};\n\nexport const VeChainLoginButton = ({\n isDark,\n gridColumn,\n setCurrentContent,\n}: Props) => {\n const { t } = useTranslation();\n const { login: loginWithVeChain } = useLoginWithVeChain();\n\n const handleLoginWithVeChain = async () => {\n setCurrentContent({\n type: 'loading',\n props: {\n title: t('Connecting to VeChain'),\n loadingText: t(\n 'Please approve the request in the connection request window...',\n ),\n onTryAgain: handleLoginWithVeChain,\n },\n });\n try {\n await loginWithVeChain();\n } catch (error) {\n console.error(t('Login failed:'), error);\n setCurrentContent({\n type: 'error',\n props: {\n error:\n error instanceof Error\n ? error.message\n : t('Failed to connect with VeChain'),\n onTryAgain: handleLoginWithVeChain,\n },\n });\n }\n };\n\n return (\n <GridItem colSpan={gridColumn ? gridColumn : 4} w={'full'}>\n <ConnectionButton\n isDark={isDark}\n onClick={handleLoginWithVeChain}\n icon={\n isDark\n ? (VechainLogoLight as IconType)\n : (VechainLogoDark as IconType)\n }\n text={t('Use social login with VeChain')}\n variant={'loginWithVechain'}\n rightIcon={<SocialIcons />}\n />\n </GridItem>\n );\n};\n","import { GridItem } from '@chakra-ui/react';\nimport { LuFingerprint } from 'react-icons/lu';\n// Import directly to avoid circular dependency with components barrel\nimport { ConnectionButton } from './ConnectionButton';\nimport { useTranslation } from 'react-i18next';\nimport { useLoginWithPasskey } from '../../../hooks';\n// Import from types/modal to avoid circular dependency\nimport type { ConnectModalContentsTypes } from '../../../types/modal';\nimport React from 'react';\n\ntype Props = {\n isDark: boolean;\n gridColumn?: number;\n setCurrentContent: React.Dispatch<\n React.SetStateAction<ConnectModalContentsTypes>\n >;\n};\n\nexport const PasskeyLoginButton = ({\n isDark,\n gridColumn,\n setCurrentContent,\n}: Props) => {\n const { t } = useTranslation();\n const { loginWithPasskey } = useLoginWithPasskey();\n\n const handleLoginWithPasskey = async () => {\n setCurrentContent({\n type: 'loading',\n props: {\n title: t('Connecting with Passkey'),\n loadingText: t('Please complete the passkey authentication...'),\n onTryAgain: handleLoginWithPasskey,\n },\n });\n try {\n await loginWithPasskey();\n } catch (error) {\n const errorMsg =\n error instanceof Error ? error.message.toLowerCase() : '';\n\n // Log specific error types for debugging\n if (errorMsg.includes('not found')) {\n console.error(error);\n }\n\n setCurrentContent({\n type: 'error',\n props: {\n error:\n error instanceof Error\n ? error.message\n : t('Failed to connect with Passkey'),\n onTryAgain: handleLoginWithPasskey,\n },\n });\n }\n };\n\n return (\n <GridItem colSpan={gridColumn} w={'full'}>\n <ConnectionButton\n isDark={isDark}\n onClick={handleLoginWithPasskey}\n icon={LuFingerprint}\n text={gridColumn && gridColumn >= 2 ? t('Passkey') : undefined}\n />\n </GridItem>\n );\n};\n","import { GridItem, Icon } from '@chakra-ui/react';\n// Import directly to avoid circular dependency with components barrel\nimport { ConnectionButton } from './ConnectionButton';\nimport { useTranslation } from 'react-i18next';\nimport { LuArrowRight, LuWallet } from 'react-icons/lu';\nimport { useEffect } from 'react';\n// Use optional hooks to handle missing DAppKitProvider gracefully\nimport { useOptionalDAppKitWallet } from '../../../hooks/api/dappkit/useOptionalDAppKitWallet';\nimport { useOptionalDAppKitWalletModal } from '../../../hooks/api/dappkit/useOptionalDAppKitWalletModal';\nimport { VeWorldLogoDark, VeWorldLogoLight } from '../../../assets';\nimport { IconType } from 'react-icons';\n// Direct import to avoid circular dependency through barrel exports\nimport { useVeChainKitConfig } from '../../../providers/VeChainKitContext';\n\ntype Props = {\n isDark: boolean;\n gridColumn?: number;\n};\n\nexport const DappKitButton = ({ isDark, gridColumn = 2 }: Props) => {\n const { t } = useTranslation();\n const { open: openDappKitModal, onConnectionStatusChange } =\n useOptionalDAppKitWalletModal();\n const { dappKit } = useVeChainKitConfig();\n const { source } = useOptionalDAppKitWallet();\n\n // Determine the button text based on the source\n const buttonText = !dappKit?.allowedWallets?.includes('sync2')\n ? t('Connect with VeWorld wallet')\n : t('Connect wallet');\n\n useEffect(() => {\n const handleConnectionChange = (\n address: string | null,\n error?: Error,\n ) => {\n if (!address) {\n if (error?.message) {\n console.error(error?.message);\n }\n return { ...(source && { source }) };\n }\n // Wallet activation is now handled in useWallet.ts\n // When a wallet connects, it will automatically be set as active\n };\n onConnectionStatusChange(handleConnectionChange);\n }, [onConnectionStatusChange, source]);\n const handleDappKitClick = () => {\n openDappKitModal();\n };\n\n return (\n <GridItem colSpan={gridColumn ? gridColumn : 2} w={'full'}>\n <ConnectionButton\n isDark={isDark}\n onClick={handleDappKitClick}\n icon={\n !dappKit?.allowedWallets?.includes('sync2')\n ? ((isDark\n ? VeWorldLogoLight\n : VeWorldLogoDark) as IconType)\n : (LuWallet as IconType)\n }\n iconWidth={'27px'}\n text={gridColumn >= 2 ? buttonText : undefined}\n rightIcon={\n (dappKit?.allowedWallets?.includes('sync2') && (\n <Icon as={LuArrowRight} />\n )) ||\n undefined\n }\n />\n </GridItem>\n );\n};\n","import { GridItem, Icon } from '@chakra-ui/react';\nimport { LuEllipsis, LuArrowRight } from 'react-icons/lu';\n// Import directly to avoid circular dependency with components barrel\nimport { ConnectionButton } from './ConnectionButton';\nimport { useTranslation } from 'react-i18next';\n\ntype Props = {\n isDark: boolean;\n onViewMoreLogin: () => void;\n gridColumn?: number;\n};\n\nexport const PrivyButton = ({ isDark, onViewMoreLogin, gridColumn }: Props) => {\n const { t } = useTranslation();\n return (\n <GridItem colSpan={gridColumn} w={'full'}>\n <ConnectionButton\n isDark={isDark}\n onClick={onViewMoreLogin}\n icon={LuEllipsis}\n text={gridColumn && gridColumn >= 2 ? t('More') : undefined}\n rightIcon={<Icon as={LuArrowRight} />}\n />\n </GridItem>\n );\n};\n","import { Grid, Stack } from '@chakra-ui/react';\nimport { EmailLoginButton } from './EmailLoginButton';\nimport { LoginWithGoogleButton } from './LoginWithGoogleButton';\nimport { LoginWithGithubButton } from './LoginWithGithubButton';\nimport { VeChainWithPrivyLoginButton } from './VeChainWithPrivyLoginButton';\nimport { VeChainLoginButton } from './VeChainLoginButton';\nimport { PasskeyLoginButton } from './PasskeyLoginButton';\nimport { DappKitButton } from './DappKitButton';\nimport { PrivyButton } from './PrivyButton';\nimport { useLoginModalContent } from '../../../hooks';\n// Use optional hook to handle missing PrivyProvider gracefully\nimport { useOptionalPrivy } from '../../../hooks/api/privy/useOptionalPrivy';\n// Direct import to avoid circular dependency through barrel exports\nimport { useVeChainKitConfig } from '../../../providers/VeChainKitContext';\n// Import from types/modal to avoid circular dependency with ConnectModal\nimport type { ConnectModalContentsTypes } from '../../../types/modal';\nimport React from 'react';\n\ntype Props = {\n setCurrentContent: React.Dispatch<\n React.SetStateAction<ConnectModalContentsTypes>\n >;\n};\n\nexport const ConnectionOptionsStack = ({ setCurrentContent }: Props) => {\n const { loginMethods, darkMode: isDark } = useVeChainKitConfig();\n\n // View more login - use optional hook for when Privy is not configured\n const { login: viewMoreLogin } = useOptionalPrivy();\n\n const {\n showGoogleLogin,\n showEmailLogin,\n showPasskey,\n showVeChainLogin,\n showDappKit,\n showMoreLogin,\n showGithubLogin,\n isOfficialVeChainApp,\n } = useLoginModalContent();\n\n return (\n <Stack spacing={4} w={'full'} align={'center'}>\n <Grid templateColumns=\"repeat(4, 1fr)\" gap={2} w={'full'}>\n {loginMethods?.map(({ method, gridColumn }) => {\n switch (method) {\n case 'email':\n return (\n showEmailLogin && (\n <EmailLoginButton key=\"email\" />\n )\n );\n case 'google':\n return (\n showGoogleLogin && (\n <LoginWithGoogleButton\n key=\"google\"\n isDark={isDark}\n gridColumn={gridColumn}\n />\n )\n );\n case 'github':\n return (\n showGithubLogin && (\n <LoginWithGithubButton\n key=\"github\"\n isDark={isDark}\n gridColumn={gridColumn}\n />\n )\n );\n case 'vechain':\n return (\n showVeChainLogin &&\n (isOfficialVeChainApp ? (\n <VeChainWithPrivyLoginButton\n key=\"vechain\"\n isDark={isDark}\n gridColumn={gridColumn}\n />\n ) : (\n <VeChainLoginButton\n key=\"vechain\"\n isDark={isDark}\n gridColumn={gridColumn}\n setCurrentContent={setCurrentContent}\n />\n ))\n );\n case 'passkey':\n return (\n showPasskey && (\n <PasskeyLoginButton\n key=\"passkey\"\n isDark={isDark}\n gridColumn={gridColumn}\n setCurrentContent={setCurrentContent}\n />\n )\n );\n case 'dappkit':\n return (\n showDappKit && (\n <DappKitButton\n key=\"dappkit\"\n isDark={isDark}\n gridColumn={gridColumn}\n />\n )\n );\n case 'more':\n return (\n showMoreLogin && (\n <PrivyButton\n key=\"more\"\n isDark={isDark}\n onViewMoreLogin={viewMoreLogin}\n gridColumn={gridColumn}\n />\n )\n );\n default:\n return null;\n }\n })}\n </Grid>\n </Stack>\n );\n};\n","import { Button } from '@chakra-ui/react';\n// Import from types/modal to avoid circular dependency with components barrel\nimport type { ConnectModalContentsTypes } from '../../../types/modal';\nimport { useTranslation } from 'react-i18next';\nimport type { PrivyAppInfo } from '../../../types';\n\ntype Props = {\n isDark: boolean;\n appsInfo: PrivyAppInfo[];\n isLoading: boolean;\n gridColumn?: number;\n setCurrentContent: React.Dispatch<\n React.SetStateAction<ConnectModalContentsTypes>\n >;\n};\n\nexport const EcosystemButton = ({\n appsInfo,\n isLoading,\n setCurrentContent,\n}: Props) => {\n const { t } = useTranslation();\n\n return (\n <Button\n fontSize={'sm'}\n variant=\"link\"\n onClick={() =>\n setCurrentContent({\n type: 'ecosystem',\n props: { appsInfo, isLoading },\n })\n }\n >\n {t('Already have an x2earn app wallet?')}\n </Button>\n );\n};\n","import {\n HStack,\n Image,\n ModalBody,\n ModalCloseButton,\n ModalFooter,\n ModalHeader,\n Text,\n useToken,\n} from '@chakra-ui/react';\n// Direct import to avoid circular dependency through barrel exports\nimport { useVeChainKitConfig } from '../../../providers/VeChainKitContext';\nimport { ModalFAQButton, StickyHeaderContainer } from '../../common';\n// Import from types/modal to avoid circular dependency with ConnectModal\nimport type { ConnectModalContentsTypes } from '../../../types/modal';\nimport React, { useEffect } from 'react';\nimport { useFetchAppInfo, useWallet } from '../../../hooks';\nimport { useTranslation } from 'react-i18next';\nimport { ConnectionOptionsStack } from '../Components/ConnectionOptionsStack';\nimport { EcosystemButton } from '../Components/EcosystemButton';\n\ntype Props = {\n setCurrentContent: React.Dispatch<\n React.SetStateAction<ConnectModalContentsTypes>\n >;\n onClose: () => void;\n preventAutoClose?: boolean;\n};\n\nexport const MainContent = ({ setCurrentContent, onClose, preventAutoClose = false }: Props) => {\n const { t } = useTranslation();\n const { connection } = useWallet();\n\n const { loginModalUI, darkMode: isDark } = useVeChainKitConfig();\n const { loginMethods, privyEcosystemAppIDS } = useVeChainKitConfig();\n const { data: appsInfo, isLoading: isEcosystemAppsLoading } =\n useFetchAppInfo(privyEcosystemAppIDS);\n\n const textColor = useToken('colors', 'vechain-kit-text-secondary');\n\n const handleFAQClick = () => {\n setCurrentContent('faq');\n };\n\n const showEcosystemButton = loginMethods?.some(\n ({ method }) => method === 'ecosystem',\n );\n\n useEffect(() => {\n if (connection.isConnected && !preventAutoClose) {\n onClose();\n }\n }, [connection.isConnected, onClose, preventAutoClose]);\n\n return (\n <>\n <StickyHeaderContainer>\n <ModalFAQButton onClick={handleFAQClick} />\n <ModalHeader>{t('Log in or sign up')}</ModalHeader>\n <ModalCloseButton />\n </StickyHeaderContainer>\n\n {loginModalUI?.logo && (\n <HStack justify={'center'}>\n <Image\n src={loginModalUI.logo || '/images/favicon.png'}\n maxW={'180px'}\n maxH={'90px'}\n m={8}\n alt=\"logo\"\n />\n </HStack>\n )}\n\n <ModalBody>\n {loginModalUI?.description && (\n <HStack\n spacing={4}\n w={'full'}\n justify={'center'}\n mb={'24px'}\n px={4}\n >\n <Text\n color={textColor}\n fontSize={'sm'}\n textAlign={'center'}\n >\n {loginModalUI?.description}\n </Text>\n </HStack>\n )}\n <ConnectionOptionsStack setCurrentContent={setCurrentContent} />\n </ModalBody>\n\n {showEcosystemButton ? (\n <ModalFooter>\n <HStack justify={'center'} w={'full'}>\n <EcosystemButton\n isDark={isDark}\n appsInfo={Object.values(appsInfo || {})}\n isLoading={isEcosystemAppsLoading}\n setCurrentContent={setCurrentContent}\n />\n </HStack>\n </ModalFooter>\n ) : (\n <ModalFooter pt={0} pb={'5px'} />\n )}\n </>\n );\n};\n","import {\n ModalBody,\n ModalHeader,\n ModalCloseButton,\n Spinner,\n VStack,\n Text,\n ModalFooter,\n Icon,\n Button,\n} from '@chakra-ui/react';\nimport { StickyHeaderContainer, ModalBackButton } from '../../common';\nimport { LuRefreshCw } from 'react-icons/lu';\nimport React from 'react';\nimport { useTranslation } from 'react-i18next';\n\ntype LoadingContentProps = {\n loadingText?: string;\n title?: string;\n onTryAgain?: () => void;\n onClose: () => void;\n onGoBack: () => void;\n showBackButton?: boolean;\n};\n\nexport const LoadingContent = ({\n loadingText,\n title,\n onTryAgain,\n onClose,\n onGoBack,\n showBackButton = true,\n}: LoadingContentProps) => {\n const { t } = useTranslation();\n const [showTimeout, setShowTimeout] = React.useState(false);\n\n React.useEffect(() => {\n const timer = setTimeout(() => {\n setShowTimeout(true);\n }, 7000);\n\n return () => clearTimeout(timer);\n }, []);\n\n return (\n <>\n <StickyHeaderContainer>\n <ModalHeader>\n {showBackButton && <ModalBackButton onClick={onGoBack} />}\n {title ?? t('Connecting...')}\n <ModalCloseButton onClick={onClose} />\n </ModalHeader>\n </StickyHeaderContainer>\n\n <ModalBody>\n <VStack\n align={'center'}\n p={6}\n gap={0}\n w={'full'}\n justifyContent={'center'}\n minH={'150px'}\n >\n <Spinner size=\"xl\" />\n </VStack>\n {loadingText && !showTimeout && (\n <Text size=\"sm\" textAlign={'center'}>\n {loadingText}\n </Text>\n )}\n {showTimeout && (\n <VStack mt={4} spacing={2}>\n <Text color=\"orange.300\" size=\"sm\" textAlign={'center'}>\n {t('This is taking longer than expected.')}\n </Text>\n <Text size=\"sm\" textAlign={'center'}>\n {t(\n 'You may want to try establishing the connection again.',\n )}\n </Text>\n </VStack>\n )}\n </ModalBody>\n <ModalFooter justifyContent={'center'}>\n {showTimeout && (\n <Button variant=\"vechainKitPrimary\" onClick={onTryAgain}>\n <Icon mr={2} as={LuRefreshCw} />\n {t('Try again')}\n </Button>\n )}\n </ModalFooter>\n </>\n );\n};\n","import {\n ModalBody,\n ModalHeader,\n VStack,\n ModalCloseButton,\n Text,\n ModalFooter,\n Icon,\n Button,\n} from '@chakra-ui/react';\nimport { StickyHeaderContainer, ModalBackButton } from '../../common';\nimport { LuCircleAlert, LuRefreshCw } from 'react-icons/lu';\nimport { motion, useReducedMotion } from 'framer-motion';\nimport { useTranslation } from 'react-i18next';\n\ntype ErrorContentProps = {\n error: string;\n onClose: () => void;\n onTryAgain: () => void;\n onGoBack: () => void;\n};\n\nexport const ErrorContent = ({\n error,\n onClose,\n onTryAgain,\n onGoBack,\n}: ErrorContentProps) => {\n const { t } = useTranslation();\n const shouldReduceMotion = useReducedMotion();\n\n return (\n <>\n <StickyHeaderContainer>\n <ModalHeader>\n <ModalBackButton onClick={onGoBack} />\n {t('Connection Failed')}\n <ModalCloseButton onClick={onClose} />\n </ModalHeader>\n </StickyHeaderContainer>\n\n <ModalBody>\n <VStack\n align={'center'}\n p={6}\n w={'full'}\n justifyContent={'center'}\n minH={'100px'}\n gap={4}\n >\n <motion.div\n transition={{\n duration: 4,\n ease: 'easeInOut',\n repeat: shouldReduceMotion ? 0 : Infinity,\n }}\n animate={{\n scale: shouldReduceMotion ? [1] : [1, 1.1, 1],\n }}\n >\n <Icon\n as={LuCircleAlert}\n color={'#ef4444'}\n fontSize={'60px'}\n opacity={0.5}\n />\n </motion.div>\n <Text w={'full'} size=\"sm\" textAlign={'center'}>\n {error}\n </Text>\n </VStack>\n </ModalBody>\n <ModalFooter justifyContent={'center'}>\n <Button variant=\"vechainKitPrimary\" onClick={onTryAgain}>\n <Icon mr={2} as={LuRefreshCw} />\n {t('Try again')}\n </Button>\n </ModalFooter>\n </>\n );\n};\n","import {\n Box,\n Button,\n Image,\n ModalBody,\n ModalCloseButton,\n ModalFooter,\n ModalHeader,\n Spinner,\n Text,\n VStack,\n useToken,\n} from '@chakra-ui/react';\nimport { ModalBackButton, StickyHeaderContainer } from '../../common';\nimport { useCrossAppConnectionCache, useOptionalPrivyCrossAppSdk } from '../../../hooks';\nimport { useTranslation } from 'react-i18next';\nimport type { PrivyAppInfo } from '../../../types';\nimport { isRejectionError } from '../../../utils/stringUtils';\n// Import from types/modal to avoid circular dependency with ConnectModal\nimport type { ConnectModalContentsTypes } from '../../../types/modal';\ntype Props = {\n onClose: () => void;\n appsInfo: PrivyAppInfo[];\n isLoading: boolean;\n setCurrentContent: React.Dispatch<\n React.SetStateAction<ConnectModalContentsTypes>\n >;\n showBackButton?: boolean;\n};\n\nexport const EcosystemContent = ({\n onClose,\n appsInfo,\n isLoading,\n setCurrentContent,\n showBackButton = true,\n}: Props) => {\n const { t } = useTranslation();\n\n // Use semantic token for text color (buttons use variants now)\n const textColor = useToken('colors', 'vechain-kit-text-primary');\n\n const { setConnectionCache } = useCrossAppConnectionCache();\n\n // Login with Vechain - Cross app account login (uses optional hook for conditional provider)\n const { login: loginWithCrossApp } = useOptionalPrivyCrossAppSdk();\n\n const connectWithVebetterDaoApps = async (\n appId: string,\n appName: string,\n ) => {\n setCurrentContent({\n type: 'loading',\n props: {\n title: `${t('Connecting with')} ${appName}`,\n loadingText: t(\n 'Please approve the request in the connection request window...',\n ),\n onTryAgain: () => {\n connectWithVebetterDaoApps(appId, appName);\n },\n },\n });\n try {\n await loginWithCrossApp(appId);\n setConnectionCache({\n name: appName,\n logoUrl: appsInfo.find((app) => app.id === appId)?.logo_url,\n appId: appId,\n website: appsInfo.find((app) => app.id === appId)?.website,\n });\n onClose();\n } catch (error) {\n const errorMsg = (error as { message?: string })?.message;\n\n // Handle user rejection or other errors\n if (errorMsg && isRejectionError(errorMsg)) {\n setCurrentContent({\n type: 'ecosystem',\n props: { appsInfo, isLoading: false },\n });\n return;\n }\n\n // If it's an Error instance, return it, otherwise create new Error\n const errorToShow =\n error instanceof Error\n ? error\n : new Error(\n 'An unexpected issue occurred while logging in with this app. Please try again or contact support.',\n );\n\n setCurrentContent({\n type: 'error',\n props: {\n error: errorToShow.message,\n onTryAgain: () => {\n connectWithVebetterDaoApps(appId, appName);\n },\n },\n });\n }\n };\n\n return (\n <Box>\n <>\n <StickyHeaderContainer>\n <ModalHeader>\n {showBackButton && (\n <ModalBackButton\n onClick={() => setCurrentContent('main')}\n />\n )}\n {t('Already have an x2earn app wallet?')}\n <ModalCloseButton onClick={onClose} />\n </ModalHeader>\n </StickyHeaderContainer>\n\n <ModalBody>\n {isLoading && (\n <VStack\n minH={'200px'}\n w={'full'}\n justifyContent={'center'}\n >\n <Spinner />\n </VStack>\n )}\n\n {!isLoading && appsInfo && (\n <VStack spacing={4} w={'full'} pb={6}>\n {appsInfo.map((appInfo) => (\n <Button\n key={appInfo.id}\n variant=\"loginIn\"\n fontSize={'14px'}\n fontWeight={'400'}\n p={6}\n borderRadius={16}\n w={'full'}\n onClick={() => {\n connectWithVebetterDaoApps(\n appInfo.id,\n appInfo.name,\n );\n }}\n justifyContent={'flex-start'}\n >\n <Image\n src={appInfo.logo_url}\n alt={appInfo.name}\n w={'30px'}\n />\n <Text ml={5}>{appInfo.name}</Text>\n </Button>\n ))}\n </VStack>\n )}\n\n {!isLoading && !appsInfo && (\n <Text textAlign={'center'} color={textColor}>\n {t(\n 'No application from VeChain ecosystem is available to login.',\n )}\n </Text>\n )}\n </ModalBody>\n <ModalFooter pt={0} />\n </>\n </Box>\n );\n};\n","'use client';\n\nimport { useState, useEffect } from 'react';\nimport { MainContent } from './Contents/MainContent';\nimport { BaseModal } from '../common';\nimport { FAQContent } from '../AccountModal';\nimport { EcosystemContent, LoadingContent, ErrorContent } from './Contents';\n// Import type from centralized location to avoid circular dependencies\nimport type { ConnectModalContentsTypes } from '../../types/modal';\n\n// Re-export for backward compatibility - needed by internal components\nexport type { ConnectModalContentsTypes } from '../../types/modal';\n\ntype Props = {\n isOpen: boolean;\n onClose: () => void;\n initialContent?: ConnectModalContentsTypes;\n preventAutoClose?: boolean;\n};\n\nexport const ConnectModal = ({\n isOpen,\n onClose,\n initialContent = 'main',\n preventAutoClose = false,\n}: Props) => {\n const [currentContent, setCurrentContent] =\n useState<ConnectModalContentsTypes>(initialContent);\n\n // Sync currentContent with initialContent when it changes (e.g., when opening from popover)\n useEffect(() => {\n if (isOpen) {\n setCurrentContent(initialContent);\n }\n }, [isOpen, initialContent, setCurrentContent]);\n\n const renderContent = () => {\n // Ensure displayContent is valid\n if (!currentContent) {\n return (\n <MainContent\n setCurrentContent={setCurrentContent}\n onClose={onClose}\n preventAutoClose={preventAutoClose}\n />\n );\n }\n\n switch (currentContent) {\n case 'main':\n return (\n <MainContent\n setCurrentContent={setCurrentContent}\n onClose={onClose}\n preventAutoClose={preventAutoClose}\n />\n );\n case 'faq':\n return (\n <FAQContent onGoBack={() => setCurrentContent('main')} />\n );\n }\n\n if (typeof currentContent === 'object' && 'type' in currentContent) {\n switch (currentContent.type) {\n case 'ecosystem':\n return (\n <EcosystemContent\n onClose={onClose}\n appsInfo={currentContent.props.appsInfo}\n isLoading={currentContent.props.isLoading}\n setCurrentContent={setCurrentContent}\n showBackButton={currentContent.props.showBackButton}\n />\n );\n case 'loading':\n return (\n <LoadingContent\n title={currentContent.props.title}\n loadingText={currentContent.props.loadingText}\n onTryAgain={currentContent.props.onTryAgain}\n onClose={onClose}\n onGoBack={() => setCurrentContent('main')}\n showBackButton={currentContent.props.showBackButton}\n />\n );\n case 'error':\n return (\n <ErrorContent\n error={currentContent.props.error}\n onClose={onClose}\n onTryAgain={currentContent.props.onTryAgain}\n onGoBack={() => setCurrentContent('main')}\n />\n );\n }\n }\n\n return null;\n };\n\n const content = renderContent();\n\n // Ensure we have valid content before rendering\n if (!content) {\n // Fallback to main content if renderContent returns null\n const fallbackContent = (\n <MainContent\n setCurrentContent={setCurrentContent}\n onClose={onClose}\n />\n );\n return (\n <BaseModal\n isOpen={isOpen}\n onClose={onClose}\n allowExternalFocus={true}\n blockScrollOnMount={true}\n mobileMinHeight={'260px'}\n mobileMaxHeight={'400px'}\n desktopMinHeight={'250px'}\n desktopMaxHeight={'400px'}\n >\n {fallbackContent}\n </BaseModal>\n );\n }\n\n return (\n <BaseModal\n isOpen={isOpen}\n onClose={onClose}\n allowExternalFocus={true}\n blockScrollOnMount={true}\n mobileMinHeight={'260px'}\n mobileMaxHeight={'400px'}\n desktopMinHeight={'250px'}\n desktopMaxHeight={'400px'}\n >\n {content}\n </BaseModal>\n );\n};\n","import {\n Button,\n ButtonProps,\n HStack,\n Icon,\n Popover,\n PopoverBody,\n PopoverContent,\n PopoverFooter,\n PopoverTrigger,\n} from '@chakra-ui/react';\nimport { ConnectionOptionsStack } from './Components/ConnectionOptionsStack';\nimport { useTranslation } from 'react-i18next';\nimport { LuChevronDown } from 'react-icons/lu';\nimport { EcosystemButton } from './Components';\n// Direct import to avoid circular dependency through barrel exports\nimport { useVeChainKitConfig } from '../../providers/VeChainKitContext';\nimport { useFetchAppInfo, useConnectModal } from '../../hooks';\nimport { ConnectModalContentsTypes } from './ConnectModal';\nimport { useCallback } from 'react';\nimport { SetStateAction } from 'react';\n\ntype ConnectPopoverProps = {\n isLoading: boolean;\n buttonStyle?: ButtonProps;\n};\n\nexport const ConnectPopover = ({\n isLoading,\n buttonStyle,\n}: ConnectPopoverProps) => {\n const { t } = useTranslation();\n const {\n loginMethods,\n darkMode: isDark,\n privyEcosystemAppIDS,\n } = useVeChainKitConfig();\n const showEcosystemButton = loginMethods?.some(\n ({ method }) => method === 'ecosystem',\n );\n const { open: openConnectModal } = useConnectModal();\n\n const { data: appsInfo, isLoading: isEcosystemAppsLoading } =\n useFetchAppInfo(privyEcosystemAppIDS);\n\n // Function to handle content changes from popover - opens ConnectModal\n // When opened from popover, we don't show back button\n const handleSetContent = useCallback(\n (\n content:\n | ConnectModalContentsTypes\n | SetStateAction<ConnectModalContentsTypes>,\n ) => {\n // Handle function form of SetStateAction\n const resolvedContent =\n typeof content === 'function'\n ? content('main') // Use 'main' as previous state (won't be used anyway)\n : content;\n\n // If content is ecosystem or loading, set showBackButton to false\n if (\n typeof resolvedContent === 'object' &&\n 'type' in resolvedContent\n ) {\n if (resolvedContent.type === 'ecosystem') {\n openConnectModal({\n type: 'ecosystem',\n props: {\n ...resolvedContent.props,\n showBackButton: false,\n },\n });\n } else if (resolvedContent.type === 'loading') {\n openConnectModal({\n type: 'loading',\n props: {\n ...resolvedContent.props,\n showBackButton: false,\n },\n });\n } else {\n // Error type or other - don't modify props\n openConnectModal(resolvedContent);\n }\n } else {\n // String type (main, faq, etc.)\n openConnectModal(resolvedContent);\n }\n },\n [openConnectModal],\n );\n\n return (\n <Popover\n placement=\"bottom-start\"\n size={'xl'}\n closeOnBlur={false}\n variant=\"vechainKitBase\"\n >\n {({ isOpen }) => (\n <>\n <PopoverTrigger>\n <Button\n isLoading={isLoading}\n {...buttonStyle}\n isActive={isOpen}\n >\n {t('Login')}\n <Icon\n ml={2}\n as={LuChevronDown}\n transform={\n isOpen ? 'rotate(180deg)' : 'rotate(0deg)'\n }\n transition=\"transform 0.2s\"\n />\n </Button>\n </PopoverTrigger>\n <PopoverContent>\n <PopoverBody>\n <ConnectionOptionsStack\n setCurrentContent={handleSetContent}\n />\n </PopoverBody>\n <PopoverFooter borderTop={'none'} pb={'15px'}>\n {showEcosystemButton && (\n <HStack justify={'center'} w={'full'}>\n <EcosystemButton\n isDark={isDark}\n appsInfo={Object.values(appsInfo || {})}\n isLoading={isEcosystemAppsLoading}\n setCurrentContent={handleSetContent}\n />\n </HStack>\n )}\n </PopoverFooter>\n </PopoverContent>\n </>\n )}\n </Popover>\n );\n};\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ const e=require(`./chunk-DjWAcSYV.cjs`),t=require(`./BaseModal-yevRjczw.cjs`);let n=require(`@chakra-ui/react`),r=require(`react/jsx-runtime`),i=require(`react-i18next`),a=require(`react-icons/lu`);const o=({onClick:e,...t})=>(0,r.jsx)(n.IconButton,{"aria-label":`Back`,icon:(0,r.jsx)(n.Icon,{as:a.LuChevronLeft,fontSize:`20px`}),size:`sm`,variant:`vechainKitHeaderIconButtons`,position:`absolute`,left:`10px`,top:`8px`,onClick:e,lineHeight:`0`,...t}),s=({onDisconnect:e,onBack:s,onClose:c,showCloseButton:l=!0,text:u})=>{let{t:d}=(0,i.useTranslation)(),f=(0,n.useToken)(`colors`,`vechain-kit-text-primary`),p=u??d(`Are you sure you want to disconnect your wallet?`);return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)(t.n,{children:[(0,r.jsx)(n.ModalHeader,{children:d(`Logout`)}),(0,r.jsx)(o,{onClick:s}),l?(0,r.jsx)(n.ModalCloseButton,{onClick:c}):null]}),(0,r.jsx)(n.ModalBody,{children:(0,r.jsxs)(n.VStack,{spacing:6,align:`center`,mt:10,children:[(0,r.jsx)(n.Icon,{as:a.LuLogOut,color:`#ef4444`,fontSize:`60px`,opacity:.5}),(0,r.jsx)(n.Text,{fontSize:`md`,textAlign:`center`,color:f,children:p})]})}),(0,r.jsx)(n.ModalFooter,{w:`full`,mt:4,children:(0,r.jsxs)(n.VStack,{spacing:3,w:`full`,children:[(0,r.jsx)(n.Button,{onClick:e,"data-testid":`disconnect-button`,variant:`vechainKitLogout`,children:d(`Confirm`)}),(0,r.jsx)(n.Button,{variant:`vechainKitSecondary`,onClick:s,"data-testid":`cancel-logout-button`,children:d(`Cancel`)})]})})]})};Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return o}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return s}});
2
+ //# sourceMappingURL=DisconnectConfirmContent-B4qahKqQ.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DisconnectConfirmContent-B4qahKqQ.cjs","names":["IconButton","Icon","LuChevronLeft","StickyHeaderContainer","ModalHeader","ModalCloseButton","ModalBody","VStack","Icon","LuLogOut","Text","ModalFooter","Button"],"sources":["../src/components/common/ModalBackButton.tsx","../src/components/AccountModal/Contents/DisconnectConfirmation/DisconnectConfirmContent.tsx"],"sourcesContent":["import { IconButton, IconButtonProps, Icon } from '@chakra-ui/react';\nimport { LuChevronLeft } from 'react-icons/lu';\n\ntype BackButtonProps = {\n onClick: () => void;\n} & Partial<IconButtonProps>;\n\nexport const ModalBackButton = ({ onClick, ...props }: BackButtonProps) => {\n return (\n <IconButton\n aria-label=\"Back\"\n icon={<Icon as={LuChevronLeft} fontSize={'20px'} />}\n size=\"sm\"\n variant=\"vechainKitHeaderIconButtons\"\n position=\"absolute\"\n left=\"10px\"\n top=\"8px\"\n onClick={onClick}\n lineHeight={'0'}\n {...props}\n />\n );\n};\n","import {\n ModalBody,\n ModalCloseButton,\n ModalHeader,\n VStack,\n Button,\n Text,\n useToken,\n Icon,\n ModalFooter,\n} from '@chakra-ui/react';\nimport {\n ModalBackButton,\n StickyHeaderContainer,\n} from '../../../common';\nimport { useTranslation } from 'react-i18next';\nimport { LuLogOut } from 'react-icons/lu';\n\nexport type DisconnectConfirmContentProps = {\n onDisconnect: () => void;\n onBack: () => void;\n onClose?: () => void;\n text?: string;\n showCloseButton?: boolean;\n};\n\nexport const DisconnectConfirmContent = ({\n onDisconnect,\n onBack,\n onClose,\n showCloseButton = true,\n text,\n}: DisconnectConfirmContentProps) => {\n const { t } = useTranslation();\n\n const textPrimary = useToken('colors', 'vechain-kit-text-primary');\n const textTitle =\n text ?? t('Are you sure you want to disconnect your wallet?');\n return (\n <>\n <StickyHeaderContainer>\n <ModalHeader>{t('Logout')}</ModalHeader>\n <ModalBackButton onClick={onBack} />\n {showCloseButton ? (\n <ModalCloseButton onClick={onClose} />\n ) : null}\n </StickyHeaderContainer>\n\n <ModalBody>\n <VStack spacing={6} align=\"center\" mt={10}>\n <Icon\n as={LuLogOut}\n color={'#ef4444'}\n fontSize={'60px'}\n opacity={0.5}\n />\n <Text fontSize=\"md\" textAlign=\"center\" color={textPrimary}>\n {textTitle}\n </Text>\n </VStack>\n </ModalBody>\n <ModalFooter w=\"full\" mt={4}>\n <VStack spacing={3} w=\"full\">\n <Button\n onClick={onDisconnect}\n data-testid=\"disconnect-button\"\n variant=\"vechainKitLogout\"\n >\n {t('Confirm')}\n </Button>\n <Button\n variant=\"vechainKitSecondary\"\n onClick={onBack}\n data-testid=\"cancel-logout-button\"\n >\n {t('Cancel')}\n </Button>\n </VStack>\n </ModalFooter>\n </>\n );\n};\n"],"mappings":"sMAOA,MAAa,GAAmB,CAAE,UAAS,GAAG,MAEtC,EAAA,EAAA,KAACA,EAAAA,WAAAA,CACG,aAAW,OACX,MAAM,EAAA,EAAA,KAACC,EAAAA,KAAAA,CAAK,GAAIC,EAAAA,cAAe,SAAU,QAAU,CACnD,KAAK,KACL,QAAQ,8BACR,SAAS,WACT,KAAK,OACL,IAAI,MACK,UACT,WAAY,IACZ,GAAI,GACN,CCMG,GAA4B,CACrC,eACA,SACA,UACA,kBAAkB,GAClB,UACiC,CACjC,GAAM,CAAE,MAAA,EAAA,EAAA,iBAAsB,CAExB,GAAA,EAAA,EAAA,UAAuB,SAAU,2BAA2B,CAC5D,EACF,GAAQ,EAAE,mDAAmD,CACjE,OACI,EAAA,EAAA,MAAA,EAAA,SAAA,CAAA,SAAA,EACI,EAAA,EAAA,MAACC,EAAAA,EAAAA,CAAAA,SAAAA,EACG,EAAA,EAAA,KAACC,EAAAA,YAAAA,CAAAA,SAAa,EAAE,SAAS,CAAA,CAAe,EACxC,EAAA,EAAA,KAAC,EAAA,CAAgB,QAAS,EAAA,CAAU,CACnC,GACG,EAAA,EAAA,KAACC,EAAAA,iBAAAA,CAAiB,QAAS,EAAA,CAAW,CACtC,OACgB,EAExB,EAAA,EAAA,KAACC,EAAAA,UAAAA,CAAAA,UACG,EAAA,EAAA,MAACC,EAAAA,OAAAA,CAAO,QAAS,EAAG,MAAM,SAAS,GAAI,cACnC,EAAA,EAAA,KAACC,EAAAA,KAAAA,CACG,GAAIC,EAAAA,SACJ,MAAO,UACP,SAAU,OACV,QAAS,IACX,EACF,EAAA,EAAA,KAACC,EAAAA,KAAAA,CAAK,SAAS,KAAK,UAAU,SAAS,MAAO,WACzC,GACE,CAAA,EACF,CAAA,CACD,EACZ,EAAA,EAAA,KAACC,EAAAA,YAAAA,CAAY,EAAE,OAAO,GAAI,YACtB,EAAA,EAAA,MAACJ,EAAAA,OAAAA,CAAO,QAAS,EAAG,EAAE,kBAClB,EAAA,EAAA,KAACK,EAAAA,OAAAA,CACG,QAAS,EACT,cAAY,oBACZ,QAAQ,4BAEP,EAAE,UAAU,EACR,EACT,EAAA,EAAA,KAACA,EAAAA,OAAAA,CACG,QAAQ,sBACR,QAAS,EACT,cAAY,gCAEX,EAAE,SAAS,EACP,CAAA,EACJ,EACC,GACf"}
@@ -0,0 +1,2 @@
1
+ import{n as e}from"./BaseModal-CWAI9-Bi.js";import{Button as t,Icon as n,IconButton as r,ModalBody as i,ModalCloseButton as a,ModalFooter as o,ModalHeader as s,Text as c,VStack as l,useToken as u}from"@chakra-ui/react";import{Fragment as d,jsx as f,jsxs as p}from"react/jsx-runtime";import{useTranslation as m}from"react-i18next";import{LuChevronLeft as h,LuLogOut as g}from"react-icons/lu";const _=({onClick:e,...t})=>f(r,{"aria-label":`Back`,icon:f(n,{as:h,fontSize:`20px`}),size:`sm`,variant:`vechainKitHeaderIconButtons`,position:`absolute`,left:`10px`,top:`8px`,onClick:e,lineHeight:`0`,...t}),v=({onDisconnect:r,onBack:h,onClose:v,showCloseButton:y=!0,text:b})=>{let{t:x}=m(),S=u(`colors`,`vechain-kit-text-primary`),C=b??x(`Are you sure you want to disconnect your wallet?`);return p(d,{children:[p(e,{children:[f(s,{children:x(`Logout`)}),f(_,{onClick:h}),y?f(a,{onClick:v}):null]}),f(i,{children:p(l,{spacing:6,align:`center`,mt:10,children:[f(n,{as:g,color:`#ef4444`,fontSize:`60px`,opacity:.5}),f(c,{fontSize:`md`,textAlign:`center`,color:S,children:C})]})}),f(o,{w:`full`,mt:4,children:p(l,{spacing:3,w:`full`,children:[f(t,{onClick:r,"data-testid":`disconnect-button`,variant:`vechainKitLogout`,children:x(`Confirm`)}),f(t,{variant:`vechainKitSecondary`,onClick:h,"data-testid":`cancel-logout-button`,children:x(`Cancel`)})]})})]})};export{_ as n,v as t};
2
+ //# sourceMappingURL=DisconnectConfirmContent-C9qLnI-m.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DisconnectConfirmContent-C9qLnI-m.js","names":[],"sources":["../src/components/common/ModalBackButton.tsx","../src/components/AccountModal/Contents/DisconnectConfirmation/DisconnectConfirmContent.tsx"],"sourcesContent":["import { IconButton, IconButtonProps, Icon } from '@chakra-ui/react';\nimport { LuChevronLeft } from 'react-icons/lu';\n\ntype BackButtonProps = {\n onClick: () => void;\n} & Partial<IconButtonProps>;\n\nexport const ModalBackButton = ({ onClick, ...props }: BackButtonProps) => {\n return (\n <IconButton\n aria-label=\"Back\"\n icon={<Icon as={LuChevronLeft} fontSize={'20px'} />}\n size=\"sm\"\n variant=\"vechainKitHeaderIconButtons\"\n position=\"absolute\"\n left=\"10px\"\n top=\"8px\"\n onClick={onClick}\n lineHeight={'0'}\n {...props}\n />\n );\n};\n","import {\n ModalBody,\n ModalCloseButton,\n ModalHeader,\n VStack,\n Button,\n Text,\n useToken,\n Icon,\n ModalFooter,\n} from '@chakra-ui/react';\nimport {\n ModalBackButton,\n StickyHeaderContainer,\n} from '../../../common';\nimport { useTranslation } from 'react-i18next';\nimport { LuLogOut } from 'react-icons/lu';\n\nexport type DisconnectConfirmContentProps = {\n onDisconnect: () => void;\n onBack: () => void;\n onClose?: () => void;\n text?: string;\n showCloseButton?: boolean;\n};\n\nexport const DisconnectConfirmContent = ({\n onDisconnect,\n onBack,\n onClose,\n showCloseButton = true,\n text,\n}: DisconnectConfirmContentProps) => {\n const { t } = useTranslation();\n\n const textPrimary = useToken('colors', 'vechain-kit-text-primary');\n const textTitle =\n text ?? t('Are you sure you want to disconnect your wallet?');\n return (\n <>\n <StickyHeaderContainer>\n <ModalHeader>{t('Logout')}</ModalHeader>\n <ModalBackButton onClick={onBack} />\n {showCloseButton ? (\n <ModalCloseButton onClick={onClose} />\n ) : null}\n </StickyHeaderContainer>\n\n <ModalBody>\n <VStack spacing={6} align=\"center\" mt={10}>\n <Icon\n as={LuLogOut}\n color={'#ef4444'}\n fontSize={'60px'}\n opacity={0.5}\n />\n <Text fontSize=\"md\" textAlign=\"center\" color={textPrimary}>\n {textTitle}\n </Text>\n </VStack>\n </ModalBody>\n <ModalFooter w=\"full\" mt={4}>\n <VStack spacing={3} w=\"full\">\n <Button\n onClick={onDisconnect}\n data-testid=\"disconnect-button\"\n variant=\"vechainKitLogout\"\n >\n {t('Confirm')}\n </Button>\n <Button\n variant=\"vechainKitSecondary\"\n onClick={onBack}\n data-testid=\"cancel-logout-button\"\n >\n {t('Cancel')}\n </Button>\n </VStack>\n </ModalFooter>\n </>\n );\n};\n"],"mappings":"uYAOA,MAAa,GAAmB,CAAE,UAAS,GAAG,KAEtC,EAAC,EAAA,CACG,aAAW,OACX,KAAM,EAAC,EAAA,CAAK,GAAI,EAAe,SAAU,QAAU,CACnD,KAAK,KACL,QAAQ,8BACR,SAAS,WACT,KAAK,OACL,IAAI,MACK,UACT,WAAY,IACZ,GAAI,GACN,CCMG,GAA4B,CACrC,eACA,SACA,UACA,kBAAkB,GAClB,UACiC,CACjC,GAAM,CAAE,KAAM,GAAgB,CAExB,EAAc,EAAS,SAAU,2BAA2B,CAC5D,EACF,GAAQ,EAAE,mDAAmD,CACjE,OACI,EAAA,EAAA,CAAA,SAAA,CACI,EAAC,EAAA,CAAA,SAAA,CACG,EAAC,EAAA,CAAA,SAAa,EAAE,SAAS,CAAA,CAAe,CACxC,EAAC,EAAA,CAAgB,QAAS,EAAA,CAAU,CACnC,EACG,EAAC,EAAA,CAAiB,QAAS,EAAA,CAAW,CACtC,OACgB,CAExB,EAAC,EAAA,CAAA,SACG,EAAC,EAAA,CAAO,QAAS,EAAG,MAAM,SAAS,GAAI,aACnC,EAAC,EAAA,CACG,GAAI,EACJ,MAAO,UACP,SAAU,OACV,QAAS,IACX,CACF,EAAC,EAAA,CAAK,SAAS,KAAK,UAAU,SAAS,MAAO,WACzC,GACE,CAAA,EACF,CAAA,CACD,CACZ,EAAC,EAAA,CAAY,EAAE,OAAO,GAAI,WACtB,EAAC,EAAA,CAAO,QAAS,EAAG,EAAE,iBAClB,EAAC,EAAA,CACG,QAAS,EACT,cAAY,oBACZ,QAAQ,4BAEP,EAAE,UAAU,EACR,CACT,EAAC,EAAA,CACG,QAAQ,sBACR,QAAS,EACT,cAAY,gCAEX,EAAE,SAAS,EACP,CAAA,EACJ,EACC,GACf"}
@@ -0,0 +1 @@
1
+ import"./VechainKitThemeProvider-Di9a04Es.js";import"./ssrUtils-DSwxhTtm.js";import"./DisconnectConfirmContent-C9qLnI-m.js";import"./BaseModal-CWAI9-Bi.js";import{n as e,t}from"./LegalDocumentsModal-aWgfKwIL.js";export{t as LegalDocumentsModal};
@@ -0,0 +1,2 @@
1
+ import{a as e,u as t}from"./VechainKitThemeProvider-Di9a04Es.js";import{n,t as r}from"./DisconnectConfirmContent-C9qLnI-m.js";import{n as i,t as a}from"./BaseModal-CWAI9-Bi.js";import{Fragment as o,useCallback as s,useMemo as c}from"react";import{Button as l,Card as u,CardBody as d,Checkbox as f,HStack as p,Icon as m,Input as h,Link as g,ModalBody as _,ModalCloseButton as v,ModalFooter as y,ModalHeader as b,Stack as x,Text as S,VStack as C,useMediaQuery as w,useSteps as T}from"@chakra-ui/react";import{jsx as E,jsxs as D}from"react/jsx-runtime";import{Trans as O,useTranslation as k}from"react-i18next";import{LuExternalLink as A}from"react-icons/lu";import{useForm as j}from"react-hook-form";import{motion as M}from"framer-motion";const N=({isOpen:e,onClose:t,steps:r,activeStep:o,goToPrevious:s,setActiveStep:c,disableBackButton:l,disableCloseButton:f,closeOnOverlayClick:p=!0,isCloseable:m=!0})=>{let h=()=>{c(0),t()},[g]=w(`(min-width: 1060px)`),_=r[o],y=o===0,x=!y&&!l||_?.title||g&&!f;return _?E(a,{closeOnOverlayClick:p,isOpen:e,onClose:h,isCloseable:m,blockScrollOnMount:!0,children:E(u,{p:0,bg:`none`,children:D(d,{p:0,children:[x?D(i,{children:[_?.title?E(b,{children:_.title}):null,!y&&!l?E(n,{onClick:s}):null,g&&!f?E(v,{onClick:t}):null]}):null,_?.description?E(S,{fontSize:{base:14,md:16},fontWeight:400,px:4,children:_?.description}):null,E(M.div,{initial:`hidden`,animate:`visible`,style:{width:`100%`},children:_.content},_.key)]})})}):null},P=({document:e,register:n,isText:r=!1})=>{let{t:i}=k(),{darkMode:a}=t(),o=e.displayName??i(`Policy`),s=a?`whiteAlpha.400`:`blackAlpha.400`,c=a?`blue.300`:`blue.500`,l=a?`blue.200`:`blue.700`,u=(()=>{if(!e.documentType)return o;switch(e.documentType){case`terms`:return e.displayName||`Terms of Service`;case`privacy`:return e.displayName||`Privacy Policy`;case`cookies`:return e.displayName||`Cookie Policy`;default:return e.displayName||`Legal Document`}})();return r?D(g,{href:e.url,isExternal:!0,color:`blue.500`,textDecoration:`underline`,_hover:{color:`blue.300`,textDecoration:`underline`},fontWeight:`medium`,display:`contents`,alignItems:`center`,children:[E(h,{...n(e.id,{required:e.required}),type:`checkbox`,hidden:!0}),u,E(m,{as:A,ml:1,boxSize:3})]},e.id):E(p,{width:`full`,borderRadius:`md`,transition:`all 0.2s`,children:D(p,{align:`flex-start`,spacing:3,width:`full`,children:[E(f,{mt:`2px`,size:`md`,colorScheme:`blue`,borderColor:s,...n(e.id,{required:e.required}),"data-testid":`tnc-checkbox`}),D(S,{fontSize:`xs`,children:[i(`I have read and agree to `),D(g,{href:e.url,isExternal:!0,color:c,textDecoration:`underline`,_hover:{color:l,textDecoration:`underline`},fontWeight:`medium`,display:`contents`,alignItems:`center`,children:[u,E(m,{as:A,ml:1})]}),e.required&&E(S,{as:`span`,color:`red.500`,fontWeight:`bold`,children:`*`})]})]})},e.id)},F=({onAgree:n,onReject:r,onlyOptionalDocuments:a=!1})=>{let{t:u}=k(),{darkMode:d}=t(),{documentsNotAgreed:f}=e(),{requiredDocuments:p,optionalDocuments:m}=c(()=>f.reduce((e,t)=>(t.required?e.requiredDocuments.push(t):e.optionalDocuments.push(t),e),{requiredDocuments:[],optionalDocuments:[]}),[f]),{handleSubmit:h,register:g,formState:{isValid:v},watch:w}=j({defaultValues:c(()=>f.reduce((e,t)=>(e[t.id]=t.required,e),{}),[f])}),T=w(),A=c(()=>f.filter(e=>T[e.id]),[f,T]),M=f?.length===A.length,N=s(e=>{let t=new Set(Object.entries(e).filter(([e,t])=>t).map(([e])=>e));return n(f.filter(e=>t.has(e.id)))},[f,n]),F=d?`#3a3a3a`:`#eaeaea`,I=d?`#2a2a2a`:`#f5f5f5`,L=d?`gray.300`:`gray.600`,R=d?`0 2px 8px rgba(0, 0, 0, 0.2)`:`0 2px 8px rgba(0, 0, 0, 0.05)`,z=p.length>0,B=m.length>0,V=c(()=>{let e=m.filter(e=>T[e.id]).length;return u(M?`Accept all`:a&&e===0?`Ignore and continue`:z&&!B||z&&e===0?`Accept`:`Accept selected`)},[a,M,m,T]),H=e=>e===p.length-2&&p.length>1?u(` and `):`, `;return E(x,{width:`full`,children:D(`form`,{onSubmit:h(N),children:[E(i,{children:E(b,{children:u(`Terms and Policies`)})}),E(_,{children:D(C,{align:`stretch`,spacing:5,width:`full`,children:[z&&D(S,{as:`span`,fontSize:`sm`,children:[u(`By continuing, you agree to`),` `,p.map((e,t)=>D(o,{children:[E(P,{document:e,register:g,isText:!0},e.id),t<p.length-1?H(t):null]},e.id)),`.`,` `,u(`Please take a moment to review all the policies, with acceptance being mandatory to continue.`)]}),a&&E(S,{fontSize:`sm`,color:L,mb:3,children:E(O,{i18nKey:`<bold>Your privacy matters.</bold> You’re in control, accept to enable optional features like cookies that help us enhance your experience.`,components:{bold:E(S,{as:`span`,fontWeight:`semibold`,color:L})}})}),B&&D(x,{p:4,borderRadius:`xl`,bg:I,borderWidth:`1px`,borderColor:F,boxShadow:R,spacing:5,children:[E(S,{fontSize:`md`,fontWeight:`bold`,color:L,children:u(`Optional`)}),E(C,{align:`stretch`,spacing:4,children:m.map(e=>E(P,{document:e,register:g},e.id))})]})]})}),E(y,{children:D(C,{width:`full`,spacing:3,children:[E(l,{variant:`vechainKitPrimary`,width:`full`,type:`submit`,isDisabled:!v,"data-testid":`accept-tnc-button`,children:V}),!a&&E(l,{variant:`ghost`,width:`full`,onClick:r,"data-testid":`reject-tnc-button`,colorScheme:`red`,children:u(`Reject and logout`)})]})})]})})};var I=function(e){return e.REVIEW_DOCUMENTS=`REVIEW_DOCUMENTS`,e.REJECT_DOCUMENTS=`REJECT_DOCUMENTS`,e}(I||{});const L=({isOpen:e,onAgree:t,handleLogout:n,onlyOptionalDocuments:i})=>{let{t:a}=k(),{activeStep:o,goToPrevious:s,setActiveStep:l,goToNext:u}=T({index:0,count:Object.keys(I).length}),d=()=>{l(0)},f=()=>{u()},p=()=>{n(),d()};return E(N,{isOpen:e,onClose:()=>{},goToPrevious:s,goToNext:u,setActiveStep:l,steps:c(()=>[{key:I.REVIEW_DOCUMENTS,content:E(F,{onAgree:t,onReject:f,onlyOptionalDocuments:i})},{key:I.REJECT_DOCUMENTS,content:E(r,{onDisconnect:p,onBack:s,onClose:s,text:a(`Are you sure you want to reject the policies and disconnect?`),showCloseButton:!1})}],[F,r,t,p]),disableCloseButton:!0,disableBackButton:!0,isCloseable:!1,closeOnOverlayClick:!1,activeStep:o})};export{P as n,L as t};
2
+ //# sourceMappingURL=LegalDocumentsModal-aWgfKwIL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LegalDocumentsModal-aWgfKwIL.js","names":[],"sources":["../src/components/StepModal/StepModal.tsx","../src/components/LegalDocumentsModal/Components/LegalDocumentItem.tsx","../src/components/LegalDocumentsModal/LegalDocumentsContent.tsx","../src/components/LegalDocumentsModal/LegalDocumentsModal.tsx"],"sourcesContent":["import { motion } from 'framer-motion';\nimport { ReactNode } from 'react';\nimport {\n Card,\n CardBody,\n Text,\n useMediaQuery,\n ModalCloseButton,\n ModalHeader,\n} from '@chakra-ui/react';\nimport { BaseModal, StickyHeaderContainer, ModalBackButton } from '../common';\n\nexport type Step<T extends string> = {\n key: T;\n content: ReactNode;\n title?: string;\n description?: string;\n};\n\nexport type StepModalProps<T extends string> = {\n isOpen: boolean;\n onClose: () => void;\n steps: Step<T>[];\n goToPrevious: () => void;\n goToNext?: () => void;\n setActiveStep: (step: number) => void;\n activeStep: number;\n disableBackButton?: boolean;\n disableCloseButton?: boolean;\n closeOnOverlayClick?: boolean;\n isCloseable?: boolean;\n};\n\nexport const StepModal = <T extends string>({\n isOpen,\n onClose,\n steps,\n activeStep,\n goToPrevious,\n setActiveStep,\n disableBackButton,\n disableCloseButton,\n closeOnOverlayClick = true,\n isCloseable = true,\n}: StepModalProps<T>) => {\n const handleClose = () => {\n // reset the active step to 0\n setActiveStep(0);\n // close the modal\n onClose();\n };\n const [isDesktop] = useMediaQuery('(min-width: 1060px)');\n\n const currentStepContent = steps[activeStep];\n\n const isFirstStep = activeStep === 0;\n\n const showHeader =\n (!isFirstStep && !disableBackButton) ||\n currentStepContent?.title ||\n (isDesktop && !disableCloseButton);\n\n if (!currentStepContent) {\n return null;\n }\n\n return (\n <BaseModal\n closeOnOverlayClick={closeOnOverlayClick}\n isOpen={isOpen}\n onClose={handleClose}\n isCloseable={isCloseable}\n blockScrollOnMount={true}\n >\n <Card p={0} bg=\"none\">\n <CardBody p={0}>\n {showHeader ? (\n <StickyHeaderContainer>\n {currentStepContent?.title ? (\n <ModalHeader>\n {currentStepContent.title}\n </ModalHeader>\n ) : null}\n\n {!isFirstStep && !disableBackButton ? (\n <ModalBackButton onClick={goToPrevious} />\n ) : null}\n\n {isDesktop && !disableCloseButton ? (\n <ModalCloseButton onClick={onClose} />\n ) : null}\n </StickyHeaderContainer>\n ) : null}\n {currentStepContent?.description ? (\n <Text\n fontSize={{ base: 14, md: 16 }}\n fontWeight={400}\n px={4}\n >\n {currentStepContent?.description}\n </Text>\n ) : null}\n\n <motion.div\n initial=\"hidden\"\n animate=\"visible\"\n key={currentStepContent.key}\n style={{ width: '100%' }}\n >\n {currentStepContent.content}\n </motion.div>\n </CardBody>\n </Card>\n </BaseModal>\n );\n};\n","// Import directly from VeChainKitContext to avoid circular dependency with providers/index.ts\nimport { useVeChainKitConfig } from '../../../providers/VeChainKitContext';\nimport type { EnrichedLegalDocument } from '../../../types';\nimport { Checkbox, HStack, Icon, Input, Link, Text } from '@chakra-ui/react';\nimport { UseFormRegister } from 'react-hook-form';\nimport { useTranslation } from 'react-i18next';\nimport { LuExternalLink } from 'react-icons/lu';\n\ntype Props = {\n document: EnrichedLegalDocument;\n register: UseFormRegister<any>;\n isText?: boolean;\n};\n\nexport const LegalDocumentItem = ({\n document,\n register,\n isText = false,\n}: Props) => {\n const { t } = useTranslation();\n const { darkMode: isDark } = useVeChainKitConfig();\n const documentName = document.displayName ?? t('Policy');\n\n const borderColor = isDark ? 'whiteAlpha.400' : 'blackAlpha.400';\n\n const linkColor = isDark ? 'blue.300' : 'blue.500';\n const linkHoverColor = isDark ? 'blue.200' : 'blue.700';\n\n // Get document type display text\n const getDocumentTypeDisplay = (): string => {\n if (!document.documentType) return documentName;\n\n switch (document.documentType) {\n case 'terms':\n return document.displayName || 'Terms of Service';\n case 'privacy':\n return document.displayName || 'Privacy Policy';\n case 'cookies':\n return document.displayName || 'Cookie Policy';\n default:\n return document.displayName || 'Legal Document';\n }\n };\n\n const displayName = getDocumentTypeDisplay();\n\n if (isText) {\n return (\n <Link\n key={document.id}\n href={document.url}\n isExternal\n color={'blue.500'}\n textDecoration=\"underline\"\n _hover={{\n color: 'blue.300',\n textDecoration: 'underline',\n }}\n fontWeight=\"medium\"\n display=\"contents\"\n alignItems=\"center\"\n >\n <Input\n {...register(document.id, {\n required: document.required,\n })}\n type=\"checkbox\"\n hidden\n />\n {displayName}\n <Icon as={LuExternalLink} ml={1} boxSize={3} />\n </Link>\n );\n }\n\n return (\n <HStack\n width=\"full\"\n borderRadius=\"md\"\n transition=\"all 0.2s\"\n key={document.id}\n >\n <HStack align=\"flex-start\" spacing={3} width=\"full\">\n <Checkbox\n mt=\"2px\"\n size=\"md\"\n colorScheme=\"blue\"\n borderColor={borderColor}\n {...register(document.id, {\n required: document.required,\n })}\n data-testid=\"tnc-checkbox\"\n />\n\n <Text fontSize=\"xs\">\n {t('I have read and agree to ')}\n <Link\n href={document.url}\n isExternal\n color={linkColor}\n textDecoration=\"underline\"\n _hover={{\n color: linkHoverColor,\n textDecoration: 'underline',\n }}\n fontWeight=\"medium\"\n display=\"contents\"\n alignItems=\"center\"\n >\n {displayName}\n <Icon as={LuExternalLink} ml={1} />\n </Link>\n {document.required && (\n <Text as=\"span\" color=\"red.500\" fontWeight=\"bold\">\n *\n </Text>\n )}\n </Text>\n </HStack>\n </HStack>\n );\n};\n","import { StickyHeaderContainer } from '../common';\n// Import from LegalDocumentsContext to avoid circular dependency with LegalDocumentsProvider\nimport { useLegalDocuments } from '../../providers/LegalDocumentsContext';\n// Import from VeChainKitContext to avoid circular dependency chain\nimport { useVeChainKitConfig } from '../../providers/VeChainKitContext';\nimport type { EnrichedLegalDocument } from '../../types';\nimport {\n Button,\n ModalBody,\n ModalFooter,\n ModalHeader,\n Stack,\n Text,\n VStack,\n} from '@chakra-ui/react';\nimport { Fragment, useCallback, useMemo } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { Trans, useTranslation } from 'react-i18next';\n\nimport { LegalDocumentItem } from './Components';\n\ntype Props = {\n onAgree: (\n documents: EnrichedLegalDocument | EnrichedLegalDocument[],\n ) => void;\n onReject: () => void;\n onlyOptionalDocuments?: boolean;\n};\n\nexport const LegalDocumentsContent = ({\n onAgree,\n onReject,\n onlyOptionalDocuments = false,\n}: Props) => {\n const { t } = useTranslation();\n const { darkMode: isDark } = useVeChainKitConfig();\n const { documentsNotAgreed } = useLegalDocuments();\n\n const { requiredDocuments, optionalDocuments } = useMemo(() => {\n return documentsNotAgreed.reduce<{\n requiredDocuments: EnrichedLegalDocument[];\n optionalDocuments: EnrichedLegalDocument[];\n }>(\n (acc, document) => {\n if (document.required) {\n acc.requiredDocuments.push(document);\n } else {\n acc.optionalDocuments.push(document);\n }\n return acc;\n },\n { requiredDocuments: [], optionalDocuments: [] },\n );\n }, [documentsNotAgreed]);\n\n const defaultFormValues = useMemo(() => {\n return documentsNotAgreed.reduce<Record<string, boolean>>(\n (acc, document) => {\n acc[document.id] = document.required;\n return acc;\n },\n {},\n );\n }, [documentsNotAgreed]);\n\n const {\n handleSubmit,\n register,\n formState: { isValid },\n watch,\n } = useForm<Record<string, boolean>>({\n defaultValues: defaultFormValues,\n });\n\n const formValues = watch();\n\n // Calculate if any optional documents are selected\n const selectedDocuments = useMemo(() => {\n return documentsNotAgreed.filter((document) => formValues[document.id]);\n }, [documentsNotAgreed, formValues]);\n\n // Calculate if all optional documents are selected\n const allSelected = documentsNotAgreed?.length === selectedDocuments.length;\n\n const onSubmit = useCallback(\n (data: Record<string, boolean>) => {\n const agreedDocumentIds = new Set(\n Object.entries(data)\n .filter(([_, checked]) => checked)\n .map(([docId]) => docId),\n );\n\n const agreedDocuments = documentsNotAgreed.filter((document) =>\n agreedDocumentIds.has(document.id),\n );\n return onAgree(agreedDocuments);\n },\n [documentsNotAgreed, onAgree],\n );\n\n const borderColor = isDark ? '#3a3a3a' : '#eaeaea';\n const sectionBgColor = isDark ? '#2a2a2a' : '#f5f5f5';\n const headingColor = isDark ? 'gray.300' : 'gray.600';\n const sectionBoxShadow = isDark\n ? '0 2px 8px rgba(0, 0, 0, 0.2)'\n : '0 2px 8px rgba(0, 0, 0, 0.05)';\n\n const hasRequiredDocuments = requiredDocuments.length > 0;\n const hasOptionalDocuments = optionalDocuments.length > 0;\n\n // Determine the text for the accept button based on selection state\n const acceptButtonText = useMemo(() => {\n const selectedOptionalCount = optionalDocuments.filter(\n (doc) => formValues[doc.id],\n ).length;\n\n if (allSelected) {\n return t('Accept all');\n }\n if (onlyOptionalDocuments && selectedOptionalCount === 0) {\n return t('Ignore and continue');\n }\n if (\n (hasRequiredDocuments && !hasOptionalDocuments) ||\n (hasRequiredDocuments && selectedOptionalCount === 0)\n ) {\n return t('Accept');\n }\n return t('Accept selected');\n }, [onlyOptionalDocuments, allSelected, optionalDocuments, formValues]);\n\n const requiredTextDivider = (index: number) => {\n //If the last two documents, and there are more than 1 document, return ' and '\n if (\n index === requiredDocuments.length - 2 &&\n requiredDocuments.length > 1\n ) {\n return t(' and ');\n }\n return ', ';\n };\n\n return (\n <Stack width=\"full\">\n <form onSubmit={handleSubmit(onSubmit)}>\n <StickyHeaderContainer>\n <ModalHeader>{t('Terms and Policies')}</ModalHeader>\n </StickyHeaderContainer>\n\n <ModalBody>\n <VStack align=\"stretch\" spacing={5} width=\"full\">\n {hasRequiredDocuments && (\n <Text as=\"span\" fontSize=\"sm\">\n {t('By continuing, you agree to')}{' '}\n {requiredDocuments.map((document, index) => (\n <Fragment key={document.id}>\n <LegalDocumentItem\n key={document.id}\n document={document}\n register={register}\n isText={true}\n />\n {index < requiredDocuments.length - 1\n ? requiredTextDivider(index)\n : null}\n </Fragment>\n ))}\n .{' '}\n {t(\n 'Please take a moment to review all the policies, with acceptance being mandatory to continue.',\n )}\n </Text>\n )}\n {onlyOptionalDocuments && (\n <Text fontSize=\"sm\" color={headingColor} mb={3}>\n <Trans\n i18nKey=\"<bold>Your privacy matters.</bold> You’re in control, accept to enable optional features like cookies that help us enhance your experience.\"\n components={{\n bold: (\n <Text\n as=\"span\"\n fontWeight=\"semibold\"\n color={headingColor}\n />\n ),\n }}\n />\n </Text>\n )}\n\n {hasOptionalDocuments && (\n <Stack\n p={4}\n borderRadius=\"xl\"\n bg={sectionBgColor}\n borderWidth=\"1px\"\n borderColor={borderColor}\n boxShadow={sectionBoxShadow}\n spacing={5}\n >\n <Text\n fontSize=\"md\"\n fontWeight=\"bold\"\n color={headingColor}\n >\n {t('Optional')}\n </Text>\n <VStack align=\"stretch\" spacing={4}>\n {optionalDocuments.map((document) => (\n <LegalDocumentItem\n key={document.id}\n document={document}\n register={register}\n />\n ))}\n </VStack>\n </Stack>\n )}\n </VStack>\n </ModalBody>\n <ModalFooter>\n <VStack width=\"full\" spacing={3}>\n <Button\n variant=\"vechainKitPrimary\"\n width=\"full\"\n type=\"submit\"\n isDisabled={!isValid}\n data-testid={'accept-tnc-button'}\n >\n {acceptButtonText}\n </Button>\n {!onlyOptionalDocuments && (\n <Button\n variant=\"ghost\"\n width=\"full\"\n onClick={onReject}\n data-testid={'reject-tnc-button'}\n colorScheme=\"red\"\n >\n {t('Reject and logout')}\n </Button>\n )}\n </VStack>\n </ModalFooter>\n </form>\n </Stack>\n );\n};\n","'use client';\n\nimport type { EnrichedLegalDocument } from '../../types';\nimport { Step, StepModal } from '../StepModal/StepModal';\nimport { useSteps } from '@chakra-ui/react';\nimport { DisconnectConfirmContent } from '../AccountModal/Contents/DisconnectConfirmation/DisconnectConfirmContent';\nimport { useMemo } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { LegalDocumentsContent } from './LegalDocumentsContent';\n\ntype Props = {\n isOpen: boolean;\n onAgree: (\n documents: EnrichedLegalDocument | EnrichedLegalDocument[],\n ) => void;\n handleLogout: () => void;\n onlyOptionalDocuments?: boolean;\n};\n\nexport type LegalDocumentsModalContentsTypes = 'legal-documents';\n\nenum LegalDocumentsSteps {\n REVIEW_DOCUMENTS = 'REVIEW_DOCUMENTS',\n REJECT_DOCUMENTS = 'REJECT_DOCUMENTS',\n}\nexport const LegalDocumentsModal = ({\n isOpen,\n onAgree,\n handleLogout,\n onlyOptionalDocuments,\n}: Props) => {\n const { t } = useTranslation();\n const { activeStep, goToPrevious, setActiveStep, goToNext } = useSteps({\n index: 0,\n count: Object.keys(LegalDocumentsSteps).length,\n });\n\n const goToFirstStep = () => {\n setActiveStep(0);\n };\n\n const goToLogoutScreen = () => {\n goToNext();\n };\n\n const logout = () => {\n handleLogout();\n goToFirstStep();\n };\n\n const steps = useMemo<Step<LegalDocumentsSteps>[]>(\n () => [\n {\n key: LegalDocumentsSteps.REVIEW_DOCUMENTS,\n content: (\n <LegalDocumentsContent\n onAgree={onAgree}\n onReject={goToLogoutScreen}\n onlyOptionalDocuments={onlyOptionalDocuments}\n />\n ),\n },\n {\n key: LegalDocumentsSteps.REJECT_DOCUMENTS,\n content: (\n <DisconnectConfirmContent\n onDisconnect={logout}\n onBack={goToPrevious}\n onClose={goToPrevious}\n text={t(\n 'Are you sure you want to reject the policies and disconnect?',\n )}\n showCloseButton={false}\n />\n ),\n },\n ],\n [LegalDocumentsContent, DisconnectConfirmContent, onAgree, logout],\n );\n\n return (\n <StepModal\n isOpen={isOpen}\n onClose={() => {}}\n goToPrevious={goToPrevious}\n goToNext={goToNext}\n setActiveStep={setActiveStep}\n steps={steps}\n disableCloseButton={true}\n disableBackButton={true}\n isCloseable={false}\n closeOnOverlayClick={false}\n activeStep={activeStep}\n />\n );\n};\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ const e=require(`./chunk-DjWAcSYV.cjs`),t=require(`./VechainKitThemeProvider-BM5258oA.cjs`),n=require(`./DisconnectConfirmContent-B4qahKqQ.cjs`),r=require(`./BaseModal-yevRjczw.cjs`);let i=require(`react`),a=require(`@chakra-ui/react`),o=require(`react/jsx-runtime`),s=require(`react-i18next`),c=require(`react-icons/lu`),l=require(`react-hook-form`),u=require(`framer-motion`);const d=({isOpen:e,onClose:t,steps:i,activeStep:s,goToPrevious:c,setActiveStep:l,disableBackButton:d,disableCloseButton:f,closeOnOverlayClick:p=!0,isCloseable:m=!0})=>{let h=()=>{l(0),t()},[g]=(0,a.useMediaQuery)(`(min-width: 1060px)`),_=i[s],v=s===0,y=!v&&!d||_?.title||g&&!f;return _?(0,o.jsx)(r.t,{closeOnOverlayClick:p,isOpen:e,onClose:h,isCloseable:m,blockScrollOnMount:!0,children:(0,o.jsx)(a.Card,{p:0,bg:`none`,children:(0,o.jsxs)(a.CardBody,{p:0,children:[y?(0,o.jsxs)(r.n,{children:[_?.title?(0,o.jsx)(a.ModalHeader,{children:_.title}):null,!v&&!d?(0,o.jsx)(n.n,{onClick:c}):null,g&&!f?(0,o.jsx)(a.ModalCloseButton,{onClick:t}):null]}):null,_?.description?(0,o.jsx)(a.Text,{fontSize:{base:14,md:16},fontWeight:400,px:4,children:_?.description}):null,(0,o.jsx)(u.motion.div,{initial:`hidden`,animate:`visible`,style:{width:`100%`},children:_.content},_.key)]})})}):null},f=({document:e,register:n,isText:r=!1})=>{let{t:i}=(0,s.useTranslation)(),{darkMode:l}=t.u(),u=e.displayName??i(`Policy`),d=l?`whiteAlpha.400`:`blackAlpha.400`,f=l?`blue.300`:`blue.500`,p=l?`blue.200`:`blue.700`,m=(()=>{if(!e.documentType)return u;switch(e.documentType){case`terms`:return e.displayName||`Terms of Service`;case`privacy`:return e.displayName||`Privacy Policy`;case`cookies`:return e.displayName||`Cookie Policy`;default:return e.displayName||`Legal Document`}})();return r?(0,o.jsxs)(a.Link,{href:e.url,isExternal:!0,color:`blue.500`,textDecoration:`underline`,_hover:{color:`blue.300`,textDecoration:`underline`},fontWeight:`medium`,display:`contents`,alignItems:`center`,children:[(0,o.jsx)(a.Input,{...n(e.id,{required:e.required}),type:`checkbox`,hidden:!0}),m,(0,o.jsx)(a.Icon,{as:c.LuExternalLink,ml:1,boxSize:3})]},e.id):(0,o.jsx)(a.HStack,{width:`full`,borderRadius:`md`,transition:`all 0.2s`,children:(0,o.jsxs)(a.HStack,{align:`flex-start`,spacing:3,width:`full`,children:[(0,o.jsx)(a.Checkbox,{mt:`2px`,size:`md`,colorScheme:`blue`,borderColor:d,...n(e.id,{required:e.required}),"data-testid":`tnc-checkbox`}),(0,o.jsxs)(a.Text,{fontSize:`xs`,children:[i(`I have read and agree to `),(0,o.jsxs)(a.Link,{href:e.url,isExternal:!0,color:f,textDecoration:`underline`,_hover:{color:p,textDecoration:`underline`},fontWeight:`medium`,display:`contents`,alignItems:`center`,children:[m,(0,o.jsx)(a.Icon,{as:c.LuExternalLink,ml:1})]}),e.required&&(0,o.jsx)(a.Text,{as:`span`,color:`red.500`,fontWeight:`bold`,children:`*`})]})]})},e.id)},p=({onAgree:e,onReject:n,onlyOptionalDocuments:c=!1})=>{let{t:u}=(0,s.useTranslation)(),{darkMode:d}=t.u(),{documentsNotAgreed:p}=t.a(),{requiredDocuments:m,optionalDocuments:h}=(0,i.useMemo)(()=>p.reduce((e,t)=>(t.required?e.requiredDocuments.push(t):e.optionalDocuments.push(t),e),{requiredDocuments:[],optionalDocuments:[]}),[p]),{handleSubmit:g,register:_,formState:{isValid:v},watch:y}=(0,l.useForm)({defaultValues:(0,i.useMemo)(()=>p.reduce((e,t)=>(e[t.id]=t.required,e),{}),[p])}),b=y(),x=(0,i.useMemo)(()=>p.filter(e=>b[e.id]),[p,b]),S=p?.length===x.length,C=(0,i.useCallback)(t=>{let n=new Set(Object.entries(t).filter(([e,t])=>t).map(([e])=>e));return e(p.filter(e=>n.has(e.id)))},[p,e]),w=d?`#3a3a3a`:`#eaeaea`,T=d?`#2a2a2a`:`#f5f5f5`,E=d?`gray.300`:`gray.600`,D=d?`0 2px 8px rgba(0, 0, 0, 0.2)`:`0 2px 8px rgba(0, 0, 0, 0.05)`,O=m.length>0,k=h.length>0,A=(0,i.useMemo)(()=>{let e=h.filter(e=>b[e.id]).length;return u(S?`Accept all`:c&&e===0?`Ignore and continue`:O&&!k||O&&e===0?`Accept`:`Accept selected`)},[c,S,h,b]),j=e=>e===m.length-2&&m.length>1?u(` and `):`, `;return(0,o.jsx)(a.Stack,{width:`full`,children:(0,o.jsxs)(`form`,{onSubmit:g(C),children:[(0,o.jsx)(r.n,{children:(0,o.jsx)(a.ModalHeader,{children:u(`Terms and Policies`)})}),(0,o.jsx)(a.ModalBody,{children:(0,o.jsxs)(a.VStack,{align:`stretch`,spacing:5,width:`full`,children:[O&&(0,o.jsxs)(a.Text,{as:`span`,fontSize:`sm`,children:[u(`By continuing, you agree to`),` `,m.map((e,t)=>(0,o.jsxs)(i.Fragment,{children:[(0,o.jsx)(f,{document:e,register:_,isText:!0},e.id),t<m.length-1?j(t):null]},e.id)),`.`,` `,u(`Please take a moment to review all the policies, with acceptance being mandatory to continue.`)]}),c&&(0,o.jsx)(a.Text,{fontSize:`sm`,color:E,mb:3,children:(0,o.jsx)(s.Trans,{i18nKey:`<bold>Your privacy matters.</bold> You’re in control, accept to enable optional features like cookies that help us enhance your experience.`,components:{bold:(0,o.jsx)(a.Text,{as:`span`,fontWeight:`semibold`,color:E})}})}),k&&(0,o.jsxs)(a.Stack,{p:4,borderRadius:`xl`,bg:T,borderWidth:`1px`,borderColor:w,boxShadow:D,spacing:5,children:[(0,o.jsx)(a.Text,{fontSize:`md`,fontWeight:`bold`,color:E,children:u(`Optional`)}),(0,o.jsx)(a.VStack,{align:`stretch`,spacing:4,children:h.map(e=>(0,o.jsx)(f,{document:e,register:_},e.id))})]})]})}),(0,o.jsx)(a.ModalFooter,{children:(0,o.jsxs)(a.VStack,{width:`full`,spacing:3,children:[(0,o.jsx)(a.Button,{variant:`vechainKitPrimary`,width:`full`,type:`submit`,isDisabled:!v,"data-testid":`accept-tnc-button`,children:A}),!c&&(0,o.jsx)(a.Button,{variant:`ghost`,width:`full`,onClick:n,"data-testid":`reject-tnc-button`,colorScheme:`red`,children:u(`Reject and logout`)})]})})]})})};var m=function(e){return e.REVIEW_DOCUMENTS=`REVIEW_DOCUMENTS`,e.REJECT_DOCUMENTS=`REJECT_DOCUMENTS`,e}(m||{});const h=({isOpen:e,onAgree:t,handleLogout:r,onlyOptionalDocuments:c})=>{let{t:l}=(0,s.useTranslation)(),{activeStep:u,goToPrevious:f,setActiveStep:h,goToNext:g}=(0,a.useSteps)({index:0,count:Object.keys(m).length}),_=()=>{h(0)},v=()=>{g()},y=()=>{r(),_()};return(0,o.jsx)(d,{isOpen:e,onClose:()=>{},goToPrevious:f,goToNext:g,setActiveStep:h,steps:(0,i.useMemo)(()=>[{key:m.REVIEW_DOCUMENTS,content:(0,o.jsx)(p,{onAgree:t,onReject:v,onlyOptionalDocuments:c})},{key:m.REJECT_DOCUMENTS,content:(0,o.jsx)(n.t,{onDisconnect:y,onBack:f,onClose:f,text:l(`Are you sure you want to reject the policies and disconnect?`),showCloseButton:!1})}],[p,n.t,t,y]),disableCloseButton:!0,disableBackButton:!0,isCloseable:!1,closeOnOverlayClick:!1,activeStep:u})};Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return f}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return h}});
2
+ //# sourceMappingURL=LegalDocumentsModal-fnhM40y6.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LegalDocumentsModal-fnhM40y6.cjs","names":["BaseModal","Card","CardBody","StickyHeaderContainer","ModalHeader","ModalBackButton","ModalCloseButton","Text","motion","useVeChainKitConfig","Link","Input","Icon","LuExternalLink","HStack","Checkbox","Text","useVeChainKitConfig","useLegalDocuments","Stack","StickyHeaderContainer","ModalHeader","ModalBody","VStack","Text","Fragment","Trans","ModalFooter","Button","DisconnectConfirmContent"],"sources":["../src/components/StepModal/StepModal.tsx","../src/components/LegalDocumentsModal/Components/LegalDocumentItem.tsx","../src/components/LegalDocumentsModal/LegalDocumentsContent.tsx","../src/components/LegalDocumentsModal/LegalDocumentsModal.tsx"],"sourcesContent":["import { motion } from 'framer-motion';\nimport { ReactNode } from 'react';\nimport {\n Card,\n CardBody,\n Text,\n useMediaQuery,\n ModalCloseButton,\n ModalHeader,\n} from '@chakra-ui/react';\nimport { BaseModal, StickyHeaderContainer, ModalBackButton } from '../common';\n\nexport type Step<T extends string> = {\n key: T;\n content: ReactNode;\n title?: string;\n description?: string;\n};\n\nexport type StepModalProps<T extends string> = {\n isOpen: boolean;\n onClose: () => void;\n steps: Step<T>[];\n goToPrevious: () => void;\n goToNext?: () => void;\n setActiveStep: (step: number) => void;\n activeStep: number;\n disableBackButton?: boolean;\n disableCloseButton?: boolean;\n closeOnOverlayClick?: boolean;\n isCloseable?: boolean;\n};\n\nexport const StepModal = <T extends string>({\n isOpen,\n onClose,\n steps,\n activeStep,\n goToPrevious,\n setActiveStep,\n disableBackButton,\n disableCloseButton,\n closeOnOverlayClick = true,\n isCloseable = true,\n}: StepModalProps<T>) => {\n const handleClose = () => {\n // reset the active step to 0\n setActiveStep(0);\n // close the modal\n onClose();\n };\n const [isDesktop] = useMediaQuery('(min-width: 1060px)');\n\n const currentStepContent = steps[activeStep];\n\n const isFirstStep = activeStep === 0;\n\n const showHeader =\n (!isFirstStep && !disableBackButton) ||\n currentStepContent?.title ||\n (isDesktop && !disableCloseButton);\n\n if (!currentStepContent) {\n return null;\n }\n\n return (\n <BaseModal\n closeOnOverlayClick={closeOnOverlayClick}\n isOpen={isOpen}\n onClose={handleClose}\n isCloseable={isCloseable}\n blockScrollOnMount={true}\n >\n <Card p={0} bg=\"none\">\n <CardBody p={0}>\n {showHeader ? (\n <StickyHeaderContainer>\n {currentStepContent?.title ? (\n <ModalHeader>\n {currentStepContent.title}\n </ModalHeader>\n ) : null}\n\n {!isFirstStep && !disableBackButton ? (\n <ModalBackButton onClick={goToPrevious} />\n ) : null}\n\n {isDesktop && !disableCloseButton ? (\n <ModalCloseButton onClick={onClose} />\n ) : null}\n </StickyHeaderContainer>\n ) : null}\n {currentStepContent?.description ? (\n <Text\n fontSize={{ base: 14, md: 16 }}\n fontWeight={400}\n px={4}\n >\n {currentStepContent?.description}\n </Text>\n ) : null}\n\n <motion.div\n initial=\"hidden\"\n animate=\"visible\"\n key={currentStepContent.key}\n style={{ width: '100%' }}\n >\n {currentStepContent.content}\n </motion.div>\n </CardBody>\n </Card>\n </BaseModal>\n );\n};\n","// Import directly from VeChainKitContext to avoid circular dependency with providers/index.ts\nimport { useVeChainKitConfig } from '../../../providers/VeChainKitContext';\nimport type { EnrichedLegalDocument } from '../../../types';\nimport { Checkbox, HStack, Icon, Input, Link, Text } from '@chakra-ui/react';\nimport { UseFormRegister } from 'react-hook-form';\nimport { useTranslation } from 'react-i18next';\nimport { LuExternalLink } from 'react-icons/lu';\n\ntype Props = {\n document: EnrichedLegalDocument;\n register: UseFormRegister<any>;\n isText?: boolean;\n};\n\nexport const LegalDocumentItem = ({\n document,\n register,\n isText = false,\n}: Props) => {\n const { t } = useTranslation();\n const { darkMode: isDark } = useVeChainKitConfig();\n const documentName = document.displayName ?? t('Policy');\n\n const borderColor = isDark ? 'whiteAlpha.400' : 'blackAlpha.400';\n\n const linkColor = isDark ? 'blue.300' : 'blue.500';\n const linkHoverColor = isDark ? 'blue.200' : 'blue.700';\n\n // Get document type display text\n const getDocumentTypeDisplay = (): string => {\n if (!document.documentType) return documentName;\n\n switch (document.documentType) {\n case 'terms':\n return document.displayName || 'Terms of Service';\n case 'privacy':\n return document.displayName || 'Privacy Policy';\n case 'cookies':\n return document.displayName || 'Cookie Policy';\n default:\n return document.displayName || 'Legal Document';\n }\n };\n\n const displayName = getDocumentTypeDisplay();\n\n if (isText) {\n return (\n <Link\n key={document.id}\n href={document.url}\n isExternal\n color={'blue.500'}\n textDecoration=\"underline\"\n _hover={{\n color: 'blue.300',\n textDecoration: 'underline',\n }}\n fontWeight=\"medium\"\n display=\"contents\"\n alignItems=\"center\"\n >\n <Input\n {...register(document.id, {\n required: document.required,\n })}\n type=\"checkbox\"\n hidden\n />\n {displayName}\n <Icon as={LuExternalLink} ml={1} boxSize={3} />\n </Link>\n );\n }\n\n return (\n <HStack\n width=\"full\"\n borderRadius=\"md\"\n transition=\"all 0.2s\"\n key={document.id}\n >\n <HStack align=\"flex-start\" spacing={3} width=\"full\">\n <Checkbox\n mt=\"2px\"\n size=\"md\"\n colorScheme=\"blue\"\n borderColor={borderColor}\n {...register(document.id, {\n required: document.required,\n })}\n data-testid=\"tnc-checkbox\"\n />\n\n <Text fontSize=\"xs\">\n {t('I have read and agree to ')}\n <Link\n href={document.url}\n isExternal\n color={linkColor}\n textDecoration=\"underline\"\n _hover={{\n color: linkHoverColor,\n textDecoration: 'underline',\n }}\n fontWeight=\"medium\"\n display=\"contents\"\n alignItems=\"center\"\n >\n {displayName}\n <Icon as={LuExternalLink} ml={1} />\n </Link>\n {document.required && (\n <Text as=\"span\" color=\"red.500\" fontWeight=\"bold\">\n *\n </Text>\n )}\n </Text>\n </HStack>\n </HStack>\n );\n};\n","import { StickyHeaderContainer } from '../common';\n// Import from LegalDocumentsContext to avoid circular dependency with LegalDocumentsProvider\nimport { useLegalDocuments } from '../../providers/LegalDocumentsContext';\n// Import from VeChainKitContext to avoid circular dependency chain\nimport { useVeChainKitConfig } from '../../providers/VeChainKitContext';\nimport type { EnrichedLegalDocument } from '../../types';\nimport {\n Button,\n ModalBody,\n ModalFooter,\n ModalHeader,\n Stack,\n Text,\n VStack,\n} from '@chakra-ui/react';\nimport { Fragment, useCallback, useMemo } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { Trans, useTranslation } from 'react-i18next';\n\nimport { LegalDocumentItem } from './Components';\n\ntype Props = {\n onAgree: (\n documents: EnrichedLegalDocument | EnrichedLegalDocument[],\n ) => void;\n onReject: () => void;\n onlyOptionalDocuments?: boolean;\n};\n\nexport const LegalDocumentsContent = ({\n onAgree,\n onReject,\n onlyOptionalDocuments = false,\n}: Props) => {\n const { t } = useTranslation();\n const { darkMode: isDark } = useVeChainKitConfig();\n const { documentsNotAgreed } = useLegalDocuments();\n\n const { requiredDocuments, optionalDocuments } = useMemo(() => {\n return documentsNotAgreed.reduce<{\n requiredDocuments: EnrichedLegalDocument[];\n optionalDocuments: EnrichedLegalDocument[];\n }>(\n (acc, document) => {\n if (document.required) {\n acc.requiredDocuments.push(document);\n } else {\n acc.optionalDocuments.push(document);\n }\n return acc;\n },\n { requiredDocuments: [], optionalDocuments: [] },\n );\n }, [documentsNotAgreed]);\n\n const defaultFormValues = useMemo(() => {\n return documentsNotAgreed.reduce<Record<string, boolean>>(\n (acc, document) => {\n acc[document.id] = document.required;\n return acc;\n },\n {},\n );\n }, [documentsNotAgreed]);\n\n const {\n handleSubmit,\n register,\n formState: { isValid },\n watch,\n } = useForm<Record<string, boolean>>({\n defaultValues: defaultFormValues,\n });\n\n const formValues = watch();\n\n // Calculate if any optional documents are selected\n const selectedDocuments = useMemo(() => {\n return documentsNotAgreed.filter((document) => formValues[document.id]);\n }, [documentsNotAgreed, formValues]);\n\n // Calculate if all optional documents are selected\n const allSelected = documentsNotAgreed?.length === selectedDocuments.length;\n\n const onSubmit = useCallback(\n (data: Record<string, boolean>) => {\n const agreedDocumentIds = new Set(\n Object.entries(data)\n .filter(([_, checked]) => checked)\n .map(([docId]) => docId),\n );\n\n const agreedDocuments = documentsNotAgreed.filter((document) =>\n agreedDocumentIds.has(document.id),\n );\n return onAgree(agreedDocuments);\n },\n [documentsNotAgreed, onAgree],\n );\n\n const borderColor = isDark ? '#3a3a3a' : '#eaeaea';\n const sectionBgColor = isDark ? '#2a2a2a' : '#f5f5f5';\n const headingColor = isDark ? 'gray.300' : 'gray.600';\n const sectionBoxShadow = isDark\n ? '0 2px 8px rgba(0, 0, 0, 0.2)'\n : '0 2px 8px rgba(0, 0, 0, 0.05)';\n\n const hasRequiredDocuments = requiredDocuments.length > 0;\n const hasOptionalDocuments = optionalDocuments.length > 0;\n\n // Determine the text for the accept button based on selection state\n const acceptButtonText = useMemo(() => {\n const selectedOptionalCount = optionalDocuments.filter(\n (doc) => formValues[doc.id],\n ).length;\n\n if (allSelected) {\n return t('Accept all');\n }\n if (onlyOptionalDocuments && selectedOptionalCount === 0) {\n return t('Ignore and continue');\n }\n if (\n (hasRequiredDocuments && !hasOptionalDocuments) ||\n (hasRequiredDocuments && selectedOptionalCount === 0)\n ) {\n return t('Accept');\n }\n return t('Accept selected');\n }, [onlyOptionalDocuments, allSelected, optionalDocuments, formValues]);\n\n const requiredTextDivider = (index: number) => {\n //If the last two documents, and there are more than 1 document, return ' and '\n if (\n index === requiredDocuments.length - 2 &&\n requiredDocuments.length > 1\n ) {\n return t(' and ');\n }\n return ', ';\n };\n\n return (\n <Stack width=\"full\">\n <form onSubmit={handleSubmit(onSubmit)}>\n <StickyHeaderContainer>\n <ModalHeader>{t('Terms and Policies')}</ModalHeader>\n </StickyHeaderContainer>\n\n <ModalBody>\n <VStack align=\"stretch\" spacing={5} width=\"full\">\n {hasRequiredDocuments && (\n <Text as=\"span\" fontSize=\"sm\">\n {t('By continuing, you agree to')}{' '}\n {requiredDocuments.map((document, index) => (\n <Fragment key={document.id}>\n <LegalDocumentItem\n key={document.id}\n document={document}\n register={register}\n isText={true}\n />\n {index < requiredDocuments.length - 1\n ? requiredTextDivider(index)\n : null}\n </Fragment>\n ))}\n .{' '}\n {t(\n 'Please take a moment to review all the policies, with acceptance being mandatory to continue.',\n )}\n </Text>\n )}\n {onlyOptionalDocuments && (\n <Text fontSize=\"sm\" color={headingColor} mb={3}>\n <Trans\n i18nKey=\"<bold>Your privacy matters.</bold> You’re in control, accept to enable optional features like cookies that help us enhance your experience.\"\n components={{\n bold: (\n <Text\n as=\"span\"\n fontWeight=\"semibold\"\n color={headingColor}\n />\n ),\n }}\n />\n </Text>\n )}\n\n {hasOptionalDocuments && (\n <Stack\n p={4}\n borderRadius=\"xl\"\n bg={sectionBgColor}\n borderWidth=\"1px\"\n borderColor={borderColor}\n boxShadow={sectionBoxShadow}\n spacing={5}\n >\n <Text\n fontSize=\"md\"\n fontWeight=\"bold\"\n color={headingColor}\n >\n {t('Optional')}\n </Text>\n <VStack align=\"stretch\" spacing={4}>\n {optionalDocuments.map((document) => (\n <LegalDocumentItem\n key={document.id}\n document={document}\n register={register}\n />\n ))}\n </VStack>\n </Stack>\n )}\n </VStack>\n </ModalBody>\n <ModalFooter>\n <VStack width=\"full\" spacing={3}>\n <Button\n variant=\"vechainKitPrimary\"\n width=\"full\"\n type=\"submit\"\n isDisabled={!isValid}\n data-testid={'accept-tnc-button'}\n >\n {acceptButtonText}\n </Button>\n {!onlyOptionalDocuments && (\n <Button\n variant=\"ghost\"\n width=\"full\"\n onClick={onReject}\n data-testid={'reject-tnc-button'}\n colorScheme=\"red\"\n >\n {t('Reject and logout')}\n </Button>\n )}\n </VStack>\n </ModalFooter>\n </form>\n </Stack>\n );\n};\n","'use client';\n\nimport type { EnrichedLegalDocument } from '../../types';\nimport { Step, StepModal } from '../StepModal/StepModal';\nimport { useSteps } from '@chakra-ui/react';\nimport { DisconnectConfirmContent } from '../AccountModal/Contents/DisconnectConfirmation/DisconnectConfirmContent';\nimport { useMemo } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { LegalDocumentsContent } from './LegalDocumentsContent';\n\ntype Props = {\n isOpen: boolean;\n onAgree: (\n documents: EnrichedLegalDocument | EnrichedLegalDocument[],\n ) => void;\n handleLogout: () => void;\n onlyOptionalDocuments?: boolean;\n};\n\nexport type LegalDocumentsModalContentsTypes = 'legal-documents';\n\nenum LegalDocumentsSteps {\n REVIEW_DOCUMENTS = 'REVIEW_DOCUMENTS',\n REJECT_DOCUMENTS = 'REJECT_DOCUMENTS',\n}\nexport const LegalDocumentsModal = ({\n isOpen,\n onAgree,\n handleLogout,\n onlyOptionalDocuments,\n}: Props) => {\n const { t } = useTranslation();\n const { activeStep, goToPrevious, setActiveStep, goToNext } = useSteps({\n index: 0,\n count: Object.keys(LegalDocumentsSteps).length,\n });\n\n const goToFirstStep = () => {\n setActiveStep(0);\n };\n\n const goToLogoutScreen = () => {\n goToNext();\n };\n\n const logout = () => {\n handleLogout();\n goToFirstStep();\n };\n\n const steps = useMemo<Step<LegalDocumentsSteps>[]>(\n () => [\n {\n key: LegalDocumentsSteps.REVIEW_DOCUMENTS,\n content: (\n <LegalDocumentsContent\n onAgree={onAgree}\n onReject={goToLogoutScreen}\n onlyOptionalDocuments={onlyOptionalDocuments}\n />\n ),\n },\n {\n key: LegalDocumentsSteps.REJECT_DOCUMENTS,\n content: (\n <DisconnectConfirmContent\n onDisconnect={logout}\n onBack={goToPrevious}\n onClose={goToPrevious}\n text={t(\n 'Are you sure you want to reject the policies and disconnect?',\n )}\n showCloseButton={false}\n />\n ),\n },\n ],\n [LegalDocumentsContent, DisconnectConfirmContent, onAgree, logout],\n );\n\n return (\n <StepModal\n isOpen={isOpen}\n onClose={() => {}}\n goToPrevious={goToPrevious}\n goToNext={goToNext}\n setActiveStep={setActiveStep}\n steps={steps}\n disableCloseButton={true}\n disableBackButton={true}\n isCloseable={false}\n closeOnOverlayClick={false}\n activeStep={activeStep}\n />\n );\n};\n"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ require(`./VechainKitThemeProvider-BM5258oA.cjs`),require(`./ssrUtils-C_5ZY26i.cjs`),require(`./DisconnectConfirmContent-B4qahKqQ.cjs`),require(`./BaseModal-yevRjczw.cjs`);const e=require(`./LegalDocumentsModal-fnhM40y6.cjs`);exports.LegalDocumentsModal=e.t;
@@ -0,0 +1,2 @@
1
+ import{a as e,it as t}from"./utils-B2Eg9TD3.js";import{E as n,S as r,b as i}from"./assets-CXk1qRDd.js";import{o as a}from"./ssrUtils-DSwxhTtm.js";import o,{useCallback as s,useRef as c,useState as l}from"react";import{jsx as u}from"react/jsx-runtime";import{WagmiProvider as d,createConfig as f,http as p,useAccount as m,useConnect as h,useDisconnect as g,useSignMessage as _,useSignTypedData as v}from"wagmi";import{toPrivyWalletConnector as y}from"@privy-io/cross-app-connect/rainbow-kit";import{defineChain as b}from"viem";import{isMobile as x}from"react-device-detect";const S=({error:t,mobileBrowserPopupMessage:n=`Mobile browser blocked the window. Please try again.`,rejectedMessage:r=`Request was cancelled.`,defaultMessage:i=`Operation failed`})=>{let a=t?.message;return x&&a&&!e(a)?Error(n):a&&e(a)?Error(r):t instanceof Error?t:Error(i)},C=b({id:`1176455790972829965191905223412607679856028701100105089447013101863`,name:`Vechain`,nativeCurrency:{name:`VeChain`,symbol:`VET`,decimals:18},rpcUrls:{default:{http:[n]}},blockExplorers:{default:{name:`Vechain Explorer`,url:r},vechainStats:{name:`Vechain Stats`,url:i}}}),w=()=>y({id:t,name:`VeChain`,iconUrl:`https://imagedelivery.net/oHBRUd2clqykxgDWmeAyLg/661dd77c-2f9d-40e7-baa1-f4e24fd7bf00/icon`,smartWalletMode:!1}),T=({privyEcosystemAppIDS:e,children:t})=>u(d,{config:c(f({chains:[C],ssr:!0,connectors:[w(),...e.map(e=>y({id:e,name:``,iconUrl:``}))],transports:{[C.id]:p()},multiInjectedProviderDiscovery:!1})).current,children:t}),E=()=>{let{connectAsync:e,connectors:n}=h(),{signTypedDataAsync:r}=v(),{signMessageAsync:i}=_(),{disconnectAsync:o}=g(),{isConnected:c}=m(),[u,d]=l(!1),[f,p]=l(null),y=s(async()=>{try{c&&(await o(),a()&&window.dispatchEvent(new Event(`wallet_disconnected`)))}catch(e){throw console.error(`Error during logout:`,e),e}},[o,c]);return{login:s(async r=>{try{d(!0),p(null);let i=n.find(e=>e.id===(r||t));if(!i)throw Error(`Connector not found`);return await e({connector:i})}catch(e){throw p(e),e}finally{d(!1)}},[e,n]),logout:y,signMessage:s(async e=>{try{return await i({message:e})}catch(e){throw S({error:e,mobileBrowserPopupMessage:`Your mobile browser blocked the signing window. Please click 'Try again' to open the signing window or change your browser settings.`,rejectedMessage:`Signing request was cancelled.`,defaultMessage:`An unexpected issue occurred while signing a message. Please try again or contact support.`})}},[i]),signTypedData:s(async e=>{try{return await r(e)}catch(e){throw S({error:e,mobileBrowserPopupMessage:`Your mobile browser blocked the signing window. Please click 'Try again' to open the signing window or change your browser settings.`,rejectedMessage:`Signing request was cancelled.`,defaultMessage:`An unexpected issue occurred while signing typed data. Please try again or contact support.`})}},[r]),isConnecting:u,connectionError:f}};export{S as a,w as i,E as n,C as r,T as t};
2
+ //# sourceMappingURL=PrivyCrossAppProvider-B6oIXeWL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PrivyCrossAppProvider-B6oIXeWL.js","names":[],"sources":["../src/utils/handlePopupError.ts","../src/providers/PrivyCrossAppProvider.tsx"],"sourcesContent":["import { isMobile } from 'react-device-detect';\nimport { isRejectionError } from './stringUtils';\n\ntype PopupErrorOptions = {\n error: unknown;\n mobileBrowserPopupMessage?: string;\n rejectedMessage?: string;\n defaultMessage?: string;\n};\n\nexport const handlePopupError = ({\n error,\n mobileBrowserPopupMessage = 'Mobile browser blocked the window. Please try again.',\n rejectedMessage = 'Request was cancelled.',\n defaultMessage = 'Operation failed',\n}: PopupErrorOptions): Error => {\n const errorMsg = (error as { message?: string })?.message;\n\n // If it's mobile browser and not a user rejection, it might be due to popup blocking\n if (isMobile && errorMsg && !isRejectionError(errorMsg)) {\n return new Error(mobileBrowserPopupMessage);\n }\n\n // Handle user rejection or other errors\n if (errorMsg && isRejectionError(errorMsg)) {\n return new Error(rejectedMessage);\n }\n\n // If it's an Error instance, return it, otherwise create new Error\n return error instanceof Error ? error : new Error(defaultMessage);\n};\n","import React, { useCallback, useRef, useState } from 'react';\nimport { toPrivyWalletConnector } from '@privy-io/cross-app-connect/rainbow-kit';\nimport {\n useConnect,\n useDisconnect,\n createConfig,\n useSignMessage,\n useSignTypedData,\n WagmiProvider,\n http,\n useAccount,\n} from 'wagmi';\nimport { SignTypedDataParameters } from '@wagmi/core';\nimport { VECHAIN_PRIVY_APP_ID } from '../utils';\nimport { defineChain } from 'viem';\nimport { handlePopupError } from '../utils/handlePopupError';\nimport { isBrowser } from '../utils/ssrUtils';\nimport {\n VECHAIN_EXPLORER_BASE_URL,\n VECHAIN_MAINNET_NODE_BASE_URL,\n VECHAINSTATS_BASE_URL,\n} from '../constants';\n\nexport const vechain = defineChain({\n id: '1176455790972829965191905223412607679856028701100105089447013101863' as unknown as number,\n name: 'Vechain',\n nativeCurrency: { name: 'VeChain', symbol: 'VET', decimals: 18 },\n rpcUrls: {\n default: {\n http: [VECHAIN_MAINNET_NODE_BASE_URL],\n },\n },\n blockExplorers: {\n default: {\n name: 'Vechain Explorer',\n url: VECHAIN_EXPLORER_BASE_URL,\n },\n vechainStats: {\n name: 'Vechain Stats',\n url: VECHAINSTATS_BASE_URL,\n },\n },\n});\n\nexport const vechainConnector = () => {\n return toPrivyWalletConnector({\n id: VECHAIN_PRIVY_APP_ID,\n name: 'VeChain',\n iconUrl:\n 'https://imagedelivery.net/oHBRUd2clqykxgDWmeAyLg/661dd77c-2f9d-40e7-baa1-f4e24fd7bf00/icon',\n smartWalletMode: false,\n });\n};\n\ninterface PrivyCrossAppProviderProps {\n privyEcosystemAppIDS: string[];\n children: React.ReactNode;\n}\n\nexport const PrivyCrossAppProvider = ({\n privyEcosystemAppIDS,\n children,\n}: PrivyCrossAppProviderProps) => {\n // Use useRef to store the config to prevent recreation on re-renders\n const wagmiConfigRef = useRef(\n createConfig({\n chains: [vechain],\n ssr: true,\n connectors: [\n vechainConnector(),\n ...privyEcosystemAppIDS.map((appId) =>\n toPrivyWalletConnector({\n id: appId,\n name: '',\n iconUrl: '',\n }),\n ),\n ],\n transports: { [vechain.id]: http() },\n multiInjectedProviderDiscovery: false,\n }),\n );\n\n return (\n <WagmiProvider config={wagmiConfigRef.current}>\n {children}\n </WagmiProvider>\n );\n};\n\nexport const usePrivyCrossAppSdk = () => {\n const { connectAsync, connectors } = useConnect();\n const { signTypedDataAsync } = useSignTypedData();\n const { signMessageAsync } = useSignMessage();\n const { disconnectAsync } = useDisconnect();\n const { isConnected } = useAccount();\n\n // Add local state to track connection\n const [isConnecting, setIsConnecting] = useState(false);\n const [connectionError, setConnectionError] = useState<Error | null>(null);\n\n const logout = useCallback(async () => {\n try {\n if (isConnected) {\n await disconnectAsync();\n // Force a state update after disconnect\n if (isBrowser()) {\n window.dispatchEvent(new Event('wallet_disconnected'));\n }\n }\n } catch (error) {\n console.error('Error during logout:', error);\n throw error;\n }\n }, [disconnectAsync, isConnected]);\n\n const login = useCallback(\n async (appID: string) => {\n try {\n setIsConnecting(true);\n setConnectionError(null);\n\n const connector = connectors.find(\n (c) => c.id === (appID || VECHAIN_PRIVY_APP_ID),\n );\n\n if (!connector) {\n throw new Error('Connector not found');\n }\n\n const result = await connectAsync({ connector });\n\n return result;\n } catch (error) {\n setConnectionError(error as Error);\n throw error;\n } finally {\n setIsConnecting(false);\n }\n },\n [connectAsync, connectors],\n );\n\n // Keep the other methods unchanged\n const signMessage = useCallback(\n async (message: string) => {\n try {\n return await signMessageAsync({ message });\n } catch (error) {\n throw handlePopupError({\n error,\n mobileBrowserPopupMessage:\n \"Your mobile browser blocked the signing window. Please click 'Try again' to open the signing window or change your browser settings.\",\n rejectedMessage: 'Signing request was cancelled.',\n defaultMessage:\n 'An unexpected issue occurred while signing a message. Please try again or contact support.',\n });\n }\n },\n [signMessageAsync],\n );\n\n const signTypedData = useCallback(\n async (data: SignTypedDataParameters) => {\n try {\n return await signTypedDataAsync(data);\n } catch (error) {\n const errorType = handlePopupError({\n error,\n mobileBrowserPopupMessage:\n \"Your mobile browser blocked the signing window. Please click 'Try again' to open the signing window or change your browser settings.\",\n rejectedMessage: 'Signing request was cancelled.',\n defaultMessage:\n 'An unexpected issue occurred while signing typed data. Please try again or contact support.',\n });\n throw errorType;\n }\n },\n [signTypedDataAsync],\n );\n\n return {\n login,\n logout,\n signMessage,\n signTypedData,\n isConnecting,\n connectionError,\n };\n};\n"],"mappings":"6jBAUA,MAAa,GAAoB,CAC7B,QACA,4BAA4B,uDAC5B,kBAAkB,yBAClB,iBAAiB,sBACW,CAC5B,IAAM,EAAY,GAAgC,QAalD,OAVI,GAAY,GAAY,CAAC,EAAiB,EAAS,CACxC,MAAM,EAA0B,CAI3C,GAAY,EAAiB,EAAS,CAC3B,MAAM,EAAgB,CAI9B,aAAiB,MAAQ,EAAY,MAAM,EAAe,ECNxD,EAAU,EAAY,CAC/B,GAAI,sEACJ,KAAM,UACN,eAAgB,CAAE,KAAM,UAAW,OAAQ,MAAO,SAAU,GAAI,CAChE,QAAS,CACL,QAAS,CACL,KAAM,CAAC,EAA8B,CACxC,CACJ,CACD,eAAgB,CACZ,QAAS,CACL,KAAM,mBACN,IAAK,EACR,CACD,aAAc,CACV,KAAM,gBACN,IAAK,EACR,CACJ,CACJ,CAAC,CAEW,MACF,EAAuB,CAC1B,GAAI,EACJ,KAAM,UACN,QACI,6FACJ,gBAAiB,GACpB,CAAC,CAQO,GAAyB,CAClC,uBACA,cAuBI,EAAC,EAAA,CAAc,OApBI,EACnB,EAAa,CACT,OAAQ,CAAC,EAAQ,CACjB,IAAK,GACL,WAAY,CACR,GAAkB,CAClB,GAAG,EAAqB,IAAK,GACzB,EAAuB,CACnB,GAAI,EACJ,KAAM,GACN,QAAS,GACZ,CAAC,CACL,CACJ,CACD,WAAY,EAAG,EAAQ,IAAK,GAAM,CAAE,CACpC,+BAAgC,GACnC,CAAC,CACL,CAGyC,QACjC,YACW,CAIX,MAA4B,CACrC,GAAM,CAAE,eAAc,cAAe,GAAY,CAC3C,CAAE,sBAAuB,GAAkB,CAC3C,CAAE,oBAAqB,GAAgB,CACvC,CAAE,mBAAoB,GAAe,CACrC,CAAE,eAAgB,GAAY,CAG9B,CAAC,EAAc,GAAmB,EAAS,GAAM,CACjD,CAAC,EAAiB,GAAsB,EAAuB,KAAK,CAEpE,EAAS,EAAY,SAAY,CACnC,GAAI,CACI,IACA,MAAM,GAAiB,CAEnB,GAAW,EACX,OAAO,cAAc,IAAI,MAAM,sBAAsB,CAAC,QAGzD,EAAO,CAEZ,MADA,QAAQ,MAAM,uBAAwB,EAAM,CACtC,IAEX,CAAC,EAAiB,EAAY,CAAC,CAmElC,MAAO,CACH,MAlEU,EACV,KAAO,IAAkB,CACrB,GAAI,CACA,EAAgB,GAAK,CACrB,EAAmB,KAAK,CAExB,IAAM,EAAY,EAAW,KACxB,GAAM,EAAE,MAAQ,GAAS,GAC7B,CAED,GAAI,CAAC,EACD,MAAU,MAAM,sBAAsB,CAK1C,OAFe,MAAM,EAAa,CAAE,YAAW,CAAC,OAG3C,EAAO,CAEZ,MADA,EAAmB,EAAe,CAC5B,SACA,CACN,EAAgB,GAAM,GAG9B,CAAC,EAAc,EAAW,CAC7B,CA0CG,SACA,YAxCgB,EAChB,KAAO,IAAoB,CACvB,GAAI,CACA,OAAO,MAAM,EAAiB,CAAE,UAAS,CAAC,OACrC,EAAO,CACZ,MAAM,EAAiB,CACnB,QACA,0BACI,uIACJ,gBAAiB,iCACjB,eACI,6FACP,CAAC,GAGV,CAAC,EAAiB,CACrB,CAyBG,cAvBkB,EAClB,KAAO,IAAkC,CACrC,GAAI,CACA,OAAO,MAAM,EAAmB,EAAK,OAChC,EAAO,CASZ,MARkB,EAAiB,CAC/B,QACA,0BACI,uIACJ,gBAAiB,iCACjB,eACI,8FACP,CAAC,GAIV,CAAC,EAAmB,CACvB,CAOG,eACA,kBACH"}
@@ -0,0 +1 @@
1
+ require(`./utils-jW13BhAb.cjs`),require(`./assets-YPd7adzM.cjs`),require(`./ssrUtils-C_5ZY26i.cjs`);const e=require(`./PrivyCrossAppProvider-DSuzrbqs.cjs`);exports.PrivyCrossAppProvider=e.t;
@@ -0,0 +1 @@
1
+ import"./utils-B2Eg9TD3.js";import"./assets-CXk1qRDd.js";import"./ssrUtils-DSwxhTtm.js";import{i as e,n as t,r as n,t as r}from"./PrivyCrossAppProvider-B6oIXeWL.js";export{r as PrivyCrossAppProvider};
@@ -0,0 +1,2 @@
1
+ const e=require(`./chunk-DjWAcSYV.cjs`),t=require(`./utils-jW13BhAb.cjs`),n=require(`./assets-YPd7adzM.cjs`),r=require(`./ssrUtils-C_5ZY26i.cjs`);let i=require(`react`);i=e.t(i);let a=require(`react/jsx-runtime`),o=require(`wagmi`),s=require(`@privy-io/cross-app-connect/rainbow-kit`),c=require(`viem`),l=require(`react-device-detect`);const u=({error:e,mobileBrowserPopupMessage:n=`Mobile browser blocked the window. Please try again.`,rejectedMessage:r=`Request was cancelled.`,defaultMessage:i=`Operation failed`})=>{let a=e?.message;return l.isMobile&&a&&!t.a(a)?Error(n):a&&t.a(a)?Error(r):e instanceof Error?e:Error(i)},d=(0,c.defineChain)({id:`1176455790972829965191905223412607679856028701100105089447013101863`,name:`Vechain`,nativeCurrency:{name:`VeChain`,symbol:`VET`,decimals:18},rpcUrls:{default:{http:[n.E]}},blockExplorers:{default:{name:`Vechain Explorer`,url:n.S},vechainStats:{name:`Vechain Stats`,url:n.b}}}),f=()=>(0,s.toPrivyWalletConnector)({id:t.it,name:`VeChain`,iconUrl:`https://imagedelivery.net/oHBRUd2clqykxgDWmeAyLg/661dd77c-2f9d-40e7-baa1-f4e24fd7bf00/icon`,smartWalletMode:!1}),p=({privyEcosystemAppIDS:e,children:t})=>(0,a.jsx)(o.WagmiProvider,{config:(0,i.useRef)((0,o.createConfig)({chains:[d],ssr:!0,connectors:[f(),...e.map(e=>(0,s.toPrivyWalletConnector)({id:e,name:``,iconUrl:``}))],transports:{[d.id]:(0,o.http)()},multiInjectedProviderDiscovery:!1})).current,children:t}),m=()=>{let{connectAsync:e,connectors:n}=(0,o.useConnect)(),{signTypedDataAsync:a}=(0,o.useSignTypedData)(),{signMessageAsync:s}=(0,o.useSignMessage)(),{disconnectAsync:c}=(0,o.useDisconnect)(),{isConnected:l}=(0,o.useAccount)(),[d,f]=(0,i.useState)(!1),[p,m]=(0,i.useState)(null),h=(0,i.useCallback)(async()=>{try{l&&(await c(),r.o()&&window.dispatchEvent(new Event(`wallet_disconnected`)))}catch(e){throw console.error(`Error during logout:`,e),e}},[c,l]);return{login:(0,i.useCallback)(async r=>{try{f(!0),m(null);let i=n.find(e=>e.id===(r||t.it));if(!i)throw Error(`Connector not found`);return await e({connector:i})}catch(e){throw m(e),e}finally{f(!1)}},[e,n]),logout:h,signMessage:(0,i.useCallback)(async e=>{try{return await s({message:e})}catch(e){throw u({error:e,mobileBrowserPopupMessage:`Your mobile browser blocked the signing window. Please click 'Try again' to open the signing window or change your browser settings.`,rejectedMessage:`Signing request was cancelled.`,defaultMessage:`An unexpected issue occurred while signing a message. Please try again or contact support.`})}},[s]),signTypedData:(0,i.useCallback)(async e=>{try{return await a(e)}catch(e){throw u({error:e,mobileBrowserPopupMessage:`Your mobile browser blocked the signing window. Please click 'Try again' to open the signing window or change your browser settings.`,rejectedMessage:`Signing request was cancelled.`,defaultMessage:`An unexpected issue occurred while signing typed data. Please try again or contact support.`})}},[a]),isConnecting:d,connectionError:p}};Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return u}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return f}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return m}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return d}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return p}});
2
+ //# sourceMappingURL=PrivyCrossAppProvider-DSuzrbqs.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PrivyCrossAppProvider-DSuzrbqs.cjs","names":["isMobile","isRejectionError","VECHAIN_MAINNET_NODE_BASE_URL","VECHAIN_EXPLORER_BASE_URL","VECHAINSTATS_BASE_URL","VECHAIN_PRIVY_APP_ID","WagmiProvider","isBrowser"],"sources":["../src/utils/handlePopupError.ts","../src/providers/PrivyCrossAppProvider.tsx"],"sourcesContent":["import { isMobile } from 'react-device-detect';\nimport { isRejectionError } from './stringUtils';\n\ntype PopupErrorOptions = {\n error: unknown;\n mobileBrowserPopupMessage?: string;\n rejectedMessage?: string;\n defaultMessage?: string;\n};\n\nexport const handlePopupError = ({\n error,\n mobileBrowserPopupMessage = 'Mobile browser blocked the window. Please try again.',\n rejectedMessage = 'Request was cancelled.',\n defaultMessage = 'Operation failed',\n}: PopupErrorOptions): Error => {\n const errorMsg = (error as { message?: string })?.message;\n\n // If it's mobile browser and not a user rejection, it might be due to popup blocking\n if (isMobile && errorMsg && !isRejectionError(errorMsg)) {\n return new Error(mobileBrowserPopupMessage);\n }\n\n // Handle user rejection or other errors\n if (errorMsg && isRejectionError(errorMsg)) {\n return new Error(rejectedMessage);\n }\n\n // If it's an Error instance, return it, otherwise create new Error\n return error instanceof Error ? error : new Error(defaultMessage);\n};\n","import React, { useCallback, useRef, useState } from 'react';\nimport { toPrivyWalletConnector } from '@privy-io/cross-app-connect/rainbow-kit';\nimport {\n useConnect,\n useDisconnect,\n createConfig,\n useSignMessage,\n useSignTypedData,\n WagmiProvider,\n http,\n useAccount,\n} from 'wagmi';\nimport { SignTypedDataParameters } from '@wagmi/core';\nimport { VECHAIN_PRIVY_APP_ID } from '../utils';\nimport { defineChain } from 'viem';\nimport { handlePopupError } from '../utils/handlePopupError';\nimport { isBrowser } from '../utils/ssrUtils';\nimport {\n VECHAIN_EXPLORER_BASE_URL,\n VECHAIN_MAINNET_NODE_BASE_URL,\n VECHAINSTATS_BASE_URL,\n} from '../constants';\n\nexport const vechain = defineChain({\n id: '1176455790972829965191905223412607679856028701100105089447013101863' as unknown as number,\n name: 'Vechain',\n nativeCurrency: { name: 'VeChain', symbol: 'VET', decimals: 18 },\n rpcUrls: {\n default: {\n http: [VECHAIN_MAINNET_NODE_BASE_URL],\n },\n },\n blockExplorers: {\n default: {\n name: 'Vechain Explorer',\n url: VECHAIN_EXPLORER_BASE_URL,\n },\n vechainStats: {\n name: 'Vechain Stats',\n url: VECHAINSTATS_BASE_URL,\n },\n },\n});\n\nexport const vechainConnector = () => {\n return toPrivyWalletConnector({\n id: VECHAIN_PRIVY_APP_ID,\n name: 'VeChain',\n iconUrl:\n 'https://imagedelivery.net/oHBRUd2clqykxgDWmeAyLg/661dd77c-2f9d-40e7-baa1-f4e24fd7bf00/icon',\n smartWalletMode: false,\n });\n};\n\ninterface PrivyCrossAppProviderProps {\n privyEcosystemAppIDS: string[];\n children: React.ReactNode;\n}\n\nexport const PrivyCrossAppProvider = ({\n privyEcosystemAppIDS,\n children,\n}: PrivyCrossAppProviderProps) => {\n // Use useRef to store the config to prevent recreation on re-renders\n const wagmiConfigRef = useRef(\n createConfig({\n chains: [vechain],\n ssr: true,\n connectors: [\n vechainConnector(),\n ...privyEcosystemAppIDS.map((appId) =>\n toPrivyWalletConnector({\n id: appId,\n name: '',\n iconUrl: '',\n }),\n ),\n ],\n transports: { [vechain.id]: http() },\n multiInjectedProviderDiscovery: false,\n }),\n );\n\n return (\n <WagmiProvider config={wagmiConfigRef.current}>\n {children}\n </WagmiProvider>\n );\n};\n\nexport const usePrivyCrossAppSdk = () => {\n const { connectAsync, connectors } = useConnect();\n const { signTypedDataAsync } = useSignTypedData();\n const { signMessageAsync } = useSignMessage();\n const { disconnectAsync } = useDisconnect();\n const { isConnected } = useAccount();\n\n // Add local state to track connection\n const [isConnecting, setIsConnecting] = useState(false);\n const [connectionError, setConnectionError] = useState<Error | null>(null);\n\n const logout = useCallback(async () => {\n try {\n if (isConnected) {\n await disconnectAsync();\n // Force a state update after disconnect\n if (isBrowser()) {\n window.dispatchEvent(new Event('wallet_disconnected'));\n }\n }\n } catch (error) {\n console.error('Error during logout:', error);\n throw error;\n }\n }, [disconnectAsync, isConnected]);\n\n const login = useCallback(\n async (appID: string) => {\n try {\n setIsConnecting(true);\n setConnectionError(null);\n\n const connector = connectors.find(\n (c) => c.id === (appID || VECHAIN_PRIVY_APP_ID),\n );\n\n if (!connector) {\n throw new Error('Connector not found');\n }\n\n const result = await connectAsync({ connector });\n\n return result;\n } catch (error) {\n setConnectionError(error as Error);\n throw error;\n } finally {\n setIsConnecting(false);\n }\n },\n [connectAsync, connectors],\n );\n\n // Keep the other methods unchanged\n const signMessage = useCallback(\n async (message: string) => {\n try {\n return await signMessageAsync({ message });\n } catch (error) {\n throw handlePopupError({\n error,\n mobileBrowserPopupMessage:\n \"Your mobile browser blocked the signing window. Please click 'Try again' to open the signing window or change your browser settings.\",\n rejectedMessage: 'Signing request was cancelled.',\n defaultMessage:\n 'An unexpected issue occurred while signing a message. Please try again or contact support.',\n });\n }\n },\n [signMessageAsync],\n );\n\n const signTypedData = useCallback(\n async (data: SignTypedDataParameters) => {\n try {\n return await signTypedDataAsync(data);\n } catch (error) {\n const errorType = handlePopupError({\n error,\n mobileBrowserPopupMessage:\n \"Your mobile browser blocked the signing window. Please click 'Try again' to open the signing window or change your browser settings.\",\n rejectedMessage: 'Signing request was cancelled.',\n defaultMessage:\n 'An unexpected issue occurred while signing typed data. Please try again or contact support.',\n });\n throw errorType;\n }\n },\n [signTypedDataAsync],\n );\n\n return {\n login,\n logout,\n signMessage,\n signTypedData,\n isConnecting,\n connectionError,\n };\n};\n"],"mappings":"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"}