import React, { useEffect, useState, useContext } from 'react'; import { Platform, View, Keyboard, StyleSheet, Switch, TouchableWithoutFeedback } from 'react-native'; import { useNavigation, useRoute, useTheme } from '@react-navigation/native'; import { BlueButton, BlueButtonLink, BlueDoneAndDismissKeyboardInputAccessory, BlueFormLabel, BlueFormMultiInput, BlueSpacing20, BlueText, SafeBlueArea, } from '../../BlueComponents'; import navigationStyle from '../../components/navigationStyle'; import Privacy from '../../blue_modules/Privacy'; import loc from '../../loc'; import { isMacCatalina } from '../../blue_modules/environment'; import { BlueStorageContext } from '../../blue_modules/storage-context'; const fs = require('../../blue_modules/fs'); const WalletsImport = () => { const navigation = useNavigation(); const { colors } = useTheme(); const route = useRoute(); const label = route?.params?.label ?? ''; const triggerImport = route?.params?.triggerImport ?? false; const { isAdancedModeEnabled } = useContext(BlueStorageContext); const [importText, setImportText] = useState(label); const [isToolbarVisibleForAndroid, setIsToolbarVisibleForAndroid] = useState(false); const [, setSpeedBackdoor] = useState(0); const [isAdvancedModeEnabledRender, setIsAdvancedModeEnabledRender] = useState(false); const [searchAccounts, setSearchAccounts] = useState(false); const [askPassphrase, setAskPassphrase] = useState(false); const styles = StyleSheet.create({ root: { paddingTop: 10, backgroundColor: colors.elevated, }, center: { flex: 1, marginHorizontal: 16, backgroundColor: colors.elevated, }, row: { flexDirection: 'row', alignItems: 'center', marginHorizontal: 16, marginTop: 10, justifyContent: 'space-between', }, }); const onBlur = () => { const valueWithSingleWhitespace = importText.replace(/^\s+|\s+$|\s+(?=\s)/g, ''); setImportText(valueWithSingleWhitespace); }; useEffect(() => { Privacy.enableBlur(); Keyboard.addListener(Platform.OS === 'ios' ? 'keyboardWillShow' : 'keyboardDidShow', () => setIsToolbarVisibleForAndroid(true)); Keyboard.addListener(Platform.OS === 'ios' ? 'keyboardWillHide' : 'keyboardDidHide', () => setIsToolbarVisibleForAndroid(false)); return () => { Keyboard.removeListener(Platform.OS === 'ios' ? 'keyboardWillHide' : 'keyboardDidHide'); Keyboard.removeListener(Platform.OS === 'ios' ? 'keyboardWillShow' : 'keyboardDidShow'); Privacy.disableBlur(); }; }, []); useEffect(() => { isAdancedModeEnabled().then(setIsAdvancedModeEnabledRender); if (triggerImport) importButtonPressed(); // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const importButtonPressed = () => { if (importText.trim().length === 0) { return; } importMnemonic(importText); }; const importMnemonic = importText => { navigation.navigate('ImportWalletDiscovery', { importText, askPassphrase, searchAccounts }); }; const onBarScanned = value => { if (value && value.data) value = value.data + ''; // no objects here, only strings setImportText(value); setTimeout(() => importMnemonic(value), 500); }; const importScan = () => { if (isMacCatalina) { fs.showActionSheet().then(onBarScanned); } else { navigation.navigate('ScanQRCodeRoot', { screen: 'ScanQRCode', params: { launchedBy: route.name, onBarScanned: onBarScanned, showFileImportButton: true, }, }); } }; const speedBackdoorTap = () => { setSpeedBackdoor(v => { v += 1; if (v < 5) return v; navigation.navigate('ImportSpeed'); return 0; }); }; const renderOptionsAndImportButton = ( <> {isAdvancedModeEnabledRender && ( <> {loc.wallets.import_passphrase} {loc.wallets.import_search_accounts} )} <> ); return ( {loc.wallets.import_explanation} {Platform.select({ android: !isToolbarVisibleForAndroid && renderOptionsAndImportButton, default: renderOptionsAndImportButton })} {Platform.select({ ios: ( { setImportText(''); }} onPasteTapped={text => { setImportText(text); Keyboard.dismiss(); }} /> ), android: isToolbarVisibleForAndroid && ( { setImportText(''); Keyboard.dismiss(); }} onPasteTapped={text => { setImportText(text); Keyboard.dismiss(); }} /> ), })} ); }; WalletsImport.navigationOptions = navigationStyle({}, opts => ({ ...opts, title: loc.wallets.import_title })); export default WalletsImport;