This commit is contained in:
2026-03-15 11:45:11 +08:00
parent 619143323b
commit 668bfeda35
5 changed files with 39 additions and 12 deletions

19
App.tsx
View File

@@ -1,5 +1,5 @@
import React, { Component } from "react"; import React, { Component } from "react";
import { Alert, AppState, AppStateStatus, Modal, Text, TextInput, TouchableOpacity, View } from "react-native"; import { Alert, AppState, AppStateStatus, Modal, Switch, Text, TextInput, TouchableOpacity, View } from "react-native";
import DeviceInfo from 'react-native-device-info'; import DeviceInfo from 'react-native-device-info';
import { import {
PhonePeBusinessBind, PhonePeBusinessBind,
@@ -35,7 +35,7 @@ import {
PaytmBusinessOTPBind, PaytmBusinessOTPBind,
} from './components/WalletBindComponents'; } from './components/WalletBindComponents';
import Api, { loadServerDomain, saveServerDomain, getServerDomain } from './services/api'; import Api, { loadServerDomain, saveServerDomain, getServerDomain, getUseHttps } from './services/api';
import { AppProps, WalletmanAppState } from './types'; import { AppProps, WalletmanAppState } from './types';
import { styles } from './styles'; import { styles } from './styles';
import WebView from "react-native-webview"; import WebView from "react-native-webview";
@@ -65,6 +65,7 @@ export default class App extends Component<AppProps, WalletmanAppState> {
showServerSettings: false, showServerSettings: false,
settingsHost: '', settingsHost: '',
settingsPort: '', settingsPort: '',
settingsHttps: true,
}; };
this.deviceId = DeviceInfo.getUniqueIdSync(); this.deviceId = DeviceInfo.getUniqueIdSync();
@@ -639,19 +640,19 @@ export default class App extends Component<AppProps, WalletmanAppState> {
const colonIdx = domain.lastIndexOf(':'); const colonIdx = domain.lastIndexOf(':');
const host = colonIdx > 0 ? domain.substring(0, colonIdx) : domain; const host = colonIdx > 0 ? domain.substring(0, colonIdx) : domain;
const port = colonIdx > 0 ? domain.substring(colonIdx + 1) : ''; const port = colonIdx > 0 ? domain.substring(colonIdx + 1) : '';
this.setState({ showServerSettings: true, settingsHost: host, settingsPort: port }); this.setState({ showServerSettings: true, settingsHost: host, settingsPort: port, settingsHttps: getUseHttps() });
}; };
saveDomain = async () => { saveDomain = async () => {
const { settingsHost, settingsPort } = this.state; const { settingsHost, settingsPort, settingsHttps } = this.state;
const domain = settingsPort ? `${settingsHost}:${settingsPort}` : settingsHost; const domain = settingsPort ? `${settingsHost}:${settingsPort}` : settingsHost;
await saveServerDomain(domain); await saveServerDomain(domain, settingsHttps);
this.setState({ showServerSettings: false }); this.setState({ showServerSettings: false });
Alert.alert('已保存', '重启 App 后生效'); Alert.alert('已保存', '重启 App 后生效');
}; };
renderServerSettingsModal() { renderServerSettingsModal() {
const { showServerSettings, settingsHost, settingsPort } = this.state; const { showServerSettings, settingsHost, settingsPort, settingsHttps } = this.state;
return ( return (
<Modal visible={showServerSettings} transparent animationType="fade"> <Modal visible={showServerSettings} transparent animationType="fade">
<View style={{ flex: 1, backgroundColor: 'rgba(0,0,0,0.5)', justifyContent: 'center', alignItems: 'center' }}> <View style={{ flex: 1, backgroundColor: 'rgba(0,0,0,0.5)', justifyContent: 'center', alignItems: 'center' }}>
@@ -668,12 +669,16 @@ export default class App extends Component<AppProps, WalletmanAppState> {
/> />
<Text style={{ fontSize: 13, color: '#666', marginBottom: 4 }}>Port</Text> <Text style={{ fontSize: 13, color: '#666', marginBottom: 4 }}>Port</Text>
<TextInput <TextInput
style={{ borderWidth: 1, borderColor: '#ddd', borderRadius: 6, paddingHorizontal: 10, paddingVertical: 8, marginBottom: 20, fontSize: 14 }} style={{ borderWidth: 1, borderColor: '#ddd', borderRadius: 6, paddingHorizontal: 10, paddingVertical: 8, marginBottom: 12, fontSize: 14 }}
value={settingsPort} value={settingsPort}
onChangeText={t => this.setState({ settingsPort: t })} onChangeText={t => this.setState({ settingsPort: t })}
placeholder="16000" placeholder="16000"
keyboardType="number-pad" keyboardType="number-pad"
/> />
<View style={{ flexDirection: 'row', alignItems: 'center', justifyContent: 'space-between', marginBottom: 20 }}>
<Text style={{ fontSize: 13, color: '#666' }}>使 HTTPS / WSS</Text>
<Switch value={settingsHttps} onValueChange={v => this.setState({ settingsHttps: v })} />
</View>
<View style={{ flexDirection: 'row', justifyContent: 'flex-end' }}> <View style={{ flexDirection: 'row', justifyContent: 'flex-end' }}>
<TouchableOpacity onPress={() => this.setState({ showServerSettings: false })} style={{ paddingHorizontal: 16, paddingVertical: 8, marginRight: 10 }}> <TouchableOpacity onPress={() => this.setState({ showServerSettings: false })} style={{ paddingHorizontal: 16, paddingVertical: 8, marginRight: 10 }}>
<Text style={{ color: '#666' }}></Text> <Text style={{ color: '#666' }}></Text>

View File

@@ -22,6 +22,7 @@
<set> <set>
<option value="$PROJECT_DIR$" /> <option value="$PROJECT_DIR$" />
<option value="$PROJECT_DIR$/app" /> <option value="$PROJECT_DIR$/app" />
<option value="$PROJECT_DIR$/../node_modules/@react-native-async-storage/async-storage/android" />
<option value="$PROJECT_DIR$/../node_modules/@react-native-cookies/cookies/android" /> <option value="$PROJECT_DIR$/../node_modules/@react-native-cookies/cookies/android" />
<option value="$PROJECT_DIR$/../node_modules/@react-native-ml-kit/barcode-scanning/android" /> <option value="$PROJECT_DIR$/../node_modules/@react-native-ml-kit/barcode-scanning/android" />
<option value="$PROJECT_DIR$/../node_modules/@react-native/gradle-plugin" /> <option value="$PROJECT_DIR$/../node_modules/@react-native/gradle-plugin" />

View File

@@ -1,29 +1,48 @@
import { WalletType } from 'rnwalletman'; import { WalletType } from 'rnwalletman';
import AsyncStorage from '@react-native-async-storage/async-storage'; import AsyncStorage from '@react-native-async-storage/async-storage';
const DEFAULT_DOMAIN = '192.168.1.198:16000'; const DEFAULT_DOMAIN = 'aa.pfgame.org';
const STORAGE_KEY = 'server_domain'; const STORAGE_KEY = 'server_domain';
const HTTPS_KEY = 'server_https';
let _domain = DEFAULT_DOMAIN; let _domain = DEFAULT_DOMAIN;
let _useHttps = true;
export async function loadServerDomain(): Promise<string> { export async function loadServerDomain(): Promise<string> {
const saved = await AsyncStorage.getItem(STORAGE_KEY); const saved = await AsyncStorage.getItem(STORAGE_KEY);
if (saved) _domain = saved; if (saved) _domain = saved;
const https = await AsyncStorage.getItem(HTTPS_KEY);
if (https !== null) _useHttps = https === 'true';
console.log('loadServerDomain', _domain, 'https:', _useHttps);
return _domain; return _domain;
} }
export async function saveServerDomain(domain: string): Promise<void> { export async function saveServerDomain(domain: string, useHttps: boolean): Promise<void> {
_domain = domain; _domain = domain;
_useHttps = useHttps;
await AsyncStorage.setItem(STORAGE_KEY, domain); await AsyncStorage.setItem(STORAGE_KEY, domain);
await AsyncStorage.setItem(HTTPS_KEY, String(useHttps));
} }
export function getServerDomain(): string { export function getServerDomain(): string {
return _domain; return _domain;
} }
export function getUseHttps(): boolean {
return _useHttps;
}
class Api { class Api {
public static get BASE_URL() { return `http://${_domain}`; } public static get BASE_URL() {
public static get WS_URL() { return `ws://${_domain}/ws`; } const domain = getServerDomain();
const scheme = getUseHttps() ? 'https' : 'http';
return `${scheme}://${domain}`;
}
public static get WS_URL() {
const domain = getServerDomain();
const scheme = getUseHttps() ? 'wss' : 'ws';
return `${scheme}://${domain}/ws`;
}
private static _instance: Api | null = null; private static _instance: Api | null = null;
private userId: number = 0; private userId: number = 0;
@@ -54,6 +73,7 @@ class Api {
} }
public async login(username: string, password: string): Promise<number> { public async login(username: string, password: string): Promise<number> {
console.log('login', Api.BASE_URL);
const res = await fetch(`${Api.BASE_URL}/login`, { const res = await fetch(`${Api.BASE_URL}/login`, {
method: 'POST', method: 'POST',
headers: { 'Content-Type': 'application/json' }, headers: { 'Content-Type': 'application/json' },

View File

@@ -31,4 +31,5 @@ export interface WalletmanAppState {
showServerSettings: boolean; showServerSettings: boolean;
settingsHost: string; settingsHost: string;
settingsPort: string; settingsPort: string;
settingsHttps: boolean;
} }