ADD: view of QR code of Vault key zpub after vault is created (closes #2410)

This commit is contained in:
Overtorment 2021-01-04 17:34:47 +00:00
parent 15a7b21c6a
commit 6c5b45f637

View file

@ -31,7 +31,7 @@ import {
} from '../../BlueComponents'; } from '../../BlueComponents';
import SquareEnumeratedWords, { SquareEnumeratedWordsContentAlign } from '../../components/SquareEnumeratedWords'; import SquareEnumeratedWords, { SquareEnumeratedWordsContentAlign } from '../../components/SquareEnumeratedWords';
import BottomModal from '../../components/BottomModal'; import BottomModal from '../../components/BottomModal';
import { HDSegwitBech32Wallet, MultisigHDWallet } from '../../class'; import { HDSegwitBech32Wallet, MultisigCosigner, MultisigHDWallet } from '../../class';
import loc from '../../loc'; import loc from '../../loc';
import { BlueStorageContext } from '../../blue_modules/storage-context'; import { BlueStorageContext } from '../../blue_modules/storage-context';
import MultipleStepsListItem, { import MultipleStepsListItem, {
@ -40,6 +40,8 @@ import MultipleStepsListItem, {
} from '../../components/MultipleStepsListItem'; } from '../../components/MultipleStepsListItem';
import Privacy from '../../Privacy'; import Privacy from '../../Privacy';
import Biometric from '../../class/biometrics'; import Biometric from '../../class/biometrics';
import QRCode from 'react-native-qrcode-svg';
import { SquareButton } from '../../components/SquareButton';
const fs = require('../../blue_modules/fs'); const fs = require('../../blue_modules/fs');
const isDesktop = getSystemName() === 'Mac OS X'; const isDesktop = getSystemName() === 'Mac OS X';
@ -51,13 +53,16 @@ const ViewEditMultisigCosigners = () => {
const { walletId } = route.params; const { walletId } = route.params;
const w = useRef(wallets.find(wallet => wallet.getID() === walletId)); const w = useRef(wallets.find(wallet => wallet.getID() === walletId));
const tempWallet = useRef(new MultisigHDWallet()); const tempWallet = useRef(new MultisigHDWallet());
const [wallet, setWallet] = useState(); const [wallet: MultisigHDWallet, setWallet] = useState();
const [isLoading, setIsLoading] = useState(true); const [isLoading, setIsLoading] = useState(true);
const [isSaveButtonDisabled, setIsSaveButtonDisabled] = useState(true); const [isSaveButtonDisabled, setIsSaveButtonDisabled] = useState(true);
const [currentlyEditingCosignerNum, setCurrentlyEditingCosignerNum] = useState(false); const [currentlyEditingCosignerNum, setCurrentlyEditingCosignerNum] = useState(false);
const [isProvideMnemonicsModalVisible, setIsProvideMnemonicsModalVisible] = useState(false); const [isProvideMnemonicsModalVisible, setIsProvideMnemonicsModalVisible] = useState(false);
const [isMnemonicsModalVisible, setIsMnemonicsModalVisible] = useState(false); const [isMnemonicsModalVisible, setIsMnemonicsModalVisible] = useState(false);
const [isShareModalVisible, setIsShareModalVisible] = useState(false);
const [importText, setImportText] = useState(''); const [importText, setImportText] = useState('');
const [exportString, setExportString] = useState('{}');
const [exportFilename, setExportFilename] = useState('bw-cosigner.json');
const [vaultKeyData, setVaultKeyData] = useState({ keyIndex: 1, xpub: '', seed: '', path: '', fp: '', isLoading: false }); // string rendered in modal const [vaultKeyData, setVaultKeyData] = useState({ keyIndex: 1, xpub: '', seed: '', path: '', fp: '', isLoading: false }); // string rendered in modal
const data = useRef(); const data = useRef();
const stylesHook = StyleSheet.create({ const stylesHook = StyleSheet.create({
@ -127,6 +132,12 @@ const ViewEditMultisigCosigners = () => {
}, },
}); });
const exportCosigner = () => {
setIsShareModalVisible(false);
setIsLoading(true);
fs.writeFileAndExport(exportFilename, exportString).finally(() => setIsLoading(false));
};
const onSave = async () => { const onSave = async () => {
setIsLoading(true); setIsLoading(true);
@ -225,6 +236,16 @@ const ViewEditMultisigCosigners = () => {
</> </>
)} )}
<BlueSpacing20 /> <BlueSpacing20 />
<BlueButton
title={loc.multisig.share}
onPress={() => {
setIsMnemonicsModalVisible(false);
setTimeout(() => {
setIsShareModalVisible(true);
}, 1000);
}}
/>
<BlueSpacing20 />
<BlueButton title={loc.send.success_done} onPress={() => setIsMnemonicsModalVisible(false)} /> <BlueButton title={loc.send.success_done} onPress={() => setIsMnemonicsModalVisible(false)} />
<BlueSpacing40 /> <BlueSpacing40 />
</View> </View>
@ -263,14 +284,20 @@ const ViewEditMultisigCosigners = () => {
text: loc.multisig.view, text: loc.multisig.view,
disabled: vaultKeyData.isLoading, disabled: vaultKeyData.isLoading,
onPress: () => { onPress: () => {
const keyIndex = el.index + 1;
const xpub = wallet.getCosigner(keyIndex);
const fp = wallet.getFingerprint(keyIndex);
const path = wallet.getCustomDerivationPathForCosigner(keyIndex);
setVaultKeyData({ setVaultKeyData({
keyIndex: el.index + 1, keyIndex,
seed: '', seed: '',
xpub: wallet.getCosigner(el.index + 1), xpub,
fp: wallet.getFingerprint(el.index + 1), fp,
path: wallet.getCustomDerivationPathForCosigner(el.index + 1), path,
isLoading: false, isLoading: false,
}); });
setExportString(MultisigCosigner.exportToJson(fp, xpub, path));
setExportFilename('bw-cosigner-' + fp + '.json');
setIsMnemonicsModalVisible(true); setIsMnemonicsModalVisible(true);
}, },
}} }}
@ -302,15 +329,22 @@ const ViewEditMultisigCosigners = () => {
disabled: vaultKeyData.isLoading, disabled: vaultKeyData.isLoading,
buttonType: MultipleStepsListItemButtohType.partial, buttonType: MultipleStepsListItemButtohType.partial,
onPress: () => { onPress: () => {
const keyIndex = el.index + 1;
const seed = wallet.getCosigner(keyIndex);
setVaultKeyData({ setVaultKeyData({
keyIndex: el.index + 1, keyIndex,
seed: wallet.getCosigner(el.index + 1), seed,
xpub: '', xpub: '',
fp: '', fp: '',
path: '', path: '',
isLoading: false, isLoading: false,
}); });
setIsMnemonicsModalVisible(true); setIsMnemonicsModalVisible(true);
const fp = wallet.getFingerprint(keyIndex);
const path = wallet.getCustomDerivationPathForCosigner(keyIndex);
const xpub = wallet.convertXpubToMultisignatureXpub(MultisigHDWallet.seedToXpub(seed, path));
setExportString(MultisigCosigner.exportToJson(fp, xpub, path));
setExportFilename('bw-cosigner-' + fp + '.json');
}, },
}} }}
dashes={MultipleStepsListItemDashType.topAndBottom} dashes={MultipleStepsListItemDashType.topAndBottom}
@ -431,6 +465,10 @@ const ViewEditMultisigCosigners = () => {
setImportText(''); setImportText('');
}; };
const hideShareModal = () => {
setIsShareModalVisible(false);
};
const renderProvideMnemonicsModal = () => { const renderProvideMnemonicsModal = () => {
return ( return (
<BottomModal isVisible={isProvideMnemonicsModalVisible} onClose={hideProvideMnemonicsModal}> <BottomModal isVisible={isProvideMnemonicsModalVisible} onClose={hideProvideMnemonicsModal}>
@ -456,6 +494,32 @@ const ViewEditMultisigCosigners = () => {
); );
}; };
const renderShareModal = () => {
return (
<BottomModal isVisible={isShareModalVisible} onClose={hideShareModal}>
<KeyboardAvoidingView behavior={Platform.OS === 'ios' ? 'position' : null}>
<View style={[styles.modalContent, stylesHook.modalContent, styles.alignItemsCenter]}>
<Text style={[styles.headerText, stylesHook.textDestination]}>{loc.multisig.this_is_cosigners_xpub}</Text>
<View style={styles.qrCodeContainer}>
<QRCode
value={exportString}
size={260}
color="#000000"
logoBackgroundColor={colors.brandingColor}
backgroundColor="#FFFFFF"
ecl="H"
/>
</View>
<BlueSpacing20 />
<View style={styles.squareButtonWrapper}>
<SquareButton style={[styles.exportButton, stylesHook.exportButton]} onPress={exportCosigner} title={loc.multisig.share} />
</View>
</View>
</KeyboardAvoidingView>
</BottomModal>
);
};
if (isLoading) if (isLoading)
return ( return (
<View style={[styles.root, stylesHook.root]}> <View style={[styles.root, stylesHook.root]}>
@ -501,6 +565,8 @@ const ViewEditMultisigCosigners = () => {
{renderProvideMnemonicsModal()} {renderProvideMnemonicsModal()}
{renderShareModal()}
{renderMnemonicsModal()} {renderMnemonicsModal()}
</View> </View>
); );
@ -611,6 +677,7 @@ const styles = StyleSheet.create({
position: 'relative', position: 'relative',
bottom: -3, bottom: -3,
}, },
qrCodeContainer: { borderWidth: 6, borderRadius: 8, borderColor: '#FFFFFF' },
tipLabelText: { tipLabelText: {
fontWeight: '500', fontWeight: '500',
} }