mirror of
https://github.com/BlueWallet/BlueWallet.git
synced 2025-02-22 06:52:41 +01:00
REF: Encrypt/Decrypt prompt
This commit is contained in:
parent
fa22b41269
commit
6f3e02c8a4
50 changed files with 460 additions and 175 deletions
|
@ -5,10 +5,9 @@ import { Keyboard, StyleSheet, View, TouchableOpacity, Platform, Image } from 'r
|
|||
interface BottomModalProps extends TrueSheetProps {
|
||||
children?: React.ReactNode;
|
||||
onClose?: () => void;
|
||||
name?: string;
|
||||
isGrabberVisible?: boolean;
|
||||
sizes?: SheetSize[] | undefined;
|
||||
footer?: ReactElement | ComponentType<any>;
|
||||
footer?: ReactElement | ComponentType<any> | null;
|
||||
footerDefaultMargins?: boolean | number;
|
||||
onPresent?: () => void;
|
||||
onSizeChange?: (size: SizeInfo) => void;
|
||||
|
@ -42,7 +41,6 @@ const styles = StyleSheet.create({
|
|||
const BottomModal = forwardRef<BottomModalHandle, BottomModalProps>(
|
||||
(
|
||||
{
|
||||
name,
|
||||
onClose,
|
||||
onPresent,
|
||||
onSizeChange,
|
||||
|
|
285
components/PromptPasswordConfirmationModal.tsx
Normal file
285
components/PromptPasswordConfirmationModal.tsx
Normal file
|
@ -0,0 +1,285 @@
|
|||
import React, { useState, useRef, forwardRef, useImperativeHandle, useEffect } from 'react';
|
||||
import { View, Text, TextInput, StyleSheet, Animated, Easing, ViewStyle } from 'react-native';
|
||||
import BottomModal, { BottomModalHandle } from './BottomModal';
|
||||
import { useTheme } from './themes';
|
||||
import loc from '../loc';
|
||||
import { SecondButton } from './SecondButton';
|
||||
import triggerHapticFeedback, { HapticFeedbackTypes } from '../blue_modules/hapticFeedback';
|
||||
|
||||
export const MODAL_TYPES = {
|
||||
ENTER_PASSWORD: 'ENTER_PASSWORD',
|
||||
CREATE_PASSWORD: 'CREATE_PASSWORD',
|
||||
} as const;
|
||||
|
||||
export type ModalType = (typeof MODAL_TYPES)[keyof typeof MODAL_TYPES];
|
||||
|
||||
interface PromptPasswordConfirmationModalProps {
|
||||
modalType: ModalType;
|
||||
onConfirmationSuccess: (password: string) => Promise<boolean>;
|
||||
onConfirmationFailure: () => void;
|
||||
onDismiss?: () => void;
|
||||
}
|
||||
|
||||
export interface PromptPasswordConfirmationModalHandle {
|
||||
present: () => Promise<void>;
|
||||
dismiss: () => Promise<void>;
|
||||
}
|
||||
|
||||
const PromptPasswordConfirmationModal = forwardRef<PromptPasswordConfirmationModalHandle, PromptPasswordConfirmationModalProps>(
|
||||
({ modalType, onConfirmationSuccess, onConfirmationFailure, onDismiss }, ref) => {
|
||||
const [password, setPassword] = useState('');
|
||||
const [confirmPassword, setConfirmPassword] = useState('');
|
||||
const [isLoading, setIsLoading] = useState(false);
|
||||
const [isSuccess, setIsSuccess] = useState(false);
|
||||
const modalRef = useRef<BottomModalHandle>(null);
|
||||
const fadeOutAnimation = useRef(new Animated.Value(1)).current;
|
||||
const fadeInAnimation = useRef(new Animated.Value(0)).current;
|
||||
const scaleAnimation = useRef(new Animated.Value(1)).current;
|
||||
const { colors } = useTheme();
|
||||
|
||||
const stylesHook = StyleSheet.create({
|
||||
modalContent: {
|
||||
backgroundColor: colors.elevated,
|
||||
width: '100%',
|
||||
},
|
||||
input: {
|
||||
backgroundColor: colors.inputBackgroundColor,
|
||||
borderColor: colors.formBorder,
|
||||
color: colors.foregroundColor,
|
||||
width: '100%',
|
||||
},
|
||||
feeModalCustomText: {
|
||||
color: colors.buttonAlternativeTextColor,
|
||||
},
|
||||
feeModalLabel: {
|
||||
color: colors.successColor,
|
||||
},
|
||||
});
|
||||
|
||||
useImperativeHandle(ref, () => ({
|
||||
present: async () => {
|
||||
resetState();
|
||||
modalRef.current?.present();
|
||||
},
|
||||
dismiss: async () => modalRef.current?.dismiss(),
|
||||
}));
|
||||
|
||||
const resetState = () => {
|
||||
setPassword('');
|
||||
setConfirmPassword('');
|
||||
setIsSuccess(false);
|
||||
setIsLoading(false);
|
||||
fadeOutAnimation.setValue(1);
|
||||
fadeInAnimation.setValue(0);
|
||||
scaleAnimation.setValue(1);
|
||||
};
|
||||
|
||||
const handleSuccessAnimation = () => {
|
||||
Animated.parallel([
|
||||
Animated.timing(fadeOutAnimation, {
|
||||
toValue: 0,
|
||||
duration: 300,
|
||||
easing: Easing.inOut(Easing.ease),
|
||||
useNativeDriver: true,
|
||||
}),
|
||||
Animated.timing(scaleAnimation, {
|
||||
toValue: 1.1,
|
||||
duration: 300,
|
||||
easing: Easing.inOut(Easing.ease),
|
||||
useNativeDriver: true,
|
||||
}),
|
||||
]).start(() => {
|
||||
setIsSuccess(true);
|
||||
Animated.timing(fadeInAnimation, {
|
||||
toValue: 1,
|
||||
duration: 500,
|
||||
easing: Easing.out(Easing.ease),
|
||||
useNativeDriver: true,
|
||||
}).start(() => {
|
||||
setTimeout(() => {
|
||||
modalRef.current?.dismiss();
|
||||
}, 1000);
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
const handleSubmit = async () => {
|
||||
setIsLoading(true);
|
||||
let success = false;
|
||||
if (modalType === MODAL_TYPES.CREATE_PASSWORD) {
|
||||
if (password === confirmPassword && password) {
|
||||
success = await onConfirmationSuccess(password);
|
||||
if (success) {
|
||||
triggerHapticFeedback(HapticFeedbackTypes.NotificationSuccess);
|
||||
handleSuccessAnimation();
|
||||
} else {
|
||||
triggerHapticFeedback(HapticFeedbackTypes.NotificationError);
|
||||
setIsLoading(false);
|
||||
onConfirmationFailure();
|
||||
}
|
||||
} else {
|
||||
setIsLoading(false);
|
||||
triggerHapticFeedback(HapticFeedbackTypes.NotificationError);
|
||||
onConfirmationFailure();
|
||||
}
|
||||
} else if (modalType === MODAL_TYPES.ENTER_PASSWORD) {
|
||||
success = await onConfirmationSuccess(password);
|
||||
setIsLoading(false);
|
||||
if (success) {
|
||||
triggerHapticFeedback(HapticFeedbackTypes.NotificationSuccess);
|
||||
handleSuccessAnimation();
|
||||
} else {
|
||||
triggerHapticFeedback(HapticFeedbackTypes.NotificationError);
|
||||
onConfirmationFailure();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
const handleCancel = async () => {
|
||||
resetState();
|
||||
onConfirmationFailure();
|
||||
await modalRef.current?.dismiss();
|
||||
};
|
||||
|
||||
useEffect(() => {
|
||||
resetState();
|
||||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||
}, [modalType]);
|
||||
|
||||
const animatedViewStyle: Animated.WithAnimatedObject<ViewStyle> = {
|
||||
opacity: fadeOutAnimation,
|
||||
transform: [{ scale: scaleAnimation }],
|
||||
width: '100%',
|
||||
};
|
||||
|
||||
return (
|
||||
<BottomModal
|
||||
ref={modalRef}
|
||||
showCloseButton={false}
|
||||
onDismiss={onDismiss}
|
||||
grabber={false}
|
||||
sizes={[350]}
|
||||
backgroundColor={colors.modal}
|
||||
contentContainerStyle={styles.modalContent}
|
||||
footer={
|
||||
(!isSuccess && (
|
||||
<Animated.View style={{ opacity: fadeOutAnimation, transform: [{ scale: scaleAnimation }] }}>
|
||||
<View style={styles.feeModalFooter}>
|
||||
<SecondButton title={loc._.cancel} onPress={handleCancel} disabled={isLoading} />
|
||||
<View style={styles.feeModalFooterSpacing} />
|
||||
<SecondButton
|
||||
title={isLoading ? '' : loc._.ok}
|
||||
onPress={handleSubmit}
|
||||
loading={isLoading}
|
||||
disabled={isLoading || !password || (modalType === MODAL_TYPES.CREATE_PASSWORD && !confirmPassword)}
|
||||
/>
|
||||
</View>
|
||||
</Animated.View>
|
||||
)) ||
|
||||
null
|
||||
}
|
||||
>
|
||||
{!isSuccess && (
|
||||
<Animated.View style={animatedViewStyle}>
|
||||
<Text style={[styles.textLabel, stylesHook.feeModalLabel]}>
|
||||
{modalType === MODAL_TYPES.CREATE_PASSWORD ? loc.settings.password_explain : loc._.enter_password}
|
||||
</Text>
|
||||
<View style={styles.inputContainer}>
|
||||
<TextInput
|
||||
testID="PasswordInput"
|
||||
secureTextEntry
|
||||
placeholder="Password"
|
||||
value={password}
|
||||
onChangeText={setPassword}
|
||||
style={[styles.input, stylesHook.input]}
|
||||
autoFocus
|
||||
onSubmitEditing={handleSubmit} // Handle Enter key as OK
|
||||
/>
|
||||
{modalType === MODAL_TYPES.CREATE_PASSWORD && (
|
||||
<TextInput
|
||||
testID="ConfirmPasswordInput"
|
||||
secureTextEntry
|
||||
placeholder="Confirm Password"
|
||||
value={confirmPassword}
|
||||
onChangeText={setConfirmPassword}
|
||||
style={[styles.input, stylesHook.input]}
|
||||
onSubmitEditing={handleSubmit} // Handle Enter key as OK
|
||||
/>
|
||||
)}
|
||||
</View>
|
||||
</Animated.View>
|
||||
)}
|
||||
{isSuccess && (
|
||||
<Animated.View
|
||||
style={{
|
||||
opacity: fadeInAnimation,
|
||||
transform: [{ scale: scaleAnimation }],
|
||||
}}
|
||||
>
|
||||
<View style={styles.successContainer}>
|
||||
<View style={styles.circle}>
|
||||
<Text style={styles.checkmark}>✔️</Text>
|
||||
</View>
|
||||
</View>
|
||||
</Animated.View>
|
||||
)}
|
||||
</BottomModal>
|
||||
);
|
||||
},
|
||||
);
|
||||
|
||||
export default PromptPasswordConfirmationModal;
|
||||
|
||||
const styles = StyleSheet.create({
|
||||
modalContent: {
|
||||
padding: 22,
|
||||
justifyContent: 'center',
|
||||
alignItems: 'center',
|
||||
flex: 1,
|
||||
width: '100%', // Ensure modal content takes full width
|
||||
},
|
||||
feeModalFooter: {
|
||||
paddingBottom: 36,
|
||||
paddingHorizontal: 24,
|
||||
flexDirection: 'row',
|
||||
justifyContent: 'space-between',
|
||||
},
|
||||
feeModalFooterSpacing: {
|
||||
paddingHorizontal: 24,
|
||||
},
|
||||
inputContainer: {
|
||||
marginBottom: 10,
|
||||
width: '100%', // Ensure full width
|
||||
},
|
||||
input: {
|
||||
borderWidth: 1,
|
||||
borderRadius: 4,
|
||||
padding: 8,
|
||||
marginVertical: 8,
|
||||
fontSize: 16,
|
||||
width: '100%', // Ensure full width
|
||||
},
|
||||
textLabel: {
|
||||
fontSize: 22,
|
||||
fontWeight: '600',
|
||||
marginBottom: 16,
|
||||
textAlign: 'center',
|
||||
},
|
||||
successContainer: {
|
||||
justifyContent: 'center',
|
||||
alignItems: 'center',
|
||||
height: 100,
|
||||
},
|
||||
circle: {
|
||||
width: 60,
|
||||
height: 60,
|
||||
borderRadius: 30,
|
||||
backgroundColor: 'green',
|
||||
justifyContent: 'center',
|
||||
alignItems: 'center',
|
||||
},
|
||||
checkmark: {
|
||||
color: 'white',
|
||||
fontSize: 30,
|
||||
},
|
||||
});
|
|
@ -1,5 +1,5 @@
|
|||
import React, { forwardRef } from 'react';
|
||||
import { StyleSheet, Text, TouchableOpacity, View } from 'react-native';
|
||||
import { StyleSheet, Text, TouchableOpacity, View, ActivityIndicator } from 'react-native';
|
||||
import { Icon } from '@rneui/themed';
|
||||
|
||||
import { useTheme } from './themes';
|
||||
|
@ -16,6 +16,7 @@ type SecondButtonProps = {
|
|||
icon?: IconProps;
|
||||
title?: string;
|
||||
onPress?: () => void;
|
||||
loading?: boolean;
|
||||
};
|
||||
|
||||
export const SecondButton = forwardRef<TouchableOpacity, SecondButtonProps>((props, ref) => {
|
||||
|
@ -27,7 +28,9 @@ export const SecondButton = forwardRef<TouchableOpacity, SecondButtonProps>((pro
|
|||
fontColor = colors.buttonDisabledTextColor;
|
||||
}
|
||||
|
||||
const buttonView = (
|
||||
const buttonView = props.loading ? (
|
||||
<ActivityIndicator size="small" color={colors.buttonTextColor} />
|
||||
) : (
|
||||
<View style={styles.view}>
|
||||
{props.icon && <Icon name={props.icon.name} type={props.icon.type} color={props.icon.color} />}
|
||||
{props.title && <Text style={[styles.text, { color: fontColor }]}>{props.title}</Text>}
|
||||
|
@ -36,7 +39,7 @@ export const SecondButton = forwardRef<TouchableOpacity, SecondButtonProps>((pro
|
|||
|
||||
return props.onPress ? (
|
||||
<TouchableOpacity
|
||||
disabled={props.disabled}
|
||||
disabled={props.disabled || props.loading}
|
||||
accessibilityRole="button"
|
||||
style={[styles.button, { backgroundColor }]}
|
||||
{...props}
|
||||
|
|
|
@ -131,7 +131,7 @@
|
|||
B4D0B2682C1DED67006B6B1B /* ReceiveMethod.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4D0B2672C1DED67006B6B1B /* ReceiveMethod.swift */; };
|
||||
B4EE583C226703320003363C /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = B40D4E35225841ED00428FCC /* Assets.xcassets */; };
|
||||
B4EFF73B2C3F6C5E0095D655 /* MockData.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4EFF73A2C3F6C5E0095D655 /* MockData.swift */; };
|
||||
C978A716948AB7DEC5B6F677 /* (null) in Frameworks */ = {isa = PBXBuildFile; };
|
||||
C978A716948AB7DEC5B6F677 /* BuildFile in Frameworks */ = {isa = PBXBuildFile; };
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
/* Begin PBXContainerItemProxy section */
|
||||
|
@ -383,7 +383,7 @@
|
|||
files = (
|
||||
782F075B5DD048449E2DECE9 /* libz.tbd in Frameworks */,
|
||||
764B49B1420D4AEB8109BF62 /* libsqlite3.0.tbd in Frameworks */,
|
||||
C978A716948AB7DEC5B6F677 /* (null) in Frameworks */,
|
||||
C978A716948AB7DEC5B6F677 /* BuildFile in Frameworks */,
|
||||
773E382FE62E836172AAB98B /* libPods-BlueWallet.a in Frameworks */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
|
|
|
@ -95,7 +95,7 @@
|
|||
"help2": "ستعمل وحدة التخزين الجديدة بكامل طاقتها، ويمكنك تخزين بعض المبالغ البسيطة هناك بحيث تبدو أكثر مصداقية ومنطقية.",
|
||||
"password_should_not_match": "كلمة المرور قيد الاستخدام حاليًا. يُرجى تجربة كلمة مرور مختلفة.",
|
||||
"passwords_do_not_match": "كلمات المرور غير متطابقة، حاول مرة أخرى.",
|
||||
"retype_password": "أعد إدخال كلمة المرور",
|
||||
"confirm_password": "أعد إدخال كلمة المرور",
|
||||
"success": "نجحت العملية",
|
||||
"title": "الإنكار المقبول"
|
||||
},
|
||||
|
@ -292,7 +292,7 @@
|
|||
"privacy_do_not_track_explanation": "لن يتم إرسال التحليلات المتعلقة بأداء وقابلية تشغيل المحفظة إلينا.",
|
||||
"push_notifications": "الإشعارات الفورية",
|
||||
"rate": "سعر الصرف",
|
||||
"retype_password": "إعادة إدخال كلمة المرور",
|
||||
"confirm_password": "إعادة إدخال كلمة المرور",
|
||||
"selfTest": "اختبار ذاتي",
|
||||
"save": "حفظ",
|
||||
"saved": "تم الحفظ",
|
||||
|
|
|
@ -62,7 +62,7 @@
|
|||
"help2": "Новото хранилище ще бъде напълно функционално и може да държите минимални средства в него. Така ще изглежда като легитимен портфеил.",
|
||||
"password_should_not_match": "Моля, изберете различна парола.",
|
||||
"passwords_do_not_match": "Паролите не съвпадат. Моля, опитайте отново.",
|
||||
"retype_password": "Повторете паролата",
|
||||
"confirm_password": "Повторете паролата",
|
||||
"success": "Успех",
|
||||
"title": "Plausible Deniability"
|
||||
},
|
||||
|
@ -195,7 +195,7 @@
|
|||
"general": "Основно",
|
||||
"general_adv_mode": "Развирени Настройки",
|
||||
"plausible_deniability": "Plausible Deniability",
|
||||
"retype_password": "Повторете паролата",
|
||||
"confirm_password": "Повторете паролата",
|
||||
"save": "Запази"
|
||||
},
|
||||
"transactions": {
|
||||
|
|
|
@ -97,7 +97,7 @@
|
|||
"create_password_explanation": "رزمی که سی جاگه زفت کردنی جعلی هڌ، نوا وا رزم جاگه زفت کردنی السی یه جۊر بۊ.",
|
||||
"password_should_not_match": "رزم هونی به کار اروه. یه رزم دیری نه به کار بگر.",
|
||||
"passwords_do_not_match": "رزمات جۊر یک نؽڌن، زه نۊ امتهانسۉ کو.",
|
||||
"retype_password": "رزمنه زه نۊ هؽل کو",
|
||||
"confirm_password": "رزمنه زه نۊ هؽل کو",
|
||||
"success": "سر ٱنجوم گرهڌ"
|
||||
},
|
||||
"pleasebackup": {
|
||||
|
@ -254,7 +254,7 @@
|
|||
"privacy_read_clipboard": "خوندن ویرگه",
|
||||
"privacy_system_settings": "سامووا دسگا",
|
||||
"rate": "نرخ",
|
||||
"retype_password": "رزمنه زه نۊ هؽل کو",
|
||||
"confirm_password": "رزمنه زه نۊ هؽل کو",
|
||||
"save": "زفت کردن",
|
||||
"saved": "زفت وابی",
|
||||
"widgets": "اوزارکا",
|
||||
|
|
|
@ -91,7 +91,7 @@
|
|||
"help2": "El moneder \"false\" és completament funcional. Pot dipositar una quantitat mínima perquè sigui més creïble.",
|
||||
"password_should_not_match": "La contrasenya no pot ser la mateixa que la del seu moneder principal.",
|
||||
"passwords_do_not_match": "Les contrasenyes no coincideixin. Torni-ho a intentar",
|
||||
"retype_password": "Tornar a escriure la contrasenya",
|
||||
"confirm_password": "Tornar a escriure la contrasenya",
|
||||
"success": "Exit",
|
||||
"title": "Negació plausible"
|
||||
},
|
||||
|
@ -222,7 +222,7 @@
|
|||
"privacy": "Privacitat",
|
||||
"privacy_read_clipboard": "Llegir el portapapers",
|
||||
"privacy_system_settings": "Configuració del Sistema",
|
||||
"retype_password": "Introdueix de nou la contrasenya contrasenya",
|
||||
"confirm_password": "Introdueix de nou la contrasenya contrasenya",
|
||||
"save": "guardar",
|
||||
"saved": "Desat",
|
||||
"total_balance": "Saldo total",
|
||||
|
|
|
@ -103,7 +103,7 @@
|
|||
"help2": "Nové úložiště bude plně funkční, můžete na něj uložit minimální částku, aby vypadalo více uvěřitelně.",
|
||||
"password_should_not_match": "Heslo k falešnému úložišti nesmí být stejné jako heslo k hlavnímu úložišti.",
|
||||
"passwords_do_not_match": "Hesla se neshodují. Zkuste to prosím znovu.",
|
||||
"retype_password": "Zadejte heslo znovu",
|
||||
"confirm_password": "Zadejte heslo znovu",
|
||||
"success": "Úspěch",
|
||||
"title": "Věrohodná popiratelnost"
|
||||
},
|
||||
|
@ -322,7 +322,7 @@
|
|||
"privacy_do_not_track_explanation": "Informace o výkonu a spolehlivosti nebudou odesílány k analýze.",
|
||||
"push_notifications": "Push oznámení",
|
||||
"rate": "Kurz",
|
||||
"retype_password": "Zadejte heslo znovu",
|
||||
"confirm_password": "Zadejte heslo znovu",
|
||||
"selfTest": "Autotest",
|
||||
"save": "Uložit",
|
||||
"saved": "Uloženo",
|
||||
|
|
|
@ -52,7 +52,7 @@
|
|||
"create_password_explanation": "Ni ddyliai'r cyfrinair ar gyfer y storfa ffug fod yr un cyfrinair ag ar gyfer y brif storfa",
|
||||
"password_should_not_match": "Mae'r cyfrinair yn cael ei ddefnyddio'n barod. Tria gyfrinair gwahanol.",
|
||||
"passwords_do_not_match": "Cyfrineiriau ddim yn gweddu. Tria eto.",
|
||||
"retype_password": "Ail-deipio'r cyfrinair",
|
||||
"confirm_password": "Ail-deipio'r cyfrinair",
|
||||
"success": "Llwyddiant"
|
||||
},
|
||||
"pleasebackup": {
|
||||
|
@ -134,7 +134,7 @@
|
|||
"password_explain": "Creu'r cyfrinair y byddi'n defnyddio i ddadgryptio'r storfa.",
|
||||
"passwords_do_not_match": "Cyfrineiriau ddim yn cyfateb.",
|
||||
"privacy": "Prefiatrwydd",
|
||||
"retype_password": "Ail-deipio cyfrinair",
|
||||
"confirm_password": "Ail-deipio cyfrinair",
|
||||
"save": "Safio",
|
||||
"saved": "Wedi Safio",
|
||||
"total_balance": "Balans Llawn"
|
||||
|
|
|
@ -28,7 +28,7 @@
|
|||
"help2": "Det nye lager vil være fuldt funktionsdygtigt, og du kan evt have nogle småbeløb så det ser troværdigt ud.",
|
||||
"password_should_not_match": "Adgangskoden til det falske lager må ikke være den samme som den du bruger til det rigtige lager",
|
||||
"passwords_do_not_match": "Adgangskoden er ikke den samme, prøv igen",
|
||||
"retype_password": "Indtast adgangskoden igen",
|
||||
"confirm_password": "Indtast adgangskoden igen",
|
||||
"success": "Succes",
|
||||
"title": "Sandsynlig benægtelse"
|
||||
},
|
||||
|
@ -73,7 +73,7 @@
|
|||
"password_explain": "Indtast den adgangskode du vil bruge til at kryptere lageret",
|
||||
"passwords_do_not_match": "Adgangskoden er ikke den samme",
|
||||
"plausible_deniability": "Sandsynlig benægtelse...",
|
||||
"retype_password": "Gentag adgangskoden",
|
||||
"confirm_password": "Gentag adgangskoden",
|
||||
"save": "save"
|
||||
},
|
||||
"transactions": {
|
||||
|
|
|
@ -103,7 +103,7 @@
|
|||
"help2": "Der zweite Speicher ist funktional identisch. Zahle auf die darin angelegten Wallet ein Minimalbetrag ein, um die Täuschung glaubhafter zu machen.",
|
||||
"password_should_not_match": "Das Passwort für den täuschenden Speicher darf nicht mit dem deines Hauptspeichers übereinstimmen",
|
||||
"passwords_do_not_match": "Passwörter stimmen nicht überein. Bitte erneut versuchen.",
|
||||
"retype_password": "Passwort wiederholen",
|
||||
"confirm_password": "Passwort wiederholen",
|
||||
"success": "Erfolg!",
|
||||
"title": "Glaubhafte Täuschung"
|
||||
},
|
||||
|
@ -321,7 +321,7 @@
|
|||
"privacy_do_not_track_explanation": "Leistungs- und Zuverlässigkeitsinformationen nicht zur Analyse einreichen.",
|
||||
"push_notifications": "Push-Meldungen",
|
||||
"rate": "Kurs",
|
||||
"retype_password": "Passwort wiederholen",
|
||||
"confirm_password": "Passwort wiederholen",
|
||||
"selfTest": "Selbsttest",
|
||||
"save": "Speichern",
|
||||
"saved": "Gespeichert",
|
||||
|
|
|
@ -75,7 +75,7 @@
|
|||
"help2": "Το νέο αρχείο θα είναι πλήρως λειτουργικό, και μπορείτε να βάλετε εκεί κάποια ελάχιστα χρήματα για να μοιάζει αληθινό.",
|
||||
"password_should_not_match": "Ο κωδικός του ψεύτικου αρχείου δεν πρέπει να είναι ίδιος με τον κωδικό του πραγματικού αρχείου",
|
||||
"passwords_do_not_match": "Οι κωδικοί δεν είναι ίδιοι, δοκίμασε ξανά",
|
||||
"retype_password": "Ξαναδώσε τον κωδικό",
|
||||
"confirm_password": "Ξαναδώσε τον κωδικό",
|
||||
"success": "Επιτυχία",
|
||||
"title": "Εύλογη δυνατότητα άρνησης"
|
||||
},
|
||||
|
@ -224,7 +224,7 @@
|
|||
"privacy_read_clipboard": "Ανάγνωση προχείρου",
|
||||
"privacy_system_settings": "Ρυθμίσεις συστήματος",
|
||||
"privacy_do_not_track": "Απενεργοποίηση ανάλυσης ",
|
||||
"retype_password": "Ξαναδώσε τον κωδικό",
|
||||
"confirm_password": "Ξαναδώσε τον κωδικό",
|
||||
"selfTest": "Διαγνωστικός έλεγχος",
|
||||
"save": "Σώσε",
|
||||
"saved": "Αποθηκεύτηκε",
|
||||
|
|
|
@ -85,7 +85,7 @@
|
|||
"help2": "The new storage will be fully functional, and you can store some minimum amounts there so that it looks more believable.",
|
||||
"password_should_not_match": "Password is currently in use. Please try a different password.",
|
||||
"passwords_do_not_match": "Passwords do not match. Please try again.",
|
||||
"retype_password": "Re-type password",
|
||||
"confirm_password": "Confirm password",
|
||||
"success": "Success",
|
||||
"title": "Plausible Deniability"
|
||||
},
|
||||
|
@ -292,7 +292,7 @@
|
|||
"notifications": "Notifications",
|
||||
"open_link_in_explorer": "Open link in explorer",
|
||||
"password": "Password",
|
||||
"password_explain": "Create the password you will use to decrypt the storage.",
|
||||
"password_explain": "Enter the password you will use to unlock your wallets.",
|
||||
"passwords_do_not_match": "Passwords do not match.",
|
||||
"plausible_deniability": "Plausible Deniability",
|
||||
"privacy": "Privacy",
|
||||
|
@ -305,7 +305,7 @@
|
|||
"privacy_do_not_track_explanation": "Performance and reliability information will not be submitted for analysis.",
|
||||
"push_notifications": "Push Notifications",
|
||||
"rate": "Rate",
|
||||
"retype_password": "Re-type password",
|
||||
"confirm_password": "Confirm password",
|
||||
"selfTest": "Self-Test",
|
||||
"save": "Save",
|
||||
"saved": "Saved",
|
||||
|
|
|
@ -86,7 +86,7 @@
|
|||
"help2": "El nuevo almacen sera completamente funcional, y puedes almacenar cantidades minimas para que sea mas creible.",
|
||||
"password_should_not_match": "Esta contraseña ya está en uso. Por favor, introduce una diferente.",
|
||||
"passwords_do_not_match": "Las contraseñas no coinciden. Por favor, inténtalo de nuevo.",
|
||||
"retype_password": "Volver a escribir contraseña",
|
||||
"confirm_password": "Volver a escribir contraseña",
|
||||
"success": "Completado",
|
||||
"title": "Negación plausible"
|
||||
},
|
||||
|
@ -280,7 +280,7 @@
|
|||
"privacy_do_not_track_explanation": "Los datos sobre funcionamiento y fiabilidad no serán enviados para ser analizados.",
|
||||
"push_notifications": "Notificaciones push",
|
||||
"rate": "Tasa",
|
||||
"retype_password": "Introduce la contraseña otra vez",
|
||||
"confirm_password": "Introduce la contraseña otra vez",
|
||||
"selfTest": "Self-Test",
|
||||
"save": "Guardar",
|
||||
"saved": "Guardado",
|
||||
|
|
|
@ -85,7 +85,7 @@
|
|||
"help2": "El nuevo almacén será completamente funcional, y puedes almacenar cantidades mínimas para que sea mas creíble.",
|
||||
"password_should_not_match": "La contraseña está actualmente en uso. Intenta con una contraseña diferente.",
|
||||
"passwords_do_not_match": "Las contraseñas no coinciden, intenta nuevamente",
|
||||
"retype_password": "Vuelve a escribir la contraseña",
|
||||
"confirm_password": "Vuelve a escribir la contraseña",
|
||||
"success": "Éxito",
|
||||
"title": "Negación plausible"
|
||||
},
|
||||
|
@ -304,7 +304,7 @@
|
|||
"privacy_do_not_track_explanation": "La información de rendimiento y confiabilidad no se enviará para su análisis.",
|
||||
"push_notifications": "Notificaciones Push",
|
||||
"rate": "Tasa",
|
||||
"retype_password": "Ingresa la contraseña nuevamente",
|
||||
"confirm_password": "Ingresa la contraseña nuevamente",
|
||||
"selfTest": "Auto-Test",
|
||||
"save": "Guardar",
|
||||
"saved": "Guardado",
|
||||
|
|
|
@ -96,7 +96,7 @@
|
|||
"help2": "فضای ذخیرهسازی جدید کاملاً کاربردی خواهد بود، و شما میتوانید مقادیر کمی را در آنجا نگه دارید تا باورپذیرتر بهنظر برسد.",
|
||||
"password_should_not_match": "گذرواژه در حال استفاده است. لطفاً گذرواژهٔ دیگری را امتحان کنید.",
|
||||
"passwords_do_not_match": "گذرواژهها مطابقت ندارند. لطفاً دوباره امتحان کنید.",
|
||||
"retype_password": "گذرواژه را دوباره بنویسید",
|
||||
"confirm_password": "گذرواژه را دوباره بنویسید",
|
||||
"success": "موفقیتآمیز بود",
|
||||
"title": "انکار موجه"
|
||||
},
|
||||
|
@ -295,7 +295,7 @@
|
|||
"privacy_do_not_track_explanation": "اطلاعات کارایی و پایداری جهت تحلیل ارسال نخواهد شد.",
|
||||
"push_notifications": "پوش نوتیفیکیشن",
|
||||
"rate": "نرخ",
|
||||
"retype_password": "گذرواژه را دوباره بنویسید",
|
||||
"confirm_password": "گذرواژه را دوباره بنویسید",
|
||||
"selfTest": "خودآزمایی",
|
||||
"save": "ذخیره",
|
||||
"saved": "ذخیره شد",
|
||||
|
|
|
@ -102,7 +102,7 @@
|
|||
"help2": "Uusi tallennustila näyttää täysin toimivalta, ja voit säilyttää pieniä summia siellä, jotta se näyttää uskottavalta.",
|
||||
"password_should_not_match": "Salasana on käytössä. Ole hyvä, ja kokeile toista salasanaa.",
|
||||
"passwords_do_not_match": "Salasana ei täsmää, yritä uudelleen.",
|
||||
"retype_password": "Salasana uudelleen",
|
||||
"confirm_password": "Salasana uudelleen",
|
||||
"success": "Onnistui",
|
||||
"title": "Uskottava Kiistettävyys"
|
||||
},
|
||||
|
@ -311,7 +311,7 @@
|
|||
"privacy_do_not_track_explanation": "Suorituskyky- ja luotettavuustietoja ei lähtetä analysoitavaksi.",
|
||||
"push_notifications": "Push-ilmoitukset",
|
||||
"rate": "Vaihtokurssi",
|
||||
"retype_password": "Salasana uudelleen",
|
||||
"confirm_password": "Salasana uudelleen",
|
||||
"selfTest": "Itsetestaus ",
|
||||
"save": "Tallenna",
|
||||
"saved": "Tallennettu",
|
||||
|
|
|
@ -93,7 +93,7 @@
|
|||
"help2": "Le nouvel espace de stockage sera totalement fonctionnel, et vous pouvez même y stocker de petits montants pour le rendre plus crédible.",
|
||||
"password_should_not_match": "Le mot de passe pour le faux espace de stockage ne doit pas être le même que celui du stockage principal",
|
||||
"passwords_do_not_match": "Vos mot de passe ne sont pas identiques, veillez ré-essayer",
|
||||
"retype_password": "Confirmation du mot de passe",
|
||||
"confirm_password": "Confirmation du mot de passe",
|
||||
"success": "Succès",
|
||||
"title": "Déni plausible"
|
||||
},
|
||||
|
@ -295,7 +295,7 @@
|
|||
"privacy_do_not_track_explanation": "Les informations de performance et de fiabilité ne seront pas soumises pour analyse.",
|
||||
"push_notifications": "Notifications push",
|
||||
"rate": "Taux",
|
||||
"retype_password": "Re-saisir votre mot de passe",
|
||||
"confirm_password": "Re-saisir votre mot de passe",
|
||||
"selfTest": "Auto-test",
|
||||
"save": "Enregistrer",
|
||||
"saved": "Enregistré",
|
||||
|
|
|
@ -101,7 +101,7 @@
|
|||
"help2": "האחסון החדש יתפקד באופן מלא, ותוכלו לאחסן בו סכומים מינימליים כך שיראה יותר מהימן.",
|
||||
"password_should_not_match": "הסיסמה כבר בשימוש. אנא נסו סיסמה אחרת.",
|
||||
"passwords_do_not_match": "סיסמאות אינן תואמות, אנא נסו שוב",
|
||||
"retype_password": "הכניסו שוב סיסמה",
|
||||
"confirm_password": "הכניסו שוב סיסמה",
|
||||
"success": "הצלחה",
|
||||
"title": "יכולת הכחשה סבירה"
|
||||
},
|
||||
|
@ -319,7 +319,7 @@
|
|||
"privacy_do_not_track_explanation": "מידע ביצועים ומהימנות לא ישלח לניתוח.",
|
||||
"push_notifications": "התראות",
|
||||
"rate": "תעריף",
|
||||
"retype_password": "הכניסו שוב סיסמה",
|
||||
"confirm_password": "הכניסו שוב סיסמה",
|
||||
"selfTest": "בדיקה עצמית",
|
||||
"save": "שמירה",
|
||||
"saved": "נשמר",
|
||||
|
|
|
@ -34,7 +34,7 @@
|
|||
"help2": "Novi spremnik će biti posve funkcionalan, možeš pohraniti koliko misliš da je potrebno da izgleda uvjerljivo.",
|
||||
"password_should_not_match": "Lozinka za fejk spremnik treba biti drugačija od lozinke za oriđi spremnik",
|
||||
"passwords_do_not_match": "Lozinke ne pašu, pokušaj ponovo",
|
||||
"retype_password": "Ponovi lozinku",
|
||||
"confirm_password": "Ponovi lozinku",
|
||||
"success": "Uspjeh",
|
||||
"title": "Fejk volet"
|
||||
},
|
||||
|
@ -81,7 +81,7 @@
|
|||
"password_explain": "Upiši lozinku koja će dekriptirati spremnik.",
|
||||
"passwords_do_not_match": "Lozinke su različite",
|
||||
"plausible_deniability": "Fejk volet...",
|
||||
"retype_password": "Ponovi lozinku",
|
||||
"confirm_password": "Ponovi lozinku",
|
||||
"save": "Spremi"
|
||||
},
|
||||
"transactions": {
|
||||
|
|
|
@ -91,7 +91,7 @@
|
|||
"help2": "Az alternatív tárhely teljesen működőképes, és akár egy kisebb összeget is elhelyezhetsz rajta, hogy hitelesebbnek tűnjön.",
|
||||
"password_should_not_match": "A hamis tárhely jelszava nem lehet ugyanaz, mint az igazi tárhelyé",
|
||||
"passwords_do_not_match": "Jelszavak nem egyeznek, próbáld újra.",
|
||||
"retype_password": "Jelszó megerősítése",
|
||||
"confirm_password": "Jelszó megerősítése",
|
||||
"success": "Hamis tárhely létrehozva!",
|
||||
"title": "Elfogadható tagadhatóság"
|
||||
},
|
||||
|
@ -288,7 +288,7 @@
|
|||
"privacy_do_not_track_explanation": "A teljesítményre és a megbízhatóságra vonatkozó információk nem lessznek beküldve elemzésre.",
|
||||
"push_notifications": "Push üzenet",
|
||||
"rate": "Ráta",
|
||||
"retype_password": "Jelszó megerősítése",
|
||||
"confirm_password": "Jelszó megerősítése",
|
||||
"selfTest": "Önteszt",
|
||||
"save": "Ment",
|
||||
"saved": "Elmentve",
|
||||
|
|
|
@ -93,7 +93,7 @@
|
|||
"help2": "New storage will be fully functional, and you can store some minimum amounts there so it looks more believable.",
|
||||
"password_should_not_match": "Password for fake storage should not match password for your main storage",
|
||||
"passwords_do_not_match": "Kata sandi tidak cocok, coba lagi",
|
||||
"retype_password": "Ketik ulang kata sandi",
|
||||
"confirm_password": "Ketik ulang kata sandi",
|
||||
"success": "Sukses",
|
||||
"title": "Penyangkalan yang Masuk Akal"
|
||||
},
|
||||
|
@ -268,7 +268,7 @@
|
|||
"privacy_system_settings": "Pengaturan sistem",
|
||||
"privacy_quickactions": "Jalan Pintas Dompet",
|
||||
"privacy_do_not_track": "Nonaktifkan Analitik",
|
||||
"retype_password": "Ulangi kata sandi",
|
||||
"confirm_password": "Ulangi kata sandi",
|
||||
"save": "simpan",
|
||||
"saved": "Tersimpan",
|
||||
"total_balance": "Total saldo",
|
||||
|
|
|
@ -95,7 +95,7 @@
|
|||
"help2": "Il nuovo archivio sarà completamente funzionante, e puoi conservarci piccole quantità così sembrerà più credibile.",
|
||||
"password_should_not_match": "La password è attualmente in uso. Per favore prova con una password diversa.",
|
||||
"passwords_do_not_match": "Le password non corrispondono. Riprova.",
|
||||
"retype_password": "Reinserisci la password",
|
||||
"confirm_password": "Reinserisci la password",
|
||||
"success": "Fatto",
|
||||
"title": "Negazione Plausibile"
|
||||
},
|
||||
|
@ -290,7 +290,7 @@
|
|||
"privacy_do_not_track_explanation": "Le informazioni circa la performance e l'affidabilità non saranno inviati per l'analisi.",
|
||||
"push_notifications": "Notifiche Push",
|
||||
"rate": "Tariffa",
|
||||
"retype_password": "Reinserisci password",
|
||||
"confirm_password": "Reinserisci password",
|
||||
"selfTest": "Auto-Test",
|
||||
"save": "Salva",
|
||||
"saved": "Salvato",
|
||||
|
|
|
@ -103,7 +103,7 @@
|
|||
"help2": "新規のダミーのウォレットはメインと同様に機能します。少額のコインを入金しておくことでダミーと疑われないようにすることが可能です。",
|
||||
"password_should_not_match": "ダミーのウォレットのパスワードはメインのウォレットのパスワードと異なる必要があります。",
|
||||
"passwords_do_not_match": "パスワードが一致しません。もう一度試してください。",
|
||||
"retype_password": "パスワードの再入力",
|
||||
"confirm_password": "パスワードの再入力",
|
||||
"success": "成功",
|
||||
"title": "隠匿設定"
|
||||
},
|
||||
|
@ -322,7 +322,7 @@
|
|||
"privacy_do_not_track_explanation": "パフォーマンスと信頼性の情報を分析のために送信しません。",
|
||||
"push_notifications": "プッシュ通知",
|
||||
"rate": "レート",
|
||||
"retype_password": "パスワードの再入力",
|
||||
"confirm_password": "パスワードの再入力",
|
||||
"selfTest": "セルフテスト",
|
||||
"save": "保存",
|
||||
"saved": "保存済",
|
||||
|
|
|
@ -84,7 +84,7 @@
|
|||
"help2": "새로운 스토리지가 활성화됩니다. 최소 금액을 넣으면 더 신뢰성있어보입니다. ",
|
||||
"password_should_not_match": "이 비밀 번호는 현재 사용중입니다. 다른 비밀번호를 입력해주세요.",
|
||||
"passwords_do_not_match": "비밀번호가 일치하지 않습니다. 다시 시도해주세요.<br>",
|
||||
"retype_password": "패스워드를 다시 넣어세요",
|
||||
"confirm_password": "패스워드를 다시 넣어세요",
|
||||
"success": "성공했습니다.",
|
||||
"title": "당위적 거부"
|
||||
},
|
||||
|
@ -274,7 +274,7 @@
|
|||
"privacy_do_not_track_explanation": "성능과 신뢰성 정보는 분석하는 데 제출되지 않을 것 입니다.",
|
||||
"push_notifications": "푸시 알림",
|
||||
"rate": "환율",
|
||||
"retype_password": "패스워드를 다시 넣어주세요",
|
||||
"confirm_password": "패스워드를 다시 넣어주세요",
|
||||
"selfTest": "자가 테스트",
|
||||
"save": "저장",
|
||||
"saved": "저장됨",
|
||||
|
|
|
@ -59,7 +59,7 @@
|
|||
"plausibledeniability": {
|
||||
"password_should_not_match": "رزم ها وه کار مؽره. یه رزم هنی نه وه کار بیر.",
|
||||
"passwords_do_not_match": "رزمیات چی یک نؽسن، دۏورته امتهانشو بکو.",
|
||||
"retype_password": "رزمن دۏورته هؽل بکو",
|
||||
"confirm_password": "رزمن دۏورته هؽل بکو",
|
||||
"success": "مۏوفق بی"
|
||||
},
|
||||
"pleasebackup": {
|
||||
|
@ -133,7 +133,7 @@
|
|||
"privacy_read_clipboard": "ونن ویرگه",
|
||||
"privacy_system_settings": "سامونیا دسگا",
|
||||
"rate": "نرخ",
|
||||
"retype_password": "رزمن دۏورته هؽل بکو",
|
||||
"confirm_password": "رزمن دۏورته هؽل بکو",
|
||||
"widgets": "اوزارکیا",
|
||||
"tools": "اوزاریا"
|
||||
},
|
||||
|
|
|
@ -81,7 +81,7 @@
|
|||
"help2": "Simpanan baharu itu akan berfungsi secara penuh, dan anda boleh menyimpan sedikit jumlah minimum di sana agar ia kelihatan tulen.",
|
||||
"password_should_not_match": "Kata laluan sudah dalam penggunaan. Sila cuba kata laluan lain.",
|
||||
"passwords_do_not_match": "Kata laluan tidak sepadan. Sila cuba lagi.",
|
||||
"retype_password": "Ulang taip kata laluan.",
|
||||
"confirm_password": "Ulang taip kata laluan.",
|
||||
"success": "Berjaya",
|
||||
"title": "Penafian Munasabah"
|
||||
},
|
||||
|
@ -258,7 +258,7 @@
|
|||
"privacy_do_not_track": "Lumpuhkan Penyelidik",
|
||||
"privacy_do_not_track_explanation": "Maklumat pencapaian dan keandalan tidak akan dihantar untuk kaji selidik.",
|
||||
"push_notifications": "Pemberitahuan Pacu",
|
||||
"retype_password": "Ulang taip kata laluan",
|
||||
"confirm_password": "Ulang taip kata laluan",
|
||||
"selfTest": "Swaujian",
|
||||
"save": "Simpan",
|
||||
"saved": "Disimpan",
|
||||
|
|
|
@ -85,7 +85,7 @@
|
|||
"help2": "Den nye lagringen vil være fullt funksjonell, og du kan lagre noen minimumsbeløp der slik at den ser mer troverdig ut.",
|
||||
"password_should_not_match": "Passordet er i bruk. Prøv et annet passord.",
|
||||
"passwords_do_not_match": "Passordene stemmer ikke overens. Vennligst prøv igjen.",
|
||||
"retype_password": "Skriv inn passordet på nytt",
|
||||
"confirm_password": "Skriv inn passordet på nytt",
|
||||
"success": "Vellykket",
|
||||
"title": "Plausibel Fornektelse"
|
||||
},
|
||||
|
@ -276,7 +276,7 @@
|
|||
"privacy_do_not_track_explanation": "Informasjon om ytelse og pålitelighet vil ikke bli sendt inn for analyse.",
|
||||
"push_notifications": "Varslinger",
|
||||
"rate": "Rate",
|
||||
"retype_password": "Skriv inn passordet på nytt",
|
||||
"confirm_password": "Skriv inn passordet på nytt",
|
||||
"selfTest": "Selvtest",
|
||||
"save": "Lagre",
|
||||
"saved": "Lagret",
|
||||
|
|
|
@ -91,7 +91,7 @@
|
|||
"help2": "नयाँ स्टोरेज पूर्ण रूपमा कार्यात्मक हुनेछ, र तपाईंले त्यहाँ केही न्यूनतम रकमहरू स्टोर गर्न सक्नुहुन्छ ताकि यो अझ विश्वासयोग्य देखिन्छ।",
|
||||
"password_should_not_match": "पासवर्ड हाल प्रयोगमा छ। कृपया फरक पासवर्ड प्रयास गर्नुहोस्।",
|
||||
"passwords_do_not_match": "पासवर्डहरू मेल खाएन। फेरि प्रयास गर्नुहोस।",
|
||||
"retype_password": "पासवर्ड पुन: लेख्नुहोस",
|
||||
"confirm_password": "पासवर्ड पुन: लेख्नुहोस",
|
||||
"success": "सफल",
|
||||
"title": "व्यावहारिक अस्वीकार्यता"
|
||||
},
|
||||
|
@ -249,7 +249,7 @@
|
|||
"privacy": "गोपनीयता",
|
||||
"privacy_quickactions": "वालेट सर्टकटहरू",
|
||||
"rate": "दर",
|
||||
"retype_password": "पासवर्ड पुन: लेख्नुहोस",
|
||||
"confirm_password": "पासवर्ड पुन: लेख्नुहोस",
|
||||
"save": "सेव",
|
||||
"saved": "बचत गरियो",
|
||||
"total_balance": "पूरा रकम"
|
||||
|
|
|
@ -98,7 +98,7 @@
|
|||
"help2": "De nieuwe opslag zal volledig functioneel zijn en u kunt er een minimum aantal munten opslaan zodat het geloofwaardig lijkt.",
|
||||
"password_should_not_match": "Wachtwoord is momenteel in gebruik. Probeer een ander wachtwoord.",
|
||||
"passwords_do_not_match": "Wachtwoorden komen niet overeen, probeer het opnieuw",
|
||||
"retype_password": "Herhaal wachtwoord",
|
||||
"confirm_password": "Herhaal wachtwoord",
|
||||
"success": "Succes",
|
||||
"title": "Plausibele ontkenning"
|
||||
},
|
||||
|
@ -284,7 +284,7 @@
|
|||
"privacy_do_not_track_explanation": "Informatie over de prestatie en betrouwbaarheid zal niet worden opgegeven voor analyse.",
|
||||
"push_notifications": "Push notificaties",
|
||||
"rate": "Rate",
|
||||
"retype_password": "Geef nogmaals het wachtwoord op",
|
||||
"confirm_password": "Geef nogmaals het wachtwoord op",
|
||||
"selfTest": "Zelf-Test",
|
||||
"save": "Opslaan",
|
||||
"saved": "Opgeslagen",
|
||||
|
|
|
@ -85,7 +85,7 @@
|
|||
"help2": "Nowa przestrzeń będzie w pełni funkcjonalna i możesz przechowywać w niej minimalne ilości, aby wyglądało to wiarygodnie.",
|
||||
"password_should_not_match": "Hasło jest aktualnie w użyciu. Spróbuj z innym hasłem.",
|
||||
"passwords_do_not_match": "Hasła do siebie nie pasują, spróbuj ponownie.",
|
||||
"retype_password": "Wpisz ponownie hasło",
|
||||
"confirm_password": "Wpisz ponownie hasło",
|
||||
"success": "Sukces",
|
||||
"title": "Wiarygodna zaprzeczalność"
|
||||
},
|
||||
|
@ -304,7 +304,7 @@
|
|||
"privacy_do_not_track_explanation": "Informacje dotyczące wydajności i niezawodności nie będą przesyłane do analizy.",
|
||||
"push_notifications": "Powiadomienia Push",
|
||||
"rate": "Kurs",
|
||||
"retype_password": "Wprowadź Ponownie hasło",
|
||||
"confirm_password": "Wprowadź Ponownie hasło",
|
||||
"selfTest": "Autotest",
|
||||
"save": "Zapisz",
|
||||
"saved": "Zapisano",
|
||||
|
|
|
@ -103,7 +103,7 @@
|
|||
"help2": "Essa nova interface é completamente funcional e você pode inclusive manter nela um valor mínimo para que pareça mais real.",
|
||||
"password_should_not_match": "Esta senha já está sendo usada. Por favor, tente uma senha diferente.",
|
||||
"passwords_do_not_match": "As senhas não coincidem. Por favor, tente outra vez.",
|
||||
"retype_password": "Inserir senha novamente",
|
||||
"confirm_password": "Inserir senha novamente",
|
||||
"success": "Sucesso",
|
||||
"title": "Negação plausível"
|
||||
},
|
||||
|
@ -321,7 +321,7 @@
|
|||
"privacy_do_not_track_explanation": "Informações de confiabilidade e desempenho não serão enviadas para análise.",
|
||||
"push_notifications": "Notificações push",
|
||||
"rate": "Taxa",
|
||||
"retype_password": "Inserir senha novamente",
|
||||
"confirm_password": "Inserir senha novamente",
|
||||
"selfTest": "Autoteste",
|
||||
"save": "Salvar",
|
||||
"saved": "Salvo",
|
||||
|
|
|
@ -76,7 +76,7 @@
|
|||
"help2": "Este novo armazenamento é completamente funcional, e pode guardar um valor minímo para parecer mais real.",
|
||||
"password_should_not_match": "Password para armazenamento FALSO não deve coincidir com a password principal",
|
||||
"passwords_do_not_match": "Passwords não coincidem, tente novamente",
|
||||
"retype_password": "Inserir password novamente",
|
||||
"confirm_password": "Inserir password novamente",
|
||||
"success": "Sucesso",
|
||||
"title": "Negação plausível"
|
||||
},
|
||||
|
@ -235,7 +235,7 @@
|
|||
"privacy_system_settings": "Configurações do Sistema",
|
||||
"privacy_quickactions": "Atalhos da Carteira",
|
||||
"push_notifications": "Notificações via push",
|
||||
"retype_password": "Inserir password novamente",
|
||||
"confirm_password": "Inserir password novamente",
|
||||
"save": "Guardar",
|
||||
"saved": "Guardado",
|
||||
"total_balance": "Saldo Total",
|
||||
|
|
|
@ -81,7 +81,7 @@
|
|||
"help2": "Noul spațiu de stocare va fi complet funcțional, și poți păstra o cantitate minimă pentru a părea mai credibil. ",
|
||||
"password_should_not_match": "Parola este deja în folosință. Încearcă o parolă diferită.",
|
||||
"passwords_do_not_match": "Parolele nu sunt identice. Încearcă din nou.",
|
||||
"retype_password": "Re-introdu parola",
|
||||
"confirm_password": "Re-introdu parola",
|
||||
"success": "Succes",
|
||||
"title": "Negare plauzibilă"
|
||||
},
|
||||
|
@ -261,7 +261,7 @@
|
|||
"privacy_do_not_track": "Dezactivează Analytics",
|
||||
"push_notifications": "Notificări push",
|
||||
"rate": "Rata",
|
||||
"retype_password": "Scrie parola din nou",
|
||||
"confirm_password": "Scrie parola din nou",
|
||||
"selfTest": "Auto-test",
|
||||
"save": "Salvează",
|
||||
"saved": "Salvat",
|
||||
|
|
|
@ -99,7 +99,7 @@
|
|||
"help2": "Новое хранилище будет полностью функциональным, и вы даже можете хранить на нем небольшое количество биткоинов, чтобы это выглядело более правдоподобно.",
|
||||
"password_should_not_match": "Пароль для фальшивого хранилища не должен быть таким же как основной пароль",
|
||||
"passwords_do_not_match": "Пароли не совпадают, попробуйте еще раз",
|
||||
"retype_password": "Повторите пароль",
|
||||
"confirm_password": "Повторите пароль",
|
||||
"success": "Готово",
|
||||
"title": "Двойное дно"
|
||||
},
|
||||
|
@ -303,7 +303,7 @@
|
|||
"privacy_do_not_track_explanation": "Информация о производительности и надежности не будет отправлена на анализ.",
|
||||
"push_notifications": "Push-уведомления",
|
||||
"rate": "Курс",
|
||||
"retype_password": "Повторите пароль",
|
||||
"confirm_password": "Повторите пароль",
|
||||
"selfTest": "Проверка приложения",
|
||||
"save": "Сохранить",
|
||||
"saved": "Сохранено",
|
||||
|
|
|
@ -84,7 +84,7 @@
|
|||
"help2": "නව ගබඩාව සම්පුර්ණයෙන්ම ක්රියාත්මක වන අතර ඔබට විශ්වාසදායක ලෙස පෙනෙන පරිදි අවම ප්රමාණයක් එහි ගබඩා කළ හැකිය.",
|
||||
"password_should_not_match": "මුර පදය දැනටමත් භාවිතයේ ඇත. කරුණාකර වෙනත් මුර පදයක් සඳහා උත්සාහ කරන්න.",
|
||||
"passwords_do_not_match": "මුරපද නොගැලපේ. කරුණාකර නැවත උත්සාහ කරන්න.",
|
||||
"retype_password": "මුරපදය නැවත ඇතුළත් කරන්න",
|
||||
"confirm_password": "මුරපදය නැවත ඇතුළත් කරන්න",
|
||||
"success": "සාර්ථකයි",
|
||||
"title": "පිළිගතහැකි ප්රතික්ෂේප කිරීම"
|
||||
},
|
||||
|
@ -272,7 +272,7 @@
|
|||
"privacy_do_not_track_explanation": "විශ්ලේෂණය සඳහා කාර්ය සාධනය සහ විශ්වසනීයත්ව තොරතුරු ඉදිරිපත් නොකෙරේ.",
|
||||
"push_notifications": "තල්ලු දැනුම්දීම්",
|
||||
"rate": "අනුපාතය",
|
||||
"retype_password": "මුරපදය යළි ඇතුළත් කරන්න",
|
||||
"confirm_password": "මුරපදය යළි ඇතුළත් කරන්න",
|
||||
"selfTest": "ස්වයං පරීක්ෂණය",
|
||||
"save": "සුරකින්න",
|
||||
"saved": "සුරකින ලදි",
|
||||
|
|
|
@ -64,7 +64,7 @@
|
|||
"help": "Za určitých okolností môžete byť donútení k prezradeniu hesla. K zaisteniu bezpečnosti vaších prostriedkov, BlueWallet môže vytvořiť ďalšie zašifrované úložiská s rozdielným heslom. V prípade potreby môžete toto heslo dať tretej strane. Pokiaľ bude zadané do BlueWallet, odomkne nové \"falošné\" úložisko. Toto bude vyzerať hodnoverne, ale udrží vaše pravé hlavné úložisko v bezpečí.",
|
||||
"help2": "Nové úložisko bude plne funkčné, môžete naň uložiť minimálnu čiastku, aby vyzeralo uveriteľnejšie.",
|
||||
"password_should_not_match": "Heslo k falošnému úložisku nesmie byť rovnaké ako heslo k hlavnému úložisku",
|
||||
"retype_password": "Heslo znovu",
|
||||
"confirm_password": "Heslo znovu",
|
||||
"success": "Úspech",
|
||||
"title": "Plausible deniability..."
|
||||
},
|
||||
|
@ -160,7 +160,7 @@
|
|||
"plausible_deniability": "Plausible deniability...",
|
||||
"privacy_system_settings": "Systémové nastavenia",
|
||||
"push_notifications": "Push notifikácie",
|
||||
"retype_password": "Heslo znovu",
|
||||
"confirm_password": "Heslo znovu",
|
||||
"save": "Uložiť",
|
||||
"saved": "Uložené"
|
||||
},
|
||||
|
|
|
@ -85,7 +85,7 @@
|
|||
"help2": "Nova shramba bo popolnoma uporabna, za večjo verodostojnost lahko tam hranite manjši znesek.",
|
||||
"password_should_not_match": "Geslo je trenutno v uporabi. Prosimo, poskusite z drugim geslom.",
|
||||
"passwords_do_not_match": "Gesli se ne ujemata, prosimo poskusite ponovno.",
|
||||
"retype_password": "Ponovno vpišite geslo",
|
||||
"confirm_password": "Ponovno vpišite geslo",
|
||||
"success": "Uspešno",
|
||||
"title": "Verodostojno Zanikanje"
|
||||
},
|
||||
|
@ -279,7 +279,7 @@
|
|||
"privacy_do_not_track_explanation": "Informacije o zmogljivosti in zanesljivosti ne bodo poslane v analizo.",
|
||||
"push_notifications": "Potisna obvestila",
|
||||
"rate": "Tečaj",
|
||||
"retype_password": "Ponovno vpišite geslo",
|
||||
"confirm_password": "Ponovno vpišite geslo",
|
||||
"selfTest": "Samotestiranje",
|
||||
"save": "Shrani",
|
||||
"saved": "Shranjeno",
|
||||
|
|
|
@ -95,7 +95,7 @@
|
|||
"help2": "Den alternativa lagringsytan kommer att vara fullt fungerade och du kan eventuellt spara en mindre summa där för att den ska verka mer trovärdig.",
|
||||
"password_should_not_match": "Lösenordet för den fejkade lagringsytan får inte vara samma som ditt huvudlösenord",
|
||||
"passwords_do_not_match": "Lösenorden du angav matchar inte. Försök igen.",
|
||||
"retype_password": "Ange lösenord igen",
|
||||
"confirm_password": "Ange lösenord igen",
|
||||
"success": "Fejkad lagringsyta skapad!",
|
||||
"title": "Trovärdigt förnekande"
|
||||
},
|
||||
|
@ -291,7 +291,7 @@
|
|||
"privacy_do_not_track_explanation": "Information om prestanda och tillförlitlighet kommer inte att skickas in för analys.",
|
||||
"push_notifications": "Pushmeddelanden",
|
||||
"rate": "Betygsätta",
|
||||
"retype_password": "Ange lösenord igen",
|
||||
"confirm_password": "Ange lösenord igen",
|
||||
"selfTest": "Självtest",
|
||||
"save": "Spara",
|
||||
"saved": "Sparad",
|
||||
|
|
|
@ -62,7 +62,7 @@
|
|||
"help2": "ที่เก็บข้อมูลอันใหม่จะทำงานได้สมบูรณ์ และคุณสามารถเก็บจำนวนเงินขั้นต่ำได้ โดยที่มีความน่าเชื่อถือ.",
|
||||
"password_should_not_match": "รหัสผ่านสำหรับที่เก็บข้อมูลเทียมไม่ควรตรงกับรหัสผ่านที่ใช้กับที่เก็บข้อมูลเทียมจริง",
|
||||
"passwords_do_not_match": "รหัสผ่านไม่ตรงกัน ",
|
||||
"retype_password": "ใส่รหัสผ่านอีกครั้ง ใส่รหัสผ่านอีกครั้ง",
|
||||
"confirm_password": "ใส่รหัสผ่านอีกครั้ง ใส่รหัสผ่านอีกครั้ง",
|
||||
"success": "สำเร็จ",
|
||||
"title": "การปฏิเสธที่เป็นไปได้"
|
||||
},
|
||||
|
@ -193,7 +193,7 @@
|
|||
"privacy_read_clipboard": "อ่านค่าจากคลิปบอร์ด",
|
||||
"privacy_system_settings": "ตั้งค่าระบบ",
|
||||
"push_notifications": "การแจ้งเตือนแบบ Push",
|
||||
"retype_password": "ใส่รหัสผ่านอีกครั้ง",
|
||||
"confirm_password": "ใส่รหัสผ่านอีกครั้ง",
|
||||
"save": "บันทึก",
|
||||
"saved": "บันทึกแล้ว",
|
||||
"total_balance": "ยอดรวม"
|
||||
|
|
|
@ -81,7 +81,7 @@
|
|||
"help": "Bazı koşullar altında, şifrenizi açıklamanız gerekebilir. Paralarınızı güvende tutmak için, BlueWallet başka bir şifre ile şifreli depolama alanı yaratabilir. Baskı altında, Bu şifreyi 3. bir tarafa söyleyebilirsiniz. Girilirse BlueWallet, yeni 'sahte' bir depolamanın kilidini açacaktır. Bu 3. şahıslara normal görünecektir, ancak paraların olduğu ana depolama alanınızı gizlice saklamaya devam edecektir.",
|
||||
"help2": "Yeni depolama alanı tamamen işlevsel olacak ve ufak bir miktar tutarsanız daha inanılır görünecektir.",
|
||||
"password_should_not_match": "Sahte depolama şifreniz, ana depolama şifrenizle aynı olmamalıdır",
|
||||
"retype_password": "Şifrenizi yeniden yazın",
|
||||
"confirm_password": "Şifrenizi yeniden yazın",
|
||||
"success": "Başarılı",
|
||||
"title": "Makul Ret"
|
||||
},
|
||||
|
@ -178,7 +178,7 @@
|
|||
"privacy_system_settings": "Sistem Ayarları",
|
||||
"privacy_quickactions": "Cüzdan Kısayolları",
|
||||
"push_notifications": "Bildirimler",
|
||||
"retype_password": "Şifrenizi yeniden girin",
|
||||
"confirm_password": "Şifrenizi yeniden girin",
|
||||
"save": "Kaydet",
|
||||
"saved": "Kaydedildi",
|
||||
"total_balance": "Bakiye"
|
||||
|
|
|
@ -93,7 +93,7 @@
|
|||
"help2": "Нове сховище буде повністю функціональним і ви навіть можете зберігати на ньому невелику кількість монет, щоб це виглядало правдоподібніше.",
|
||||
"password_should_not_match": "Пароль для фальшивого сховища не може бути таким же як основний пароль.",
|
||||
"passwords_do_not_match": "Паролі не збігаються, спробуйте ще раз.",
|
||||
"retype_password": "Наберіть пароль ще раз",
|
||||
"confirm_password": "Наберіть пароль ще раз",
|
||||
"success": "Операція успішна",
|
||||
"title": "Правдоподібне Заперечення"
|
||||
},
|
||||
|
@ -227,7 +227,7 @@
|
|||
"privacy_quickactions": "Ярлики Гаманця",
|
||||
"privacy_do_not_track": "Вимкнути Аналітику",
|
||||
"push_notifications": "Пуш Сповіщення",
|
||||
"retype_password": "Наберіть пароль ще раз",
|
||||
"confirm_password": "Наберіть пароль ще раз",
|
||||
"save": "Зберегти",
|
||||
"saved": "Збережено",
|
||||
"total_balance": "Загальний Баланс",
|
||||
|
|
|
@ -92,7 +92,7 @@
|
|||
"help2": "Lưu trữ mới sẻ hoạt động hoàn toàn, và bạn có thể nạp một ít tiền tại đó để nó có vẻ đáng tin cậy.",
|
||||
"password_should_not_match": "Mật khẩu hiện đang được sử dụng. Vui lòng thử một mật khẩu khác.",
|
||||
"passwords_do_not_match": "Mật khẩu không phù hợp. Vui lòng thử lại.",
|
||||
"retype_password": "Nhập lại mật khẩu",
|
||||
"confirm_password": "Nhập lại mật khẩu",
|
||||
"success": "Thành công",
|
||||
"title": "Sự từ chối hợp lý "
|
||||
},
|
||||
|
@ -285,7 +285,7 @@
|
|||
"privacy_do_not_track_explanation": "Thông tin về hiệu suất và độ tin cậy không sẽ được gửi để phân tích.",
|
||||
"push_notifications": " Thông báo đẩy",
|
||||
"rate": "Tỷ lệ",
|
||||
"retype_password": "Nhập lại mật khẩu",
|
||||
"confirm_password": "Nhập lại mật khẩu",
|
||||
"selfTest": "Tự kiểm tra",
|
||||
"save": "Lưu",
|
||||
"saved": "Đã lưu",
|
||||
|
|
|
@ -89,7 +89,7 @@
|
|||
"help2": "Fop berging is heeltemal funksioneel",
|
||||
"password_should_not_match": "Die wagwoord vir fantasie berging moet verskil van die wagwoord vir hoof berging.",
|
||||
"passwords_do_not_match": "Wagwoorde vergelyk nie, probeer weer",
|
||||
"retype_password": "Hervoer wagwoord",
|
||||
"confirm_password": "Hervoer wagwoord",
|
||||
"success": "Sukses",
|
||||
"title": "Geloofwaardige Ontkenbaarheid"
|
||||
},
|
||||
|
@ -172,7 +172,7 @@
|
|||
"password_explain": "Skep die wagwoord wat jy sal gebruik om jou berging te de-enkripteer",
|
||||
"passwords_do_not_match": "Wagwoorde stem nie oor een nie",
|
||||
"plausible_deniability": "Geloofwaardige ontkenbaarheid...",
|
||||
"retype_password": "Hervoer wagwoord",
|
||||
"confirm_password": "Hervoer wagwoord",
|
||||
"save": "stoor"
|
||||
},
|
||||
"notifications": {
|
||||
|
|
|
@ -52,7 +52,7 @@
|
|||
"help2": "Igumbi lokugcina elitsha liza kusebenza ngokupheleleyo, kwaye unako ukugcina okunye ‘ + ‘lxabiso elincinci apho likhangeleka ngakumbi.",
|
||||
"password_should_not_match": "Inombolo yakho yokuvula igumbi lokugcina inkohliso akumele ifane ne nombolo yokuvula igumbi lakho elinyanisekileyo",
|
||||
"passwords_do_not_match": "Inombolo yokuvula ayihambelani, zama kwakhona",
|
||||
"retype_password": "Phinda inombolo yokuvula",
|
||||
"confirm_password": "Phinda inombolo yokuvula",
|
||||
"success": "Iphumelele",
|
||||
"title": "Ukuphika"
|
||||
},
|
||||
|
@ -98,7 +98,7 @@
|
|||
"password_explain": "Ukudala iinombolo yokuvula oyisebenzisayo ukucima ukugcina",
|
||||
"passwords_do_not_match": "Inombolo yokuvula azifani",
|
||||
"plausible_deniability": "Ukuphika...",
|
||||
"retype_password": "Phina inombolo yokuvula",
|
||||
"confirm_password": "Phina inombolo yokuvula",
|
||||
"save": "ndoloza"
|
||||
},
|
||||
"transactions": {
|
||||
|
|
|
@ -68,7 +68,7 @@
|
|||
"help2": "新的储存空间具备完整的功能,你可以存入少量的金额在里面。",
|
||||
"password_should_not_match": "此密码已被使用,请用另一个密码。",
|
||||
"passwords_do_not_match": "密码不匹配,请再试一遍。",
|
||||
"retype_password": "重输密码",
|
||||
"confirm_password": "重输密码",
|
||||
"success": "成功",
|
||||
"title": "合理推诿"
|
||||
},
|
||||
|
@ -229,7 +229,7 @@
|
|||
"privacy_quickactions": "钱包捷径",
|
||||
"privacy_clipboard_explanation": "如果在剪贴板中找到地址或发票,请提供捷径。",
|
||||
"push_notifications": "推送通知",
|
||||
"retype_password": "再次输入密码",
|
||||
"confirm_password": "再次输入密码",
|
||||
"selfTest": "自行测试",
|
||||
"save": "保存",
|
||||
"saved": "已保存",
|
||||
|
|
|
@ -65,7 +65,7 @@
|
|||
"help2": "新的儲存空間具備完整的功能,你可以存入少量的金額在裏面。",
|
||||
"password_should_not_match": "此密碼已被使用,請用另一個密碼。",
|
||||
"passwords_do_not_match": "密碼不匹配,請再試一遍。",
|
||||
"retype_password": "重新輸入密碼",
|
||||
"confirm_password": "重新輸入密碼",
|
||||
"success": "成功",
|
||||
"title": "合理推諉"
|
||||
},
|
||||
|
@ -223,7 +223,7 @@
|
|||
"privacy_quickactions": "錢包捷徑",
|
||||
"privacy_clipboard_explanation": "如果在剪貼簿中找到地址或賬單,請提供捷徑。",
|
||||
"push_notifications": "推送通知",
|
||||
"retype_password": "再次輸入密碼",
|
||||
"confirm_password": "再次輸入密碼",
|
||||
"selfTest": "自行測試",
|
||||
"save": "儲存",
|
||||
"saved": "已儲存",
|
||||
|
|
|
@ -53,7 +53,7 @@ const PlausibleDeniability: React.FC = () => {
|
|||
dispatch({ type: SET_LOADING, payload: false });
|
||||
return;
|
||||
}
|
||||
const p2 = await prompt(loc.plausibledeniability.create_password, loc.plausibledeniability.retype_password);
|
||||
const p2 = await prompt(loc.plausibledeniability.create_password, loc.plausibledeniability.confirm_password);
|
||||
if (p1 !== p2) {
|
||||
dispatch({ type: SET_LOADING, payload: false });
|
||||
triggerHapticFeedback(HapticFeedbackTypes.NotificationError);
|
||||
|
|
|
@ -1,29 +1,26 @@
|
|||
import React, { useCallback, useEffect, useReducer } from 'react';
|
||||
import React, { useCallback, useEffect, useReducer, useRef } from 'react';
|
||||
import { Alert, Platform, ScrollView, StyleSheet, Text, TouchableOpacity, TouchableWithoutFeedback, View } from 'react-native';
|
||||
import triggerHapticFeedback, { HapticFeedbackTypes } from '../../blue_modules/hapticFeedback';
|
||||
import { BlueCard, BlueSpacing20, BlueText } from '../../BlueComponents';
|
||||
import presentAlert from '../../components/Alert';
|
||||
import ListItem from '../../components/ListItem';
|
||||
import { useTheme } from '../../components/themes';
|
||||
import prompt from '../../helpers/prompt';
|
||||
import { unlockWithBiometrics, useBiometrics } from '../../hooks/useBiometrics';
|
||||
import loc from '../../loc';
|
||||
import { useExtendedNavigation } from '../../hooks/useExtendedNavigation';
|
||||
import { useStorage } from '../../hooks/context/useStorage';
|
||||
import { popToTop } from '../../NavigationService';
|
||||
import PromptPasswordConfirmationModal, {
|
||||
MODAL_TYPES,
|
||||
PromptPasswordConfirmationModalHandle,
|
||||
} from '../../components/PromptPasswordConfirmationModal';
|
||||
|
||||
enum ActionType {
|
||||
SetLoading = 'SET_LOADING',
|
||||
SetStorageEncryptedSwitch = 'SET_STORAGE_ENCRYPTED_SWITCH',
|
||||
SetDeviceBiometricCapable = 'SET_DEVICE_BIOMETRIC_CAPABLE',
|
||||
SetCurrentLoadingSwitch = 'SET_CURRENT_LOADING_SWITCH',
|
||||
}
|
||||
|
||||
interface State {
|
||||
isLoading: boolean;
|
||||
storageIsEncryptedSwitchEnabled: boolean;
|
||||
deviceBiometricCapable: boolean;
|
||||
currentLoadingSwitch: string | null;
|
||||
SetModalType = 'SET_MODAL_TYPE',
|
||||
SetIsSuccess = 'SET_IS_SUCCESS',
|
||||
ResetState = 'RESET_STATE',
|
||||
}
|
||||
|
||||
interface Action {
|
||||
|
@ -31,11 +28,22 @@ interface Action {
|
|||
payload?: any;
|
||||
}
|
||||
|
||||
interface State {
|
||||
isLoading: boolean;
|
||||
storageIsEncryptedSwitchEnabled: boolean;
|
||||
deviceBiometricCapable: boolean;
|
||||
currentLoadingSwitch: string | null;
|
||||
modalType: keyof typeof MODAL_TYPES;
|
||||
isSuccess: boolean;
|
||||
}
|
||||
|
||||
const initialState: State = {
|
||||
isLoading: true,
|
||||
storageIsEncryptedSwitchEnabled: false,
|
||||
deviceBiometricCapable: false,
|
||||
currentLoadingSwitch: null,
|
||||
modalType: MODAL_TYPES.ENTER_PASSWORD,
|
||||
isSuccess: false,
|
||||
};
|
||||
|
||||
const reducer = (state: State, action: Action): State => {
|
||||
|
@ -48,6 +56,12 @@ const reducer = (state: State, action: Action): State => {
|
|||
return { ...state, deviceBiometricCapable: action.payload };
|
||||
case ActionType.SetCurrentLoadingSwitch:
|
||||
return { ...state, currentLoadingSwitch: action.payload };
|
||||
case ActionType.SetModalType:
|
||||
return { ...state, modalType: action.payload };
|
||||
case ActionType.SetIsSuccess:
|
||||
return { ...state, isSuccess: action.payload };
|
||||
case ActionType.ResetState:
|
||||
return initialState;
|
||||
default:
|
||||
return state;
|
||||
}
|
||||
|
@ -59,6 +73,7 @@ const EncryptStorage = () => {
|
|||
const [state, dispatch] = useReducer(reducer, initialState);
|
||||
const { navigate } = useExtendedNavigation();
|
||||
const { colors } = useTheme();
|
||||
const promptRef = useRef<PromptPasswordConfirmationModalHandle>(null);
|
||||
|
||||
const styleHooks = StyleSheet.create({
|
||||
root: {
|
||||
|
@ -75,71 +90,25 @@ const EncryptStorage = () => {
|
|||
dispatch({ type: ActionType.SetStorageEncryptedSwitch, payload: isStorageEncryptedSwitchEnabled });
|
||||
dispatch({ type: ActionType.SetDeviceBiometricCapable, payload: isDeviceBiometricCapableSync });
|
||||
dispatch({ type: ActionType.SetLoading, payload: false });
|
||||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||
}, []);
|
||||
}, [isStorageEncrypted, isDeviceBiometricCapable]);
|
||||
|
||||
useEffect(() => {
|
||||
initializeState();
|
||||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||
}, []);
|
||||
}, [initializeState]);
|
||||
|
||||
const handleDecryptStorage = async () => {
|
||||
dispatch({ type: ActionType.SetCurrentLoadingSwitch, payload: 'decrypt' });
|
||||
const password = await prompt(loc.settings.password, loc._.storage_is_encrypted).catch(() => {
|
||||
dispatch({ type: ActionType.SetLoading, payload: false });
|
||||
dispatch({ type: ActionType.SetCurrentLoadingSwitch, payload: null });
|
||||
});
|
||||
if (!password) {
|
||||
dispatch({ type: ActionType.SetLoading, payload: false });
|
||||
dispatch({ type: ActionType.SetCurrentLoadingSwitch, payload: null });
|
||||
return;
|
||||
}
|
||||
try {
|
||||
await decryptStorage(password);
|
||||
await saveToDisk();
|
||||
popToTop();
|
||||
} catch (e) {
|
||||
if (password) {
|
||||
triggerHapticFeedback(HapticFeedbackTypes.NotificationError);
|
||||
presentAlert({ message: loc._.bad_password });
|
||||
}
|
||||
|
||||
dispatch({ type: ActionType.SetLoading, payload: false });
|
||||
dispatch({ type: ActionType.SetCurrentLoadingSwitch, payload: null });
|
||||
dispatch({ type: ActionType.SetStorageEncryptedSwitch, payload: await isStorageEncrypted() });
|
||||
}
|
||||
dispatch({ type: ActionType.SetModalType, payload: MODAL_TYPES.ENTER_PASSWORD });
|
||||
promptRef.current?.present();
|
||||
};
|
||||
|
||||
const onEncryptStorageSwitch = async (value: boolean) => {
|
||||
dispatch({ type: ActionType.SetCurrentLoadingSwitch, payload: 'encrypt' });
|
||||
dispatch({ type: ActionType.SetLoading, payload: true });
|
||||
|
||||
if (value) {
|
||||
let p1 = await prompt(loc.settings.password, loc.settings.password_explain).catch(() => {
|
||||
dispatch({ type: ActionType.SetLoading, payload: false });
|
||||
dispatch({ type: ActionType.SetCurrentLoadingSwitch, payload: null });
|
||||
p1 = undefined;
|
||||
});
|
||||
if (!p1) {
|
||||
dispatch({ type: ActionType.SetLoading, payload: false });
|
||||
dispatch({ type: ActionType.SetCurrentLoadingSwitch, payload: null });
|
||||
return;
|
||||
}
|
||||
const p2 = await prompt(loc.settings.password, loc.settings.retype_password).catch(() => {
|
||||
dispatch({ type: ActionType.SetLoading, payload: false });
|
||||
dispatch({ type: ActionType.SetCurrentLoadingSwitch, payload: null });
|
||||
});
|
||||
if (p1 === p2) {
|
||||
await encryptStorage(p1);
|
||||
dispatch({ type: ActionType.SetLoading, payload: false });
|
||||
dispatch({ type: ActionType.SetCurrentLoadingSwitch, payload: null });
|
||||
dispatch({ type: ActionType.SetStorageEncryptedSwitch, payload: await isStorageEncrypted() });
|
||||
saveToDisk();
|
||||
} else {
|
||||
dispatch({ type: ActionType.SetLoading, payload: false });
|
||||
dispatch({ type: ActionType.SetCurrentLoadingSwitch, payload: null });
|
||||
triggerHapticFeedback(HapticFeedbackTypes.NotificationError);
|
||||
presentAlert({ message: loc.settings.passwords_do_not_match });
|
||||
}
|
||||
dispatch({ type: ActionType.SetModalType, payload: MODAL_TYPES.CREATE_PASSWORD });
|
||||
promptRef.current?.present();
|
||||
} else {
|
||||
Alert.alert(
|
||||
loc.settings.encrypt_decrypt,
|
||||
|
@ -179,20 +148,18 @@ const EncryptStorage = () => {
|
|||
};
|
||||
|
||||
const renderPasscodeExplanation = () => {
|
||||
let isCapable = true;
|
||||
return (
|
||||
Platform.OS === 'android' && Platform.Version >= 30 ? (
|
||||
<>
|
||||
<BlueText />
|
||||
<BlueText>{loc.formatString(loc.settings.biometrics_fail, { type: deviceBiometricType! })}</BlueText>
|
||||
</>
|
||||
) : null
|
||||
);
|
||||
};
|
||||
|
||||
if (Platform.OS === 'android') {
|
||||
if (Platform.Version < 30) {
|
||||
isCapable = false;
|
||||
}
|
||||
}
|
||||
|
||||
return isCapable ? (
|
||||
<>
|
||||
<BlueText />
|
||||
<BlueText>{loc.formatString(loc.settings.biometrics_fail, { type: deviceBiometricType! })}</BlueText>
|
||||
</>
|
||||
) : null;
|
||||
const onModalDismiss = () => {
|
||||
initializeState(); // Reinitialize state on modal dismiss to refresh the UI
|
||||
};
|
||||
|
||||
return (
|
||||
|
@ -246,6 +213,38 @@ const EncryptStorage = () => {
|
|||
containerStyle={[styles.row, styleHooks.root]}
|
||||
/>
|
||||
)}
|
||||
<PromptPasswordConfirmationModal
|
||||
ref={promptRef}
|
||||
modalType={state.modalType}
|
||||
onConfirmationSuccess={async (password: string) => {
|
||||
let success = false;
|
||||
if (state.modalType === MODAL_TYPES.CREATE_PASSWORD) {
|
||||
try {
|
||||
await encryptStorage(password);
|
||||
await saveToDisk();
|
||||
success = true;
|
||||
} catch (error) {
|
||||
presentAlert({ title: loc.errors.error, message: (error as Error).message });
|
||||
success = false;
|
||||
}
|
||||
} else if (state.modalType === MODAL_TYPES.ENTER_PASSWORD) {
|
||||
try {
|
||||
await decryptStorage(password);
|
||||
await saveToDisk();
|
||||
success = true;
|
||||
} catch (error) {
|
||||
presentAlert({ message: loc._.bad_password });
|
||||
success = false;
|
||||
}
|
||||
}
|
||||
return success;
|
||||
}}
|
||||
onConfirmationFailure={() => {
|
||||
dispatch({ type: ActionType.SetLoading, payload: false });
|
||||
dispatch({ type: ActionType.SetCurrentLoadingSwitch, payload: null });
|
||||
}}
|
||||
onDismiss={onModalDismiss}
|
||||
/>
|
||||
</ScrollView>
|
||||
);
|
||||
};
|
||||
|
|
Loading…
Add table
Reference in a new issue