From 9c220f1322be06fad4aef4ec9d507d3bd0933ec1 Mon Sep 17 00:00:00 2001 From: TQCasey <494294315@qq.com> Date: Tue, 24 Mar 2026 16:47:37 +0800 Subject: [PATCH] =?UTF-8?q?test=20=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- App.tsx | 44 +- declarations.d.ts | 6 + metro.config.js | 23 +- package.json | 2 + res/bharatpe-business.webp | Bin 0 -> 3546 bytes res/freecharge.png | Bin 0 -> 17965 bytes res/googlepay-business.webp | Bin 0 -> 16008 bytes res/mobikwik.png | Bin 0 -> 16302 bytes res/paytm-business.png | Bin 0 -> 31736 bytes res/paytm.png | Bin 0 -> 15293 bytes res/phonepe-business.webp | Bin 0 -> 4684 bytes res/phonepe.webp | Bin 0 -> 2912 bytes screens/HomeScreen.tsx | 1080 ++++++++++++++++------------------- screens/TestScreen.tsx | 69 +++ servers/walletman | 2 +- services/api.ts | 46 ++ 16 files changed, 669 insertions(+), 603 deletions(-) create mode 100644 declarations.d.ts create mode 100644 res/bharatpe-business.webp create mode 100644 res/freecharge.png create mode 100644 res/googlepay-business.webp create mode 100644 res/mobikwik.png create mode 100644 res/paytm-business.png create mode 100644 res/paytm.png create mode 100644 res/phonepe-business.webp create mode 100644 res/phonepe.webp create mode 100644 screens/TestScreen.tsx diff --git a/App.tsx b/App.tsx index 4d58b5d..8e44486 100644 --- a/App.tsx +++ b/App.tsx @@ -1,11 +1,32 @@ import React from 'react'; -import { Text } from 'react-native'; import { NavigationContainer } from '@react-navigation/native'; import { createBottomTabNavigator } from '@react-navigation/bottom-tabs'; import { SafeAreaProvider } from 'react-native-safe-area-context'; +import Svg, { Path, Circle, Rect } from 'react-native-svg'; import HomeScreen from './screens/HomeScreen'; +import TestScreen from './screens/TestScreen'; import MessageScreen from './screens/MessageScreen'; +const WalletIcon = ({ color, size }: { color: string; size: number }) => ( + + + + + +); + +const ToolIcon = ({ color, size }: { color: string; size: number }) => ( + + + +); + +const MessageIcon = ({ color, size }: { color: string; size: number }) => ( + + + +); + const Tab = createBottomTabNavigator(); export default function App() { @@ -30,11 +51,18 @@ export default function App() { name="Home" component={HomeScreen} options={{ - title: '首页', - tabBarLabel: '首页', - tabBarIcon: ({ color, size }) => ( - 🏠 - ), + title: '钱包列表', + tabBarLabel: '钱包列表', + tabBarIcon: ({ color, size }) => , + }} + /> + , }} /> ( - 💬 - ), + tabBarIcon: ({ color, size }) => , }} /> diff --git a/declarations.d.ts b/declarations.d.ts new file mode 100644 index 0000000..dcae957 --- /dev/null +++ b/declarations.d.ts @@ -0,0 +1,6 @@ +declare module '*.svg' { + import React from 'react'; + import { SvgProps } from 'react-native-svg'; + const content: React.FC; + export default content; +} diff --git a/metro.config.js b/metro.config.js index ad8f87b..87f8ee2 100644 --- a/metro.config.js +++ b/metro.config.js @@ -1,11 +1,16 @@ -const {getDefaultConfig, mergeConfig} = require('@react-native/metro-config'); +const { getDefaultConfig, mergeConfig } = require('@react-native/metro-config'); -/** - * Metro configuration - * https://facebook.github.io/metro/docs/configuration - * - * @type {import('metro-config').MetroConfig} - */ -const config = {}; +const defaultConfig = getDefaultConfig(__dirname); +const { assetExts, sourceExts } = defaultConfig.resolver; -module.exports = mergeConfig(getDefaultConfig(__dirname), config); +const config = { + transformer: { + babelTransformerPath: require.resolve('react-native-svg-transformer'), + }, + resolver: { + assetExts: assetExts.filter(ext => ext !== 'svg'), + sourceExts: [...sourceExts, 'svg'], + }, +}; + +module.exports = mergeConfig(defaultConfig, config); diff --git a/package.json b/package.json index 119a351..342480d 100644 --- a/package.json +++ b/package.json @@ -25,6 +25,8 @@ "react-native-gesture-handler": "~2.9.0", "react-native-safe-area-context": "^4.4.1", "react-native-screens": "~3.36.0", + "react-native-svg": "^14.1.0", + "react-native-svg-transformer": "^1.5.3", "react-native-tcp-socket": "^6.4.1", "react-native-webview": "13.6.2", "rnauto": "./libs/rnauto", diff --git a/res/bharatpe-business.webp b/res/bharatpe-business.webp new file mode 100644 index 0000000000000000000000000000000000000000..729871b2adafd7dbca8af3c151d8b24031adb1e0 GIT binary patch literal 3546 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 literal 0 HcmV?d00001 diff --git a/res/freecharge.png b/res/freecharge.png new file mode 100644 index 0000000000000000000000000000000000000000..08fc60ba1c5b5a60f0396b2b60d964b12e1d0770 GIT binary patch literal 17965 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 O68CiVb6Mw<&;$T#%b}bA literal 0 HcmV?d00001 diff --git a/res/googlepay-business.webp b/res/googlepay-business.webp new file mode 100644 index 0000000000000000000000000000000000000000..04165e9d6e35a7a3d51b408c9d83a673cda2f647 GIT binary patch literal 16008 zcmV;3K6k-VNk&G1J^%n$MM6+kP&iC;J^%nO-@$hP5l3#@1`=dv2ML=0e>iQ?)1D*x zKLPx;1{Tl_EFi8lbkfj`4OyoY5ISkdCvD!xxsGcn#2-k}_$R^2M(*Q&dQLQOcC7B-IOLrd?HKKa%Zdktv{- z-@uoFw{Q5k=qqA#ZD0ML6S%c)t5)VXV~>j#K;$l^Q3*+p8#{Bc)0Qx@xqK$u^K0q4)ZCx7xZ9p}hKoQF+ z1EmIl0ssl1F2yKC6M=y)0f4HMV?U zB33Q{*6lXpav4mu6u>7J9^mi&dk5@4O@k-_;PUx|2W@V+!ST~H%9K5O+O|p99dgyr!UKE*i-@`)}fc z|6i3GIp>_)Bxc!`*&5jc9%kk+Gv|$&Ij_vj%*@QZ%sckbdc2MqB-yg0?!M9%dtwzX|5rS&nf&R#s1Z6oCC3SOZrUEwQsMIFC>fkL)z+qUiN+B)`G*h>?m z*O&lY&;Kuy?52m8_mKF68Q%XJ$Q?6t%xn+r4tHRq1NB#hGoNF)3$H%;s{_UjSMaE! z4qf4T!pzK>n0{e4jsBV|PnhXgtFrhmOlD@f>M)a;ZAo$@Nsi=1W>wE|^1~AXKprRx zfjEAg18cWk=_ryULCKl`{~qvz9G+aq1mKzee~~0PnOV>@BxYu2W@h3C@v8;erV)0J7Ge|aA<%eI;^&wKPFfkiN+fJt8X_);h;*?li1@ZMdN_J1-Y zPrr!Btgh-Bd;VP8wrzX&74WntUTyEb0G`Z~ZF_7_qq;LIA|{{@HvGTg{|*0d_f6`sbTwiP;v@~{VShLWC zwa`?NGx6!GIV`wq;2KY^7*pe_r^bj&f7@U64*Or!R*os;BHh#G>_yy6BWl8dW9Ta-Ic`HJreyClZ$H%MI-M=NJdo zZCB{XHmVJ5&Cs|EDgtN{R$$%&3&3KZ1m!w0cW#xosPsxXg0?;k_Qz!Txwa~BHH9u+ zlJG|f$t)cmW7bh=SJg@yxBAexee}OlVf%0D+pG|Toe9UOe}CGDimz6S=%|lQs|lgn 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 C?8*lK literal 0 HcmV?d00001 diff --git a/res/mobikwik.png b/res/mobikwik.png new file mode 100644 index 0000000000000000000000000000000000000000..32908f54bb77a3ff812cdf8cf7986cad2ccc5729 GIT binary patch literal 16302 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%0A8AP0kzr{Rh zPd=z+%8E_Y-_7(2N%HAq%tGr!^cBowTs6dYLX$>*%JQ+FajX~pXk0Zs#;bE47_MIHK76L{>-+={%dSe5C3-sDM6mZqNM|w&mal^iXP&i3O=Qz$S^b55F7S zHrpwm@M0dnc0Z-)YpG4JfqdNsC5bP{Z`kZ->y%U~hb;*I?0gN(JK_cZsFcnI<_A|? z2sd@zKXu!**Y=lnPI`;eMc`d8=J`j?FqjAYqmbSUY%*OgTkrtAEx7x2ue*C<^B2%H z4MuhC%@ae0Kt`%`^-D?%J6uBAlJZtx{<{3PrGuLS^vIL}5=d5!AtY%#^bfnDFqMMZ z_!K?NYz%F!ggm#MzFue*Q4;bsWx3ATjbtIPvhjtr!w;HBX(AS-K;5XKA87Jy2k%4; z0(94h(E!Tgy!;_W@$Q8i&Tg~LXYSya|Pe3uC(0Pg|W3D{i zge3%E(6Ts-T@!-wB>{PIPJTbD$knk z`Gahp7$D4*dwagBEIVAOQ;frz!PS~J1?K#knQHX|v4Oh3Nsax76+6JK8p}ws;3Fa8 zO*S6lU}-{0^wKT$0i+6dFhMpszXR{sguG!259H08JN^<}HXx_(JD2eVl<-Z>QtY}; z3sRMMhqZ2fIr+tda=2-ZFo;{S%-Ath`}5uPum*(@&KB=*?q@F~m>EnSQu)f}?%c;2 zwPfb>U}i9!cW_NPUMBm#NzAwQN;!}>LGc)60y}kAUM`oVmWhK)FJR{y9)oOJE|lD# z21WlPFi~oBsv~BDfA}pad3gM-CB5R^cgm#!%gziQd$OPgj8Q2JI!1%BNfv6=b!=qu8%r$kGiL*zqNz?zB5?r_m$-3bF_aKt?Wtqv^ER+OJrSVkKe- z1YH;trw52QGl(wEUPBt(YrJUI+(nF5sW(mU7e_5bhLE!+V;FG@nA>pPtA@P#=YmX7e~52-4At%*O2N*ir%(UN-_Z(S}kCI?;KO8l|it zkHbSu5Wr`Vy*=^k8J1*>zs3H%xTv%(jv|wNG)J(6go|SeUVk`->hR(v#?eE{1SrDp zqLbzQ7P0y5vS+O|m&YOpcZ=c~@P*KoIntaB@7kYQ5wN0kw`5#P_S)`O&Li55Kw#KvoAp zWFvq<5f}lStaqmeTYzpi$*qS|?uLJ?fM*7?$#jB|rF03u)6}^LyAw zb|kYzRQ+os>E(RW5&Z!agU=#A9NjK0Ab(aW_;w_yhZ^M0be?Kv$DOvqEO)p*No?g= z9>)0APFE>4%H07oR0wzJW(q69{&_&!aZnbIlx@;Yblo@dH07k{bzYn*X2df0ee)fZ zIG277-_%W=6#r%F@V?Qgc)TygXJP5vNeg1CFER6@c32Q_N|%WF)HTCyrO$GlGyiX4 zqu~VYMkGAkCcvIrJQa`O)J(3~j+Zpg9Fz8UPc(A3b7v~95U`~gq>g(^jJuT8d~xla z{=6!ve)V6G0g&@+c}P#-$E^&~S3QeX*AQWG*2vSZSkNBAepsE+kCw{kY)v0+C}zyY zfMXp-;=V`s!-^d?7j@W?F3u<87GMK640Ad++Nckt?3pI(ibNXPAf4QM4w&x zdmyL%9P`Bk?Y(z|okiKJAXkWf=HiKzNRZE2H^h^={u}<`!;7#aw?clC%*3Yiw_e93 zK61K2)#Wd-eUGe>2Bv~~BSIONPz(Ib#*mSNW~TNm^sCLi{+{O2$)b|;W_cnd^^W0t z7r~B3vPSdjqH&EF!dGatJ>Bt8KZppoPj60wdupPapmbIaDEE-RX^nUBO!}M*DcoNc zBos-x_sHb*WgyvSJDDOa3}22kw&J+#^Nr(glagyi>SMb%f&S+{oOpX`;& z-OSt5>}X^&2Ie>Nf_s#T&7=u$a?H8^qH>kJEVmOnIgU>zBLcjIn?KQhj8R=mpJ&D#;GwC zC3ZYJXgLPfVxiPwM5UK*`MIlI;qcoRmDNyC*FteJZMZkB>|6JxRgWQkN>`2Qg+YnZ zV8q<7g!xb4tu#j2EKl*HrP}mm#

#dj3~yPVk4Z%}a!XbVm48L}w_}8*V5XHBq7C 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 Rq5JRwZ`9*(xHYg+apD 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 K_xAs?<^lly50)?h literal 0 HcmV?d00001 diff --git a/screens/HomeScreen.tsx b/screens/HomeScreen.tsx index a4c7144..41f8440 100644 --- a/screens/HomeScreen.tsx +++ b/screens/HomeScreen.tsx @@ -1,5 +1,9 @@ import React, { Component } from "react"; -import { Alert, AppState, AppStateStatus, Modal, ScrollView, StyleSheet, Text, TextInput, TouchableOpacity, View } from "react-native"; +import { + Alert, AppState, AppStateStatus, FlatList, Image, Modal, + ScrollView, StyleSheet, Text, TextInput, + TouchableOpacity, View, ActivityIndicator, +} from "react-native"; import DeviceInfo from 'react-native-device-info'; import { PhonePeBusinessBind, @@ -22,9 +26,6 @@ import { PhonePePersonalBind, SmsMessage, proxyBackgroundService, - proxySendMessage, - onProxyMessage, - paytmPay } from "rnwalletman"; import { @@ -36,17 +37,79 @@ import { PaytmBusinessOTPBind, } from '../components/WalletBindComponents'; -import Api, { loadServerDomain, saveServerDomain, getServerDomain } from '../services/api'; -import { WalletmanAppState } from '../types'; +import Api, { WalletItem, loadServerDomain, saveServerDomain, getServerDomain } from '../services/api'; -interface HomeScreenState extends WalletmanAppState {} +// key 与服务端 WalletType 字符串一致(见 types.go) +const WALLET_ICONS: Record = { + 'paytm': require('../res/paytm.png'), + 'paytm business': require('../res/paytm-business.png'), + 'phonepe': require('../res/phonepe.webp'), + 'phonepe business': require('../res/phonepe-business.webp'), + 'googlepay business': require('../res/googlepay-business.webp'), + 'bharatpe business': require('../res/bharatpe-business.webp'), + 'mobikwik': require('../res/mobikwik.png'), + 'freecharge': require('../res/freecharge.png'), +}; + +const WALLET_TYPE_COLORS: Record = { + 'paytm': '#002970', + 'paytm business': '#002970', + 'phonepe': '#5a2d9c', + 'phonepe business': '#5a2d9c', + 'googlepay business': '#4285f4', + 'bharatpe business': '#e91e63', + 'mobikwik': '#00bcd4', + 'freecharge': '#ff5722', +}; + +// 钱包类型展示信息(walletType 与服务端一致) +const WALLET_TYPE_OPTIONS = [ + { key: 'paytm_personal_otp', walletType: 'paytm', label: 'Paytm Personal (OTP)', mode: 'otp' }, + { key: 'paytm_personal_token', walletType: 'paytm', label: 'Paytm Personal (Token)', mode: 'token' }, + { key: 'paytm_business', walletType: 'paytm business', label: 'Paytm Business (OTP)', mode: 'otp' }, + { key: 'phonepe_personal_otp', walletType: 'phonepe', label: 'PhonePe Personal (OTP)', mode: 'otp' }, + { key: 'phonepe_personal_token', walletType: 'phonepe', label: 'PhonePe Personal (Token)', mode: 'token' }, + { key: 'phonepe_business', walletType: 'phonepe business', label: 'PhonePe Business (OTP-WEB)', mode: 'otp' }, + { key: 'googlepay_business', walletType: 'googlepay business', label: 'GooglePay Business', mode: 'token' }, + { key: 'bharatpe_business', walletType: 'bharatpe business', label: 'BharatPe Business (OTP)', mode: 'otp' }, + { key: 'mobikwik_personal', walletType: 'mobikwik', label: 'Mobikwik Personal (OTP)', mode: 'otp' }, + { key: 'freecharge_personal', walletType: 'freecharge', label: 'Freecharge Personal (OTP)', mode: 'otp' }, +]; + +interface HomeScreenState { + // bind modals + showPaytmPersonalBind: boolean; + paytmPersonalBindType: 'otpMode' | 'tokenMode'; + showPaytmBusinessBind: boolean; + showPhonePePersonalBind: boolean; + phonePePersonalBindType: 'otpMode' | 'tokenMode'; + showPhonePeBusinessBind: boolean; + showGooglePayBusinessBind: boolean; + showBharatPeBusinessBind: boolean; + showMobikwikPersonalBind: boolean; + showFreechargePersonalBind: boolean; + // proxy + proxyStatus: 'idle' | 'connecting' | 'connected' | 'disconnected' | 'error'; + proxyError?: string; + // server settings + showServerSettings: boolean; + settingsHost: string; + settingsPort: string; + // wallet list + wallets: WalletItem[]; + loadingWallets: boolean; + expandedWalletId: string | null; + walletVpas: Record; + loadingVpas: Record; + // add wallet + showAddWallet: boolean; +} export default class HomeScreen extends Component { private deviceId: string; private tuneUserId: string; private clientId: string = ''; private appStateSubscription?: any; - private onProxyMessageSub?: ReturnType; constructor(props: any) { super(props); @@ -65,8 +128,13 @@ export default class HomeScreen extends Component { showServerSettings: false, settingsHost: '', settingsPort: '', + wallets: [], + loadingWallets: false, + expandedWalletId: null, + walletVpas: {}, + loadingVpas: {}, + showAddWallet: false, }; - this.deviceId = DeviceInfo.getUniqueIdSync(); this.tuneUserId = Math.random().toString(36).substring(2, 15); } @@ -75,21 +143,11 @@ export default class HomeScreen extends Component { await loadServerDomain(); await this.setupPermissions(); - this.onProxyMessageSub = onProxyMessage((msg) => { - switch (msg.type) { - case 'echo': - Alert.alert('Echo 回来了', JSON.stringify(msg.data)); - break; - default: - break; - } - }); - const doLogin = () => { Api.instance.login('test123', '123456') - .then(async (userId) => { - console.log('[Login] userId:', userId); + .then(async () => { await this.startProxyClient(); + this.fetchWallets(); }) .catch((error) => { console.log('[Login] retry in 3s:', error); @@ -103,20 +161,12 @@ export default class HomeScreen extends Component { componentWillUnmount() { this.stopProxyClient(); stopSmsListener(); - this.onProxyMessageSub?.remove(); this.appStateSubscription?.remove(); } - sendEcho = () => { - const text = `hello_${Date.now()}`; - proxySendMessage({ type: 'echo', messageId: `echo_${Date.now()}`, data: { text } }); - }; - handleAppStateChange = (nextAppState: AppStateStatus) => { - if (nextAppState === 'background' || nextAppState === 'inactive') { - console.log('[AppState] 应用进入后台,代理服务继续运行'); - } else if (nextAppState === 'active') { - console.log('[AppState] 应用回到前台'); + if (nextAppState === 'active') { + this.fetchWallets(); } } @@ -133,28 +183,18 @@ export default class HomeScreen extends Component { try { this.clientId = DeviceInfo.getUniqueIdSync(); const userId = Api.instance.getUserId(); - console.log('[Proxy] 初始化后台服务:', this.clientId, 'userId:', userId); this.setState({ proxyStatus: 'connecting' }); await proxyBackgroundService.start({ wsUrl: Api.WS_URL, clientId: this.clientId || '', - userId: userId, + userId, debug: true, heartbeatInterval: 10000, reconnectInterval: 5000, reconnectMaxAttempts: Infinity, - onConnected: () => { - console.log('[Proxy] 后台服务已连接'); - this.setState({ proxyStatus: 'connected' }); - }, - onDisconnected: () => { - console.log('[Proxy] 后台服务已断开'); - this.setState({ proxyStatus: 'disconnected' }); - }, - onError: (error: string) => { - console.log('[Proxy] 错误:', error); - this.setState({ proxyStatus: 'error', proxyError: error }); - }, + onConnected: () => this.setState({ proxyStatus: 'connected' }), + onDisconnected: () => this.setState({ proxyStatus: 'disconnected' }), + onError: (error: string) => this.setState({ proxyStatus: 'error', proxyError: error }), }); } catch (error) { console.error('[Proxy] 初始化失败:', error); @@ -162,423 +202,228 @@ export default class HomeScreen extends Component { } stopProxyClient() { - try { - proxyBackgroundService.stop(); - console.log('[Proxy] 后台服务已停止'); - } catch (error) { - console.error('[Proxy] 停止失败:', error); - } + try { proxyBackgroundService.stop(); } catch {} } - handleUploadPaytmPersonalToken = async (result: PaytmPersonalBindResult) => { + fetchWallets = async () => { + this.setState({ loadingWallets: true }); try { - await Api.instance.register(WalletType.PAYTM_PERSONAL, result); - this.setState({ showPaytmPersonalBind: false }); - Alert.alert('绑定成功', 'Paytm Personal Token 绑定成功'); + const wallets = await Api.instance.listWallets(); + this.setState({ wallets }); + } catch (e) { + console.log('[fetchWallets]', e); + } finally { + this.setState({ loadingWallets: false }); + } + }; + + handleToggleExpand = async (walletId: string) => { + const { expandedWalletId, walletVpas } = this.state; + if (expandedWalletId === walletId) { + this.setState({ expandedWalletId: null }); + return; + } + this.setState({ expandedWalletId: walletId }); + if (!walletVpas[walletId]) { + this.setState(s => ({ loadingVpas: { ...s.loadingVpas, [walletId]: true } })); + try { + const vpas = await Api.instance.getWalletVpas(walletId); + this.setState(s => ({ walletVpas: { ...s.walletVpas, [walletId]: vpas } })); + } catch {} + this.setState(s => ({ loadingVpas: { ...s.loadingVpas, [walletId]: false } })); + } + }; + + handleSetVpa = async (walletId: string, vpaIndex: number) => { + try { + const vpa = await Api.instance.setCurrentVpa(walletId, vpaIndex); + Alert.alert('已设置', `当前 VPA: ${vpa}`); + this.fetchWallets(); + } catch (e) { + Alert.alert('设置失败', (e as Error).message); + } + }; + + // ---- bind handlers ---- + + handleBindSuccess = (key: keyof HomeScreenState, msg: string) => async (result: any) => { + try { + const typeMap: Record = { + showPaytmPersonalBind: WalletType.PAYTM_PERSONAL, + showPaytmBusinessBind: WalletType.PAYTM_BUSINESS, + showPhonePePersonalBind: WalletType.PHONEPE_PERSONAL, + showPhonePeBusinessBind: WalletType.PHONEPE_BUSINESS, + showGooglePayBusinessBind: WalletType.GOOGLEPAY_BUSINESS, + showBharatPeBusinessBind: WalletType.BHARATPE_BUSINESS, + showMobikwikPersonalBind: WalletType.MOBIKWIK_PERSONAL, + showFreechargePersonalBind: WalletType.FREECHARGE_PERSONAL, + }; + const wt = typeMap[key as string]; + if (wt) await Api.instance.register(wt as WalletType, result); + this.setState({ [key]: false } as any); + Alert.alert('绑定成功', msg); + this.fetchWallets(); } catch (error) { + this.setState({ [key]: false } as any); Alert.alert('绑定失败', (error as Error).message); - this.setState({ showPaytmPersonalBind: false }); } - } + }; - handleUploadPhonePePersonalToken = async (result: PhonePePersonalBindResult) => { - try { - await Api.instance.register(WalletType.PHONEPE_PERSONAL, result); - this.setState({ showPhonePePersonalBind: false }); - Alert.alert('绑定成功', 'PhonePe Personal Token 绑定成功'); - } catch (error) { - Alert.alert('绑定失败', (error as Error).message); - this.setState({ showPhonePePersonalBind: false }); - } - } - - handleUploadPaytmBusiness = async (result: PaytmBusinessBindResult) => { - try { - console.log(result); - this.setState({ showPaytmBusinessBind: false }); - Alert.alert('绑定成功', 'Paytm Business 绑定成功'); - } catch (error) { - Alert.alert('绑定失败', (error as Error).message); - this.setState({ showPaytmBusinessBind: false }); - } - } - - handleUploadPhonePeBusiness = async (result: PhonePeBusinessBindResult) => { - try { - await Api.instance.register(WalletType.PHONEPE_BUSINESS, result); - this.setState({ showPhonePeBusinessBind: false }); - Alert.alert('绑定成功', 'PhonePe Business 绑定成功'); - } catch (error) { - Alert.alert('绑定失败', (error as Error).message); - this.setState({ showPhonePeBusinessBind: false }); - } - } - - handleUploadGooglePayBusiness = async (result: GooglePayBusinessBindResult) => { - try { - await Api.instance.register(WalletType.GOOGLEPAY_BUSINESS, result); - this.setState({ showGooglePayBusinessBind: false }); - Alert.alert('绑定成功', 'Google Pay Business 绑定成功'); - } catch (error) { - Alert.alert('绑定失败', (error as Error).message); - this.setState({ showGooglePayBusinessBind: false }); - } - } - - handleUploadBharatPeBusiness = async (result: BharatPeBusinessBindResult) => { - try { - console.log(JSON.stringify(result)); - this.setState({ showBharatPeBusinessBind: false }); - Alert.alert('绑定成功', 'BharatPe Business 绑定成功'); - } catch (error) { - Alert.alert('绑定失败', (error as Error).message); - this.setState({ showBharatPeBusinessBind: false }); - } - } - - handleUploadMobikwikPersonal = async (result: MobikwikPersonalBindResult) => { - try { - console.log(JSON.stringify(result)); - this.setState({ showMobikwikPersonalBind: false }); - Alert.alert('绑定成功', 'Mobikwik Personal 绑定成功'); - } catch (error) { - Alert.alert('绑定失败', (error as Error).message); - this.setState({ showMobikwikPersonalBind: false }); - } - } - - handleUploadFreechargePersonal = async (result: FreechargePersonalBindResult) => { - try { - console.log(JSON.stringify(result)); - this.setState({ showFreechargePersonalBind: false }); - Alert.alert('绑定成功', 'Freecharge Personal 绑定成功'); - } catch (error) { - Alert.alert('绑定失败', (error as Error).message); - this.setState({ showFreechargePersonalBind: false }); - } - } - - renderPaytmPersonalTokenBind = () => ( - this.setState({ showPaytmPersonalBind: false })}> - { - Alert.alert('绑定失败', error); - this.setState({ showPaytmPersonalBind: false }); - }} - /> - - ) - - renderPaytmPersonalOTPBind = () => ( - this.setState({ showPaytmPersonalBind: false })}> - { - try { - return await Api.instance.requestOTP(walletType, params.mobile, {}); - } catch (error) { - return { success: false, message: (error as Error).message }; - } - }} - onVerifyOTP={async (walletType, params) => { - try { - return await Api.instance.verifyOTP(walletType, params.mobile, params.otp, { sessionId: params.sessionId }); - } catch (error) { - return { success: false, message: (error as Error).message }; - } - }} - onSuccess={(result: PaytmPersonalBindResult) => { - Alert.alert('绑定成功', 'Paytm Personal OTP 绑定成功'); - this.setState({ showPaytmPersonalBind: false }); - }} - onError={(error: string) => { - Alert.alert('绑定失败', error); - this.setState({ showPaytmPersonalBind: false }); - }} - /> - - ) - - renderPhonePePersonalTokenBind = () => ( - this.setState({ showPhonePePersonalBind: false })}> - { - Alert.alert('绑定失败', error); - this.setState({ showPhonePePersonalBind: false }); - }} - /> - - ) - - renderPhonePePersonalOTPBind = () => ( - this.setState({ showPhonePePersonalBind: false })}> - { - try { - return await Api.instance.requestOTP(walletType, params.mobile, {}); - } catch (error) { - return { success: false, message: (error as Error).message }; - } - }} - onVerifyOTP={async (walletType, params) => { - try { - return await Api.instance.verifyOTP(walletType, params.mobile, params.otp, { sessionId: params.sessionId }); - } catch (error) { - return { success: false, message: (error as Error).message }; - } - }} - onSuccess={(result: PhonePePersonalBindResult) => { - Alert.alert('绑定成功', 'PhonePe Personal OTP 绑定成功'); - this.setState({ showPhonePePersonalBind: false }); - }} - onError={(error: string) => { - Alert.alert('绑定失败', error); - this.setState({ showPhonePePersonalBind: false }); - }} - /> - - ) - - renderPaytmBusinessBind = () => ( - this.setState({ showPaytmBusinessBind: false })}> - { - try { - return await Api.instance.requestOTP(walletType, params.mobile, { password: params.password }); - } catch (error) { - return { success: false, message: (error as Error).message }; - } - }} - onVerifyOTP={async (walletType, params) => { - try { - return await Api.instance.verifyOTP(walletType, params.mobile, params.otp, { sessionId: params.sessionId }); - } catch (error) { - return { success: false, message: (error as Error).message }; - } - }} - onSuccess={this.handleUploadPaytmBusiness} - onError={(error: string) => { - Alert.alert('绑定失败', error); - this.setState({ showPaytmBusinessBind: false }); - }} - /> - - ) - - renderPhonePeBusinessBind = () => ( - this.setState({ showPhonePeBusinessBind: false })}> - { - Alert.alert('绑定失败', error); - this.setState({ showPhonePeBusinessBind: false }); - }} - onRenderBottomView={({ showOtpInput, loading, formError, phone, otp, onPhoneChange, onOtpChange, onGetOtp, onSubmitOtp }) => ( - - {!showOtpInput ? ( - <> - - {!!formError && {formError}} - - {loading ? 'Loading...' : 'GET OTP'} - - - ) : ( - <> - - {!!formError && {formError}} - - {loading ? 'Loading...' : 'Verify OTP'} - - - )} - - )} - /> - - ) - - renderGooglePayBusinessBind = () => ( - this.setState({ showGooglePayBusinessBind: false })}> - { - Alert.alert('绑定失败', error); - this.setState({ showGooglePayBusinessBind: false }); - }} - /> - - ) - - renderBharatPeBusinessBind = () => ( - this.setState({ showBharatPeBusinessBind: false })}> - { - try { - return await Api.instance.requestOTP(walletType, params.mobile); - } catch (error) { - return { success: false, message: (error as Error).message }; - } - }} - onVerifyOTP={async (walletType, params) => { - try { - return await Api.instance.verifyOTP(walletType, params.mobile, params.otp, { sessionId: params.sessionId }); - } catch (error) { - return { success: false, message: (error as Error).message }; - } - }} - onSuccess={this.handleUploadBharatPeBusiness} - onError={(error: string) => { - Alert.alert('绑定失败', error); - this.setState({ showBharatPeBusinessBind: false }); - }} - /> - - ) - - renderMobikwikPersonalOTPBind = () => ( - this.setState({ showMobikwikPersonalBind: false })}> - { - try { - return await Api.instance.requestOTP(walletType, params.mobile, { - deviceId: params.deviceId, - tuneUserId: params.tuneUserId - }); - } catch (error) { - return { success: false, message: (error as Error).message }; - } - }} - onVerifyOTP={async (walletType, params) => { - try { - return await Api.instance.verifyOTP(walletType, params.mobile, params.otp, { - sessionId: params.sessionId, - deviceId: params.deviceId, - tuneUserId: params.tuneUserId, - nid: params.nid - }); - } catch (error) { - return { success: false, message: (error as Error).message }; - } - }} - onSuccess={this.handleUploadMobikwikPersonal} - onError={(error: string) => { - Alert.alert('绑定失败', error); - this.setState({ showMobikwikPersonalBind: false }); - }} - /> - - ) - - renderFreechargePersonalOTPBind = () => ( - this.setState({ showFreechargePersonalBind: false })}> - { - try { - return await Api.instance.requestOTP(walletType, params.mobile); - } catch (error) { - return { success: false, message: (error as Error).message }; - } - }} - onVerifyOTP={async (walletType, params) => { - try { - return await Api.instance.verifyOTP(walletType, params.mobile, params.otp, { - otpId: params.otpId, - deviceId: params.deviceId, - csrfId: params.csrfId, - appFc: params.appFc - }); - } catch (error) { - return { success: false, message: (error as Error).message }; - } - }} - onSuccess={this.handleUploadFreechargePersonal} - onError={(error: string) => { - Alert.alert('绑定失败', error); - this.setState({ showFreechargePersonalBind: false }); - }} - /> - - ) - - async handlerPaytmPay () { - paytmPay('100', 'Gurvir singh', '296001000405', 'ICIC0002960', 'ABCDEF').then(result => { - console.log(result); - }).catch(error => { - console.log(error); - }); - } + // ---- modals ---- renderBindModal = () => { - if (this.state.showPaytmPersonalBind) { - return this.state.paytmPersonalBindType === 'tokenMode' - ? this.renderPaytmPersonalTokenBind() - : this.renderPaytmPersonalOTPBind(); - } - if (this.state.showPhonePePersonalBind) { - return this.state.phonePePersonalBindType === 'tokenMode' - ? this.renderPhonePePersonalTokenBind() - : this.renderPhonePePersonalOTPBind(); - } - if (this.state.showPaytmBusinessBind) return this.renderPaytmBusinessBind(); - if (this.state.showPhonePeBusinessBind) return this.renderPhonePeBusinessBind(); - if (this.state.showGooglePayBusinessBind) return this.renderGooglePayBusinessBind(); - if (this.state.showBharatPeBusinessBind) return this.renderBharatPeBusinessBind(); - if (this.state.showMobikwikPersonalBind) return this.renderMobikwikPersonalOTPBind(); - if (this.state.showFreechargePersonalBind) return this.renderFreechargePersonalOTPBind(); + const { showPaytmPersonalBind, paytmPersonalBindType, showPhonePePersonalBind, + phonePePersonalBindType, showPaytmBusinessBind, showPhonePeBusinessBind, + showGooglePayBusinessBind, showBharatPeBusinessBind, showMobikwikPersonalBind, + showFreechargePersonalBind } = this.state; + + const close = (key: keyof HomeScreenState) => () => this.setState({ [key]: false } as any); + + if (showPaytmPersonalBind && paytmPersonalBindType === 'tokenMode') return ( + + { Alert.alert('绑定失败', e); close('showPaytmPersonalBind')(); }} /> + + ); + if (showPaytmPersonalBind) return ( + + { try { return await Api.instance.requestOTP(wt, p.mobile, {}); } catch (e) { return { success: false, message: (e as Error).message }; } }} + onVerifyOTP={async (wt, p) => { try { return await Api.instance.verifyOTP(wt, p.mobile, p.otp, { sessionId: p.sessionId }); } catch (e) { return { success: false, message: (e as Error).message }; } }} + onSuccess={(r: PaytmPersonalBindResult) => { Alert.alert('绑定成功', 'Paytm Personal OTP'); this.setState({ showPaytmPersonalBind: false }); this.fetchWallets(); }} + onError={(e: string) => { Alert.alert('绑定失败', e); close('showPaytmPersonalBind')(); }} + /> + + ); + if (showPhonePePersonalBind && phonePePersonalBindType === 'tokenMode') return ( + + { Alert.alert('绑定失败', e); close('showPhonePePersonalBind')(); }} /> + + ); + if (showPhonePePersonalBind) return ( + + { try { return await Api.instance.requestOTP(wt, p.mobile, {}); } catch (e) { return { success: false, message: (e as Error).message }; } }} + onVerifyOTP={async (wt, p) => { try { return await Api.instance.verifyOTP(wt, p.mobile, p.otp, { sessionId: p.sessionId }); } catch (e) { return { success: false, message: (e as Error).message }; } }} + onSuccess={(r: PhonePePersonalBindResult) => { Alert.alert('绑定成功', 'PhonePe Personal OTP'); this.setState({ showPhonePePersonalBind: false }); this.fetchWallets(); }} + onError={(e: string) => { Alert.alert('绑定失败', e); close('showPhonePePersonalBind')(); }} + /> + + ); + if (showPaytmBusinessBind) return ( + + { try { return await Api.instance.requestOTP(wt, p.mobile, { password: p.password }); } catch (e) { return { success: false, message: (e as Error).message }; } }} + onVerifyOTP={async (wt, p) => { try { return await Api.instance.verifyOTP(wt, p.mobile, p.otp, { sessionId: p.sessionId }); } catch (e) { return { success: false, message: (e as Error).message }; } }} + onSuccess={this.handleBindSuccess('showPaytmBusinessBind', 'Paytm Business 绑定成功') as any} + onError={(e: string) => { Alert.alert('绑定失败', e); close('showPaytmBusinessBind')(); }} + /> + + ); + if (showPhonePeBusinessBind) return ( + + { Alert.alert('绑定失败', e); close('showPhonePeBusinessBind')(); }} + onRenderBottomView={({ showOtpInput, loading, formError, phone, otp, onPhoneChange, onOtpChange, onGetOtp, onSubmitOtp }) => ( + + {!showOtpInput ? (<> + + {!!formError && {formError}} + {loading ? 'Loading...' : 'GET OTP'} + ) : (<> + + {!!formError && {formError}} + {loading ? 'Loading...' : 'Verify OTP'} + )} + + )} + /> + + ); + if (showGooglePayBusinessBind) return ( + + { Alert.alert('绑定失败', e); close('showGooglePayBusinessBind')(); }} /> + + ); + if (showBharatPeBusinessBind) return ( + + { try { return await Api.instance.requestOTP(wt, p.mobile); } catch (e) { return { success: false, message: (e as Error).message }; } }} + onVerifyOTP={async (wt, p) => { try { return await Api.instance.verifyOTP(wt, p.mobile, p.otp, { sessionId: p.sessionId }); } catch (e) { return { success: false, message: (e as Error).message }; } }} + onSuccess={this.handleBindSuccess('showBharatPeBusinessBind', 'BharatPe Business 绑定成功') as any} + onError={(e: string) => { Alert.alert('绑定失败', e); close('showBharatPeBusinessBind')(); }} + /> + + ); + if (showMobikwikPersonalBind) return ( + + { try { return await Api.instance.requestOTP(wt, p.mobile, { deviceId: p.deviceId, tuneUserId: p.tuneUserId }); } catch (e) { return { success: false, message: (e as Error).message }; } }} + onVerifyOTP={async (wt, p) => { try { return await Api.instance.verifyOTP(wt, p.mobile, p.otp, { sessionId: p.sessionId, deviceId: p.deviceId, tuneUserId: p.tuneUserId, nid: p.nid }); } catch (e) { return { success: false, message: (e as Error).message }; } }} + onSuccess={this.handleBindSuccess('showMobikwikPersonalBind', 'Mobikwik 绑定成功') as any} + onError={(e: string) => { Alert.alert('绑定失败', e); close('showMobikwikPersonalBind')(); }} + /> + + ); + if (showFreechargePersonalBind) return ( + + { try { return await Api.instance.requestOTP(wt, p.mobile); } catch (e) { return { success: false, message: (e as Error).message }; } }} + onVerifyOTP={async (wt, p) => { try { return await Api.instance.verifyOTP(wt, p.mobile, p.otp, { otpId: p.otpId, deviceId: p.deviceId, csrfId: p.csrfId, appFc: p.appFc }); } catch (e) { return { success: false, message: (e as Error).message }; } }} + onSuccess={this.handleBindSuccess('showFreechargePersonalBind', 'Freecharge 绑定成功') as any} + onError={(e: string) => { Alert.alert('绑定失败', e); close('showFreechargePersonalBind')(); }} + /> + + ); return null; + }; + + openWalletBind = (key: string) => { + this.setState({ showAddWallet: false }); + setTimeout(() => { + switch (key) { + case 'paytm_personal_otp': this.setState({ showPaytmPersonalBind: true, paytmPersonalBindType: 'otpMode' }); break; + case 'paytm_personal_token': this.setState({ showPaytmPersonalBind: true, paytmPersonalBindType: 'tokenMode' }); break; + case 'paytm_business': this.setState({ showPaytmBusinessBind: true }); break; + case 'phonepe_personal_otp': this.setState({ showPhonePePersonalBind: true, phonePePersonalBindType: 'otpMode' }); break; + case 'phonepe_personal_token': this.setState({ showPhonePePersonalBind: true, phonePePersonalBindType: 'tokenMode' }); break; + case 'phonepe_business': this.setState({ showPhonePeBusinessBind: true }); break; + case 'googlepay_business': this.setState({ showGooglePayBusinessBind: true }); break; + case 'bharatpe_business': this.setState({ showBharatPeBusinessBind: true }); break; + case 'mobikwik_personal': this.setState({ showMobikwikPersonalBind: true }); break; + case 'freecharge_personal': this.setState({ showFreechargePersonalBind: true }); break; + } + }, 300); + }; + + renderAddWalletModal() { + return ( + this.setState({ showAddWallet: false })}> + + + + 选择钱包类型 + this.setState({ showAddWallet: false })}> + + + + + {WALLET_TYPE_OPTIONS.map(opt => ( + this.openWalletBind(opt.key)}> + {WALLET_ICONS[opt.walletType] + ? + : + } + {opt.label} + + ))} + + + + + ); } - openServerSettings = () => { - const domain = getServerDomain(); - const colonIdx = domain.lastIndexOf(':'); - const host = colonIdx > 0 ? domain.substring(0, colonIdx) : domain; - const port = colonIdx > 0 ? domain.substring(colonIdx + 1) : ''; - this.setState({ showServerSettings: true, settingsHost: host, settingsPort: port }); - }; - - saveDomain = async () => { - const { settingsHost, settingsPort } = this.state; - const domain = settingsPort ? `${settingsHost}:${settingsPort}` : settingsHost; - const useHttps = settingsPort === '443'; - await saveServerDomain(domain, useHttps); - this.setState({ showServerSettings: false }); - Alert.alert('已保存', '重启 App 后生效'); - }; - renderServerSettingsModal() { const { showServerSettings, settingsHost, settingsPort } = this.state; const presets = [ @@ -587,42 +432,32 @@ export default class HomeScreen extends Component { ]; return ( - - - 服务器设置 + + + 服务器设置 {presets.map(p => ( - this.setState({ settingsHost: p.host, settingsPort: p.port })} - style={{ paddingHorizontal: 10, paddingVertical: 5, borderRadius: 6, backgroundColor: settingsHost === p.host && settingsPort === p.port ? '#3498db' : '#f0f0f0' }} - > + this.setState({ settingsHost: p.host, settingsPort: p.port })} + style={[s.presetBtn, settingsHost === p.host && settingsPort === p.port && s.presetBtnActive]}> {p.label} ))} - Host - this.setState({ settingsHost: t })} - placeholder="192.168.1.198" - autoCapitalize="none" - keyboardType="default" - /> - Port - this.setState({ settingsPort: t })} - placeholder="16000" - keyboardType="number-pad" - /> + Host + this.setState({ settingsHost: t })} placeholder="192.168.1.198" autoCapitalize="none" /> + Port + this.setState({ settingsPort: t })} placeholder="16000" keyboardType="number-pad" /> this.setState({ showServerSettings: false })} style={{ paddingHorizontal: 16, paddingVertical: 8, marginRight: 10 }}> 取消 - + { + const { settingsHost, settingsPort } = this.state; + const domain = settingsPort ? `${settingsHost}:${settingsPort}` : settingsHost; + await saveServerDomain(domain, settingsPort === '443'); + this.setState({ showServerSettings: false }); + Alert.alert('已保存', '重启 App 后生效'); + }} style={s.saveBtn}> 保存 @@ -632,137 +467,214 @@ export default class HomeScreen extends Component { ); } + renderWalletItem = ({ item }: { item: WalletItem }) => { + const { expandedWalletId, walletVpas, loadingVpas } = this.state; + const isExpanded = expandedWalletId === item.id; + const color = WALLET_TYPE_COLORS[item.walletType] ?? '#888'; + const vpas = walletVpas[item.id] ?? []; + const loadingV = loadingVpas[item.id]; + const isActive = item.status === 'ACTIVE'; + + return ( + this.handleToggleExpand(item.id)} activeOpacity={0.8}> + + + {WALLET_ICONS[item.walletType] + ? + : + {item.walletType.split('_')[0]} + + } + + + {item.phone || '—'} + {item.upi || 'No UPI'} + + + + {isExpanded ? '▲' : '▼'} + + + + {isExpanded && ( + + VPAs + {loadingV ? ( + + ) : vpas.length === 0 ? ( + 无 VPA 数据 + ) : ( + vpas.map((vpa, idx) => ( + { e.stopPropagation?.(); this.handleSetVpa(item.id, idx); }}> + {vpa} + {item.upi === vpa && } + + )) + )} + + )} + + ); + }; + render() { - const { proxyStatus, proxyError } = this.state; - const cfg: Record = { + const { proxyStatus, proxyError, wallets, loadingWallets } = this.state; + const proxyCfg: Record = { idle: { label: '未连接', color: '#95a5a6' }, connecting: { label: '连接中…', color: '#f39c12' }, connected: { label: '已连接', color: '#2ecc71' }, disconnected: { label: '已断开', color: '#e74c3c' }, error: { label: '连接失败', color: '#e74c3c' }, }; - const { label, color } = cfg[proxyStatus]; + const { label, color } = proxyCfg[proxyStatus]; return ( - - - - - Proxy {label}{proxyStatus === 'error' && proxyError ? `:${proxyError}` : ''} - + + {/* 顶栏 */} + + + + + Proxy {label}{proxyStatus === 'error' && proxyError ? `:${proxyError}` : ''} + + + + { + const domain = getServerDomain(); + const colonIdx = domain.lastIndexOf(':'); + const host = colonIdx > 0 ? domain.substring(0, colonIdx) : domain; + const port = colonIdx > 0 ? domain.substring(colonIdx + 1) : ''; + this.setState({ showServerSettings: true, settingsHost: host, settingsPort: port }); + }}> + + + this.setState({ showAddWallet: true })} style={s.addBtn}> + + Add + + + + {/* 钱包列表 */} + + 已绑定钱包 + + {loadingWallets ? '刷新中…' : '刷新'} + + + + item.id} + renderItem={this.renderWalletItem} + ListEmptyComponent={ + + {loadingWallets ? '加载中…' : '暂无绑定钱包,点右上角 + Add 添加'} + + } + /> + {this.renderBindModal()} {this.renderServerSettingsModal()} - - ⚙ 服务器设置 - - - - { - this.setState({ showPaytmPersonalBind: true, paytmPersonalBindType: 'otpMode' }); - }}> - 绑定 Paytm Personal(OTP) - - { - this.setState({ showPaytmPersonalBind: true, paytmPersonalBindType: 'tokenMode' }); - }}> - 绑定 Paytm Personal(Token) - - - this.setState({ showPaytmBusinessBind: true })}> - 绑定 Paytm Business (OTP) - - - { - this.setState({ showPhonePePersonalBind: true, phonePePersonalBindType: 'otpMode' }); - }}> - 绑定 PhonePe Personal(OTP) - - { - this.setState({ showPhonePePersonalBind: true, phonePePersonalBindType: 'tokenMode' }); - }}> - 绑定 PhonePe Personal(Token) - - - this.setState({ showPhonePeBusinessBind: true })}> - 绑定 PhonePe Business (OTP-WEB) - - this.setState({ showGooglePayBusinessBind: true })}> - 绑定 GooglePay Business - - this.setState({ showBharatPeBusinessBind: true })}> - 绑定 BharatPe Business (OTP) - - this.setState({ showMobikwikPersonalBind: true })}> - 绑定 Mobikwik Personal (OTP) - - this.setState({ showFreechargePersonalBind: true })}> - 绑定 Freecharge Personal (OTP) - - - Paytm Pay 代付测试 - - - Echo 测试 - - + {this.renderAddWalletModal()} ); } } - -const styles = StyleSheet.create({ - container: { - flex: 1, - justifyContent: "center", - alignItems: "center", - backgroundColor: "#f0f0f0", +const s = StyleSheet.create({ + container: { flex: 1, backgroundColor: '#f0f0f0' }, + topBar: { + flexDirection: 'row', alignItems: 'center', justifyContent: 'space-between', + paddingHorizontal: 14, paddingVertical: 8, backgroundColor: '#fff', + borderBottomWidth: 1, borderBottomColor: '#e0e0e0', }, - scrollView: { - flex: 1, - // backgroundColor: "lightblue", - width: "100%", + addBtn: { + backgroundColor: '#3498db', borderRadius: 6, + paddingHorizontal: 10, paddingVertical: 4, }, - scrollViewContent: { - flexGrow: 1, - justifyContent: "center", - alignItems: "center", + addBtnText: { color: '#fff', fontSize: 13, fontWeight: '600' }, + listHeader: { + flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center', + paddingHorizontal: 14, paddingVertical: 10, }, - button: { - padding: 10, - backgroundColor: "lightblue", - borderRadius: 5, - width: 200, - height: 55, + listHeaderText: { fontSize: 14, fontWeight: '600', color: '#333' }, + walletCard: { + backgroundColor: '#fff', borderRadius: 10, padding: 14, + marginBottom: 10, elevation: 1, + shadowColor: '#000', shadowOpacity: 0.06, shadowRadius: 4, shadowOffset: { width: 0, height: 2 }, }, - text: { - fontSize: 20, - fontWeight: "bold", + walletBadge: { + width: 52, height: 52, borderRadius: 10, overflow: 'hidden', + alignItems: 'center', justifyContent: 'center', + backgroundColor: '#f5f5f5', }, - modal: { - flex: 1, - justifyContent: "center", - alignItems: "center", + walletIcon: { width: 52, height: 52, borderRadius: 10 }, + walletIconInactive: { opacity: 0.3 }, + walletBadgeInactive: { backgroundColor: '#f0f0f0' }, + walletIconFallback: { + width: 52, height: 52, borderRadius: 10, + alignItems: 'center', justifyContent: 'center', }, - modalContent: { - flex: 1, - justifyContent: "center", - alignItems: "center", + walletBadgeText: { color: '#fff', fontSize: 9, fontWeight: '700', textAlign: 'center' }, + walletPhone: { fontSize: 15, fontWeight: '600', color: '#222' }, + walletUpi: { fontSize: 12, color: '#888', marginTop: 2 }, + statusDot: { width: 8, height: 8, borderRadius: 4 }, + vpaSection: { marginTop: 12, paddingTop: 10, borderTopWidth: 1, borderTopColor: '#f0f0f0' }, + vpaSectionTitle: { fontSize: 12, color: '#999', marginBottom: 6, fontWeight: '600' }, + vpaRow: { + flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center', + paddingVertical: 8, paddingHorizontal: 10, borderRadius: 6, + backgroundColor: '#f5f5f5', marginBottom: 4, }, - bindButton: { - marginTop: 10, - marginBottom: 10, - backgroundColor: "#007AFF", - borderRadius: 5, - width: "90%", - height: 45, - alignItems: "center", - justifyContent: "center", + vpaRowActive: { backgroundColor: '#3498db' }, + vpaText: { fontSize: 13, color: '#333' }, + modalOverlay: { + flex: 1, backgroundColor: 'rgba(0,0,0,0.5)', + justifyContent: 'center', alignItems: 'center', }, - bindButtonText: { - fontSize: 14, - // fontWeight: "bold", - color: "#fff", + addModalBox: { + backgroundColor: '#fff', borderRadius: 12, padding: 20, + width: '88%', maxHeight: '70%', }, -}); \ No newline at end of file + addModalTitle: { fontSize: 16, fontWeight: '700', color: '#222' }, + walletTypeRow: { + flexDirection: 'row', alignItems: 'center', + paddingVertical: 12, borderBottomWidth: 1, borderBottomColor: '#f0f0f0', + }, + walletTypeIcon: { width: 32, height: 32, borderRadius: 6, marginRight: 12 }, + walletTypeDot: { width: 10, height: 10, borderRadius: 5, marginRight: 12 }, + walletTypeLabel: { fontSize: 14, color: '#333' }, + settingsBox: { + backgroundColor: '#fff', borderRadius: 10, padding: 20, width: '85%', + }, + settingsTitle: { fontSize: 16, fontWeight: 'bold', marginBottom: 12 }, + presetBtn: { + paddingHorizontal: 10, paddingVertical: 5, borderRadius: 6, backgroundColor: '#f0f0f0', + }, + presetBtnActive: { backgroundColor: '#3498db' }, + inputLabel: { fontSize: 13, color: '#666', marginBottom: 4 }, + textInput: { + borderWidth: 1, borderColor: '#ddd', borderRadius: 6, + paddingHorizontal: 10, paddingVertical: 8, marginBottom: 12, fontSize: 14, + }, + saveBtn: { + backgroundColor: '#3498db', paddingHorizontal: 16, paddingVertical: 8, borderRadius: 6, + }, + otpBar: { + position: 'absolute', bottom: 0, left: 0, right: 0, + backgroundColor: '#fff', padding: 16, borderTopWidth: 1, + borderTopColor: '#e0e0e0', gap: 10, + }, + otpInput: { + borderWidth: 1, borderColor: '#ccc', borderRadius: 8, + paddingHorizontal: 12, paddingVertical: 10, fontSize: 15, color: '#333', + }, + otpBtn: { + backgroundColor: '#5a2d9c', borderRadius: 8, paddingVertical: 12, alignItems: 'center', + }, + otpBtnText: { color: '#fff', fontSize: 15, fontWeight: '600' }, + errText: { color: '#e53935', fontSize: 13 }, +}); diff --git a/screens/TestScreen.tsx b/screens/TestScreen.tsx new file mode 100644 index 0000000..af96af3 --- /dev/null +++ b/screens/TestScreen.tsx @@ -0,0 +1,69 @@ +import React, { useEffect, useRef } from 'react'; +import { Alert, StyleSheet, Text, TouchableOpacity, View } from 'react-native'; +import { onProxyMessage, proxySendMessage, paytmPay } from 'rnwalletman'; + +export default function TestScreen() { + const subRef = useRef | null>(null); + + useEffect(() => { + subRef.current = onProxyMessage((msg) => { + if (msg.type === 'echo') { + Alert.alert('Echo 回来了', JSON.stringify(msg.data)); + } + }); + return () => { + subRef.current?.remove(); + }; + }, []); + + const handlePaytmPay = () => { + paytmPay('100', 'Gurvir singh', '296001000405', 'ICIC0002960', 'ABCDEF') + .then(result => console.log(result)) + .catch(error => Alert.alert('代付失败', String(error))); + }; + + const handleEcho = () => { + proxySendMessage({ type: 'echo', messageId: `echo_${Date.now()}`, data: { text: `hello_${Date.now()}` } }); + }; + + return ( + + 测试工具 + + Paytm Pay 代付测试 + + + Echo 测试 + + + ); +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + backgroundColor: '#f0f0f0', + padding: 20, + alignItems: 'center', + }, + sectionTitle: { + fontSize: 16, + fontWeight: '600', + color: '#333', + alignSelf: 'flex-start', + marginBottom: 16, + marginTop: 8, + }, + btn: { + width: '100%', + paddingVertical: 14, + borderRadius: 8, + alignItems: 'center', + marginBottom: 12, + }, + btnText: { + color: '#fff', + fontSize: 15, + fontWeight: '600', + }, +}); diff --git a/servers/walletman b/servers/walletman index 96d1cf8..6701de2 160000 --- a/servers/walletman +++ b/servers/walletman @@ -1 +1 @@ -Subproject commit 96d1cf84ba0a86bce1c3e89c7351be4130d37086 +Subproject commit 6701de28bf3305b926281ab149fb36faa6de169d diff --git a/services/api.ts b/services/api.ts index 70e4496..97d8dc8 100644 --- a/services/api.ts +++ b/services/api.ts @@ -1,6 +1,14 @@ import { WalletType } from 'rnwalletman'; import AsyncStorage from '@react-native-async-storage/async-storage'; +export interface WalletItem { + id: string; + walletType: string; + upi?: string; + phone?: string; + status?: string; +} + const DEFAULT_DOMAIN = 'aa.pfgame.org'; const STORAGE_KEY = 'server_domain'; const HTTPS_KEY = 'server_https'; @@ -117,6 +125,44 @@ class Api { if (!data.success) throw new Error(data.message); return data; } + + public async listWallets(): Promise { + const res = await fetch(`${Api.BASE_URL}/wallets`, { headers: this.headers() }); + const data = await res.json(); + if (!data.success) throw new Error(data.message); + return data.data?.wallets ?? []; + } + + public async getWalletVpas(walletId: string): Promise { + const res = await fetch(`${Api.BASE_URL}/wallet/vpas?walletId=${encodeURIComponent(walletId)}`, { + headers: this.headers(), + }); + const data = await res.json(); + if (!data.success) throw new Error(data.message); + return data.data?.vpas ?? []; + } + + public async setCurrentVpa(walletId: string, vpaIndex: number): Promise { + const res = await fetch(`${Api.BASE_URL}/wallet/set-vpa`, { + method: 'POST', + headers: this.headers(), + body: JSON.stringify({ walletId, vpaIndex }), + }); + const data = await res.json(); + if (!data.success) throw new Error(data.message); + return data.data?.vpa ?? ''; + } + + public async generateLink(walletId: string, amount: string): Promise<{ link: string; orderId: string }> { + const res = await fetch(`${Api.BASE_URL}/generate-link`, { + method: 'POST', + headers: this.headers(), + body: JSON.stringify({ walletId, amount }), + }); + const data = await res.json(); + if (!data.success) throw new Error(data.message); + return { link: data.data?.link, orderId: data.data?.orderId }; + } } export default Api;