Merge branch 'master' into amountregex

This commit is contained in:
marcosrdz 2020-11-12 09:29:14 -05:00
commit 61563bf8d6
12 changed files with 158 additions and 70 deletions

1
App.js
View File

@ -254,6 +254,7 @@ const App = () => {
style={styles.bottomModal}
deviceHeight={height}
onBackdropPress={hideClipboardContentModal}
onBackButtonPress={hideClipboardContentModal}
>
<KeyboardAvoidingView behavior={Platform.OS === 'ios' ? 'position' : null}>
<View style={[styles.modalContent, stylesHook.modalContent]}>

View File

@ -12,6 +12,9 @@
"dont_allow": "Запретить",
"yes": "Да",
"no": "Нет",
"save": "Сохранить",
"seed": "Сид-фраза",
"wallet_key": "Ключ кошелька",
"invalid_animated_qr_code_fragment" : "Ошибочный фрагмент QRCode, попробуйте снова",
"file_saved": "Файл ({filePath}) сохранён в папке Загрузки."
},
@ -115,13 +118,13 @@
"create_fake_storage": "Создать фальшивое хранилище",
"create_password": "Придумай пароль",
"create_password_explanation": "Пароль для фальшивого хранилища не должен быть таким же как основной пароль",
"help": "При определенных обстоятельствах тебя могут вынудить раскрыть пароль. Чтобы сохранить свой Bitcoin в безопасности, BlueWallet может создать еще одно зашифрованое хранилище, с другим паролем. В случае шантажа ты можешь раскрыть третьим лицам этот пароль. Если ввести этот пароль в BlueWallet, разблокируется 'фальшивое' хранилище. Это будет выглядеть правдоподобно для третьих лиц, но при этом сохранит ваше основное хранилище с Bitcoin в безопасности.",
"help": "При определенных обстоятельствах тебя могут вынудить раскрыть пароль. Чтобы сохранить свой Bitcoin в безопасности, BlueWallet может создать еще одно зашифрованное хранилище, с другим паролем. В случае шантажа ты можешь раскрыть третьим лицам этот пароль. Если ввести этот пароль в BlueWallet, разблокируется 'фальшивое' хранилище. Это будет выглядеть правдоподобно для третьих лиц, но при этом сохранит ваше основное хранилище с Bitcoin в безопасности.",
"help2": "Новое хранилище будет полностью функциональным и ты даже можешь хранить на нем немного Bitcoin, чтобы это выглядело более правдоподобно.",
"password_should_not_match": "Пароль для фальшивого хранилища не должен быть таким же как основной пароль",
"passwords_do_not_match": "Пароли не совпадают, попробуй еще раз",
"retype_password": "Набери пароль повторно",
"success": "Готово",
"title": "Правдоподобная имитация"
"title": "Двойное дно"
},
"pleasebackup": {
"ask": "Вы сохранили seed фразу вашего кошелька? Эта резервная фраза необходима для восстановления доступа к вашим средствам, если вы потеряете это устройство. Без резервной фразы ваши средства будут навсегда потеряны.",
@ -252,7 +255,7 @@
"encrypt_title": "Безопасность",
"encrypt_tstorage": "хранилище",
"encrypt_use": "Использовать {type}",
"encrypt_use_expl": "{тип} будет использоваться для подтверждения совершения транзакции, разблокировки, экспорта или удаления кошелька. {type} не будет использоваться для разблокировки зашифрованного хранилища.",
"encrypt_use_expl": "{type} будет использоваться для подтверждения совершения транзакции, разблокировки, экспорта или удаления кошелька. {type} не будет использоваться для разблокировки зашифрованного хранилища.",
"general": "Основные",
"general_adv_mode": "Включить расширенный режим",
"general_adv_mode_e": "При включении вы увидите расширенные параметры, такие как разные типы кошельков, возможность указать экземпляр LNDHub, к которому вы хотите подключиться, и пользовательскую энтропию при создании кошелька.",
@ -274,7 +277,7 @@
"password": "Пароль",
"password_explain": "Придумай пароль для расшифровки хранилища",
"passwords_do_not_match": "Пароли не совпадают",
"plausible_deniability": "Правдоподобная имитация...",
"plausible_deniability": "Двойное дно",
"privacy": "Приватность",
"privacy_read_clipboard": "Чтение Буфера обмена",
"privacy_read_clipboard_alert": "BlueWallet позволит быстро отправить Биткоины, если обнаружит адрес в Буфера обмена.",
@ -295,6 +298,8 @@
"cpfp_exp": "Мы создадим новую транзакцию, которая потратит вашу неподтвержденную. Общая сумма комиссии будет выше, чем первоначальная комиссия, поэтому она будет добыта быстрее. Это называется CPFP - ребенок платит за родителя.",
"cpfp_no_bump": "Нельзя повысить комиссию этой транзакции",
"cpfp_title": "Повысить комиссию (CPFP)",
"details_balance_hide": "Скрыть баланс",
"details_balance_show": "Показать баланс",
"details_block": "Номер Блока",
"details_copy": "копировать",
"details_from": "От",
@ -307,6 +312,7 @@
"details_transaction_details": "Детали транзакции",
"enable_hw": "Кошелек не используется вместе с аппаратным. Вы хотите включить поддержку аппаратного кошелека?",
"list_conf": "{number} подтв.",
"pending": "В процессе",
"list_title": "Мои транзакции",
"rbf_explain": "Мы заменим эту транзакцию другой с более высокой комиссией, поэтому будет обработана быстрее. Это называется RBF - Replace By Fee.",
"rbf_title": "Повысить комиссию (RBF)",
@ -315,7 +321,7 @@
"transactions_count": "кол-во транзакций"
},
"wallets": {
"add_bitcoin_explain": "Simple and powerful Bitcoin wallet",
"add_bitcoin_explain": "Простой и мощный Биткойн кошелек",
"add_bitcoin": "Bitcoin",
"add_create": "Создать",
"add_entropy_generated": "{gen} байтов сгенерированной энтории",
@ -324,7 +330,7 @@
"add_import_wallet": "Импортировать кошелек",
"import_file": "Импортировать файл",
"add_lightning": "Lightning",
"add_lightning_explain": "For spending with instant transactions",
"add_lightning_explain": "Для мгновенных переводов",
"add_lndhub": "Подключиться к своему LNDHub",
"add_lndhub_error": "Не верный адрес LNDHub.",
"add_lndhub_placeholder": "Адрес хоста",
@ -389,10 +395,11 @@
"xpub_title": "XPUB кошелька"
},
"multisig": {
"multisig_vault": "Vault",
"multisig_vault_explain": "Best security for large amounts",
"multisig_vault": "Хранилище",
"multisig_vault_explain": "Лучшая безопасность для больших сумм",
"provide_signature": "Предоставить подпись",
"vault_key": "Ключ хранилища {number}",
"required_keys_out_of_total": "Требуемое количество ключей",
"fee": "Коммисия: {number}",
"fee_btc": "{number} BTC",
"confirm": "Поддтвердить",
@ -402,6 +409,42 @@
"scan_or_import_file": "Сканировать или импортировать файл",
"export_coordination_setup": "экспортировать настройки координатора",
"cosign_this_transaction": "Участвовать в совместном подписании транзакции?",
"co_sign_transaction": "Подписать транзакцию \"по воздуху\" (QRCode)"
"lets_start": "Давайте начнем",
"create": "Создать",
"provide_key": "Предоставить ключ",
"native_segwit_title": "Лучшая практика",
"wrapped_segwit_title": "Лучшая совместимость",
"legacy_title": "Устаревший",
"co_sign_transaction": "Подписать транзакцию \"по воздуху\" (QRCode)",
"what_is_vault": "Хранилище — это",
"what_is_vault_numberOfWallets": "{m} из {n} мультисиг",
"what_is_vault_wallet": "кошелёк",
"vault_advanced_customize": "Настройки Хранилища...",
"needs": "Нужно",
"what_is_vault_description_number_of_vault_keys": "{m} ключа хранилища",
"what_is_vault_description_to_spend": "чтобы потратить и третий мы можете \nиспользовать как резервный",
"quorum": "{m} из {n} кворум",
"quorum_header": "Кворум",
"of": "из",
"wallet_type": "Тип кошелька",
"view_key": "посмотреть",
"invalid_mnemonics": "Сид-фраза не верна",
"invalid_cosigner": "Не действительные данные cosigner",
"invalid_cosigner_format": "Не верный cosigner: он не подходит для {format} формата",
"create_new_key": "Создать Новый",
"scan_or_open_file": "Сканировать или открыть файл",
"i_have_mnemonics": "У меня есть сид-фраза для этого ключа...",
"please_write_down_mnemonics": "Пожалуйста, запишите эту мнемоническую фразу на листе бумаги. Не волнуйтесь, это можно сделать и потом.",
"i_wrote_it_down": "Я всё записал!",
"type_your_mnemonics": "Вставьте сид-фразу для импорта вашего ключа хранилища",
"this_is_cosigners_xpub": "Это xpub cosigner'а готов к импорту в другой кошелёк. Делится им безопасно.",
"wallet_key_created": "Ваш ключ Хранилища был создан. Обязательно сделайте резервную копию вашей сид-фразы",
"are_you_sure_seed_will_be_lost": "Вы уверены? Ваша сид-фраза будет утеряна если нет резервной копии",
"forget_this_seed": "Забыть сид-фразу и использовать xpub вместо неё",
"invalid_fingerprint": "Отпечаток этой сид-фразы не соответствует отпечатку фразы cosigner'a ",
"view_edit_cosigners": "Просмотр/редактирование cosigner'ов",
"this_cosigner_is_already_imported": "Этот cosigner уже импортирован",
"export_signed_psbt": "Экспортировать PSBT с подписью",
"view_edit_cosigners_title": "Редактировать Cosigner'ов"
}
}

6
package-lock.json generated
View File

@ -10036,9 +10036,9 @@
}
},
"eslint-config-prettier": {
"version": "6.12.0",
"resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.12.0.tgz",
"integrity": "sha512-9jWPlFlgNwRUYVoujvWTQ1aMO8o6648r+K7qU7K5Jmkbyqav1fuEZC0COYpGBxyiAJb65Ra9hrmFx19xRGwXWw==",
"version": "6.14.0",
"resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.14.0.tgz",
"integrity": "sha512-DbVwh0qZhAC7CNDWcq8cBdK6FcVHiMTKmCypOPWeZkp9hJ8xYwTaWSa6bb6cjfi8KOeJy0e9a8Izxyx+O4+gCQ==",
"requires": {
"get-stdin": "^6.0.0"
}

View File

@ -98,7 +98,7 @@
"ecurve": "1.0.6",
"electrum-client": "git+https://github.com/BlueWallet/rn-electrum-client.git#f9a827e724a5a2e578fdfdb483f83793af55b030",
"electrum-mnemonic": "2.0.0",
"eslint-config-prettier": "6.12.0",
"eslint-config-prettier": "6.14.0",
"eslint-config-standard": "14.1.1",
"eslint-config-standard-react": "9.2.0",
"eslint-plugin-prettier": "3.1.4",

View File

@ -292,6 +292,7 @@ const ReceiveDetails = () => {
isVisible={isCustomModalVisible}
style={styles.bottomModal}
onBackdropPress={dismissCustomAmountModal}
onBackButtonPress={dismissCustomAmountModal}
>
<KeyboardAvoidingView behavior={Platform.OS === 'ios' ? 'position' : null}>
<View style={styles.modalContent}>

View File

@ -727,6 +727,8 @@ export default class SendDetails extends Component {
}
};
hideFeeSelectionModal = () => this.setState({ isFeeSelectionModalVisible: false });
renderFeeSelectionModal = () => {
const { feePrecalc, fee, networkTransactionFees: nf } = this.state;
const options = [
@ -759,7 +761,8 @@ export default class SendDetails extends Component {
deviceWidth={this.state.width + this.state.width / 2}
isVisible={this.state.isFeeSelectionModalVisible}
style={styles.bottomModal}
onBackdropPress={() => this.setState({ isFeeSelectionModalVisible: false })}
onBackdropPress={this.hideFeeSelectionModal}
onBackButtonPress={this.hideFeeSelectionModal}
>
<KeyboardAvoidingView behavior={Platform.OS === 'ios' ? 'position' : null}>
<View style={styles.modalContent}>
@ -993,6 +996,11 @@ export default class SendDetails extends Component {
);
};
hideAdvancedTransactionOptionsModal = () => {
Keyboard.dismiss();
this.setState({ isAdvancedTransactionOptionsVisible: false });
};
renderAdvancedTransactionOptionsModal = () => {
const isSendMaxUsed = this.state.addresses.some(element => element.amount === BitcoinUnit.MAX);
return (
@ -1001,10 +1009,8 @@ export default class SendDetails extends Component {
deviceWidth={this.state.width + this.state.width / 2}
isVisible={this.state.isAdvancedTransactionOptionsVisible}
style={styles.bottomModal}
onBackdropPress={() => {
Keyboard.dismiss();
this.setState({ isAdvancedTransactionOptionsVisible: false });
}}
onBackdropPress={this.hideAdvancedTransactionOptionsModal}
onBackButtonPress={this.hideAdvancedTransactionOptionsModal}
>
<KeyboardAvoidingView behavior={Platform.OS === 'ios' ? 'position' : null}>
<View style={styles.advancedTransactionOptionsModalContent}>

View File

@ -104,17 +104,20 @@ const WalletsAddMultisig = () => {
setN(n - 1);
};
const closeModal = () => {
Keyboard.dismiss();
setIsModalVisible(false);
};
const renderModal = () => {
return (
<Modal
isVisible={isModalVisible}
style={styles.bottomModal}
onBackdropPress={() => {
Keyboard.dismiss();
setIsModalVisible(false);
}}
deviceHeight={windowHeight}
deviceWidth={windowWidth}
onBackdropPress={closeModal}
onBackButtonPress={closeModal}
>
<KeyboardAvoidingView behavior={Platform.OS === 'ios' ? 'position' : null}>
<View style={[styles.modalContentShort, stylesHook.modalContentShort]}>

View File

@ -501,10 +501,11 @@ const WalletsAddMultisigStep2 = () => {
const renderMnemonicsModal = () => {
return (
<Modal
deviceHeight={windowHeight}
deviceWidth={windowWidth}
isVisible={isMnemonicsModalVisible}
style={styles.bottomModal}
onBackButtonPress={Keyboard.dismiss}
deviceHeight={windowHeight}
deviceWidth={windowWidth}
onBackdropPress={Keyboard.dismiss}
>
<View style={[styles.newKeyModalContent, stylesHook.modalContent]}>
@ -531,6 +532,12 @@ const WalletsAddMultisigStep2 = () => {
);
};
const hideProvideMnemonicsModal = () => {
Keyboard.dismiss();
setIsProvideMnemonicsModalVisible(false);
setImportText('');
};
const renderProvideMnemonicsModal = () => {
return (
<Modal
@ -538,11 +545,8 @@ const WalletsAddMultisigStep2 = () => {
deviceWidth={windowWidth}
isVisible={isProvideMnemonicsModalVisible}
style={styles.bottomModal}
onBackdropPress={() => {
Keyboard.dismiss();
setIsProvideMnemonicsModalVisible(false);
setImportText('');
}}
onBackdropPress={hideProvideMnemonicsModal}
onBackButtonPress={hideProvideMnemonicsModal}
>
<KeyboardAvoidingView behavior={Platform.OS === 'ios' ? 'position' : null}>
<View style={[styles.modalContent, stylesHook.modalContent]}>
@ -567,6 +571,11 @@ const WalletsAddMultisigStep2 = () => {
fs.writeFileAndExport(cosignerXpubFilename, cosignerXpub).finally(() => setIsLoading(false));
};
const hideCosignersXpubModal = () => {
Keyboard.dismiss();
setIsRenderCosignersXpubModalVisible(false);
};
const renderCosignersXpubModal = () => {
return (
<Modal
@ -574,10 +583,8 @@ const WalletsAddMultisigStep2 = () => {
deviceWidth={windowWidth}
isVisible={isRenderCosignersXpubModalVisible}
style={styles.bottomModal}
onBackdropPress={() => {
Keyboard.dismiss();
setIsRenderCosignersXpubModalVisible(false);
}}
onBackdropPress={hideCosignersXpubModal}
onBackButtonPress={hideCosignersXpubModal}
>
<KeyboardAvoidingView behavior={Platform.OS === 'ios' ? 'position' : null}>
<View style={[styles.modalContent, stylesHook.modalContent, styles.alignItemsCenter]}>

View File

@ -350,16 +350,19 @@ export default class HodlHodl extends Component {
return loc.hodl.filter_country_global;
}
hideChooseSideModal = () => {
Keyboard.dismiss();
this.setState({ isChooseSideModalVisible: false });
};
renderChooseSideModal = () => {
return (
<Modal
isVisible={this.state.isChooseSideModalVisible}
style={styles.bottomModal}
deviceHeight={windowHeight}
onBackdropPress={() => {
Keyboard.dismiss();
this.setState({ isChooseSideModalVisible: false });
}}
onBackdropPress={this.hideChooseSideModal}
onBackButtonPress={this.hideChooseSideModal}
>
<KeyboardAvoidingView behavior={Platform.OS === 'ios' ? 'position' : null}>
<View style={styles.modalContentShort}>
@ -390,6 +393,11 @@ export default class HodlHodl extends Component {
);
};
hideFiltersModal = () => {
Keyboard.dismiss();
this.setState({ isFiltersModalVisible: false });
};
renderFiltersModal = () => {
return (
<Modal
@ -405,10 +413,8 @@ export default class HodlHodl extends Component {
});
}
}}
onBackdropPress={() => {
Keyboard.dismiss();
this.setState({ isFiltersModalVisible: false });
}}
onBackdropPress={this.hideFiltersModal}
onBackButtonPress={this.hideFiltersModal}
>
<KeyboardAvoidingView behavior={Platform.OS === 'ios' ? 'position' : null}>
<View style={styles.modalContentShort}>
@ -462,6 +468,11 @@ export default class HodlHodl extends Component {
);
};
hideChooseCountryModal = () => {
Keyboard.dismiss();
this.setState({ isChooseCountryModalVisible: false });
};
renderChooseContryModal = () => {
const countries2render = [];
@ -503,10 +514,8 @@ export default class HodlHodl extends Component {
deviceHeight={windowHeight}
isVisible={this.state.isChooseCountryModalVisible}
style={styles.bottomModal}
onBackdropPress={() => {
Keyboard.dismiss();
this.setState({ isChooseCountryModalVisible: false });
}}
onBackdropPress={this.hideChooseCountryModal}
onBackButtonPress={this.hideChooseCountryModal}
>
<KeyboardAvoidingView behavior={Platform.OS === 'ios' ? 'position' : null}>
<View style={styles.modalContent}>
@ -550,6 +559,11 @@ export default class HodlHodl extends Component {
);
};
hideChooseCurrencyModal = () => {
Keyboard.dismiss();
this.setState({ isChooseCurrencyVisible: false });
};
renderChooseCurrencyModal = () => {
const currencies2render = [];
@ -580,10 +594,8 @@ export default class HodlHodl extends Component {
isVisible={this.state.isChooseCurrencyVisible}
style={styles.bottomModal}
deviceHeight={windowHeight}
onBackdropPress={() => {
Keyboard.dismiss();
this.setState({ isChooseCurrencyVisible: false });
}}
onBackdropPress={this.hideChooseCurrencyModal}
onBackButtonPress={this.hideChooseCurrencyModal}
>
<KeyboardAvoidingView behavior={Platform.OS === 'ios' ? 'position' : null}>
<View style={styles.modalContent}>
@ -627,6 +639,11 @@ export default class HodlHodl extends Component {
);
};
hideChooseMethodModal = () => {
Keyboard.dismiss();
this.setState({ isChooseMethodVisible: false });
};
renderChooseMethodModal = () => {
const methods2render = [];
@ -657,10 +674,8 @@ export default class HodlHodl extends Component {
isVisible={this.state.isChooseMethodVisible}
style={styles.bottomModal}
deviceHeight={windowHeight}
onBackdropPress={() => {
Keyboard.dismiss();
this.setState({ isChooseMethodVisible: false });
}}
onBackdropPress={this.hideChooseMethodModal}
onBackButtonPress={this.hideChooseMethodModal}
>
<KeyboardAvoidingView behavior={Platform.OS === 'ios' ? 'position' : null}>
<View style={styles.modalContent}>

View File

@ -163,6 +163,11 @@ export default class HodlHodlMyContracts extends Component {
});
}
hideContractModal = () => {
Keyboard.dismiss();
this.setState({ isRenderContractVisible: false });
};
renderContract = () => {
if (!this.state.contractToDisplay) return;
@ -171,10 +176,8 @@ export default class HodlHodlMyContracts extends Component {
isVisible={this.state.isRenderContractVisible}
style={styles.bottomModal}
deviceHeight={windowHeight}
onBackdropPress={() => {
Keyboard.dismiss();
this.setState({ isRenderContractVisible: false });
}}
onBackdropPress={this.hideContractModal}
onBackButtonPress={this.hideContractModal}
>
<KeyboardAvoidingView behavior={Platform.OS === 'ios' ? 'position' : null}>
<View style={styles.modalContent}>

View File

@ -248,6 +248,11 @@ const WalletTransactions = () => {
);
};
const hideManageFundsModal = () => {
Keyboard.dismiss();
setIsManageFundsModalVisible(false);
};
const renderManageFundsModal = () => {
return (
<Modal
@ -255,10 +260,8 @@ const WalletTransactions = () => {
deviceWidth={windowWidth}
isVisible={isManageFundsModalVisible}
style={styles.bottomModal}
onBackdropPress={() => {
Keyboard.dismiss();
setIsManageFundsModalVisible(false);
}}
onBackdropPress={hideManageFundsModal}
onBackButtonPress={hideManageFundsModal}
>
<KeyboardAvoidingView behavior={Platform.OS === 'ios' ? 'position' : null}>
<View style={[styles.advancedTransactionOptionsModalContent, stylesHook.advancedTransactionOptionsModalContent]}>

View File

@ -152,15 +152,18 @@ const ViewEditMultisigCosigners = () => {
}, []),
);
const hideMnemonicsModal = () => {
Keyboard.dismiss();
setIsMnemonicsModalVisible(false);
};
const renderMnemonicsModal = () => {
return (
<Modal
isVisible={isMnemonicsModalVisible}
style={styles.bottomModal}
onBackdropPress={() => {
Keyboard.dismiss();
setIsMnemonicsModalVisible(false);
}}
onBackdropPress={hideMnemonicsModal}
onBackButtonPress={hideMnemonicsModal}
>
<View style={[styles.newKeyModalContent, stylesHook.modalContent]}>
<View style={styles.itemKeyUnprovidedWrapper}>
@ -418,16 +421,19 @@ const ViewEditMultisigCosigners = () => {
}
};
const hideProvideMnemonicsModal = () => {
Keyboard.dismiss();
setIsProvideMnemonicsModalVisible(false);
setImportText('');
};
const renderProvideMnemonicsModal = () => {
return (
<Modal
isVisible={isProvideMnemonicsModalVisible}
style={styles.bottomModal}
onBackdropPress={() => {
Keyboard.dismiss();
setIsProvideMnemonicsModalVisible(false);
setImportText('');
}}
onBackdropPress={hideProvideMnemonicsModal}
onBackButtonPress={hideProvideMnemonicsModal}
>
<KeyboardAvoidingView behavior={Platform.OS === 'ios' ? 'position' : null}>
<View style={[styles.modalContent, stylesHook.modalContent]}>