forked from cerc-io/laconic-wallet
* Display decoded message received while using signDirect method * Fix permission dialog not exiting after clicking outside * Handle review changes * Remove optional chaining in while checking for signDirect method
120 lines
3.3 KiB
TypeScript
120 lines
3.3 KiB
TypeScript
import React, { useEffect, useState } from 'react';
|
|
import { AppState, TouchableOpacity, View } from 'react-native';
|
|
import { Button, Text, TextInput } from 'react-native-paper';
|
|
import {
|
|
Camera,
|
|
useCameraDevice,
|
|
useCameraPermission,
|
|
useCodeScanner,
|
|
} from 'react-native-vision-camera';
|
|
import { Linking } from 'react-native';
|
|
|
|
import { useNavigation } from '@react-navigation/native';
|
|
import { NativeStackNavigationProp } from '@react-navigation/native-stack';
|
|
|
|
import { web3WalletPair } from '../utils/wallet-connect/WalletConnectUtils';
|
|
import styles from '../styles/stylesheet';
|
|
import { StackParamsList } from '../types';
|
|
|
|
const AddSession = () => {
|
|
const navigation =
|
|
useNavigation<NativeStackNavigationProp<StackParamsList>>();
|
|
|
|
const { hasPermission, requestPermission } = useCameraPermission();
|
|
const device = useCameraDevice('back');
|
|
|
|
const [currentWCURI, setCurrentWCURI] = useState<string>('');
|
|
const [isActive, setIsActive] = useState(AppState.currentState === 'active');
|
|
const [isScanning, setScanning] = useState(true);
|
|
|
|
const codeScanner = useCodeScanner({
|
|
codeTypes: ['qr'],
|
|
onCodeScanned: codes => {
|
|
if (isScanning) {
|
|
codes.forEach(code => {
|
|
if (code.value) {
|
|
setCurrentWCURI(code.value);
|
|
setScanning(false);
|
|
}
|
|
});
|
|
}
|
|
},
|
|
});
|
|
|
|
const linkToSettings = async () => {
|
|
await Linking.openSettings();
|
|
};
|
|
|
|
const pair = async () => {
|
|
const pairing = await web3WalletPair({ uri: currentWCURI });
|
|
navigation.navigate('WalletConnect');
|
|
return pairing;
|
|
};
|
|
|
|
useEffect(() => {
|
|
const handleAppStateChange = (newState: string) => {
|
|
setIsActive(newState === 'active');
|
|
};
|
|
|
|
AppState.addEventListener('change', handleAppStateChange);
|
|
|
|
if (!hasPermission) {
|
|
requestPermission();
|
|
}
|
|
}, [hasPermission, requestPermission]);
|
|
|
|
return (
|
|
<View style={styles.appContainer}>
|
|
{!hasPermission || !device ? (
|
|
<>
|
|
<Text>
|
|
{!hasPermission
|
|
? 'No Camera Permission granted'
|
|
: 'No Camera Selected'}
|
|
</Text>
|
|
<TouchableOpacity onPress={linkToSettings}>
|
|
<Text variant="titleSmall" style={[styles.hyperlink]}>
|
|
Go to settings
|
|
</Text>
|
|
</TouchableOpacity>
|
|
</>
|
|
) : (
|
|
<>
|
|
<View style={styles.cameraContainer}>
|
|
{isActive ? (
|
|
<Camera
|
|
style={styles.camera}
|
|
device={device}
|
|
isActive={isActive}
|
|
codeScanner={codeScanner}
|
|
video={false}
|
|
/>
|
|
) : (
|
|
<Text>No Camera Selected!</Text>
|
|
)}
|
|
</View>
|
|
|
|
<View style={styles.inputContainer}>
|
|
<Text variant="titleMedium">Enter WalletConnect URI</Text>
|
|
<TextInput
|
|
mode="outlined"
|
|
onChangeText={setCurrentWCURI}
|
|
value={currentWCURI}
|
|
numberOfLines={4}
|
|
multiline={true}
|
|
style={{ padding: 10 }}
|
|
/>
|
|
|
|
<View style={styles.signButton}>
|
|
<Button mode="contained" onPress={pair}>
|
|
Pair Session
|
|
</Button>
|
|
</View>
|
|
</View>
|
|
</>
|
|
)}
|
|
</View>
|
|
);
|
|
};
|
|
export default AddSession;
|