2020-06-01 14:54:23 +02:00
|
|
|
/* eslint react/prop-types: "off", react-native/no-inline-styles: "off" */
|
2024-05-20 11:54:13 +02:00
|
|
|
import AsyncStorage from '@react-native-async-storage/async-storage';
|
|
|
|
import Clipboard from '@react-native-clipboard/clipboard';
|
2018-12-25 15:16:23 +01:00
|
|
|
import PropTypes from 'prop-types';
|
2024-05-20 11:54:13 +02:00
|
|
|
import React, { Component, forwardRef } from 'react';
|
2018-12-12 04:33:28 +01:00
|
|
|
import {
|
|
|
|
ActivityIndicator,
|
|
|
|
Dimensions,
|
2024-05-20 11:54:13 +02:00
|
|
|
I18nManager,
|
2019-01-31 07:52:21 +01:00
|
|
|
InputAccessoryView,
|
2020-09-09 19:55:13 +02:00
|
|
|
Keyboard,
|
|
|
|
KeyboardAvoidingView,
|
2018-12-12 04:33:28 +01:00
|
|
|
Platform,
|
2020-09-09 19:55:13 +02:00
|
|
|
StyleSheet,
|
2018-12-23 05:13:58 +01:00
|
|
|
TextInput,
|
2020-09-09 19:55:13 +02:00
|
|
|
TouchableOpacity,
|
|
|
|
View,
|
2018-12-12 04:33:28 +01:00
|
|
|
} from 'react-native';
|
2024-05-20 11:54:13 +02:00
|
|
|
import { Icon, Text } from 'react-native-elements';
|
|
|
|
|
2023-10-24 03:28:44 +02:00
|
|
|
import { BlueCurrentTheme, useTheme } from './components/themes';
|
2021-08-16 18:10:04 +02:00
|
|
|
import loc, { formatStringAddTwoWhiteSpaces } from './loc';
|
2024-05-20 11:54:13 +02:00
|
|
|
import NetworkTransactionFees, { NetworkTransactionFee, NetworkTransactionFeeType } from './models/networkTransactionFees';
|
2021-02-25 04:09:41 +01:00
|
|
|
|
2018-05-12 22:27:34 +02:00
|
|
|
const { height, width } = Dimensions.get('window');
|
|
|
|
const aspectRatio = height / width;
|
|
|
|
let isIpad;
|
|
|
|
if (aspectRatio > 1.6) {
|
|
|
|
isIpad = false;
|
|
|
|
} else {
|
|
|
|
isIpad = true;
|
|
|
|
}
|
2018-01-30 23:42:38 +01:00
|
|
|
|
2021-07-20 15:10:45 +02:00
|
|
|
/**
|
|
|
|
* TODO: remove this comment once this file gets properly converted to typescript.
|
|
|
|
*
|
|
|
|
* @type {React.FC<any>}
|
|
|
|
*/
|
2021-02-27 01:23:59 +01:00
|
|
|
export const BlueButtonLink = forwardRef((props, ref) => {
|
2020-07-15 19:32:59 +02:00
|
|
|
const { colors } = useTheme();
|
|
|
|
return (
|
|
|
|
<TouchableOpacity
|
2021-06-24 14:50:57 +02:00
|
|
|
accessibilityRole="button"
|
2020-07-15 19:32:59 +02:00
|
|
|
style={{
|
|
|
|
minHeight: 60,
|
|
|
|
minWidth: 100,
|
|
|
|
justifyContent: 'center',
|
|
|
|
}}
|
2020-08-11 00:38:07 +02:00
|
|
|
{...props}
|
2021-02-27 01:23:59 +01:00
|
|
|
ref={ref}
|
2020-07-15 19:32:59 +02:00
|
|
|
>
|
2020-08-11 00:38:07 +02:00
|
|
|
<Text style={{ color: colors.foregroundColor, textAlign: 'center', fontSize: 16 }}>{props.title}</Text>
|
2020-07-15 19:32:59 +02:00
|
|
|
</TouchableOpacity>
|
|
|
|
);
|
2021-02-27 01:23:59 +01:00
|
|
|
});
|
2020-07-15 19:32:59 +02:00
|
|
|
|
2020-11-30 05:18:54 +01:00
|
|
|
export const BlueCard = props => {
|
|
|
|
return <View {...props} style={{ padding: 20 }} />;
|
|
|
|
};
|
2018-01-30 23:42:38 +01:00
|
|
|
|
2020-11-22 09:04:04 +01:00
|
|
|
export const BlueText = props => {
|
2020-07-15 19:32:59 +02:00
|
|
|
const { colors } = useTheme();
|
2021-08-20 10:16:57 +02:00
|
|
|
const style = StyleSheet.compose({ color: colors.foregroundColor, writingDirection: I18nManager.isRTL ? 'rtl' : 'ltr' }, props.style);
|
|
|
|
return <Text {...props} style={style} />;
|
2020-07-15 19:32:59 +02:00
|
|
|
};
|
2018-01-30 23:42:38 +01:00
|
|
|
|
2020-11-25 04:01:51 +01:00
|
|
|
export const BlueTextCentered = props => {
|
2020-08-11 00:38:07 +02:00
|
|
|
const { colors } = useTheme();
|
|
|
|
return <Text {...props} style={{ color: colors.foregroundColor, textAlign: 'center' }} />;
|
|
|
|
};
|
2022-01-28 12:13:53 +01:00
|
|
|
|
2020-08-11 00:38:07 +02:00
|
|
|
export const BlueFormLabel = props => {
|
|
|
|
const { colors } = useTheme();
|
|
|
|
|
2021-05-22 05:36:34 +02:00
|
|
|
return (
|
|
|
|
<Text
|
|
|
|
{...props}
|
|
|
|
style={{
|
|
|
|
color: colors.foregroundColor,
|
|
|
|
fontWeight: '400',
|
|
|
|
marginHorizontal: 20,
|
|
|
|
writingDirection: I18nManager.isRTL ? 'rtl' : 'ltr',
|
|
|
|
}}
|
|
|
|
/>
|
|
|
|
);
|
2020-08-11 00:38:07 +02:00
|
|
|
};
|
2018-01-30 23:42:38 +01:00
|
|
|
|
2020-11-30 05:18:54 +01:00
|
|
|
export const BlueFormMultiInput = props => {
|
|
|
|
const { colors } = useTheme();
|
2019-02-28 01:45:44 +01:00
|
|
|
|
2020-11-30 05:18:54 +01:00
|
|
|
return (
|
|
|
|
<TextInput
|
|
|
|
multiline
|
|
|
|
underlineColorAndroid="transparent"
|
|
|
|
numberOfLines={4}
|
|
|
|
style={{
|
|
|
|
paddingHorizontal: 8,
|
|
|
|
paddingVertical: 16,
|
|
|
|
flex: 1,
|
|
|
|
marginTop: 5,
|
|
|
|
marginHorizontal: 20,
|
|
|
|
borderColor: colors.formBorder,
|
|
|
|
borderBottomColor: colors.formBorder,
|
|
|
|
borderWidth: 1,
|
|
|
|
borderBottomWidth: 0.5,
|
|
|
|
borderRadius: 4,
|
|
|
|
backgroundColor: colors.inputBackgroundColor,
|
|
|
|
color: colors.foregroundColor,
|
|
|
|
textAlignVertical: 'top',
|
|
|
|
}}
|
|
|
|
autoCorrect={false}
|
|
|
|
autoCapitalize="none"
|
|
|
|
spellCheck={false}
|
|
|
|
{...props}
|
|
|
|
selectTextOnFocus={false}
|
|
|
|
keyboardType={Platform.OS === 'android' ? 'visible-password' : 'default'}
|
|
|
|
/>
|
|
|
|
);
|
|
|
|
};
|
2018-05-06 19:12:14 +02:00
|
|
|
|
2020-11-30 05:18:54 +01:00
|
|
|
export const BlueSpacing = props => {
|
|
|
|
return <View {...props} style={{ height: 60 }} />;
|
|
|
|
};
|
2018-06-29 00:17:14 +02:00
|
|
|
|
2020-11-28 04:24:20 +01:00
|
|
|
export const BlueSpacing40 = props => {
|
|
|
|
return <View {...props} style={{ height: 50 }} />;
|
|
|
|
};
|
2018-01-30 23:42:38 +01:00
|
|
|
|
2018-06-29 00:17:14 +02:00
|
|
|
export class is {
|
|
|
|
static ipad() {
|
|
|
|
return isIpad;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-11-28 04:24:20 +01:00
|
|
|
export const BlueSpacing20 = props => {
|
2021-09-09 13:00:11 +02:00
|
|
|
const { horizontal = false } = props;
|
|
|
|
return <View {...props} style={{ height: horizontal ? 0 : 20, width: horizontal ? 20 : 0, opacity: 0 }} />;
|
2020-11-28 04:24:20 +01:00
|
|
|
};
|
2018-06-25 00:22:46 +02:00
|
|
|
|
2020-11-28 04:24:20 +01:00
|
|
|
export const BlueSpacing10 = props => {
|
|
|
|
return <View {...props} style={{ height: 10, opacity: 0 }} />;
|
|
|
|
};
|
2019-05-22 14:08:31 +02:00
|
|
|
|
2020-12-11 05:17:55 +01:00
|
|
|
export const BlueDismissKeyboardInputAccessory = () => {
|
|
|
|
const { colors } = useTheme();
|
|
|
|
BlueDismissKeyboardInputAccessory.InputAccessoryViewID = 'BlueDismissKeyboardInputAccessory';
|
2019-08-29 06:18:32 +02:00
|
|
|
|
2020-12-11 05:17:55 +01:00
|
|
|
return Platform.OS !== 'ios' ? null : (
|
|
|
|
<InputAccessoryView nativeID={BlueDismissKeyboardInputAccessory.InputAccessoryViewID}>
|
2019-08-29 06:18:32 +02:00
|
|
|
<View
|
|
|
|
style={{
|
2020-12-11 05:17:55 +01:00
|
|
|
backgroundColor: colors.inputBackgroundColor,
|
|
|
|
height: 44,
|
|
|
|
flex: 1,
|
2019-08-29 06:18:32 +02:00
|
|
|
flexDirection: 'row',
|
|
|
|
justifyContent: 'flex-end',
|
|
|
|
alignItems: 'center',
|
|
|
|
}}
|
|
|
|
>
|
2020-12-11 05:17:55 +01:00
|
|
|
<BlueButtonLink title={loc.send.input_done} onPress={Keyboard.dismiss} />
|
2019-08-29 06:18:32 +02:00
|
|
|
</View>
|
2020-12-11 05:17:55 +01:00
|
|
|
</InputAccessoryView>
|
|
|
|
);
|
|
|
|
};
|
2019-08-29 06:18:32 +02:00
|
|
|
|
2020-12-11 05:17:55 +01:00
|
|
|
export const BlueDoneAndDismissKeyboardInputAccessory = props => {
|
|
|
|
const { colors } = useTheme();
|
|
|
|
BlueDoneAndDismissKeyboardInputAccessory.InputAccessoryViewID = 'BlueDoneAndDismissKeyboardInputAccessory';
|
|
|
|
|
|
|
|
const onPasteTapped = async () => {
|
|
|
|
const clipboard = await Clipboard.getString();
|
|
|
|
props.onPasteTapped(clipboard);
|
|
|
|
};
|
|
|
|
|
|
|
|
const inputView = (
|
|
|
|
<View
|
|
|
|
style={{
|
|
|
|
backgroundColor: colors.inputBackgroundColor,
|
|
|
|
flexDirection: 'row',
|
|
|
|
justifyContent: 'flex-end',
|
|
|
|
alignItems: 'center',
|
|
|
|
maxHeight: 44,
|
|
|
|
}}
|
|
|
|
>
|
|
|
|
<BlueButtonLink title={loc.send.input_clear} onPress={props.onClearTapped} />
|
|
|
|
<BlueButtonLink title={loc.send.input_paste} onPress={onPasteTapped} />
|
|
|
|
<BlueButtonLink title={loc.send.input_done} onPress={Keyboard.dismiss} />
|
|
|
|
</View>
|
|
|
|
);
|
|
|
|
|
|
|
|
if (Platform.OS === 'ios') {
|
|
|
|
return <InputAccessoryView nativeID={BlueDoneAndDismissKeyboardInputAccessory.InputAccessoryViewID}>{inputView}</InputAccessoryView>;
|
|
|
|
} else {
|
|
|
|
return <KeyboardAvoidingView>{inputView}</KeyboardAvoidingView>;
|
2019-08-29 06:18:32 +02:00
|
|
|
}
|
2020-12-11 05:17:55 +01:00
|
|
|
};
|
2019-08-29 06:18:32 +02:00
|
|
|
|
2020-11-30 05:18:54 +01:00
|
|
|
export const BlueLoading = props => {
|
2020-07-15 19:32:59 +02:00
|
|
|
return (
|
2021-04-29 16:32:48 +02:00
|
|
|
<View style={{ flex: 1, justifyContent: 'center' }} {...props}>
|
2020-07-15 19:32:59 +02:00
|
|
|
<ActivityIndicator />
|
|
|
|
</View>
|
|
|
|
);
|
|
|
|
};
|
|
|
|
|
2019-08-27 06:05:27 +02:00
|
|
|
export class BlueReplaceFeeSuggestions extends Component {
|
|
|
|
static propTypes = {
|
|
|
|
onFeeSelected: PropTypes.func.isRequired,
|
|
|
|
transactionMinimum: PropTypes.number.isRequired,
|
|
|
|
};
|
|
|
|
|
|
|
|
static defaultProps = {
|
|
|
|
transactionMinimum: 1,
|
|
|
|
};
|
|
|
|
|
2020-09-14 12:49:08 +02:00
|
|
|
state = {
|
|
|
|
customFeeValue: '1',
|
|
|
|
};
|
2019-08-27 06:05:27 +02:00
|
|
|
|
|
|
|
async componentDidMount() {
|
2020-09-14 12:49:08 +02:00
|
|
|
try {
|
|
|
|
const cachedNetworkTransactionFees = JSON.parse(await AsyncStorage.getItem(NetworkTransactionFee.StorageKey));
|
|
|
|
|
|
|
|
if (cachedNetworkTransactionFees && 'fastestFee' in cachedNetworkTransactionFees) {
|
2020-09-15 15:17:01 +02:00
|
|
|
this.setState({ networkFees: cachedNetworkTransactionFees }, () => this.onFeeSelected(NetworkTransactionFeeType.FAST));
|
2020-09-14 12:49:08 +02:00
|
|
|
}
|
|
|
|
} catch (_) {}
|
2019-08-27 06:05:27 +02:00
|
|
|
const networkFees = await NetworkTransactionFees.recommendedFees();
|
2020-09-15 15:17:01 +02:00
|
|
|
this.setState({ networkFees }, () => this.onFeeSelected(NetworkTransactionFeeType.FAST));
|
2019-08-27 06:05:27 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
onFeeSelected = selectedFeeType => {
|
|
|
|
if (selectedFeeType !== NetworkTransactionFeeType.CUSTOM) {
|
|
|
|
Keyboard.dismiss();
|
|
|
|
}
|
|
|
|
if (selectedFeeType === NetworkTransactionFeeType.FAST) {
|
|
|
|
this.props.onFeeSelected(this.state.networkFees.fastestFee);
|
|
|
|
this.setState({ selectedFeeType }, () => this.props.onFeeSelected(this.state.networkFees.fastestFee));
|
|
|
|
} else if (selectedFeeType === NetworkTransactionFeeType.MEDIUM) {
|
2020-05-18 16:45:31 +02:00
|
|
|
this.setState({ selectedFeeType }, () => this.props.onFeeSelected(this.state.networkFees.mediumFee));
|
2019-08-27 06:05:27 +02:00
|
|
|
} else if (selectedFeeType === NetworkTransactionFeeType.SLOW) {
|
2020-05-18 16:45:31 +02:00
|
|
|
this.setState({ selectedFeeType }, () => this.props.onFeeSelected(this.state.networkFees.slowFee));
|
2019-08-27 06:05:27 +02:00
|
|
|
} else if (selectedFeeType === NetworkTransactionFeeType.CUSTOM) {
|
2020-09-14 12:49:08 +02:00
|
|
|
this.props.onFeeSelected(Number(this.state.customFeeValue));
|
2019-08-27 06:05:27 +02:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
onCustomFeeTextChange = customFee => {
|
2020-09-14 12:49:08 +02:00
|
|
|
const customFeeValue = customFee.replace(/[^0-9]/g, '');
|
|
|
|
this.setState({ customFeeValue, selectedFeeType: NetworkTransactionFeeType.CUSTOM }, () => {
|
2019-08-27 06:05:27 +02:00
|
|
|
this.onFeeSelected(NetworkTransactionFeeType.CUSTOM);
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
|
|
render() {
|
2020-09-14 12:49:08 +02:00
|
|
|
const { networkFees, selectedFeeType } = this.state;
|
|
|
|
|
2019-08-27 06:05:27 +02:00
|
|
|
return (
|
2020-05-15 11:26:37 +02:00
|
|
|
<View>
|
2020-09-14 12:49:08 +02:00
|
|
|
{networkFees &&
|
|
|
|
[
|
|
|
|
{
|
|
|
|
label: loc.send.fee_fast,
|
|
|
|
time: loc.send.fee_10m,
|
|
|
|
type: NetworkTransactionFeeType.FAST,
|
|
|
|
rate: networkFees.fastestFee,
|
|
|
|
active: selectedFeeType === NetworkTransactionFeeType.FAST,
|
|
|
|
},
|
|
|
|
{
|
2021-08-01 21:05:21 +02:00
|
|
|
label: formatStringAddTwoWhiteSpaces(loc.send.fee_medium),
|
2020-09-14 12:49:08 +02:00
|
|
|
time: loc.send.fee_3h,
|
|
|
|
type: NetworkTransactionFeeType.MEDIUM,
|
|
|
|
rate: networkFees.mediumFee,
|
|
|
|
active: selectedFeeType === NetworkTransactionFeeType.MEDIUM,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
label: loc.send.fee_slow,
|
|
|
|
time: loc.send.fee_1d,
|
|
|
|
type: NetworkTransactionFeeType.SLOW,
|
|
|
|
rate: networkFees.slowFee,
|
|
|
|
active: selectedFeeType === NetworkTransactionFeeType.SLOW,
|
|
|
|
},
|
|
|
|
].map(({ label, type, time, rate, active }, index) => (
|
|
|
|
<TouchableOpacity
|
2021-06-24 14:50:57 +02:00
|
|
|
accessibilityRole="button"
|
2020-09-14 12:49:08 +02:00
|
|
|
key={label}
|
|
|
|
onPress={() => this.onFeeSelected(type)}
|
|
|
|
style={[
|
|
|
|
{ paddingHorizontal: 16, paddingVertical: 8, marginBottom: 10 },
|
|
|
|
active && { borderRadius: 8, backgroundColor: BlueCurrentTheme.colors.incomingBackgroundColor },
|
|
|
|
]}
|
|
|
|
>
|
|
|
|
<View style={{ justifyContent: 'space-between', flexDirection: 'row', alignItems: 'center' }}>
|
|
|
|
<Text style={{ fontSize: 22, color: BlueCurrentTheme.colors.successColor, fontWeight: '600' }}>{label}</Text>
|
|
|
|
<View
|
|
|
|
style={{
|
|
|
|
backgroundColor: BlueCurrentTheme.colors.successColor,
|
|
|
|
borderRadius: 5,
|
|
|
|
paddingHorizontal: 6,
|
|
|
|
paddingVertical: 3,
|
|
|
|
}}
|
|
|
|
>
|
|
|
|
<Text style={{ color: BlueCurrentTheme.colors.background }}>~{time}</Text>
|
|
|
|
</View>
|
|
|
|
</View>
|
|
|
|
<View style={{ justifyContent: 'flex-end', flexDirection: 'row', alignItems: 'center' }}>
|
|
|
|
<Text style={{ color: BlueCurrentTheme.colors.successColor }}>{rate} sat/byte</Text>
|
|
|
|
</View>
|
|
|
|
</TouchableOpacity>
|
|
|
|
))}
|
|
|
|
<TouchableOpacity
|
2021-06-24 14:50:57 +02:00
|
|
|
accessibilityRole="button"
|
2020-09-14 12:49:08 +02:00
|
|
|
onPress={() => this.customTextInput.focus()}
|
|
|
|
style={[
|
|
|
|
{ paddingHorizontal: 16, paddingVertical: 8, marginBottom: 10 },
|
|
|
|
selectedFeeType === NetworkTransactionFeeType.CUSTOM && {
|
|
|
|
borderRadius: 8,
|
|
|
|
backgroundColor: BlueCurrentTheme.colors.incomingBackgroundColor,
|
|
|
|
},
|
|
|
|
]}
|
|
|
|
>
|
|
|
|
<View style={{ justifyContent: 'space-between', flexDirection: 'row', alignItems: 'center' }}>
|
2021-08-01 21:05:21 +02:00
|
|
|
<Text style={{ fontSize: 22, color: BlueCurrentTheme.colors.successColor, fontWeight: '600' }}>
|
|
|
|
{formatStringAddTwoWhiteSpaces(loc.send.fee_custom)}
|
|
|
|
</Text>
|
2020-09-14 12:49:08 +02:00
|
|
|
</View>
|
|
|
|
<View style={{ justifyContent: 'space-between', flexDirection: 'row', alignItems: 'center', marginTop: 5 }}>
|
|
|
|
<TextInput
|
|
|
|
onChangeText={this.onCustomFeeTextChange}
|
|
|
|
keyboardType="numeric"
|
|
|
|
value={this.state.customFeeValue}
|
|
|
|
ref={ref => (this.customTextInput = ref)}
|
|
|
|
maxLength={9}
|
2020-05-15 11:26:37 +02:00
|
|
|
style={{
|
2020-09-14 12:49:08 +02:00
|
|
|
backgroundColor: BlueCurrentTheme.colors.inputBackgroundColor,
|
|
|
|
borderBottomColor: BlueCurrentTheme.colors.formBorder,
|
|
|
|
borderBottomWidth: 0.5,
|
|
|
|
borderColor: BlueCurrentTheme.colors.formBorder,
|
|
|
|
borderRadius: 4,
|
|
|
|
borderWidth: 1.0,
|
|
|
|
color: '#81868e',
|
|
|
|
flex: 1,
|
|
|
|
marginRight: 10,
|
|
|
|
minHeight: 33,
|
|
|
|
paddingRight: 5,
|
2020-09-15 16:05:25 +02:00
|
|
|
paddingLeft: 5,
|
2020-05-15 11:26:37 +02:00
|
|
|
}}
|
2020-09-14 12:49:08 +02:00
|
|
|
onFocus={() => this.onCustomFeeTextChange(this.state.customFeeValue)}
|
2023-07-25 16:31:09 +02:00
|
|
|
defaultValue={this.props.transactionMinimum}
|
2021-09-14 15:08:15 +02:00
|
|
|
placeholder={loc.send.fee_satvbyte}
|
2020-09-14 12:49:08 +02:00
|
|
|
placeholderTextColor="#81868e"
|
|
|
|
inputAccessoryViewID={BlueDismissKeyboardInputAccessory.InputAccessoryViewID}
|
|
|
|
/>
|
|
|
|
<Text style={{ color: BlueCurrentTheme.colors.successColor }}>sat/byte</Text>
|
2020-05-15 11:26:37 +02:00
|
|
|
</View>
|
|
|
|
</TouchableOpacity>
|
2020-07-15 19:32:59 +02:00
|
|
|
<BlueText style={{ color: BlueCurrentTheme.colors.alternativeTextColor }}>
|
2021-09-15 16:24:51 +02:00
|
|
|
{loc.formatString(loc.send.fee_replace_minvb, { min: this.props.transactionMinimum })}
|
2020-05-15 11:26:37 +02:00
|
|
|
</BlueText>
|
|
|
|
</View>
|
2019-08-27 06:05:27 +02:00
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-04-18 03:33:13 +02:00
|
|
|
export function BlueBigCheckmark({ style = {} }) {
|
2020-04-28 18:27:35 +02:00
|
|
|
const defaultStyles = {
|
|
|
|
backgroundColor: '#ccddf9',
|
|
|
|
width: 120,
|
|
|
|
height: 120,
|
|
|
|
borderRadius: 60,
|
|
|
|
alignSelf: 'center',
|
|
|
|
justifyContent: 'center',
|
|
|
|
marginTop: 0,
|
|
|
|
marginBottom: 0,
|
|
|
|
};
|
|
|
|
const mergedStyles = { ...defaultStyles, ...style };
|
|
|
|
return (
|
|
|
|
<View style={mergedStyles}>
|
|
|
|
<Icon name="check" size={50} type="font-awesome" color="#0f5cc0" />
|
|
|
|
</View>
|
|
|
|
);
|
2024-04-29 15:01:46 +02:00
|
|
|
}
|