Merge pull request #3310 from BlueWallet/accessbility

ADD: Accessibility button trait to TouchableOpacity
This commit is contained in:
GLaDOS 2021-06-24 14:49:54 +01:00 committed by GitHub
commit 17d48debff
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
39 changed files with 154 additions and 63 deletions

View file

@ -80,6 +80,7 @@ export const BlueButton = props => {
alignItems: 'center',
paddingHorizontal: 16,
}}
accessibilityRole="button"
{...props}
>
<View style={{ flexDirection: 'row', justifyContent: 'center', alignItems: 'center' }}>
@ -101,6 +102,7 @@ export const SecondButton = forwardRef((props, ref) => {
return (
<TouchableOpacity
accessibilityRole="button"
style={{
flex: 1,
borderWidth: 0.7,
@ -127,7 +129,7 @@ export const SecondButton = forwardRef((props, ref) => {
export const BitcoinButton = props => {
const { colors } = useTheme();
return (
<TouchableOpacity testID={props.testID} onPress={props.onPress}>
<TouchableOpacity accessibilityRole="button" testID={props.testID} onPress={props.onPress}>
<View
style={{
borderColor: (props.active && colors.newBlue) || colors.buttonDisabledBackgroundColor,
@ -169,7 +171,7 @@ export const BitcoinButton = props => {
export const VaultButton = props => {
const { colors } = useTheme();
return (
<TouchableOpacity testID={props.testID} onPress={props.onPress}>
<TouchableOpacity accessibilityRole="button" testID={props.testID} onPress={props.onPress}>
<View
style={{
borderColor: (props.active && colors.foregroundColor) || colors.buttonDisabledBackgroundColor,
@ -217,7 +219,7 @@ export const VaultButton = props => {
export const LightningButton = props => {
const { colors } = useTheme();
return (
<TouchableOpacity onPress={props.onPress}>
<TouchableOpacity accessibilityRole="button" onPress={props.onPress}>
<View
style={{
borderColor: (props.active && colors.lnborderColor) || colors.buttonDisabledBackgroundColor,
@ -423,6 +425,7 @@ export class BlueWalletNavigationHeader extends Component {
}
/>
<TouchableOpacity
accessibilityRole="button"
style={styles.balance}
onPress={this.changeWalletBalanceUnit}
ref={this.walletBalanceText}
@ -449,7 +452,7 @@ export class BlueWalletNavigationHeader extends Component {
)}
</TouchableOpacity>
{this.state.wallet.type === LightningCustodianWallet.type && this.state.allowOnchainAddress && (
<TouchableOpacity onPress={this.manageFundsPressed}>
<TouchableOpacity accessibilityRole="button" onPress={this.manageFundsPressed}>
<View
style={{
marginTop: 14,
@ -477,7 +480,7 @@ export class BlueWalletNavigationHeader extends Component {
</TouchableOpacity>
)}
{this.state.wallet.type === MultisigHDWallet.type && (
<TouchableOpacity onPress={this.manageFundsPressed}>
<TouchableOpacity accessibilityRole="button" onPress={this.manageFundsPressed}>
<View
style={{
marginTop: 14,
@ -513,6 +516,7 @@ export const BlueButtonLink = forwardRef((props, ref) => {
const { colors } = useTheme();
return (
<TouchableOpacity
accessibilityRole="button"
style={{
minHeight: 60,
minWidth: 100,
@ -557,7 +561,7 @@ export const BluePrivateBalance = () => {
export const BlueCopyToClipboardButton = ({ stringToCopy, displayText = false }) => {
return (
<TouchableOpacity onPress={() => Clipboard.setString(stringToCopy)}>
<TouchableOpacity accessibilityRole="button" onPress={() => Clipboard.setString(stringToCopy)}>
<Text style={{ fontSize: 13, fontWeight: '400', color: '#68bbe1' }}>{displayText || loc.transactions.details_copy}</Text>
</TouchableOpacity>
);
@ -599,7 +603,12 @@ export class BlueCopyTextToClipboard extends Component {
render() {
return (
<View style={{ justifyContent: 'center', alignItems: 'center', paddingHorizontal: 16 }}>
<TouchableOpacity onPress={this.copyToClipboard} disabled={this.state.hasTappedText} testID="BlueCopyTextToClipboard">
<TouchableOpacity
accessibilityRole="button"
onPress={this.copyToClipboard}
disabled={this.state.hasTappedText}
testID="BlueCopyTextToClipboard"
>
<Animated.Text style={styleCopyTextToClipboard.address} numberOfLines={0}>
{this.state.address}
</Animated.Text>
@ -1193,7 +1202,7 @@ export const BlueReceiveButtonIcon = props => {
const { colors } = useTheme();
return (
<TouchableOpacity {...props} style={{ flex: 1 }}>
<TouchableOpacity accessibilityRole="button" {...props} style={{ flex: 1 }}>
<View
style={{
flex: 1,
@ -1628,6 +1637,7 @@ export class BlueReplaceFeeSuggestions extends Component {
},
].map(({ label, type, time, rate, active }, index) => (
<TouchableOpacity
accessibilityRole="button"
key={label}
onPress={() => this.onFeeSelected(type)}
style={[
@ -1654,6 +1664,7 @@ export class BlueReplaceFeeSuggestions extends Component {
</TouchableOpacity>
))}
<TouchableOpacity
accessibilityRole="button"
onPress={() => this.customTextInput.focus()}
style={[
{ paddingHorizontal: 16, paddingVertical: 8, marginBottom: 10 },
@ -1752,6 +1763,7 @@ export const BlueTabs = ({ active, onSwitch, tabs }) => (
{tabs.map((Tab, i) => (
<TouchableOpacity
key={i}
accessibilityRole="button"
onPress={() => onSwitch(i)}
style={[
tabsStyles.tabRoot,
@ -1859,18 +1871,21 @@ export class DynamicQRCode extends Component {
<BlueSpacing20 />
<View style={animatedQRCodeStyle.controller}>
<TouchableOpacity
accessibilityRole="button"
style={[animatedQRCodeStyle.button, { width: '25%', alignItems: 'flex-start' }]}
onPress={this.moveToPreviousFragment}
>
<Text style={animatedQRCodeStyle.text}>{loc.send.dynamic_prev}</Text>
</TouchableOpacity>
<TouchableOpacity
accessibilityRole="button"
style={[animatedQRCodeStyle.button, { width: '50%' }]}
onPress={this.state.intervalHandler ? this.stopAutoMove : this.startAutoMove}
>
<Text style={animatedQRCodeStyle.text}>{this.state.intervalHandler ? loc.send.dynamic_stop : loc.send.dynamic_start}</Text>
</TouchableOpacity>
<TouchableOpacity
accessibilityRole="button"
style={[animatedQRCodeStyle.button, { width: '25%', alignItems: 'flex-end' }]}
onPress={this.moveToNextFragment}
>

View file

@ -97,13 +97,13 @@ const UnlockWith = () => {
const color = colorScheme === 'dark' ? '#FFFFFF' : '#000000';
if ((biometricType === Biometric.TouchID || biometricType === Biometric.Biometrics) && !isStorageEncryptedEnabled) {
return (
<TouchableOpacity disabled={isAuthenticating} onPress={unlockWithBiometrics}>
<TouchableOpacity accessibilityRole="button" disabled={isAuthenticating} onPress={unlockWithBiometrics}>
<Icon name="fingerprint" size={64} type="font-awesome5" color={color} />
</TouchableOpacity>
);
} else if (biometricType === Biometric.FaceID && !isStorageEncryptedEnabled) {
return (
<TouchableOpacity disabled={isAuthenticating} onPress={unlockWithBiometrics}>
<TouchableOpacity accessibilityRole="button" disabled={isAuthenticating} onPress={unlockWithBiometrics}>
<Image
source={colorScheme === 'dark' ? require('./img/faceid-default.png') : require('./img/faceid-dark.png')}
style={styles.icon}
@ -112,7 +112,7 @@ const UnlockWith = () => {
);
} else if (isStorageEncryptedEnabled) {
return (
<TouchableOpacity disabled={isAuthenticating} onPress={unlockWithKey}>
<TouchableOpacity accessibilityRole="button" disabled={isAuthenticating} onPress={unlockWithKey}>
<Icon name="lock" size={64} type="font-awesome5" color={color} />
</TouchableOpacity>
);

View file

@ -66,10 +66,15 @@ const AddressInput = ({
});
}
}}
accessibilityRole="button"
style={[styles.scan, stylesHook.scan]}
accessibilityLabel={loc.send.details_scan}
accessibilityHint={loc.send.details_scan_hint}
>
<Image source={require('../img/scan-white.png')} />
<Text style={[styles.scanText, stylesHook.scanText]}>{loc.send.details_scan}</Text>
<Image source={require('../img/scan-white.png')} accessible={false} />
<Text style={[styles.scanText, stylesHook.scanText]} accessible={false}>
{loc.send.details_scan}
</Text>
</TouchableOpacity>
</View>
);

View file

@ -240,7 +240,12 @@ class AmountInput extends Component {
</View>
</View>
{!disabled && amount !== BitcoinUnit.MAX && (
<TouchableOpacity testID="changeAmountUnitButton" style={styles.changeAmountUnit} onPress={this.changeAmountUnit}>
<TouchableOpacity
accessibilityRole="button"
testID="changeAmountUnitButton"
style={styles.changeAmountUnit}
onPress={this.changeAmountUnit}
>
<Image source={require('../img/round-compare-arrows-24-px.png')} />
</TouchableOpacity>
)}

View file

@ -35,11 +35,11 @@ const styles = StyleSheet.create({
});
const CoinsSelected = ({ number, onContainerPress, onClose }) => (
<TouchableOpacity style={styles.root} onPress={onContainerPress}>
<TouchableOpacity accessibilityRole="button" style={styles.root} onPress={onContainerPress}>
<View style={styles.labelContainer}>
<Text style={styles.labelText}>{loc.formatString(loc.cc.coins_selected, { number })}</Text>
</View>
<TouchableOpacity style={styles.buttonContainer} onPress={onClose}>
<TouchableOpacity accessibilityRole="button" style={styles.buttonContainer} onPress={onClose}>
<Avatar rounded containerStyle={[styles.ball]} icon={{ name: 'close', size: 22, type: 'ionicons', color: 'white' }} />
</TouchableOpacity>
</TouchableOpacity>

View file

@ -105,6 +105,7 @@ export class DynamicQRCode extends Component {
return (
<View style={animatedQRCodeStyle.container}>
<TouchableOpacity
accessibilityRole="button"
testID="DynamicCode"
style={animatedQRCodeStyle.qrcodeContainer}
onPress={() => {
@ -136,18 +137,21 @@ export class DynamicQRCode extends Component {
<BlueSpacing20 />
<View style={animatedQRCodeStyle.controller}>
<TouchableOpacity
accessibilityRole="button"
style={[animatedQRCodeStyle.button, { width: '25%', alignItems: 'flex-start' }]}
onPress={this.moveToPreviousFragment}
>
<Text style={animatedQRCodeStyle.text}>{loc.send.dynamic_prev}</Text>
</TouchableOpacity>
<TouchableOpacity
accessibilityRole="button"
style={[animatedQRCodeStyle.button, { width: '50%' }]}
onPress={this.state.intervalHandler ? this.stopAutoMove : this.startAutoMove}
>
<Text style={animatedQRCodeStyle.text}>{this.state.intervalHandler ? loc.send.dynamic_stop : loc.send.dynamic_start}</Text>
</TouchableOpacity>
<TouchableOpacity
accessibilityRole="button"
style={[animatedQRCodeStyle.button, { width: '25%', alignItems: 'flex-end' }]}
onPress={this.moveToNextFragment}
>

View file

@ -119,7 +119,7 @@ export const FButton = ({ text, icon, width, first, last, ...props }) => {
}
return (
<TouchableOpacity style={[bStyles.root, bStylesHook.root, style]} {...props}>
<TouchableOpacity accessibilityRole="button" style={[bStyles.root, bStylesHook.root, style]} {...props}>
<View style={bStyles.icon}>{icon}</View>
<Text numberOfLines={1} style={[bStyles.text, props.disabled ? bStylesHook.textDisabled : bStylesHook.text]}>
{text}

View file

@ -139,6 +139,7 @@ const MultipleStepsListItem = props => {
{props.button.buttonType === undefined ||
(props.button.buttonType === MultipleStepsListItemButtohType.full && (
<TouchableOpacity
accessibilityRole="button"
disabled={props.button.disabled}
style={[styles.provideKeyButton, stylesHook.provideKeyButton, buttonOpacity]}
onPress={props.button.onPress}
@ -152,6 +153,7 @@ const MultipleStepsListItem = props => {
{props.button.leftText}
</Text>
<TouchableOpacity
accessibilityRole="button"
disabled={props.button.disabled}
style={[styles.rowPartialRightButton, stylesHook.provideKeyButton, rightButtonOpacity]}
onPress={props.button.onPress}
@ -166,7 +168,12 @@ const MultipleStepsListItem = props => {
)}
{!showActivityIndicator && props.rightButton && checked && (
<View style={styles.rightButtonContainer} accessibilityComponentType>
<TouchableOpacity disabled={props.rightButton.disabled} style={styles.rightButton} onPress={props.rightButton.onPress}>
<TouchableOpacity
accessibilityRole="button"
disabled={props.rightButton.disabled}
style={styles.rightButton}
onPress={props.rightButton.onPress}
>
<Text style={[styles.provideKeyButtonText, stylesHook.provideKeyButtonText]}>{props.rightButton.text}</Text>
</TouchableOpacity>
</View>

View file

@ -29,6 +29,7 @@ export const SquareButton = forwardRef((props, ref) => {
}}
{...props}
ref={ref}
accessibilityRole="button"
>
<View style={{ flexDirection: 'row', justifyContent: 'center', alignItems: 'center' }}>
{props.icon && <Icon name={props.icon.name} type={props.icon.type} color={props.icon.color} />}

View file

@ -35,7 +35,11 @@ const SquareEnumeratedWords = props => {
);
} else {
component.push(
<TouchableOpacity style={[styles.entryTextContainer, stylesHook.entryTextContainer]} key={`${secret}${index}`}>
<TouchableOpacity
accessibilityRole="button"
style={[styles.entryTextContainer, stylesHook.entryTextContainer]}
key={`${secret}${index}`}
>
<Text textBreakStrategy="simple" style={[styles.entryText, stylesHook.entryText]}>
{secret}
</Text>

View file

@ -60,7 +60,7 @@ const nStyles = StyleSheet.create({
const NewWalletPanel = ({ onPress }) => {
const { colors } = useTheme();
return (
<TouchableOpacity testID="CreateAWallet" onPress={onPress} style={nStyles.root}>
<TouchableOpacity accessibilityRole="button" testID="CreateAWallet" onPress={onPress} style={nStyles.root}>
<View style={[nStyles.container, { backgroundColor: WalletGradient.createWallet() }]}>
<Text style={[nStyles.addAWAllet, { color: colors.foregroundColor }]}>{loc.wallets.list_create_a_wallet}</Text>
<Text style={[nStyles.addLine, { color: colors.alternativeTextColor }]}>{loc.wallets.list_create_a_wallet_text}</Text>
@ -290,8 +290,7 @@ const cStyles = StyleSheet.create({
content: {
left: 16,
flexDirection: I18nManager.isRTL && Platform.OS === 'android' ? 'row-reverse' : 'row',
}
},
});
const WalletsCarousel = forwardRef((props, ref) => {
@ -348,7 +347,6 @@ const WalletsCarousel = forwardRef((props, ref) => {
inactiveSlideOpacity={I18nManager.isRTL && Platform.OS === 'android' ? 1.0 : 0.7}
activeSlideAlignment="start"
contentContainerCustomStyle={cStyles.content}
initialNumToRender={10}
onLayout={onLayout}
{...props}

View file

@ -21,7 +21,7 @@ const navigationStyle = ({ closeButton = false, closeButtonFunc, ...opts }, form
navigation.goBack(null);
};
headerRight = () => (
<TouchableOpacity style={styles.button} onPress={handleClose} testID="NavigationCloseButton">
<TouchableOpacity accessibilityRole="button" style={styles.button} onPress={handleClose} testID="NavigationCloseButton">
<Image source={theme.closeImage} />
</TouchableOpacity>
);
@ -71,6 +71,7 @@ export const navigationStyleTx = (opts, formatter) => {
headerTintColor: theme.colors.foregroundColor,
headerLeft: () => (
<TouchableOpacity
accessibilityRole="button"
style={styles.button}
onPress={() => {
Keyboard.dismiss();

View file

@ -186,6 +186,7 @@
"details_no_signed_tx": "The selected file doesnt contain a transaction that can be imported.",
"details_note_placeholder": "Note to Self",
"details_scan": "Scan",
"details_scan_hint": "Double tap to scan or import a destination",
"details_total_exceeds_balance": "The sending amount exceeds the available balance.",
"details_unrecognized_file_format": "Unrecognized file format",
"details_wallet_before_tx": "Before creating a transaction, you must first add a Bitcoin wallet.",

View file

@ -54,7 +54,7 @@
"e2e:debug": "(test -f android/app/build/outputs/apk/debug/app-debug.apk && test -f android/app/build/outputs/apk/androidTest/debug/app-debug-androidTest.apk) || npm run e2e:debug-build; npm run e2e:debug-test",
"e2e:release-build": "detox build -c android.emu.release",
"e2e:release-test": "detox test -c android.emu.release --record-videos all --take-screenshots all --headless --loglevel trace",
"lint": "eslint *.js screen/**/*.js blue_modules/*.js class/**/*.js models/ loc/ tests/**/*.js components/**/*.js",
"lint": "eslint *.js screen/**/*.js blue_modules/*.js class/**/*.js models/ loc/ tests/**/*.js components/**/*.js components/*.js",
"lint:fix": "npm run lint -- --fix",
"lint:quickfix": "git status --porcelain | grep -v '\\.json' | grep '\\.js' --color=never | awk '{print $2}' | xargs eslint --fix; exit 0",
"unit": "jest tests/unit/*"

View file

@ -483,6 +483,7 @@ export default class Browser extends Component {
<View style={styles.safeURLHome}>
{Platform.OS !== 'ios' && ( // on iOS lappbrowser opens blank page, thus, no HOME button
<TouchableOpacity
accessibilityRole="button"
onPress={() => {
processedInvoices = {};
this.setState({ url: 'https://bluewallet.io/marketplace/' });
@ -497,6 +498,7 @@ export default class Browser extends Component {
)}
<TouchableOpacity
accessibilityRole="button"
onPress={() => {
this.webView.current?.reload();
}}

View file

@ -304,7 +304,14 @@ const LNDCreateInvoice = () => {
const renderScanClickable = () => {
return (
<TouchableOpacity disabled={isLoading} onPress={navigateToScanQRCode} style={[styles.scanRoot, styleHooks.scanRoot]}>
<TouchableOpacity
disabled={isLoading}
onPress={navigateToScanQRCode}
style={[styles.scanRoot, styleHooks.scanRoot]}
accessibilityRole="button"
accessibilityLabel={loc.send.details_scan}
accessibilityHint={loc.send.details_scan_hint}
>
<Image style={{}} source={require('../../img/scan-white.png')} />
<Text style={[styles.scanClick, styleHooks.scanClick]}>{loc.send.details_scan}</Text>
</TouchableOpacity>
@ -320,13 +327,13 @@ const LNDCreateInvoice = () => {
return (
<View style={styles.walletRoot}>
{!isLoading && (
<TouchableOpacity style={styles.walletChooseWrap} onPress={navigateToSelectWallet}>
<TouchableOpacity accessibilityRole="button" style={styles.walletChooseWrap} onPress={navigateToSelectWallet}>
<Text style={styles.walletChooseText}>{loc.wallets.select_wallet.toLowerCase()}</Text>
<Icon name={I18nManager.isRTL ? 'angle-left' : 'angle-right'} size={18} type="font-awesome" color="#9aa0aa" />
</TouchableOpacity>
)}
<View style={styles.walletNameWrap}>
<TouchableOpacity style={styles.walletNameTouch} onPress={navigateToSelectWallet}>
<TouchableOpacity accessibilityRole="button" style={styles.walletNameTouch} onPress={navigateToSelectWallet}>
<Text style={[styles.walletNameText, styleHooks.walletNameText]}>{wallet.current.getLabel()}</Text>
<Text style={[styles.walletNameBalance, styleHooks.walletNameBalance]}>
{formatBalanceWithoutSuffix(wallet.current.getBalance(), BitcoinUnit.SATS, false)}

View file

@ -214,7 +214,7 @@ const LNDViewInvoice = () => {
/>
<View style={styles.detailsRoot}>
{invoice.payment_preimage && typeof invoice.payment_preimage === 'string' ? (
<TouchableOpacity style={styles.detailsTouch} onPress={navigateToPreImageScreen}>
<TouchableOpacity accessibilityRole="button" style={styles.detailsTouch} onPress={navigateToPreImageScreen}>
<Text style={[styles.detailsText, stylesHook.detailsText]}>{loc.send.create_details}</Text>
<Icon
name={I18nManager.isRTL ? 'angle-left' : 'angle-right'}

View file

@ -128,6 +128,7 @@ export default class LnurlPay extends Component {
<View style={styles.walletSelectRoot}>
{!this.state.isLoading && (
<TouchableOpacity
accessibilityRole="button"
style={styles.walletSelectTouch}
onPress={() =>
this.props.navigation.navigate('SelectWallet', { onWalletSelect: this.onWalletSelect, chainType: Chain.OFFCHAIN })
@ -139,6 +140,7 @@ export default class LnurlPay extends Component {
)}
<View style={styles.walletWrap}>
<TouchableOpacity
accessibilityRole="button"
style={styles.walletWrapTouch}
onPress={() =>
this.props.navigation.navigate('SelectWallet', { onWalletSelect: this.onWalletSelect, chainType: Chain.OFFCHAIN })

View file

@ -247,13 +247,13 @@ const ScanLndInvoice = () => {
return (
<View style={styles.walletSelectRoot}>
{!isLoading && (
<TouchableOpacity style={styles.walletSelectTouch} onPress={naviageToSelectWallet}>
<TouchableOpacity accessibilityRole="button" style={styles.walletSelectTouch} onPress={naviageToSelectWallet}>
<Text style={styles.walletSelectText}>{loc.wallets.select_wallet.toLowerCase()}</Text>
<Icon name={I18nManager.isRTL ? 'angle-left' : 'angle-right'} size={18} type="font-awesome" color="#9aa0aa" />
</TouchableOpacity>
)}
<View style={styles.walletWrap}>
<TouchableOpacity style={styles.walletWrapTouch} onPress={naviageToSelectWallet}>
<TouchableOpacity accessibilityRole="button" style={styles.walletWrapTouch} onPress={naviageToSelectWallet}>
<Text style={[styles.walletWrapLabel, stylesHook.walletWrapLabel]}>{walletLabel}</Text>
<Text style={[styles.walletWrapBalance, stylesHook.walletWrapBalance]}>
{formatBalanceWithoutSuffix(wallet.getBalance(), BitcoinUnit.SATS, false)}

View file

@ -112,6 +112,7 @@ export default class AztecoRedeem extends Component {
<View style={styles.selectWallet1}>
{!this.state.isLoading && (
<TouchableOpacity
accessibilityRole="button"
style={styles.selectTouch}
onPress={() =>
this.props.navigation.navigate('SelectWallet', {
@ -126,6 +127,7 @@ export default class AztecoRedeem extends Component {
)}
<View style={styles.selectWallet2}>
<TouchableOpacity
accessibilityRole="button"
style={styles.selectTouch}
onPress={() =>
this.props.navigation.navigate('SelectWallet', {

View file

@ -221,6 +221,7 @@ export default class Confirm extends Component {
</Text>
{this.state.isLoading ? <ActivityIndicator /> : <BlueButton onPress={() => this.send()} title={loc.send.confirm_sendNow} />}
<TouchableOpacity
accessibilityRole="button"
testID="TransactionDetailsButton"
style={styles.txDetails}
onPress={async () => {

View file

@ -144,10 +144,14 @@ export default class SendCreate extends Component {
<BlueText style={styles.cardText}>{loc.send.create_this_is_hex}</BlueText>
<TextInput testID="TxhexInput" style={styles.cardTx} height={72} multiline editable value={this.state.tx} />
<TouchableOpacity style={styles.actionTouch} onPress={() => Clipboard.setString(this.state.tx)}>
<TouchableOpacity accessibilityRole="button" style={styles.actionTouch} onPress={() => Clipboard.setString(this.state.tx)}>
<Text style={styles.actionText}>{loc.send.create_copy}</Text>
</TouchableOpacity>
<TouchableOpacity style={styles.actionTouch} onPress={() => Linking.openURL('https://coinb.in/?verify=' + this.state.tx)}>
<TouchableOpacity
accessibilityRole="button"
style={styles.actionTouch}
onPress={() => Linking.openURL('https://coinb.in/?verify=' + this.state.tx)}
>
<Text style={styles.actionText}>{loc.send.create_verify}</Text>
</TouchableOpacity>
</BlueCard>
@ -258,7 +262,7 @@ SendCreate.navigationOptions = navigationStyle({}, (options, { theme, navigation
let headerRight;
if (route.params.exportTXN) {
headerRight = () => (
<TouchableOpacity style={styles.export} onPress={route.params.exportTXN}>
<TouchableOpacity accessibilityRole="button" style={styles.export} onPress={route.params.exportTXN}>
<Icon size={22} name="share-alternative" type="entypo" color={BlueCurrentTheme.colors.foregroundColor} />
</TouchableOpacity>
);

View file

@ -930,6 +930,7 @@ const SendDetails = () => {
<View style={[styles.modalContent, stylesHook.modalContent]}>
{options.map(({ label, time, fee, rate, active }, index) => (
<TouchableOpacity
accessibilityRole="button"
key={label}
onPress={() => {
setFeePrecalc(fp => ({ ...fp, current: fee }));
@ -954,6 +955,7 @@ const SendDetails = () => {
))}
<TouchableOpacity
testID="feeCustom"
accessibilityRole="button"
style={styles.feeModalCustom}
onPress={async () => {
let error = loc.send.fee_satbyte;
@ -1102,6 +1104,7 @@ const SendDetails = () => {
<View style={styles.select}>
{!isLoading && (
<TouchableOpacity
accessibilityRole="button"
style={styles.selectTouch}
onPress={() => navigation.navigate('SelectWallet', { onWalletSelect, chainType: Chain.ONCHAIN })}
>
@ -1111,6 +1114,7 @@ const SendDetails = () => {
)}
<View style={styles.selectWrap}>
<TouchableOpacity
accessibilityRole="button"
style={styles.selectTouch}
onPress={() => navigation.navigate('SelectWallet', { onWalletSelect, chainType: Chain.ONCHAIN })}
>
@ -1251,6 +1255,7 @@ const SendDetails = () => {
</View>
<TouchableOpacity
testID="chooseFee"
accessibilityRole="button"
onPress={() => setIsFeeSelectionModalVisible(true)}
disabled={isLoading}
style={styles.fee}
@ -1428,6 +1433,7 @@ SendDetails.navigationOptions = navigationStyleTx({}, (options, { theme, navigat
...options,
headerRight: () => (
<TouchableOpacity
accessibilityRole="button"
style={styles.advancedOptions}
onPress={route.params.advancedOptionsMenuButtonAction}
testID="advancedOptionsMenuButton"

View file

@ -117,6 +117,7 @@ const PsbtMultisig = () => {
{renderProvideSignature && (
<View>
<TouchableOpacity
accessibilityRole="button"
testID="ProvideSignature"
style={[styles.provideSignatureButton, stylesHook.provideSignatureButton]}
onPress={navigateToPSBTMultisigQRCode}
@ -283,6 +284,7 @@ const PsbtMultisig = () => {
{isConfirmEnabled() && (
<View style={styles.height80}>
<TouchableOpacity
accessibilityRole="button"
testID="ExportSignedPsbt"
style={[styles.provideSignatureButton, stylesHook.provideSignatureButton]}
onPress={navigateToPSBTMultisigQRCode}

View file

@ -168,10 +168,10 @@ const PsbtWithHardwareWallet = () => {
<BlueText style={[styles.hexLabel, stylesHook.hexLabel]}>{loc.send.create_this_is_hex}</BlueText>
<TextInput style={[styles.hexInput, stylesHook.hexInput]} height={112} multiline editable value={txHex} />
<TouchableOpacity style={styles.hexTouch} onPress={copyHexToClipboard}>
<TouchableOpacity accessibilityRole="button" style={styles.hexTouch} onPress={copyHexToClipboard}>
<Text style={[styles.hexText, stylesHook.hexText]}>{loc.send.create_copy}</Text>
</TouchableOpacity>
<TouchableOpacity style={styles.hexTouch} onPress={handleOnVerifyPressed}>
<TouchableOpacity accessibilityRole="button" style={styles.hexTouch} onPress={handleOnVerifyPressed}>
<Text style={[styles.hexText, stylesHook.hexText]}>{loc.send.create_verify}</Text>
</TouchableOpacity>
<BlueSpacing20 />

View file

@ -161,7 +161,7 @@ const About = () => {
<BlueTextCentered>Electrum server</BlueTextCentered>
<BlueSpacing20 />
<TouchableOpacity onPress={handleOnGithubPress} style={styles.buttonLink}>
<TouchableOpacity accessibilityRole="button" onPress={handleOnGithubPress} style={styles.buttonLink}>
<Icon size={22} name="github" type="font-awesome-5" color={colors.foregroundColor} />
<Text style={styles.textLink}>{loc.settings.about_sm_github}</Text>
</TouchableOpacity>
@ -211,6 +211,7 @@ const About = () => {
<BlueTextCentered>Unique ID: {getUniqueId()}</BlueTextCentered>
<View style={styles.copyToClipboard}>
<TouchableOpacity
accessibilityRole="button"
onPress={() => {
const stringToCopy = 'user.id:' + getUniqueId();
Sentry.captureMessage('copied unique id');

View file

@ -236,7 +236,7 @@ export default class ElectrumSettings extends Component {
<View key={i} style={styles.serverHistoryItem}>
<Text style={styles.serverRow} numberOfLines={1} ellipsizeMode="middle">{`${server.host}:${server.port || server.sslPort}`}</Text>
<TouchableOpacity style={styles.selectButton} onPress={() => this.selectServer(server)}>
<TouchableOpacity accessibilityRole="button" style={styles.selectButton} onPress={() => this.selectServer(server)}>
<BlueText>{loc.settings.electrum_select}</BlueText>
</TouchableOpacity>
</View>
@ -328,7 +328,7 @@ export default class ElectrumSettings extends Component {
<View style={styles.serverAddTitle}>
<BlueText style={styles.explain}>{loc.settings.electrum_settings_explain}</BlueText>
<TouchableOpacity testID="ResetToDefault" onPress={() => this.resetToDefault()}>
<TouchableOpacity accessibilityRole="button" testID="ResetToDefault" onPress={() => this.resetToDefault()}>
<BlueText>{loc.settings.electrum_reset}</BlueText>
</TouchableOpacity>
</View>
@ -371,7 +371,7 @@ export default class ElectrumSettings extends Component {
<BlueCard>
<View style={styles.serverHistoryTitle}>
<BlueText style={styles.explain}>{loc.settings.electrum_history}</BlueText>
<TouchableOpacity onPress={() => this.clearHistoryAlert()}>
<TouchableOpacity accessibilityRole="button" onPress={() => this.clearHistoryAlert()}>
<BlueText>{loc.settings.electrum_clear}</BlueText>
</TouchableOpacity>
</View>

View file

@ -198,10 +198,14 @@ export default class CPFP extends Component {
<BlueText style={styles.hex}>{loc.send.create_this_is_hex}</BlueText>
<TextInput style={styles.hexInput} height={112} multiline editable value={this.state.txhex} />
<TouchableOpacity style={styles.action} onPress={() => Clipboard.setString(this.state.txhex)}>
<TouchableOpacity accessibilityRole="button" style={styles.action} onPress={() => Clipboard.setString(this.state.txhex)}>
<Text style={styles.actionText}>{loc.send.create_copy}</Text>
</TouchableOpacity>
<TouchableOpacity style={styles.action} onPress={() => Linking.openURL('https://coinb.in/?verify=' + this.state.txhex)}>
<TouchableOpacity
accessibilityRole="button"
style={styles.action}
onPress={() => Linking.openURL('https://coinb.in/?verify=' + this.state.txhex)}
>
<Text style={styles.actionText}>{loc.send.create_verify}</Text>
</TouchableOpacity>
<BlueButton onPress={() => this.broadcast()} title={loc.send.confirm_sendNow} />

View file

@ -66,7 +66,7 @@ const TransactionsDetails = () => {
useEffect(() => {
setOptions({
headerRight: () => (
<TouchableOpacity disabled={isLoading} style={styles.save} onPress={handleOnSaveButtonTapped}>
<TouchableOpacity accessibilityRole="button" disabled={isLoading} style={styles.save} onPress={handleOnSaveButtonTapped}>
<Text style={stylesHooks.saveText}>{loc.wallets.details_save}</Text>
</TouchableOpacity>
),
@ -242,6 +242,7 @@ const TransactionsDetails = () => {
]}
/>
<TouchableOpacity
accessibilityRole="button"
ref={openTransactionOnBlockExplorerRef}
onPress={handleOnOpenTransactionOnBlockExporerTapped}
onLongPress={showToolTipMenu}

View file

@ -226,7 +226,7 @@ const TransactionsStatus = () => {
} else if (isRBFCancelPossible === buttonStatus.possible) {
return (
<>
<TouchableOpacity style={styles.cancel}>
<TouchableOpacity accessibilityRole="button" style={styles.cancel}>
<Text onPress={navigateToRBFCancel} style={styles.cancelText}>
{loc.transactions.status_cancel}
</Text>
@ -348,7 +348,7 @@ const TransactionsStatus = () => {
{renderCPFP()}
{renderRBFBumpFee()}
{renderRBFCancel()}
<TouchableOpacity style={styles.details} onPress={navigateToTransactionDetials}>
<TouchableOpacity accessibilityRole="button" style={styles.details} onPress={navigateToTransactionDetials}>
<Text style={styles.detailsText}>{loc.send.create_details.toLowerCase()}</Text>
<Icon name={I18nManager.isRTL ? 'angle-left' : 'angle-right'} size={18} type="font-awesome" color="#9aa0aa" />
</TouchableOpacity>

View file

@ -108,7 +108,7 @@ const WalletsAddMultisig = () => {
<Text style={[styles.textSubtitle, stylesHook.textSubtitle]}>{loc.multisig.required_keys_out_of_total}</Text>
<View style={styles.rowCenter}>
<View style={styles.column}>
<TouchableOpacity onPress={increaseM} disabled={n === m || m === 7} style={styles.chevron}>
<TouchableOpacity accessibilityRole="button" onPress={increaseM} disabled={n === m || m === 7} style={styles.chevron}>
<Icon
name="chevron-up"
size={22}
@ -117,7 +117,7 @@ const WalletsAddMultisig = () => {
/>
</TouchableOpacity>
<Text style={[styles.textM, stylesHook.textHeader]}>{m}</Text>
<TouchableOpacity onPress={decreaseM} disabled={m === 2} style={styles.chevron}>
<TouchableOpacity accessibilityRole="button" onPress={decreaseM} disabled={m === 2} style={styles.chevron}>
<Icon name="chevron-down" size={22} type="octicon" color={m === 2 ? colors.buttonDisabledTextColor : '#007AFF'} />
</TouchableOpacity>
</View>
@ -127,11 +127,11 @@ const WalletsAddMultisig = () => {
</View>
<View style={styles.column}>
<TouchableOpacity disabled={n === 7} onPress={increaseN} style={styles.chevron}>
<TouchableOpacity accessibilityRole="button" disabled={n === 7} onPress={increaseN} style={styles.chevron}>
<Icon name="chevron-up" size={22} type="octicon" color={n === 7 ? colors.buttonDisabledTextColor : '#007AFF'} />
</TouchableOpacity>
<Text style={[styles.textM, stylesHook.textHeader]}>{n}</Text>
<TouchableOpacity onPress={decreaseN} disabled={n === m} style={styles.chevron}>
<TouchableOpacity accessibilityRole="button" onPress={decreaseN} disabled={n === m} style={styles.chevron}>
<Icon name="chevron-down" size={22} type="octicon" color={n === m ? colors.buttonDisabledTextColor : '#007AFF'} />
</TouchableOpacity>
</View>

View file

@ -643,7 +643,7 @@ const WalletsAddMultisigStep2 = () => {
const renderHelp = () => {
return (
<View style={styles.helpButtonWrapper}>
<TouchableOpacity style={[styles.helpButton, stylesHook.helpButton]} onPress={handleOnHelpPress}>
<TouchableOpacity accessibilityRole="button" style={[styles.helpButton, stylesHook.helpButton]} onPress={handleOnHelpPress}>
<Icon size={20} name="help" type="octaicon" color={colors.foregroundColor} />
<Text style={[styles.helpButtonText, stylesHook.helpButtonText]}>{loc.multisig.ms_help}</Text>
</TouchableOpacity>

View file

@ -179,7 +179,7 @@ const WalletDetails = () => {
// eslint-disable-next-line react-hooks/exhaustive-deps
setOptions({
headerRight: () => (
<TouchableOpacity testID="Save" disabled={isLoading} style={styles.save} onPress={setLabel}>
<TouchableOpacity accessibilityRole="button" testID="Save" disabled={isLoading} style={styles.save} onPress={setLabel}>
<Text style={stylesHook.saveText}>{loc.wallets.details_save}</Text>
</TouchableOpacity>
),
@ -599,7 +599,7 @@ const WalletDetails = () => {
)}
<BlueSpacing20 />
<BlueSpacing20 />
<TouchableOpacity onPress={handleDeleteButtonTapped} testID="DeleteButton">
<TouchableOpacity accessibilityRole="button" onPress={handleDeleteButtonTapped} testID="DeleteButton">
<Text textBreakStrategy="simple" style={styles.delete}>{`${loc.wallets.details_delete}${' '}`}</Text>
</TouchableOpacity>
</View>

View file

@ -714,11 +714,12 @@ export default class HodlHodl extends Component {
{this.state.isLoading ? (
<ActivityIndicator />
) : (
<TouchableOpacity onPress={() => this.setState({ isChooseCountryModalVisible: true })}>
<TouchableOpacity accessibilityRole="button" onPress={() => this.setState({ isChooseCountryModalVisible: true })}>
<Text style={styles.locationText}>{this.getNativeCountryName()}</Text>
</TouchableOpacity>
)}
<TouchableOpacity
accessibilityRole="button"
style={styles.blueTextContainer}
onPress={() => {
this.setState({ isFiltersModalVisible: true });

View file

@ -443,6 +443,7 @@ HodlHodlMyContracts.navigationOptions = navigationStyle(
},
headerRight: () => (
<TouchableOpacity
accessibilityRole="button"
style={styles.marginRight}
onPress={() => {
Alert.alert(

View file

@ -129,13 +129,13 @@ const WalletsList = () => {
},
headerRight: () =>
I18nManager.isRTL ? null : (
<TouchableOpacity testID="SettingsButton" style={styles.headerTouch} onPress={navigateToSettings}>
<TouchableOpacity accessibilityRole="button" testID="SettingsButton" style={styles.headerTouch} onPress={navigateToSettings}>
<Icon size={22} name="kebab-horizontal" type="octicon" color={colors.foregroundColor} />
</TouchableOpacity>
),
headerLeft: () =>
I18nManager.isRTL ? (
<TouchableOpacity testID="SettingsButton" style={styles.headerTouch} onPress={navigateToSettings}>
<TouchableOpacity accessibilityRole="button" testID="SettingsButton" style={styles.headerTouch} onPress={navigateToSettings}>
<Icon size={22} name="kebab-horizontal" type="octicon" color={colors.foregroundColor} />
</TouchableOpacity>
) : null,
@ -218,7 +218,7 @@ const WalletsList = () => {
{`${loc.transactions.list_title}${' '}`}
</Text>
{isDesktop && (
<TouchableOpacity style={style} onPress={() => refreshTransactions(true)} disabled={isLoading}>
<TouchableOpacity accessibilityRole="button" style={style} onPress={() => refreshTransactions(true)} disabled={isLoading}>
<Icon name="refresh" type="font-awesome" color={colors.feeText} />
</TouchableOpacity>
)}
@ -247,6 +247,7 @@ const WalletsList = () => {
if (carouselData.length > 0 && !carouselData.some(wallet => wallet.type === PlaceholderWallet.type)) {
const button = (
<TouchableOpacity
accessibilityRole="button"
onPress={() => {
navigate('HodlHodl', { screen: 'HodlHodl' });
}}

View file

@ -103,10 +103,10 @@ export const convertToBuffer = ({ entropy, bits }) => {
const Coin = ({ push }) => (
<View style={styles.coinRoot}>
<TouchableOpacity onPress={() => push(getEntropy(0, 2))} style={styles.coinBody}>
<TouchableOpacity accessibilityRole="button" onPress={() => push(getEntropy(0, 2))} style={styles.coinBody}>
<Image style={styles.coinImage} source={require('../../img/coin1.png')} />
</TouchableOpacity>
<TouchableOpacity onPress={() => push(getEntropy(1, 2))} style={styles.coinBody}>
<TouchableOpacity accessibilityRole="button" onPress={() => push(getEntropy(1, 2))} style={styles.coinBody}>
<Image style={styles.coinImage} source={require('../../img/coin2.png')} />
</TouchableOpacity>
</View>
@ -151,7 +151,7 @@ const Dice = ({ push, sides }) => {
return (
<ScrollView contentContainerStyle={[styles.diceContainer, stylesHook.diceContainer]}>
{[...Array(sides)].map((_, i) => (
<TouchableOpacity key={i} onPress={() => push(getEntropy(i, sides))}>
<TouchableOpacity accessibilityRole="button" key={i} onPress={() => push(getEntropy(i, sides))}>
<View style={[styles.diceRoot, { width: diceWidth }]}>
{sides === 6 ? (
<Icon style={styles.diceIcon} name={diceIcon(i + 1)} size={70} color="grey" type="font-awesome-5" />
@ -240,7 +240,7 @@ const Entropy = () => {
return (
<SafeBlueArea>
<BlueSpacing20 />
<TouchableOpacity onPress={() => setShow(!show)}>
<TouchableOpacity accessibilityRole="button" onPress={() => setShow(!show)}>
<View style={[styles.entropy, stylesHook.entropy]}>
<Text style={[styles.entropyText, stylesHook.entropyText]}>{show ? hex : `${bits} of 256 bits`}</Text>
</View>

View file

@ -105,6 +105,7 @@ const SelectWallet = () => {
ReactNativeHapticFeedback.trigger('selection', { ignoreAndroidSystemSettings: false });
onWalletSelect(item);
}}
accessibilityRole="button"
>
<View shadowOpacity={40 / 100} shadowOffset={{ width: 0, height: 0 }} shadowRadius={5} style={styles.itemRoot}>
<LinearGradient shadowColor="#000000" colors={WalletGradient.gradientsFor(item.type)} style={styles.gradient}>

View file

@ -259,7 +259,13 @@ const WalletTransactions = () => {
</View>
<View style={[styles.listHeaderTextRow, stylesHook.listHeaderTextRow]}>
<Text style={[styles.listHeaderText, stylesHook.listHeaderText]}>{loc.transactions.list_title}</Text>
<TouchableOpacity testID="refreshTransactions" style={style} onPress={refreshTransactions} disabled={isLoading}>
<TouchableOpacity
accessibilityRole="button"
testID="refreshTransactions"
style={style}
onPress={refreshTransactions}
disabled={isLoading}
>
<Icon name="refresh" type="font-awesome" color={colors.feeText} />
</TouchableOpacity>
</View>
@ -340,6 +346,7 @@ const WalletTransactions = () => {
return Platform.select({
android: (
<TouchableOpacity
accessibilityRole="button"
onPress={() => {
if (wallet.type === LightningCustodianWallet.type) {
navigate('LappBrowserRoot', {
@ -358,6 +365,7 @@ const WalletTransactions = () => {
ios:
wallet.getBalance() > 0 ? (
<TouchableOpacity
accessibilityRole="button"
onPress={async () => {
Linking.openURL('https://bluewallet.io/marketplace/');
}}
@ -373,6 +381,7 @@ const WalletTransactions = () => {
const renderLappBrowserButton = () => {
return (
<TouchableOpacity
accessibilityRole="button"
onPress={() => {
navigate('LappBrowserRoot', {
screen: 'LappBrowser',
@ -391,7 +400,11 @@ const WalletTransactions = () => {
const renderSellFiat = () => {
return (
<TouchableOpacity onPress={navigateToBuyBitcoin} style={[styles.marketplaceButton2, stylesHook.marketplaceButton2]}>
<TouchableOpacity
accessibilityRole="button"
onPress={navigateToBuyBitcoin}
style={[styles.marketplaceButton2, stylesHook.marketplaceButton2]}
>
<Text style={[styles.marketpalceText1, stylesHook.marketpalceText1]}>{loc.wallets.list_tap_here_to_buy}</Text>
</TouchableOpacity>
);
@ -654,7 +667,7 @@ const WalletTransactions = () => {
{isLightning() && <Text style={styles.emptyTxsLightning}>{loc.wallets.list_empty_txs2_lightning}</Text>}
{!isLightning() && (
<TouchableOpacity onPress={navigateToBuyBitcoin} style={styles.buyBitcoin}>
<TouchableOpacity onPress={navigateToBuyBitcoin} style={styles.buyBitcoin} accessibilityRole="button">
<Text testID="NoTxBuyBitcoin" style={styles.buyBitcoinText}>
{loc.wallets.list_tap_here_to_buy}
</Text>
@ -716,6 +729,7 @@ WalletTransactions.navigationOptions = navigationStyle({}, (options, { theme, na
return {
headerRight: () => (
<TouchableOpacity
accessibilityRole="button"
testID="WalletDetails"
disabled={route.params.isLoading === true}
style={styles.walletDetails}