laconic-wallet/components/AddSession.tsx
shreerang6921 2a92e71594
Display decoded message received while using signDirect method (#52)
* 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
2024-03-13 12:02:08 +05:30

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;