Skip to content

Commit 2f9a805

Browse files
committed
fix(suite-native): use linear gradient in screen footers with buttons
1 parent 06df8dd commit 2f9a805

File tree

9 files changed

+63
-81
lines changed

9 files changed

+63
-81
lines changed

suite-native/coin-enabling/package.json

-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@
2727
"@suite-native/toasts": "workspace:*",
2828
"@suite-native/tokens": "workspace:*",
2929
"@trezor/styles": "workspace:*",
30-
"expo-linear-gradient": "^14.0.1",
3130
"react": "18.2.0",
3231
"react-native": "0.76.1",
3332
"react-native-reanimated": "^3.16.7",

suite-native/coin-enabling/src/screens/CoinEnablingInitScreen.tsx

+13-55
Original file line numberDiff line numberDiff line change
@@ -1,59 +1,30 @@
11
import { useDispatch, useSelector } from 'react-redux';
22
import Animated, { SlideInDown, SlideOutDown } from 'react-native-reanimated';
3-
import { View } from 'react-native';
43

54
import { A } from '@mobily/ts-belt';
65
import { useNavigation } from '@react-navigation/native';
7-
import { LinearGradient } from 'expo-linear-gradient';
86

9-
import { Screen, useHandleHardwareBackNavigation } from '@suite-native/navigation';
7+
import {
8+
Screen,
9+
ScreenFooterGradient,
10+
useHandleHardwareBackNavigation,
11+
} from '@suite-native/navigation';
1012
import { Box, Button, Text, VStack } from '@suite-native/atoms';
1113
import {
1214
applyDiscoveryChangesThunk,
1315
selectDeviceEnabledDiscoveryNetworkSymbols,
1416
setIsCoinEnablingInitFinished,
1517
} from '@suite-native/discovery';
1618
import { Translation } from '@suite-native/intl';
17-
import { prepareNativeStyle, useNativeStyles } from '@trezor/styles';
1819
import { analytics, EventType } from '@suite-native/analytics';
19-
import { hexToRgba } from '@suite-common/suite-utils';
2020

2121
import { DiscoveryCoinsFilter } from '../components/DiscoveryCoinsFilter';
2222

23-
const BOTTOM_OFFSET = 12;
24-
const BUTTON_HEIGHT = 48;
25-
26-
const contentStyle = prepareNativeStyle(_ => ({
27-
paddingBottom: BOTTOM_OFFSET,
28-
}));
29-
30-
const gradientBackgroundBottomStyle = prepareNativeStyle<{ showButton: boolean }>(
31-
(utils, { showButton }) => ({
32-
width: '100%',
33-
height: utils.spacings.sp16,
34-
position: 'absolute',
35-
bottom: -BOTTOM_OFFSET,
36-
pointerEvents: 'none',
37-
extend: [{ condition: showButton, style: { bottom: BUTTON_HEIGHT } }],
38-
}),
39-
);
40-
41-
const buttonWrapperStyle = prepareNativeStyle(utils => ({
42-
bottom: BOTTOM_OFFSET,
43-
backgroundColor: utils.colors.backgroundSurfaceElevation0,
44-
width: '100%',
45-
}));
46-
47-
const buttonStyle = prepareNativeStyle(utils => ({
48-
paddingHorizontal: utils.spacings.sp16,
49-
}));
50-
5123
export const CoinEnablingInitScreen = () => {
5224
const dispatch = useDispatch();
5325
const navigation = useNavigation();
5426
useHandleHardwareBackNavigation();
5527

56-
const { applyStyle, utils } = useNativeStyles();
5728
const enabledNetworkSymbols = useSelector(selectDeviceEnabledDiscoveryNetworkSymbols);
5829

5930
const handleSave = () => {
@@ -69,9 +40,6 @@ export const CoinEnablingInitScreen = () => {
6940
}
7041
};
7142

72-
// 'transparent' color is not working in context of LinearGradient on iOS. RGBA has to be used instead.
73-
const transparentColor = hexToRgba(utils.colors.backgroundSurfaceElevation0, 0.01);
74-
7543
const canBeSaved = A.isNotEmpty(enabledNetworkSymbols);
7644

7745
return (
@@ -87,29 +55,19 @@ export const CoinEnablingInitScreen = () => {
8755
</VStack>
8856
}
8957
footer={
90-
<View style={applyStyle(buttonWrapperStyle)}>
91-
<LinearGradient
92-
dither={false}
93-
colors={[transparentColor, utils.colors.backgroundSurfaceElevation0]}
94-
style={applyStyle(gradientBackgroundBottomStyle, {
95-
showButton: canBeSaved,
96-
})}
97-
/>
98-
{canBeSaved && (
99-
<Animated.View
100-
entering={SlideInDown}
101-
exiting={SlideOutDown}
102-
style={applyStyle(buttonStyle)}
103-
>
58+
canBeSaved && (
59+
<Animated.View entering={SlideInDown} exiting={SlideOutDown}>
60+
<ScreenFooterGradient />
61+
<Box marginHorizontal="sp16">
10462
<Button onPress={handleSave} testID="@coin-enabling/button-save">
10563
<Translation id="moduleSettings.coinEnabling.initialSetup.button" />
10664
</Button>
107-
</Animated.View>
108-
)}
109-
</View>
65+
</Box>
66+
</Animated.View>
67+
)
11068
}
11169
>
112-
<Box style={applyStyle(contentStyle)}>
70+
<Box>
11371
<DiscoveryCoinsFilter allowDeselectLastCoin={true} allowChangeAnalytics={false} />
11472
</Box>
11573
</Screen>

suite-native/module-accounts-import/src/components/AccountImportSummaryScreen.tsx

+3-2
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { ReactNode } from 'react';
22
import { KeyboardAvoidingView, Platform } from 'react-native';
33

44
import { Box, PictogramTitleHeader, VStack } from '@suite-native/atoms';
5-
import { Screen } from '@suite-native/navigation';
5+
import { Screen, ScreenFooterGradient } from '@suite-native/navigation';
66

77
import { AccountImportScreenHeader } from './AccountImportScreenHeader';
88

@@ -25,7 +25,8 @@ export const AccountImportSummaryScreen = ({
2525
header={<AccountImportScreenHeader />}
2626
footer={
2727
<KeyboardAvoidingView behavior={Platform.OS === 'ios' ? 'padding' : 'height'}>
28-
<Box margin="sp16">{footer}</Box>
28+
<ScreenFooterGradient />
29+
<Box marginHorizontal="sp16">{footer}</Box>
2930
</KeyboardAvoidingView>
3031
}
3132
>

suite-native/module-device-settings/src/screens/FirmwareUpdateScreen/FirmwareUpdateScreen.tsx

+1
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import { FirmwareUpdateVersionCard } from './FirmwareVersionCard';
2626

2727
const firmwareUpdateButtonStyle = prepareNativeStyle(utils => ({
2828
marginHorizontal: utils.spacings.sp16,
29+
marginBottom: utils.spacings.sp16,
2930
}));
3031

3132
type NavigationProp = StackNavigationProps<

suite-native/module-send/src/screens/SendOutputsScreen.tsx

+14-21
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import {
2121
updateFeeInfoThunk,
2222
} from '@suite-common/wallet-core';
2323
import {
24+
ScreenFooterGradient,
2425
SendStackParamList,
2526
SendStackRoutes,
2627
StackNavigationProps,
@@ -30,7 +31,6 @@ import { getNetwork } from '@suite-common/wallet-config';
3031
import { Box, Button } from '@suite-native/atoms';
3132
import { Translation } from '@suite-native/intl';
3233
import { useDebounce } from '@trezor/react-utils';
33-
import { prepareNativeStyle, useNativeStyles } from '@trezor/styles';
3434
import { useForm, Form } from '@suite-native/forms';
3535
import { selectIsAmountInSats, SettingsSliceRootState } from '@suite-native/settings';
3636
import { TokenAddress } from '@suite-common/wallet-types';
@@ -46,11 +46,6 @@ import { FeeLevelsMaxAmount } from '../types';
4646
import { storeFeeLevels } from '../sendFormSlice';
4747
import { useSubscribeForSolanaBlockUpdates } from '../hooks/useSubscribeForSolanaBlockUpdates';
4848

49-
const buttonWrapperStyle = prepareNativeStyle(utils => ({
50-
width: '100%',
51-
padding: utils.spacings.sp16,
52-
}));
53-
5449
const getDefaultValues = ({
5550
tokenContract,
5651
}: {
@@ -72,7 +67,6 @@ export const SendOutputsScreen = ({
7267
}: StackProps<SendStackParamList, SendStackRoutes.SendOutputs>) => {
7368
const { accountKey, tokenContract } = params;
7469
const dispatch = useDispatch();
75-
const { applyStyle } = useNativeStyles();
7670
const debounce = useDebounce();
7771
const navigation =
7872
useNavigation<StackNavigationProps<SendStackParamList, SendStackRoutes.SendOutputs>>();
@@ -275,20 +269,19 @@ export const SendOutputsScreen = ({
275269
}
276270
footer={
277271
isValid && (
278-
<Animated.View
279-
entering={SlideInDown}
280-
exiting={SlideOutDown}
281-
style={applyStyle(buttonWrapperStyle)}
282-
>
283-
<Button
284-
accessibilityRole="button"
285-
accessibilityLabel="validate send form"
286-
testID="@send/form-submit-button"
287-
onPress={handleNavigateToReviewScreen}
288-
isDisabled={isSubmitting}
289-
>
290-
<Translation id="generic.buttons.continue" />
291-
</Button>
272+
<Animated.View entering={SlideInDown} exiting={SlideOutDown}>
273+
<ScreenFooterGradient />
274+
<Box marginHorizontal="sp16">
275+
<Button
276+
accessibilityRole="button"
277+
accessibilityLabel="validate send form"
278+
testID="@send/form-submit-button"
279+
onPress={handleNavigateToReviewScreen}
280+
isDisabled={isSubmitting}
281+
>
282+
<Translation id="generic.buttons.continue" />
283+
</Button>
284+
</Box>
292285
</Animated.View>
293286
)
294287
}

suite-native/navigation/package.json

+1
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
"@trezor/connect": "workspace:*",
2727
"@trezor/styles": "workspace:*",
2828
"@trezor/theme": "workspace:*",
29+
"expo-linear-gradient": "14.0.1",
2930
"expo-linking": "^7.0.2",
3031
"expo-navigation-bar": "^4.0.2",
3132
"expo-system-ui": "^4.0.2",
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import { LinearGradient } from 'expo-linear-gradient';
2+
3+
import { prepareNativeStyle, useNativeStyles } from '@trezor/styles';
4+
import { hexToRgba } from '@suite-common/suite-utils';
5+
6+
const screenFooterGradientStyle = prepareNativeStyle(utils => ({
7+
width: '100%',
8+
height: utils.spacings.sp16,
9+
top: -utils.spacings.sp16,
10+
marginBottom: -utils.spacings.sp16,
11+
pointerEvents: 'none',
12+
}));
13+
14+
export const ScreenFooterGradient = () => {
15+
const { applyStyle, utils } = useNativeStyles();
16+
17+
// 'transparent' color does not work in context of LinearGradient on iOS, RGBA has to be used instead.
18+
const backgroundColor = utils.colors.backgroundSurfaceElevation0;
19+
const transparentColor = hexToRgba(backgroundColor, 0.01);
20+
21+
return (
22+
<LinearGradient
23+
dither={false}
24+
colors={[transparentColor, backgroundColor]}
25+
style={applyStyle(screenFooterGradientStyle)}
26+
/>
27+
);
28+
};

suite-native/navigation/src/index.ts

+1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ export * from './useScrollDivider';
88
export * from './components/TabBar';
99
export * from './components/Screen';
1010
export * from './components/ScreenHeader';
11+
export * from './components/ScreenFooterGradient';
1112
export * from './components/NavigationContainerWithAnalytics';
1213
export * from './components/GoBackIcon';
1314
export * from './components/ScrollViewContext';

yarn.lock

+2-2
Original file line numberDiff line numberDiff line change
@@ -10186,7 +10186,6 @@ __metadata:
1018610186
"@suite-native/toasts": "workspace:*"
1018710187
"@suite-native/tokens": "workspace:*"
1018810188
"@trezor/styles": "workspace:*"
10189-
expo-linear-gradient: "npm:^14.0.1"
1019010189
react: "npm:18.2.0"
1019110190
react-native: "npm:0.76.1"
1019210191
react-native-reanimated: "npm:^3.16.7"
@@ -10967,6 +10966,7 @@ __metadata:
1096710966
"@trezor/connect": "workspace:*"
1096810967
"@trezor/styles": "workspace:*"
1096910968
"@trezor/theme": "workspace:*"
10969+
expo-linear-gradient: "npm:14.0.1"
1097010970
expo-linking: "npm:^7.0.2"
1097110971
expo-navigation-bar: "npm:^4.0.2"
1097210972
expo-system-ui: "npm:^4.0.2"
@@ -23121,7 +23121,7 @@ __metadata:
2312123121
languageName: node
2312223122
linkType: hard
2312323123

23124-
"expo-linear-gradient@npm:^14.0.1":
23124+
"expo-linear-gradient@npm:14.0.1, expo-linear-gradient@npm:^14.0.1":
2312523125
version: 14.0.1
2312623126
resolution: "expo-linear-gradient@npm:14.0.1"
2312723127
peerDependencies:

0 commit comments

Comments
 (0)