zopassport 0.1.0

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 (110) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +407 -0
  3. package/app/.env.example +15 -0
  4. package/app/README.md +28 -0
  5. package/app/package.json +24 -0
  6. package/app/reanimated-mock.js +102 -0
  7. package/app/reanimated-mock.jsx +97 -0
  8. package/app/src/App.tsx +331 -0
  9. package/app/src/components/FounderBadge.tsx +26 -0
  10. package/app/src/components/OTPInput.tsx +149 -0
  11. package/app/src/components/PhoneInput.tsx +109 -0
  12. package/app/src/components/ZoAuth.tsx +320 -0
  13. package/app/src/components/ZoAvatar.tsx +87 -0
  14. package/app/src/components/ZoLanding.tsx +231 -0
  15. package/app/src/components/ZoOnboarding.tsx +524 -0
  16. package/app/src/components/ZoPassportCard.tsx +183 -0
  17. package/app/src/components/ZoProgressRing.tsx +57 -0
  18. package/app/src/components/index.ts +16 -0
  19. package/app/src/components/wallet/MovingShine.tsx +43 -0
  20. package/app/src/components/wallet/TransactionItem.tsx +84 -0
  21. package/app/src/components/wallet/TransactionList.tsx +65 -0
  22. package/app/src/components/wallet/WalletCard.tsx +152 -0
  23. package/app/src/components/wallet/WalletScreen.tsx +190 -0
  24. package/app/src/components/wallet/ZoToken.tsx +69 -0
  25. package/app/src/components/wallet/index.ts +8 -0
  26. package/app/src/components/wallet/styles/index.ts +4 -0
  27. package/app/src/components/wallet/styles/walletStyles.ts +210 -0
  28. package/app/src/sdk/ZoPassportSDK.ts +277 -0
  29. package/app/src/sdk/lib/api/auth.ts +223 -0
  30. package/app/src/sdk/lib/api/avatar.ts +155 -0
  31. package/app/src/sdk/lib/api/client.ts +135 -0
  32. package/app/src/sdk/lib/api/index.ts +8 -0
  33. package/app/src/sdk/lib/api/profile.ts +80 -0
  34. package/app/src/sdk/lib/api/wallet.ts +59 -0
  35. package/app/src/sdk/lib/types/auth.ts +78 -0
  36. package/app/src/sdk/lib/types/avatar.ts +22 -0
  37. package/app/src/sdk/lib/types/index.ts +8 -0
  38. package/app/src/sdk/lib/types/profile.ts +18 -0
  39. package/app/src/sdk/lib/types/wallet.ts +103 -0
  40. package/app/src/sdk/lib/types.ts +205 -0
  41. package/app/src/sdk/lib/utils/index.ts +6 -0
  42. package/app/src/sdk/lib/utils/phone.ts +71 -0
  43. package/app/src/sdk/lib/utils/storage.ts +116 -0
  44. package/app/src/sdk/lib/utils/wallet.ts +73 -0
  45. package/app/src/sdk/types.ts +205 -0
  46. package/app/src/styles.css +154 -0
  47. package/app/svg-mock.js +125 -0
  48. package/app/svg-mock.jsx +120 -0
  49. package/app/vite.config.ts +70 -0
  50. package/assets/ASSETS_MANIFEST.md +124 -0
  51. package/assets/bae.png +0 -0
  52. package/assets/bro.png +0 -0
  53. package/assets/cultural-stickers/Business.png +0 -0
  54. package/assets/cultural-stickers/Default (2).jpg +0 -0
  55. package/assets/cultural-stickers/Design.png +0 -0
  56. package/assets/cultural-stickers/FollowYourHeart.png +0 -0
  57. package/assets/cultural-stickers/Food.png +0 -0
  58. package/assets/cultural-stickers/Game.png +0 -0
  59. package/assets/cultural-stickers/Health&Fitness.png +0 -0
  60. package/assets/cultural-stickers/Home&Lifestyle.png +0 -0
  61. package/assets/cultural-stickers/Law.png +0 -0
  62. package/assets/cultural-stickers/Literature&Stories.png +0 -0
  63. package/assets/cultural-stickers/Music&Entertainment.png +0 -0
  64. package/assets/cultural-stickers/Nature&Wildlife.png +0 -0
  65. package/assets/cultural-stickers/Photography.png +0 -0
  66. package/assets/cultural-stickers/Science&Technology.png +0 -0
  67. package/assets/cultural-stickers/Spiritual.png +0 -0
  68. package/assets/cultural-stickers/Sport.png +0 -0
  69. package/assets/cultural-stickers/Stories&Journal.png +0 -0
  70. package/assets/cultural-stickers/Television&Cinema.png +0 -0
  71. package/assets/cultural-stickers/Travel&Adventure.png +0 -0
  72. package/assets/cultural-stickers/z.jpg (1).jpg +0 -0
  73. package/assets/figma-assets/landing-zo-logo.png +0 -0
  74. package/assets/images/rank1.jpeg +0 -0
  75. package/assets/index.ts +76 -0
  76. package/assets/lotties/loader.json +1216 -0
  77. package/assets/lotties/spinner.json +1 -0
  78. package/assets/videos/loading-screen-background.mp4 +0 -0
  79. package/assets/videos/opening-disks.mp4 +0 -0
  80. package/assets/wallet/constants.ts +38 -0
  81. package/assets/zo-coin.gif +0 -0
  82. package/assets/zo-fallback.png +0 -0
  83. package/dist/assets/index.d.mts +136 -0
  84. package/dist/assets/index.d.ts +136 -0
  85. package/dist/assets/index.js +133 -0
  86. package/dist/assets/index.js.map +1 -0
  87. package/dist/assets/index.mjs +100 -0
  88. package/dist/assets/index.mjs.map +1 -0
  89. package/dist/index.d.mts +789 -0
  90. package/dist/index.d.ts +789 -0
  91. package/dist/index.js +1118 -0
  92. package/dist/index.js.map +1 -0
  93. package/dist/index.mjs +1060 -0
  94. package/dist/index.mjs.map +1 -0
  95. package/dist/react-native.d.mts +537 -0
  96. package/dist/react-native.d.ts +537 -0
  97. package/dist/react-native.js +1617 -0
  98. package/dist/react-native.js.map +1 -0
  99. package/dist/react-native.mjs +1588 -0
  100. package/dist/react-native.mjs.map +1 -0
  101. package/dist/react.d.mts +824 -0
  102. package/dist/react.d.ts +824 -0
  103. package/dist/react.js +3856 -0
  104. package/dist/react.js.map +1 -0
  105. package/dist/react.mjs +3801 -0
  106. package/dist/react.mjs.map +1 -0
  107. package/package.json +112 -0
  108. package/scripts/init.js +196 -0
  109. package/scripts/postinstall.js +174 -0
  110. package/scripts/verify-build.js +121 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/react-native.tsx","../src/components/wallet/WalletScreen.tsx","../src/components/wallet/WalletCard.tsx","../src/components/wallet/MovingShine.tsx","../assets/wallet/constants.ts","../src/components/wallet/styles/walletStyles.ts","../src/components/wallet/ZoToken.tsx","../src/lib/utils/wallet.ts","../src/components/wallet/TransactionList.tsx","../src/components/wallet/TransactionItem.tsx","../src/lib/api/client.ts","../src/lib/utils/logger.ts","../src/lib/utils/storage.ts","../src/lib/api/auth.ts","../src/lib/api/profile.ts","../src/lib/api/avatar.ts","../src/lib/api/wallet.ts","../src/ZoPassportSDK.ts"],"sourcesContent":["// zopassport/react-native\n// React Native-specific exports for the Zo Passport SDK\n// NOTE: This entry point requires react-native and react-native-reanimated\n\n// =====================\n// React Native Components\n// =====================\n\n// Wallet components (React Native)\nexport {\n WalletScreen,\n WalletCard,\n TransactionList,\n TransactionItem,\n MovingShine,\n ZoToken,\n ZoTokenVideo,\n} from './components/wallet/index.native';\n\n// =====================\n// Types\n// =====================\n\nexport type {\n WalletCardProps,\n WalletScreenProps,\n WalletUser,\n Transaction,\n TransactionListProps,\n TransactionItemProps,\n MovingShineProps,\n} from './lib/types/wallet';\n\n// =====================\n// Re-export core SDK (framework-agnostic)\n// =====================\n\nexport { ZoPassportSDK } from './ZoPassportSDK';\nexport type { ZoPassportSDKConfig } from './ZoPassportSDK';\nexport * from './lib/types';\n\n// =====================\n// Storage adapters\n// =====================\n\nexport {\n AsyncStorageAdapter,\n MemoryStorageAdapter,\n STORAGE_KEYS,\n type StorageAdapter,\n} from './lib/utils/storage';\n\n","// Wallet Screen Component - React Native wallet screen\n// Note: This component requires react-native and react-native-reanimated\nimport React, { useState, useCallback, useMemo, memo } from 'react';\nimport {\n View,\n Text,\n ScrollView,\n Pressable,\n ActivityIndicator,\n StyleSheet,\n SafeAreaView,\n} from 'react-native';\nimport Animated, { FadeIn, FadeOut, FadeInUp, FadeOutUp, FadeInDown } from 'react-native-reanimated';\nimport { WalletCard } from './WalletCard';\nimport { TransactionList } from './TransactionList';\nimport { walletStyles } from './styles/walletStyles';\nimport type { WalletScreenProps } from '../../lib/types/wallet';\n\nexport const WalletScreen: React.FC<WalletScreenProps> = memo(({ \n user, \n balance, \n transactions, \n isLoading: isLoadingProp = false,\n onBack \n}) => {\n const [isOpen, setIsOpen] = useState(false);\n const [isTitleVisible, setIsTitleVisible] = useState(false);\n const isLoading = isLoadingProp;\n\n const toggleView = useCallback(() => {\n setIsOpen((prev) => !prev);\n }, []);\n\n const handleScroll = useCallback((event: any) => {\n const scrollY = event.nativeEvent.contentOffset.y;\n setIsTitleVisible(scrollY > 200);\n }, []);\n\n const backdrop = useMemo(\n () =>\n isOpen ? (\n <Pressable onPress={toggleView} style={styles.openBg}>\n <View />\n </Pressable>\n ) : null,\n [isOpen, toggleView]\n );\n\n const description = useMemo(\n () =>\n isOpen ? (\n <Animated.View entering={FadeIn} exiting={FadeOut} style={styles.zoDescriptionContainer}>\n <Text style={styles.description}>\n Get Zo World coins as airdrop by completing quests, stay & trips.\n </Text>\n </Animated.View>\n ) : null,\n [isOpen]\n );\n\n const walletText = `${user.nickname || user.first_name}'s wallet`;\n\n return (\n <View style={styles.screen}>\n {/* Header */}\n <View style={styles.header}>\n <Pressable onPress={onBack}>\n <Text style={styles.backButton}>←</Text>\n </Pressable>\n <Animated.View pointerEvents=\"none\" style={styles.titleContainer}>\n {isTitleVisible && (\n <Animated.View entering={FadeInUp} exiting={FadeOutUp}>\n <Text style={[styles.whiteText, styles.headerTitle]}>\n {walletText}\n </Text>\n </Animated.View>\n )}\n </Animated.View>\n </View>\n\n {/* Content */}\n <ScrollView\n contentContainerStyle={styles.container}\n onScroll={handleScroll}\n scrollEventThrottle={16}\n showsVerticalScrollIndicator={false}\n >\n {isLoading ? (\n <Animated.View key=\"loader\" entering={FadeIn} exiting={FadeOut} style={styles.loader}>\n <ActivityIndicator size=\"large\" color=\"#00C853\" />\n </Animated.View>\n ) : (\n <Animated.View entering={FadeInDown} style={styles.container}>\n <SafeAreaView />\n\n {/* Transactions */}\n <TransactionList transactions={transactions} isLoading={false} />\n\n {/* Backdrop */}\n {backdrop}\n\n {/* Wallet Card */}\n <WalletCard\n balance={balance}\n user={user}\n isOpen={isOpen}\n onToggle={toggleView}\n isLoading={isLoading}\n />\n\n <View style={styles.bar} />\n <SafeAreaView />\n </Animated.View>\n )}\n </ScrollView>\n\n {/* Description */}\n {description}\n </View>\n );\n});\n\nWalletScreen.displayName = 'WalletScreen';\n\nconst styles = StyleSheet.create({\n ...walletStyles,\n backButton: {\n color: '#FFFFFF',\n fontSize: 24,\n fontWeight: '600',\n },\n headerTitle: {\n fontSize: 18,\n fontWeight: '600',\n },\n});\n\n","// Wallet Card Component - Extracted from Zostel app\nimport React, { memo, useEffect } from 'react';\nimport { View, Text, Image, Pressable, StyleSheet } from 'react-native';\nimport Animated, {\n useSharedValue,\n useAnimatedStyle,\n withTiming,\n FadeIn,\n} from 'react-native-reanimated';\nimport { MovingShine } from './MovingShine';\nimport { ZoTokenVideo } from './ZoToken';\nimport { WALLET_ASSETS, ANIMATIONS } from '../../../assets/wallet/constants';\nimport { walletStyles } from './styles/walletStyles';\nimport { formatBalance, formatWalletAddress, formatNickname } from '../../lib/utils/wallet';\nimport type { WalletCardProps } from '../../lib/types/wallet';\n\nexport const WalletCard: React.FC<WalletCardProps> = memo(\n ({ balance, user, isOpen = false, onToggle, isLoading }) => {\n const bgY = useSharedValue(0);\n const cardY = useSharedValue(0);\n\n const animatedBackgroundStyle = useAnimatedStyle(() => ({\n transform: [{ translateY: bgY.value }],\n }));\n\n const animatedCardStyle = useAnimatedStyle(() => ({\n transform: [{ translateY: cardY.value }],\n }));\n\n useEffect(() => {\n bgY.value = withTiming(isOpen ? 200 : 0, { duration: ANIMATIONS.cardTransition });\n cardY.value = withTiming(isOpen ? -150 : 0, { duration: ANIMATIONS.cardTransition });\n }, [isOpen]);\n\n const displayName = user.nickname\n ? formatNickname(user.nickname)\n : user.first_name || 'You';\n\n const walletText = `${displayName}'s wallet`;\n\n return (\n <Pressable\n style={styles.cardPressContainer}\n onPress={onToggle}\n >\n <Animated.View style={[styles.card, animatedBackgroundStyle]}>\n {/* Background Image */}\n <Image\n source={{ uri: WALLET_ASSETS.walletBackground }}\n style={StyleSheet.absoluteFillObject}\n resizeMode=\"contain\"\n />\n\n {/* Shadow */}\n <Animated.View\n style={styles.cardShadow}\n entering={FadeIn.duration(ANIMATIONS.fadeInDuration)}\n />\n\n {/* Card Content */}\n <Animated.View style={[styles.cardContainer, animatedCardStyle]}>\n <View style={styles.cardContent}>\n {/* Balance Row */}\n <View style={styles.balanceRow}>\n <View style={styles.balanceWrapper}>\n <Text style={[styles.whiteText, styles.balanceAmount]}>\n {formatBalance(balance)}\n </Text>\n <Text style={[styles.grayText, styles.currency]}>\n $Zo\n </Text>\n </View>\n <ZoTokenVideo size={24} />\n </View>\n\n <View style={styles.flex} />\n\n {/* User Info */}\n {user && (\n <View style={styles.avatarInfo}>\n {user.avatar?.image && (\n <Image\n source={{ uri: user.avatar.image }}\n style={styles.avatar}\n />\n )}\n <View style={styles.flex}>\n <Text style={[styles.whiteText, styles.userName]}>\n {displayName}\n </Text>\n <Text style={[styles.grayText, styles.walletAddress]}>\n {formatWalletAddress(user.wallet_address || '')}\n </Text>\n </View>\n </View>\n )}\n\n {/* Shine Effect */}\n <View style={styles.shineContainer}>\n <MovingShine />\n </View>\n </View>\n </Animated.View>\n\n {/* Card Cover */}\n <View style={styles.cardCover}>\n <Image\n source={{ uri: WALLET_ASSETS.walletCover }}\n style={StyleSheet.absoluteFillObject}\n resizeMode=\"cover\"\n />\n <View style={styles.cardCoverTextContainer}>\n <Text style={[styles.grayText, styles.cardCoverText]}>\n {walletText}\n </Text>\n </View>\n </View>\n </Animated.View>\n </Pressable>\n );\n }\n);\n\nWalletCard.displayName = 'WalletCard';\n\nconst styles = StyleSheet.create({\n ...walletStyles,\n balanceAmount: {\n fontSize: 24,\n fontWeight: '700',\n },\n currency: {\n fontSize: 12,\n },\n userName: {\n fontSize: 16,\n fontWeight: '600',\n },\n walletAddress: {\n fontSize: 12,\n },\n avatar: {\n width: 32,\n height: 32,\n borderRadius: 16,\n },\n cardCoverText: {\n fontSize: 16,\n fontWeight: '600',\n },\n});\n\n","// Moving Shine Effect - Extracted from Zostel app\nimport React, { memo, useEffect } from 'react';\nimport { View, Image, StyleSheet } from 'react-native';\nimport Animated, {\n useSharedValue,\n useAnimatedStyle,\n withRepeat,\n withTiming,\n} from 'react-native-reanimated';\nimport { WALLET_ASSETS, ANIMATIONS } from '../../../assets/wallet/constants';\nimport { walletStyles } from './styles/walletStyles';\nimport type { MovingShineProps } from '../../lib/types/wallet';\n\nexport const MovingShine: React.FC<MovingShineProps> = memo(\n ({ duration = ANIMATIONS.shineDuration }) => {\n const tx = useSharedValue(-100);\n\n const animatedStyle = useAnimatedStyle(() => ({\n transform: [{ rotate: '30deg' }, { translateX: tx.value }],\n }));\n\n useEffect(() => {\n tx.value = withRepeat(withTiming(420, { duration }), -1, false);\n }, [duration]);\n\n return (\n <Animated.View style={[styles.shineEffect, animatedStyle]}>\n <Image\n source={{ uri: WALLET_ASSETS.shine }}\n style={StyleSheet.absoluteFillObject}\n resizeMode=\"cover\"\n />\n </Animated.View>\n );\n }\n);\n\nMovingShine.displayName = 'MovingShine';\n\nconst styles = StyleSheet.create({\n shineEffect: walletStyles.shineEffect,\n});\n\n","// Wallet Asset URLs - Production CDN\nexport const WALLET_ASSETS = {\n walletBackground:\n 'https://proxy.cdn.zo.xyz/gallery/media/images/2e1fe74c-673c-4acd-a5aa-4ac13027dfb2_20250706072110.png',\n walletCover:\n 'https://proxy.cdn.zo.xyz/gallery/media/images/aeb1d508-c511-46a9-b4f8-260ea8825c6a_20250706072152.png',\n shine:\n 'https://proxy.cdn.zo.xyz/gallery/media/images/2a117a82-e399-4278-8eac-0d5b9209d150_20250706073538.png',\n} as const;\n\nexport const WALLET_COLORS = {\n background: '#111111',\n cardBackground: '#222222',\n cardInner: 'rgba(255, 255, 255, 0.24)',\n cardContent: '#111111',\n cardBorder: 'rgba(255, 255, 255, 0.16)',\n textWhite: '#FFFFFF',\n textGray: 'rgba(255, 255, 255, 0.44)',\n zoGreen: '#00C853',\n shadowDark: 'rgba(25, 25, 25, 1)',\n} as const;\n\nexport const WALLET_DIMENSIONS = {\n cardAspectRatio: 312 / 200,\n coverAspectRatio: 312 / 120,\n cardBorderRadius: 16,\n innerBorderRadius: 12,\n avatarSize: 32,\n tokenSize: 16,\n tokenVideoSize: 24,\n} as const;\n\nexport const ANIMATIONS = {\n shineDuration: 1500,\n cardTransition: 300,\n fadeInDuration: 500,\n} as const;\n\n","// Wallet Styles - Extracted from Zostel app\nimport { StyleSheet } from 'react-native';\nimport { WALLET_COLORS, WALLET_DIMENSIONS } from '../../../../assets/wallet/constants';\n\nexport const walletStyles = StyleSheet.create({\n // Layout\n flex: {\n flex: 1,\n },\n screen: {\n flex: 1,\n backgroundColor: WALLET_COLORS.background,\n },\n container: {\n flexDirection: 'column-reverse',\n },\n \n // Header\n header: {\n width: '100%',\n flexDirection: 'row',\n paddingVertical: 16,\n paddingHorizontal: 24,\n alignItems: 'flex-start',\n },\n titleContainer: {\n ...StyleSheet.absoluteFillObject,\n alignItems: 'center',\n justifyContent: 'center',\n },\n \n // Wallet Card\n cardPressContainer: {\n padding: 24,\n paddingBottom: 0,\n paddingTop: 8,\n },\n card: {\n aspectRatio: WALLET_DIMENSIONS.cardAspectRatio,\n width: '100%',\n borderRadius: WALLET_DIMENSIONS.cardBorderRadius,\n backgroundColor: WALLET_COLORS.cardBackground,\n },\n cardContainer: {\n margin: 24,\n flex: 1,\n alignSelf: 'stretch',\n backgroundColor: WALLET_COLORS.cardInner,\n borderRadius: WALLET_DIMENSIONS.innerBorderRadius,\n paddingBottom: 4,\n },\n cardContent: {\n flex: 1,\n padding: 16,\n backgroundColor: WALLET_COLORS.cardContent,\n borderRadius: WALLET_DIMENSIONS.innerBorderRadius,\n borderWidth: 1,\n borderColor: WALLET_COLORS.cardBorder,\n },\n cardShadow: {\n width: '80%',\n height: 24,\n backgroundColor: WALLET_COLORS.shadowDark,\n position: 'absolute',\n top: '45%',\n left: '10%',\n shadowColor: 'black',\n shadowOffset: { width: 0, height: -10 },\n shadowOpacity: 0.75,\n shadowRadius: 16,\n elevation: 5,\n },\n \n // Balance\n balanceRow: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n },\n balanceWrapper: {\n flexDirection: 'row',\n alignItems: 'baseline',\n gap: 4,\n },\n \n // User Info\n avatarInfo: {\n flexDirection: 'row',\n gap: 8,\n },\n \n // Card Cover\n cardCover: {\n aspectRatio: WALLET_DIMENSIONS.coverAspectRatio,\n width: '100%',\n position: 'absolute',\n bottom: 0,\n left: 0,\n right: 0,\n borderBottomLeftRadius: WALLET_DIMENSIONS.innerBorderRadius,\n borderBottomRightRadius: WALLET_DIMENSIONS.innerBorderRadius,\n overflow: 'hidden',\n },\n cardCoverTextContainer: {\n position: 'absolute',\n bottom: 0,\n left: 0,\n right: 0,\n top: 0,\n justifyContent: 'center',\n alignItems: 'center',\n },\n \n // Shine Effect\n shineContainer: {\n ...StyleSheet.absoluteFillObject,\n overflow: 'hidden',\n },\n shineEffect: {\n position: 'absolute',\n width: 150,\n left: -60,\n top: -140,\n bottom: 0,\n },\n \n // Text Styles\n whiteText: {\n color: WALLET_COLORS.textWhite,\n },\n grayText: {\n color: WALLET_COLORS.textGray,\n },\n \n // Token\n tokenVideo: {\n width: WALLET_DIMENSIONS.tokenVideoSize,\n height: WALLET_DIMENSIONS.tokenVideoSize,\n borderRadius: WALLET_DIMENSIONS.tokenVideoSize,\n overflow: 'hidden',\n },\n token: {\n width: WALLET_DIMENSIONS.tokenSize,\n height: WALLET_DIMENSIONS.tokenSize,\n },\n tokenContainer: {\n flexDirection: 'row',\n gap: 4,\n alignItems: 'center',\n justifyContent: 'center',\n },\n textShadow: {\n shadowRadius: 8,\n shadowOpacity: 1,\n },\n \n // Transactions\n txnContent: {\n alignSelf: 'stretch',\n paddingHorizontal: 24,\n gap: 32,\n paddingBottom: 24,\n paddingTop: 40,\n },\n txnRow: {\n minHeight: 40,\n flexDirection: 'row',\n gap: 12,\n justifyContent: 'space-between',\n alignItems: 'center',\n },\n iconBgTilted: {\n transform: [{ rotate: '-45deg' }],\n width: 40,\n height: 40,\n borderRadius: 20,\n backgroundColor: '#202020',\n alignItems: 'center',\n justifyContent: 'center',\n },\n \n // States\n loader: {\n flex: 1,\n alignItems: 'center',\n justifyContent: 'center',\n marginTop: 240,\n },\n openBg: {\n ...StyleSheet.absoluteFillObject,\n backgroundColor: WALLET_COLORS.background,\n opacity: 0.8,\n },\n zoDescriptionContainer: {\n position: 'absolute',\n bottom: 140,\n },\n description: {\n paddingHorizontal: 24,\n color: WALLET_COLORS.textWhite,\n },\n \n // Spacing\n bar: {\n height: 56,\n },\n});\n\nexport default walletStyles;\n\n","// $Zo Token Components - Extracted from Zostel app\nimport React from 'react';\nimport { View, Image, StyleSheet } from 'react-native';\n\n// Zo coin asset path (served from assets folder)\nconst ZO_COIN_GIF = '/zo-coin.gif';\n\ninterface ZoTokenProps {\n size?: number;\n style?: any;\n /** Custom source URL for the Zo coin */\n source?: string;\n}\n\n/**\n * Static $Zo Token Icon - uses the animated zo-coin.gif\n */\nexport const ZoToken: React.FC<ZoTokenProps> = ({ size = 16, style, source = ZO_COIN_GIF }) => {\n return (\n <View style={[{ width: size, height: size }, style]}>\n <Image\n source={{ uri: source }}\n style={{\n width: size,\n height: size,\n borderRadius: size / 2,\n }}\n resizeMode=\"cover\"\n />\n </View>\n );\n};\n\n/**\n * Animated $Zo Token Video Component\n * Uses the zo-coin.gif animated image\n */\nexport const ZoTokenVideo: React.FC<ZoTokenProps> = ({ size = 24, style, source = ZO_COIN_GIF }) => {\n return (\n <View\n style={[\n {\n width: size,\n height: size,\n borderRadius: size / 2,\n overflow: 'hidden',\n },\n style,\n ]}\n >\n <Image\n source={{ uri: source }}\n style={{\n width: size,\n height: size,\n }}\n resizeMode=\"cover\"\n />\n </View>\n );\n};\n\nconst styles = StyleSheet.create({\n container: {\n alignItems: 'center',\n justifyContent: 'center',\n },\n});\n\n","// Wallet Formatting Utilities\n// Framework-agnostic pure functions for wallet data formatting\n\n/**\n * Format balance number with commas\n * @param balance - Raw balance number\n * @returns Formatted string (e.g., \"1,234.56\")\n */\nexport const formatBalance = (balance: number): string => {\n if (balance === 0) return '0';\n\n const formatted = balance.toLocaleString('en-US', {\n minimumFractionDigits: 0,\n maximumFractionDigits: 2,\n });\n\n return formatted;\n};\n\n/**\n * Format balance for short display\n * @param balance - Raw balance number\n * @returns Shortened string (e.g., \"1.2K\", \"1.5M\")\n */\nexport const formatBalanceShort = (balance: number): string => {\n if (balance === 0) return '0';\n if (balance < 1000) return formatBalance(balance);\n if (balance < 1000000) return `${(balance / 1000).toFixed(1)}K`;\n return `${(balance / 1000000).toFixed(1)}M`;\n};\n\n/**\n * Format wallet address to short form\n * @param address - Full wallet address\n * @returns Shortened address (e.g., \"0x12...34ab\")\n */\nexport const formatWalletAddress = (address: string): string => {\n if (!address || address.length < 8) return address;\n return `${address.slice(0, 4)}...${address.slice(-4)}`;\n};\n\n/**\n * Format nickname with @ prefix\n * @param nickname - User nickname\n * @returns Formatted nickname (e.g., \"@john\")\n */\nexport const formatNickname = (nickname: string): string => {\n if (!nickname) return '';\n return nickname.startsWith('@') ? nickname : `@${nickname}`;\n};\n\n/**\n * Format transaction amount\n * @param amount - Transaction amount\n * @param action - deposit or spend\n * @returns Formatted amount with +/- prefix\n */\nexport const formatTransactionAmount = (\n amount: number,\n action: 'deposit' | 'spend'\n): string => {\n const formatted = formatBalance(amount);\n return action === 'spend' ? `- ${formatted}` : `+ ${formatted}`;\n};\n\n/**\n * Get transaction color\n * @param action - deposit or spend\n * @returns Color hex code\n */\nexport const getTransactionColor = (action: 'deposit' | 'spend'): string => {\n return action === 'spend' ? '#FF4444' : '#00C853';\n};\n","// Transaction List Component - Extracted from Zostel app\nimport React, { memo } from 'react';\nimport { View, ScrollView, Text, ActivityIndicator, StyleSheet } from 'react-native';\nimport { TransactionItem } from './TransactionItem';\nimport { walletStyles } from './styles/walletStyles';\nimport type { TransactionListProps } from '../../lib/types/wallet';\n\nexport const TransactionList: React.FC<TransactionListProps> = memo(\n ({ transactions, isLoading, onEndReached }) => {\n if (isLoading && !transactions?.length) {\n return (\n <View style={styles.loader}>\n <ActivityIndicator size=\"large\" color=\"#00C853\" />\n </View>\n );\n }\n\n if (!transactions?.length) {\n return (\n <View style={styles.emptyState}>\n <Text style={styles.emptyText}>No transactions yet</Text>\n <Text style={styles.emptySubtext}>\n Complete quests to earn $Zo tokens\n </Text>\n </View>\n );\n }\n\n return (\n <View style={styles.txnContent}>\n {transactions.map((transaction, index) => (\n <TransactionItem key={transaction.id || index} transaction={transaction} />\n ))}\n </View>\n );\n }\n);\n\nTransactionList.displayName = 'TransactionList';\n\nconst styles = StyleSheet.create({\n txnContent: walletStyles.txnContent,\n loader: {\n padding: 40,\n alignItems: 'center',\n justifyContent: 'center',\n },\n emptyState: {\n padding: 40,\n alignItems: 'center',\n justifyContent: 'center',\n },\n emptyText: {\n color: '#FFFFFF',\n fontSize: 18,\n fontWeight: '600',\n marginBottom: 8,\n },\n emptySubtext: {\n color: 'rgba(255, 255, 255, 0.44)',\n fontSize: 14,\n textAlign: 'center',\n },\n});\n\n","// Transaction Item Component - Extracted from Zostel app\nimport React, { memo } from 'react';\nimport { View, Text, StyleSheet } from 'react-native';\nimport moment from 'moment';\nimport { ZoToken } from './ZoToken';\nimport { walletStyles } from './styles/walletStyles';\nimport { formatBalance, getTransactionColor } from '../../lib/utils/wallet';\nimport type { TransactionItemProps } from '../../lib/types/wallet';\n\nconst StatusIcon: React.FC = memo(() => {\n return (\n <View style={styles.iconBgTilted}>\n <Text style={styles.iconText}>←</Text>\n </View>\n );\n});\n\nStatusIcon.displayName = 'StatusIcon';\n\nexport const TransactionItem: React.FC<TransactionItemProps> = memo(\n ({ transaction, showDate = true }) => {\n const color = getTransactionColor(transaction.action);\n const formattedAmount = formatBalance(transaction.amount);\n\n return (\n <View style={styles.txnRow}>\n <StatusIcon />\n \n <View style={styles.flex}>\n <Text style={styles.description}>{transaction.description}</Text>\n {showDate && transaction.claimed_at && (\n <Text style={styles.date}>\n {moment(transaction.claimed_at).format('DD MMM hh:mm A')}\n </Text>\n )}\n </View>\n\n <View style={styles.tokenContainer}>\n <Text\n style={[\n styles.textShadow,\n {\n shadowColor: color,\n color: color,\n fontWeight: '600',\n fontSize: 16,\n },\n ]}\n >\n + {formattedAmount}\n </Text>\n <ZoToken size={16} />\n </View>\n </View>\n );\n }\n);\n\nTransactionItem.displayName = 'TransactionItem';\n\nconst styles = StyleSheet.create({\n txnRow: walletStyles.txnRow,\n iconBgTilted: walletStyles.iconBgTilted,\n tokenContainer: walletStyles.tokenContainer,\n textShadow: walletStyles.textShadow,\n flex: {\n flex: 1,\n },\n iconText: {\n color: 'rgba(255, 255, 255, 0.6)',\n fontSize: 16,\n },\n description: {\n color: '#FFFFFF',\n fontSize: 16,\n fontWeight: '500',\n },\n date: {\n color: 'rgba(255, 255, 255, 0.44)',\n fontSize: 12,\n marginTop: 2,\n },\n});\n\n","// src/lib/api/client.ts\n// ZO API HTTP client configuration\n\nimport axios, { AxiosInstance } from 'axios';\nimport { StorageAdapter, STORAGE_KEYS, LocalStorageAdapter } from '../utils/storage';\n\nexport interface ZoPassportConfig {\n /** Your ZO client key (required) */\n clientKey: string;\n /** API base URL (default: https://api.io.zo.xyz) */\n baseUrl?: string;\n /** Request timeout in ms (default: 10000) */\n timeout?: number;\n /** Storage adapter for tokens (default: LocalStorageAdapter) */\n storageAdapter?: StorageAdapter;\n}\n\n/**\n * Generate new device credentials\n */\nfunction generateDeviceCredentials(): { deviceId: string; deviceSecret: string } {\n const deviceId = `web-${Date.now()}-${Math.random().toString(36).substring(7)}`;\n const deviceSecret = Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15);\n return { deviceId, deviceSecret };\n}\n\nexport class ZoApiClient {\n private client: AxiosInstance;\n private config: ZoPassportConfig;\n private storage: StorageAdapter;\n\n constructor(config: ZoPassportConfig) {\n this.config = config;\n this.storage = config.storageAdapter || new LocalStorageAdapter();\n\n this.client = axios.create({\n baseURL: config.baseUrl || 'https://api.io.zo.xyz',\n timeout: config.timeout || 10000,\n headers: {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n },\n });\n\n this.setupInterceptors();\n }\n\n private async setupInterceptors() {\n // Request interceptor: Add required headers\n this.client.interceptors.request.use(async (config) => {\n // Always add client key\n config.headers['client-key'] = this.config.clientKey;\n\n // Get or generate device credentials\n const credentials = await this.getOrCreateDeviceCredentials();\n config.headers['client-device-id'] = credentials.deviceId;\n config.headers['client-device-secret'] = credentials.deviceSecret;\n\n // Add auth token if available\n const token = await this.storage.getItem(STORAGE_KEYS.ACCESS_TOKEN);\n if (token) {\n config.headers['Authorization'] = `Bearer ${token}`;\n }\n\n return config;\n });\n\n // Response interceptor: Handle token refresh on 401\n this.client.interceptors.response.use(\n (response) => response,\n async (error) => {\n const originalRequest = error.config;\n\n // If 401 and we haven't retried yet\n if (error.response?.status === 401 && !originalRequest._retry) {\n originalRequest._retry = true;\n\n const refreshToken = await this.storage.getItem(STORAGE_KEYS.REFRESH_TOKEN);\n if (refreshToken) {\n try {\n const response = await this.client.post('/api/v1/auth/token/refresh/', {\n refresh_token: refreshToken,\n });\n\n if (response.data?.access) {\n await this.storage.setItem(STORAGE_KEYS.ACCESS_TOKEN, response.data.access);\n if (response.data.refresh) {\n await this.storage.setItem(STORAGE_KEYS.REFRESH_TOKEN, response.data.refresh);\n }\n\n // Retry original request with new token\n originalRequest.headers['Authorization'] = `Bearer ${response.data.access}`;\n return this.client(originalRequest);\n }\n } catch (refreshError) {\n // Refresh failed - clear session\n await this.storage.removeItem(STORAGE_KEYS.ACCESS_TOKEN);\n await this.storage.removeItem(STORAGE_KEYS.REFRESH_TOKEN);\n }\n }\n }\n\n return Promise.reject(error);\n }\n );\n }\n\n private async getOrCreateDeviceCredentials(): Promise<{ deviceId: string; deviceSecret: string }> {\n // Try to get from storage\n const storedId = await this.storage.getItem(STORAGE_KEYS.CLIENT_DEVICE_ID);\n const storedSecret = await this.storage.getItem(STORAGE_KEYS.CLIENT_DEVICE_SECRET);\n\n if (storedId && storedSecret) {\n return { deviceId: storedId, deviceSecret: storedSecret };\n }\n\n // Generate new credentials\n const credentials = generateDeviceCredentials();\n\n // Save to storage\n await this.storage.setItem(STORAGE_KEYS.CLIENT_DEVICE_ID, credentials.deviceId);\n await this.storage.setItem(STORAGE_KEYS.CLIENT_DEVICE_SECRET, credentials.deviceSecret);\n\n return credentials;\n }\n\n get axiosInstance(): AxiosInstance {\n return this.client;\n }\n\n getStorage(): StorageAdapter {\n return this.storage;\n }\n}\n\n","// src/lib/utils/logger.ts\n// Configurable logger for SDK debugging\n\ntype LogLevel = 'debug' | 'info' | 'warn' | 'error' | 'none';\n\ninterface LoggerConfig {\n enabled: boolean;\n level: LogLevel;\n prefix: string;\n}\n\nconst LOG_LEVELS: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n none: 4,\n};\n\nclass Logger {\n private config: LoggerConfig = {\n enabled: false,\n level: 'warn',\n prefix: '[ZoPassport]',\n };\n\n /**\n * Configure the logger\n * @param options - Logger configuration\n */\n configure(options: Partial<LoggerConfig>): void {\n this.config = { ...this.config, ...options };\n }\n\n /**\n * Enable debug logging\n */\n enable(): void {\n this.config.enabled = true;\n }\n\n /**\n * Disable all logging\n */\n disable(): void {\n this.config.enabled = false;\n }\n\n /**\n * Set log level\n */\n setLevel(level: LogLevel): void {\n this.config.level = level;\n }\n\n private shouldLog(level: LogLevel): boolean {\n if (!this.config.enabled) return false;\n return LOG_LEVELS[level] >= LOG_LEVELS[this.config.level];\n }\n\n debug(...args: unknown[]): void {\n if (this.shouldLog('debug')) {\n console.log(this.config.prefix, ...args);\n }\n }\n\n info(...args: unknown[]): void {\n if (this.shouldLog('info')) {\n console.info(this.config.prefix, ...args);\n }\n }\n\n warn(...args: unknown[]): void {\n if (this.shouldLog('warn')) {\n console.warn(this.config.prefix, ...args);\n }\n }\n\n error(...args: unknown[]): void {\n if (this.shouldLog('error')) {\n console.error(this.config.prefix, ...args);\n }\n }\n}\n\n// Singleton instance\nexport const logger = new Logger();\n\n// Export for testing/advanced usage\nexport { Logger };\nexport type { LogLevel, LoggerConfig };\n\n","// src/lib/utils/storage.ts\n// Storage adapters for token persistence\n\nimport { logger } from './logger';\n\n/**\n * Storage adapter interface\n * Implement this to provide custom storage (e.g., AsyncStorage for React Native)\n */\nexport interface StorageAdapter {\n getItem(key: string): Promise<string | null>;\n setItem(key: string, value: string): Promise<void>;\n removeItem(key: string): Promise<void>;\n}\n\n/**\n * Storage keys used by the SDK\n */\nexport const STORAGE_KEYS = {\n ACCESS_TOKEN: 'zo_access_token',\n REFRESH_TOKEN: 'zo_refresh_token',\n TOKEN_EXPIRY: 'zo_token_expiry',\n REFRESH_EXPIRY: 'zo_refresh_expiry',\n USER: 'zo_user',\n CLIENT_DEVICE_ID: 'zo_device_id',\n CLIENT_DEVICE_SECRET: 'zo_device_secret',\n AVATAR_URL: 'zo_avatar_url',\n NICKNAME: 'zo_nickname',\n CITY: 'zo_city',\n BODY_TYPE: 'zo_body_type',\n} as const;\n\n/**\n * LocalStorage adapter for web browsers\n */\nexport class LocalStorageAdapter implements StorageAdapter {\n async getItem(key: string): Promise<string | null> {\n if (typeof window === 'undefined') return null;\n try {\n return localStorage.getItem(key);\n } catch (error) {\n logger.warn(`LocalStorage.getItem failed for key \"${key}\":`, error);\n return null;\n }\n }\n\n async setItem(key: string, value: string): Promise<void> {\n if (typeof window === 'undefined') return;\n try {\n localStorage.setItem(key, value);\n } catch (error) {\n // Common causes: storage full, private mode, SecurityError\n logger.warn(`LocalStorage.setItem failed for key \"${key}\":`, error);\n }\n }\n\n async removeItem(key: string): Promise<void> {\n if (typeof window === 'undefined') return;\n try {\n localStorage.removeItem(key);\n } catch (error) {\n logger.warn(`LocalStorage.removeItem failed for key \"${key}\":`, error);\n }\n }\n}\n\n/**\n * AsyncStorage adapter for React Native\n * Provide AsyncStorage from @react-native-async-storage/async-storage\n */\nexport class AsyncStorageAdapter implements StorageAdapter {\n private storage: {\n getItem(key: string): Promise<string | null>;\n setItem(key: string, value: string): Promise<void>;\n removeItem(key: string): Promise<void>;\n };\n\n constructor(asyncStorage: AsyncStorageAdapter['storage']) {\n this.storage = asyncStorage;\n }\n\n async getItem(key: string): Promise<string | null> {\n try {\n return await this.storage.getItem(key);\n } catch (error) {\n logger.warn(`AsyncStorage.getItem failed for key \"${key}\":`, error);\n return null;\n }\n }\n\n async setItem(key: string, value: string): Promise<void> {\n try {\n await this.storage.setItem(key, value);\n } catch (error) {\n logger.warn(`AsyncStorage.setItem failed for key \"${key}\":`, error);\n }\n }\n\n async removeItem(key: string): Promise<void> {\n try {\n await this.storage.removeItem(key);\n } catch (error) {\n logger.warn(`AsyncStorage.removeItem failed for key \"${key}\":`, error);\n }\n }\n}\n\n/**\n * In-memory storage adapter (for SSR or testing)\n */\nexport class MemoryStorageAdapter implements StorageAdapter {\n private store: Map<string, string> = new Map();\n\n async getItem(key: string): Promise<string | null> {\n return this.store.get(key) || null;\n }\n\n async setItem(key: string, value: string): Promise<void> {\n this.store.set(key, value);\n }\n\n async removeItem(key: string): Promise<void> {\n this.store.delete(key);\n }\n\n /** Clear all stored data (useful for testing) */\n clear(): void {\n this.store.clear();\n }\n}\n","// src/lib/api/auth.ts\n// ZO API authentication functions\n\nimport { ZoApiClient } from './client';\nimport type {\n ZoAuthOTPRequest,\n ZoAuthOTPVerifyRequest,\n ZoAuthResponse,\n ZoErrorResponse,\n} from '../types';\n\nexport class ZoAuth {\n constructor(private client: ZoApiClient) {}\n\n /**\n * Send OTP to phone number\n * Step 1 of ZO phone authentication\n */\n async sendOTP(\n countryCode: string,\n phoneNumber: string\n ): Promise<{ success: boolean; message: string }> {\n try {\n const payload: ZoAuthOTPRequest = {\n mobile_country_code: countryCode,\n mobile_number: phoneNumber,\n message_channel: '', // Empty string as per ZO API spec\n };\n\n const response = await this.client.axiosInstance.post(\n '/api/v1/auth/login/mobile/otp/',\n payload\n );\n\n if (response.status >= 200 && response.status < 300) {\n return {\n success: true,\n message: response.data?.message || 'OTP sent successfully',\n };\n }\n\n return {\n success: false,\n message: response.data?.message || `Unexpected status: ${response.status}`,\n };\n } catch (error: any) {\n const errorData = error.response?.data as ZoErrorResponse;\n const errorMessage = errorData?.detail || errorData?.message || errorData?.error || error.message || 'Failed to send OTP';\n\n return {\n success: false,\n message: errorMessage,\n };\n }\n }\n\n /**\n * Verify OTP and authenticate user\n * Step 2 of ZO phone authentication\n * Returns full auth response with tokens and user profile\n */\n async verifyOTP(\n countryCode: string,\n phoneNumber: string,\n otp: string\n ): Promise<{\n success: boolean;\n data?: ZoAuthResponse;\n error?: string;\n }> {\n try {\n const payload: ZoAuthOTPVerifyRequest = {\n mobile_country_code: countryCode,\n mobile_number: phoneNumber,\n otp,\n };\n\n const response = await this.client.axiosInstance.post<ZoAuthResponse>(\n '/api/v1/auth/login/mobile/',\n payload\n );\n\n // Parse response data if it's a string\n let responseData: ZoAuthResponse;\n if (typeof response.data === 'string') {\n try {\n responseData = JSON.parse(response.data);\n } catch {\n return {\n success: false,\n error: 'Invalid response format from authentication service',\n };\n }\n } else {\n responseData = response.data;\n }\n\n // Validate response structure\n if (!responseData || !responseData.user || !responseData.access_token) {\n return {\n success: false,\n error: 'Invalid response structure from authentication service',\n };\n }\n\n // Note: Session storage is handled by ZoPassportSDK.saveSession()\n return {\n success: true,\n data: responseData,\n };\n } catch (error: any) {\n const errorMessage = this.extractErrorMessage(error);\n return {\n success: false,\n error: errorMessage,\n };\n }\n }\n\n /**\n * Refresh access token using refresh token\n */\n async refreshAccessToken(\n refreshToken: string\n ): Promise<{\n success: boolean;\n tokens?: {\n access: string;\n refresh: string;\n access_expiry: string;\n refresh_expiry: string;\n };\n error?: string;\n }> {\n try {\n const response = await this.client.axiosInstance.post('/api/v1/auth/token/refresh/', {\n refresh_token: refreshToken,\n });\n\n return {\n success: true,\n tokens: response.data,\n };\n } catch (error: any) {\n return {\n success: false,\n error: 'Failed to refresh authentication',\n };\n }\n }\n\n /**\n * Check if user is authenticated\n */\n async checkLoginStatus(accessToken: string): Promise<{\n success: boolean;\n isAuthenticated: boolean;\n }> {\n try {\n const response = await this.client.axiosInstance.get('/api/v1/auth/login/check/', {\n headers: {\n Authorization: `Bearer ${accessToken}`,\n },\n });\n\n return {\n success: true,\n isAuthenticated: response.data.authenticated === true,\n };\n } catch {\n return {\n success: false,\n isAuthenticated: false,\n };\n }\n }\n\n /**\n * Extract error message from various ZO API error formats\n */\n private extractErrorMessage(error: any): string {\n const errorData = error.response?.data;\n\n if (errorData) {\n // Format 1: { success: false, errors: [...] }\n if (errorData.errors && Array.isArray(errorData.errors)) {\n return errorData.errors[0] || 'Invalid OTP';\n }\n // Format 2: { detail: \"...\", message: \"...\" }\n if (errorData.detail) return errorData.detail;\n if (errorData.message) return errorData.message;\n // Format 3: { error: \"...\" }\n if (errorData.error) return errorData.error;\n }\n\n return 'Authentication failed';\n }\n}\n\n","// src/lib/api/profile.ts\n// ZO API profile functions\n\nimport { ZoApiClient } from './client';\nimport type { ZoProfileResponse, ZoProfileUpdatePayload, ZoErrorResponse } from '../types';\n\nexport class ZoProfile {\n constructor(private client: ZoApiClient) {}\n\n /**\n * Get user profile\n */\n async getProfile(accessToken: string): Promise<{\n success: boolean;\n profile?: ZoProfileResponse;\n error?: string;\n }> {\n try {\n const response = await this.client.axiosInstance.get<ZoProfileResponse>(\n '/api/v1/profile/me/',\n {\n headers: {\n Authorization: `Bearer ${accessToken}`,\n },\n }\n );\n\n return {\n success: true,\n profile: response.data,\n };\n } catch (error: any) {\n const errorData = error.response?.data as ZoErrorResponse;\n return {\n success: false,\n error: errorData?.detail || errorData?.message || 'Failed to fetch profile',\n };\n }\n }\n\n /**\n * Update user profile (partial updates supported)\n */\n async updateProfile(\n accessToken: string,\n updates: ZoProfileUpdatePayload\n ): Promise<{\n success: boolean;\n profile?: ZoProfileResponse;\n error?: string;\n }> {\n try {\n const response = await this.client.axiosInstance.post<ZoProfileResponse>(\n '/api/v1/profile/me/',\n updates,\n {\n headers: {\n Authorization: `Bearer ${accessToken}`,\n },\n }\n );\n\n return {\n success: true,\n profile: response.data,\n };\n } catch (error: any) {\n const errorData = error.response?.data as ZoErrorResponse;\n return {\n success: false,\n error: errorData?.detail || errorData?.message || 'Failed to update profile',\n };\n }\n }\n}\n\n","// src/lib/api/avatar.ts\n// ZO API avatar generation functions\n\nimport { ZoApiClient } from './client';\nimport type {\n ZoAvatarGenerateRequest,\n ZoAvatarGenerateResponse,\n ZoAvatarStatusResponse,\n ZoErrorResponse,\n} from '../types';\n\nexport class ZoAvatar {\n constructor(private client: ZoApiClient) {}\n\n /**\n * Generate avatar for user\n */\n async generateAvatar(\n accessToken: string,\n bodyType: 'bro' | 'bae'\n ): Promise<{\n success: boolean;\n task_id?: string;\n status?: string;\n error?: string;\n }> {\n try {\n const payload: ZoAvatarGenerateRequest = {\n body_type: bodyType,\n };\n\n const response = await this.client.axiosInstance.post<ZoAvatarGenerateResponse>(\n '/api/v1/avatar/generate/',\n payload,\n {\n headers: {\n Authorization: `Bearer ${accessToken}`,\n },\n }\n );\n\n return {\n success: true,\n task_id: response.data.task_id,\n status: response.data.status,\n };\n } catch (error: any) {\n const errorData = error.response?.data as ZoErrorResponse;\n return {\n success: false,\n error: errorData?.detail || errorData?.message || 'Failed to generate avatar',\n };\n }\n }\n\n /**\n * Check avatar generation status\n */\n async getAvatarStatus(\n accessToken: string,\n taskId: string\n ): Promise<{\n success: boolean;\n status?: 'pending' | 'processing' | 'completed' | 'failed';\n avatarUrl?: string;\n error?: string;\n }> {\n try {\n const response = await this.client.axiosInstance.get<ZoAvatarStatusResponse>(\n `/api/v1/avatar/status/${taskId}/`,\n {\n headers: {\n Authorization: `Bearer ${accessToken}`,\n },\n }\n );\n\n return {\n success: true,\n status: response.data.status,\n avatarUrl: response.data.result?.avatar_url,\n };\n } catch (error: any) {\n const errorData = error.response?.data as ZoErrorResponse;\n return {\n success: false,\n error: errorData?.detail || errorData?.message || 'Failed to get avatar status',\n };\n }\n }\n\n /**\n * Poll avatar status until completion\n */\n async pollAvatarStatus(\n accessToken: string,\n taskId: string,\n options: {\n onProgress?: (status: string) => void;\n onComplete?: (avatarUrl: string) => void;\n onError?: (error: string) => void;\n maxAttempts?: number;\n interval?: number;\n } = {}\n ): Promise<void> {\n const {\n onProgress,\n onComplete,\n onError,\n maxAttempts = 30,\n interval = 2000,\n } = options;\n\n let attempts = 0;\n\n const poll = async () => {\n attempts++;\n\n if (attempts > maxAttempts) {\n const timeoutError = 'Avatar generation timed out';\n onError?.(timeoutError);\n return;\n }\n\n const result = await this.getAvatarStatus(accessToken, taskId);\n\n if (!result.success) {\n onError?.(result.error || 'Unknown error');\n return;\n }\n\n onProgress?.(result.status || 'unknown');\n\n if (result.status === 'completed' && result.avatarUrl) {\n onComplete?.(result.avatarUrl);\n return;\n }\n\n if (result.status === 'failed') {\n onError?.('Avatar generation failed');\n return;\n }\n\n // Continue polling\n setTimeout(poll, interval);\n };\n\n poll();\n }\n}\n\n","// src/lib/api/wallet.ts\n// Framework-agnostic Wallet API\n\nimport { ZoApiClient } from './client';\nimport { logger } from '../utils/logger';\nimport type { BalanceResponse, TransactionsResponse, Transaction } from '../types/wallet';\n\n// $Zo Token Configuration\nconst ZO_TOKEN_CONFIG = {\n base: {\n rpc: 'https://mainnet.base.org',\n contractAddress: '0x111142c7ecaf39797b7865b82034269962142069', // $Zo token on Base\n decimals: 18,\n },\n avalanche: {\n rpc: 'https://api.avax.network/ext/bc/C/rpc',\n contractAddress: '0x111142c7ecaf39797b7865b82034269962142069', // $Zo token on Avalanche (update if different)\n decimals: 18,\n },\n};\n\n// ERC-20 balanceOf ABI (minimal)\nconst ERC20_BALANCE_ABI = '0x70a08231'; // balanceOf(address)\n\nexport class ZoWallet {\n private client: ZoApiClient;\n private cachedBalance: number = 0;\n private userWalletAddress: string | null = null;\n private network: 'base' | 'avalanche' = 'base';\n\n constructor(client: ZoApiClient) {\n this.client = client;\n }\n\n /**\n * Set the user's wallet address for on-chain queries\n */\n setWalletAddress(address: string, network: 'base' | 'avalanche' = 'base') {\n this.userWalletAddress = address;\n this.network = network;\n logger.debug(`Wallet address set: ${address} on ${network}`);\n }\n\n /**\n * Get wallet balance - tries on-chain first, then API fallback\n * @returns Wallet balance amount\n */\n async getBalance(): Promise<number> {\n // Try on-chain balance first if wallet address is set\n if (this.userWalletAddress) {\n try {\n const onChainBalance = await this.getOnChainBalance();\n if (onChainBalance !== null) {\n this.cachedBalance = onChainBalance;\n return onChainBalance;\n }\n } catch (error) {\n logger.warn('On-chain balance check failed, falling back to API:', error);\n }\n }\n\n // Fallback to API endpoints\n const apiBalance = await this.getBalanceFromAPI();\n if (apiBalance !== null) {\n return apiBalance;\n }\n\n // Return cached balance or 0\n logger.debug('Returning cached/default balance:', this.cachedBalance);\n return this.cachedBalance;\n }\n\n /**\n * Fetch balance directly from blockchain via JSON-RPC\n */\n private async getOnChainBalance(): Promise<number | null> {\n if (!this.userWalletAddress) {\n logger.warn('No wallet address set for on-chain query');\n return null;\n }\n\n const config = ZO_TOKEN_CONFIG[this.network];\n\n try {\n // Prepare the eth_call for balanceOf(address)\n const paddedAddress = this.userWalletAddress.toLowerCase().replace('0x', '').padStart(64, '0');\n const data = ERC20_BALANCE_ABI + paddedAddress;\n\n const response = await fetch(config.rpc, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n jsonrpc: '2.0',\n id: 1,\n method: 'eth_call',\n params: [\n {\n to: config.contractAddress,\n data: data,\n },\n 'latest',\n ],\n }),\n });\n\n const result = await response.json();\n \n if (result.error) {\n logger.warn('RPC error:', result.error);\n return null;\n }\n\n // Parse the hex balance\n const rawBalance = BigInt(result.result || '0x0');\n const balance = Number(rawBalance) / Math.pow(10, config.decimals);\n \n logger.debug(`On-chain balance fetched: ${balance} $Zo`);\n return balance;\n } catch (error) {\n logger.warn('Failed to fetch on-chain balance:', error);\n return null;\n }\n }\n\n /**\n * Fetch balance from Zo API endpoints (tries multiple endpoints with fallback)\n */\n private async getBalanceFromAPI(): Promise<number | null> {\n const endpoints = [\n '/api/v1/web3/token/airdrops/summary',\n '/api/v1/wallet/balance',\n '/api/v1/profile/wallet',\n ];\n\n const errors: Array<{ endpoint: string; status?: number; message: string }> = [];\n\n for (const endpoint of endpoints) {\n try {\n const response = await this.client.axiosInstance.get<BalanceResponse>(endpoint);\n const balance = response.data?.data?.total_amount \n ?? (response.data as any)?.balance\n ?? (response.data as any)?.total_amount;\n \n if (typeof balance === 'number') {\n logger.debug(`Balance fetched from API ${endpoint}:`, balance);\n this.cachedBalance = balance;\n return balance;\n }\n } catch (error: any) {\n // Collect error info for debugging (skip 404s as they're expected)\n if (error?.response?.status !== 404) {\n errors.push({\n endpoint,\n status: error?.response?.status,\n message: error?.message || 'Unknown error',\n });\n }\n }\n }\n\n // Log aggregated errors if all endpoints failed\n if (errors.length > 0) {\n logger.warn('All balance API endpoints failed:', errors);\n }\n\n return null;\n }\n\n /**\n * Get transaction history\n * @param page - Optional page number for pagination\n * @returns Array of transactions\n */\n async getTransactions(page?: number): Promise<{\n transactions: Transaction[];\n next?: string;\n previous?: string;\n count: number;\n }> {\n const endpoints = [\n page ? `/api/v1/profile/completion-grants/claims?page=${page}` : '/api/v1/profile/completion-grants/claims',\n page ? `/api/v1/wallet/transactions?page=${page}` : '/api/v1/wallet/transactions',\n ];\n\n const errors: Array<{ endpoint: string; status?: number; message: string }> = [];\n\n for (const url of endpoints) {\n try {\n const response = await this.client.axiosInstance.get<TransactionsResponse>(url);\n // Handle multiple API response formats\n const data = (response.data?.data || response.data) as {\n results?: Transaction[];\n transactions?: Transaction[];\n next?: string;\n previous?: string;\n count?: number;\n };\n \n return {\n transactions: data?.results ?? data?.transactions ?? [],\n next: data?.next,\n previous: data?.previous,\n count: data?.count ?? 0,\n };\n } catch (error: any) {\n // Collect error info for debugging (skip 404s as they're expected)\n if (error?.response?.status !== 404) {\n errors.push({\n endpoint: url,\n status: error?.response?.status,\n message: error?.message || 'Unknown error',\n });\n }\n }\n }\n\n // Log aggregated errors if all endpoints failed\n if (errors.length > 0) {\n logger.warn('All transaction API endpoints failed:', errors);\n }\n\n // Return empty if all endpoints fail\n return {\n transactions: [],\n next: undefined,\n previous: undefined,\n count: 0,\n };\n }\n}\n","// ZoPassportSDK - Main SDK class\n// One-stop initialization for the entire Zo Passport experience\n\nimport { ZoApiClient, ZoPassportConfig } from './lib/api/client';\nimport { ZoAuth } from './lib/api/auth';\nimport { ZoProfile } from './lib/api/profile';\nimport { ZoAvatar } from './lib/api/avatar';\nimport { ZoWallet } from './lib/api/wallet';\nimport { LocalStorageAdapter, AsyncStorageAdapter, StorageAdapter, STORAGE_KEYS } from './lib/utils/storage';\nimport { logger } from './lib/utils/logger';\nimport type { ZoUser, ZoAuthResponse, Transaction } from './lib/types';\n\nexport interface ZoPassportSDKConfig extends ZoPassportConfig {\n /** Optional: Provide a custom storage adapter (default: LocalStorageAdapter) */\n storageAdapter?: StorageAdapter;\n /** Optional: Enable auto token refresh (default: true) */\n autoRefresh?: boolean;\n /** Optional: Token refresh interval in ms (default: 60000 = 1 minute) */\n refreshInterval?: number;\n /** Optional: Enable debug logging (default: false) */\n debug?: boolean;\n}\n\nexport class ZoPassportSDK {\n private client: ZoApiClient;\n private storage: StorageAdapter;\n private refreshTimer: ReturnType<typeof setTimeout> | null = null;\n private _readyPromise: Promise<void>;\n\n public auth: ZoAuth;\n public profile: ZoProfile;\n public avatar: ZoAvatar;\n public wallet: ZoWallet;\n\n private _user: ZoUser | null = null;\n private _isAuthenticated: boolean = false;\n\n constructor(config: ZoPassportSDKConfig) {\n // Configure debug logging\n if (config.debug) {\n logger.enable();\n logger.setLevel('debug');\n }\n\n // Initialize storage adapter\n this.storage = config.storageAdapter || new LocalStorageAdapter();\n\n // Initialize API client\n this.client = new ZoApiClient({\n ...config,\n storageAdapter: this.storage,\n });\n\n // Initialize API modules\n this.auth = new ZoAuth(this.client);\n this.profile = new ZoProfile(this.client);\n this.avatar = new ZoAvatar(this.client);\n this.wallet = new ZoWallet(this.client);\n\n // Start auto-refresh if enabled\n if (config.autoRefresh !== false) {\n this.startAutoRefresh(config.refreshInterval || 60000);\n }\n\n // Load existing session (store promise for ready() method)\n this._readyPromise = this.loadSession();\n \n logger.debug('SDK initialized with config:', { \n baseUrl: config.baseUrl, \n autoRefresh: config.autoRefresh !== false,\n });\n }\n\n /**\n * Wait for the SDK to be ready (session loaded from storage)\n * Use this if you need to check isAuthenticated immediately after construction\n */\n async ready(): Promise<void> {\n return this._readyPromise;\n }\n\n // =====================\n // Session Management\n // =====================\n\n private async loadSession(): Promise<void> {\n try {\n const userJson = await this.storage.getItem(STORAGE_KEYS.USER);\n const accessToken = await this.storage.getItem(STORAGE_KEYS.ACCESS_TOKEN);\n\n if (userJson && accessToken) {\n this._user = JSON.parse(userJson);\n this._isAuthenticated = true;\n }\n } catch (error) {\n logger.warn('Failed to load session:', error);\n }\n }\n\n private async saveSession(authResponse: ZoAuthResponse): Promise<void> {\n await this.storage.setItem(STORAGE_KEYS.ACCESS_TOKEN, authResponse.access_token);\n await this.storage.setItem(STORAGE_KEYS.REFRESH_TOKEN, authResponse.refresh_token);\n await this.storage.setItem(STORAGE_KEYS.TOKEN_EXPIRY, authResponse.access_token_expiry);\n await this.storage.setItem(STORAGE_KEYS.REFRESH_EXPIRY, authResponse.refresh_token_expiry);\n await this.storage.setItem(STORAGE_KEYS.USER, JSON.stringify(authResponse.user));\n await this.storage.setItem(STORAGE_KEYS.CLIENT_DEVICE_ID, authResponse.device_id || '');\n await this.storage.setItem(STORAGE_KEYS.CLIENT_DEVICE_SECRET, authResponse.device_secret || '');\n\n this._user = authResponse.user;\n this._isAuthenticated = true;\n }\n\n async clearSession(): Promise<void> {\n await this.storage.removeItem(STORAGE_KEYS.ACCESS_TOKEN);\n await this.storage.removeItem(STORAGE_KEYS.REFRESH_TOKEN);\n await this.storage.removeItem(STORAGE_KEYS.TOKEN_EXPIRY);\n await this.storage.removeItem(STORAGE_KEYS.REFRESH_EXPIRY);\n await this.storage.removeItem(STORAGE_KEYS.USER);\n await this.storage.removeItem(STORAGE_KEYS.CLIENT_DEVICE_ID);\n await this.storage.removeItem(STORAGE_KEYS.CLIENT_DEVICE_SECRET);\n\n this._user = null;\n this._isAuthenticated = false;\n }\n\n // =====================\n // Auto Token Refresh\n // =====================\n\n private startAutoRefresh(interval: number): void {\n this.refreshTimer = setInterval(async () => {\n await this.refreshTokenIfNeeded();\n }, interval);\n }\n\n private stopAutoRefresh(): void {\n if (this.refreshTimer) {\n clearInterval(this.refreshTimer);\n this.refreshTimer = null;\n }\n }\n\n private async refreshTokenIfNeeded(): Promise<void> {\n const tokenExpiry = await this.storage.getItem(STORAGE_KEYS.TOKEN_EXPIRY);\n const refreshToken = await this.storage.getItem(STORAGE_KEYS.REFRESH_TOKEN);\n\n if (!tokenExpiry || !refreshToken) return;\n\n const expiryDate = new Date(tokenExpiry);\n const now = new Date();\n const twoMinutes = 2 * 60 * 1000;\n\n // Refresh if expiring within 2 minutes\n if (expiryDate.getTime() - now.getTime() < twoMinutes) {\n const result = await this.auth.refreshAccessToken(refreshToken);\n if (result.success && result.tokens) {\n await this.storage.setItem(STORAGE_KEYS.ACCESS_TOKEN, result.tokens.access);\n await this.storage.setItem(STORAGE_KEYS.REFRESH_TOKEN, result.tokens.refresh);\n await this.storage.setItem(STORAGE_KEYS.TOKEN_EXPIRY, result.tokens.access_expiry);\n await this.storage.setItem(STORAGE_KEYS.REFRESH_EXPIRY, result.tokens.refresh_expiry);\n }\n }\n }\n\n // =====================\n // Public API\n // =====================\n\n get user(): ZoUser | null {\n return this._user;\n }\n\n get isAuthenticated(): boolean {\n return this._isAuthenticated;\n }\n\n /**\n * Complete phone authentication flow\n */\n async loginWithPhone(\n countryCode: string,\n phoneNumber: string,\n otp: string\n ): Promise<{ success: boolean; user?: ZoUser; error?: string }> {\n const result = await this.auth.verifyOTP(countryCode, phoneNumber, otp);\n\n if (result.success && result.data) {\n await this.saveSession(result.data);\n \n // Set wallet address for on-chain balance queries\n if (result.data.user?.wallet_address) {\n this.wallet.setWalletAddress(result.data.user.wallet_address, 'base');\n }\n \n return { success: true, user: result.data.user };\n }\n\n return { success: false, error: result.error };\n }\n\n /**\n * Logout and clear session\n */\n async logout(): Promise<void> {\n await this.clearSession();\n this.stopAutoRefresh();\n }\n\n /**\n * Get current user profile\n */\n async getProfile(): Promise<ZoUser | null> {\n const accessToken = await this.storage.getItem(STORAGE_KEYS.ACCESS_TOKEN);\n if (!accessToken) return null;\n\n const result = await this.profile.getProfile(accessToken);\n if (result.success && result.profile) {\n this._user = result.profile as ZoUser;\n await this.storage.setItem(STORAGE_KEYS.USER, JSON.stringify(result.profile));\n \n // Set wallet address for on-chain balance queries\n if (result.profile.wallet_address) {\n this.wallet.setWalletAddress(result.profile.wallet_address, 'base');\n }\n \n return result.profile as ZoUser;\n }\n\n return null;\n }\n\n /**\n * Update user profile\n */\n async updateProfile(updates: {\n first_name?: string;\n last_name?: string;\n bio?: string;\n date_of_birth?: string;\n place_name?: string;\n body_type?: 'bro' | 'bae';\n }): Promise<{ success: boolean; profile?: ZoUser; error?: string }> {\n const accessToken = await this.storage.getItem(STORAGE_KEYS.ACCESS_TOKEN);\n if (!accessToken) return { success: false, error: 'Not authenticated' };\n\n const result = await this.profile.updateProfile(accessToken, updates);\n if (result.success && result.profile) {\n this._user = result.profile as ZoUser;\n await this.storage.setItem(STORAGE_KEYS.USER, JSON.stringify(result.profile));\n return { success: true, profile: result.profile as ZoUser };\n }\n\n return { success: false, error: result.error };\n }\n\n /**\n * Generate avatar\n */\n async generateAvatar(bodyType: 'bro' | 'bae'): Promise<{\n success: boolean;\n avatarUrl?: string;\n error?: string;\n }> {\n const accessToken = await this.storage.getItem(STORAGE_KEYS.ACCESS_TOKEN);\n if (!accessToken) return { success: false, error: 'Not authenticated' };\n\n // Start generation\n const startResult = await this.avatar.generateAvatar(accessToken, bodyType);\n if (!startResult.success || !startResult.task_id) {\n return { success: false, error: startResult.error };\n }\n\n // Poll for completion\n return new Promise((resolve) => {\n this.avatar.pollAvatarStatus(accessToken, startResult.task_id!, {\n onComplete: (avatarUrl) => {\n resolve({ success: true, avatarUrl });\n },\n onError: (error) => {\n resolve({ success: false, error });\n },\n });\n });\n }\n\n /**\n * Get wallet balance\n */\n async getWalletBalance(): Promise<number> {\n return this.wallet.getBalance();\n }\n\n /**\n * Get wallet transactions\n */\n async getWalletTransactions(page?: number): Promise<{\n transactions: Transaction[];\n next?: string;\n previous?: string;\n count: number;\n }> {\n return this.wallet.getTransactions(page);\n }\n\n /**\n * Cleanup\n */\n destroy(): void {\n this.stopAutoRefresh();\n }\n}\n\n"],"mappings":"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","names":["import_react","import_react_native","import_react_native_reanimated","import_react","import_react_native","import_react_native_reanimated","import_react_native","Animated","import_react_native","import_jsx_runtime","styles","import_jsx_runtime","styles","Animated","import_react","import_react_native","import_react","import_react_native","import_jsx_runtime","styles","moment","import_jsx_runtime","styles","import_jsx_runtime","styles","Animated","axios"]}