Skip to content

Commit 5e5d8a3

Browse files
vytickmatejkriz
authored andcommitted
feat(suite-native): prompt remember only after discovery ended
1 parent 05304da commit 5e5d8a3

File tree

3 files changed

+51
-19
lines changed

3 files changed

+51
-19
lines changed

suite-common/wallet-core/src/discovery/discoveryReducer.ts

+11-2
Original file line numberDiff line numberDiff line change
@@ -91,8 +91,11 @@ export const selectDeviceDiscovery = (state: DiscoveryRootState & DeviceRootStat
9191
return selectDiscoveryByDeviceState(state, selectedDevice?.state);
9292
};
9393

94-
export const selectIsDeviceDiscoveryActive = (state: DiscoveryRootState & DeviceRootState) => {
95-
const discovery = selectDeviceDiscovery(state);
94+
export const selectIsDiscoveryActiveByDeviceState = (
95+
state: DiscoveryRootState & DeviceRootState,
96+
deviceState: string | undefined,
97+
) => {
98+
const discovery = selectDiscoveryByDeviceState(state, deviceState);
9699

97100
if (!discovery) return false;
98101

@@ -102,6 +105,12 @@ export const selectIsDeviceDiscoveryActive = (state: DiscoveryRootState & Device
102105
);
103106
};
104107

108+
export const selectIsDeviceDiscoveryActive = (state: DiscoveryRootState & DeviceRootState) => {
109+
const discovery = selectDeviceDiscovery(state);
110+
111+
return selectIsDiscoveryActiveByDeviceState(state, discovery?.deviceState);
112+
};
113+
105114
/**
106115
* Helper selector called from components
107116
* return `true` if discovery process is running/completed and `authConfirm` is required

suite-native/module-home/src/screens/HomeScreen/components/EnableViewOnlyBottomSheet.tsx

+4
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import {
66
selectIsPortfolioTrackerDevice,
77
toggleRememberDevice,
88
selectIsDeviceRemembered,
9+
selectIsDeviceDiscoveryActive,
910
} from '@suite-common/wallet-core';
1011
import { analytics, EventType } from '@suite-native/analytics';
1112
import { BottomSheet, Box, Button, CenteredTitleHeader, VStack } from '@suite-native/atoms';
@@ -45,6 +46,7 @@ export const EnableViewOnlyBottomSheet = () => {
4546
const isPortfolioTrackerDevice = useSelector(selectIsPortfolioTrackerDevice);
4647
const viewOnlyCancelationTimestamp = useSelector(selectViewOnlyCancelationTimestamp);
4748
const isDeviceRemembered = useSelector(selectIsDeviceRemembered);
49+
const isDiscoveryActive = useSelector(selectIsDeviceDiscoveryActive);
4850
const { showToast } = useToast();
4951
const [isVisible, setIsVisible] = useState(false);
5052
const [isAvailableBiometrics, setIsAvailableBiometrics] = useState(false);
@@ -63,13 +65,15 @@ export const EnableViewOnlyBottomSheet = () => {
6365
// does not have view only mode enabled already
6466
// the device is authorized
6567
// not a portfolio tracker
68+
// discovery has finished
6669
// the user hasn't made a choice yet
6770
// and biometrics initial setup was decided or biometrics is not available
6871

6972
const canBeShowed =
7073
!isDeviceRemembered &&
7174
isDeviceReadyToUseAndAuthorized &&
7275
!isPortfolioTrackerDevice &&
76+
!isDiscoveryActive &&
7377
!viewOnlyCancelationTimestamp &&
7478
(isBiometricsInitialSetupFinished || !isAvailableBiometrics);
7579

suite-native/module-settings/src/components/ViewOnly/WalletRow.tsx

+36-17
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,14 @@
1-
import { useDispatch } from 'react-redux';
1+
import { useDispatch, useSelector } from 'react-redux';
22

3-
import { Button, HStack, Text } from '@suite-native/atoms';
3+
import { Button, HStack, Loader, Text } from '@suite-native/atoms';
44
import { Translation } from '@suite-native/intl';
5-
import { deviceActions, toggleRememberDevice } from '@suite-common/wallet-core';
5+
import {
6+
DeviceRootState,
7+
DiscoveryRootState,
8+
deviceActions,
9+
selectIsDiscoveryActiveByDeviceState,
10+
toggleRememberDevice,
11+
} from '@suite-common/wallet-core';
612
import { analytics, EventType } from '@suite-native/analytics';
713
import { useAlert } from '@suite-native/alerts';
814
import { useToast } from '@suite-native/toasts';
@@ -11,18 +17,25 @@ import { TrezorDevice } from '@suite-common/suite-types';
1117
import { prepareNativeStyle, useNativeStyles } from '@trezor/styles';
1218
import { setViewOnlyCancelationTimestamp } from '@suite-native/settings';
1319

20+
type WalletRowProps = {
21+
device: TrezorDevice;
22+
};
23+
1424
const walletRowStyle = prepareNativeStyle(utils => ({
1525
paddingHorizontal: utils.spacings.medium,
1626
justifyContent: 'space-between',
1727
alignItems: 'center',
1828
height: 60,
1929
}));
2030

21-
export const WalletRow = ({ device }: { device: TrezorDevice }) => {
31+
export const WalletRow = ({ device }: WalletRowProps) => {
2232
const dispatch = useDispatch();
2333
const { showAlert, hideAlert } = useAlert();
2434
const { showToast } = useToast();
2535
const { applyStyle } = useNativeStyles();
36+
const isDeviceDiscoveryActive = useSelector((state: DiscoveryRootState & DeviceRootState) =>
37+
selectIsDiscoveryActiveByDeviceState(state, device.state),
38+
);
2639

2740
const walletNameLabel = device.useEmptyPassphrase ? (
2841
<Translation id="moduleSettings.viewOnly.wallet.standard" />
@@ -90,6 +103,8 @@ export const WalletRow = ({ device }: { device: TrezorDevice }) => {
90103
});
91104
};
92105

106+
const showToggleButton = device.remember || !isDeviceDiscoveryActive;
107+
93108
return (
94109
<HStack key={device.instance} style={applyStyle(walletRowStyle)}>
95110
<HStack spacing={12} alignItems="center">
@@ -99,19 +114,23 @@ export const WalletRow = ({ device }: { device: TrezorDevice }) => {
99114
/>
100115
<Text variant="callout">{walletNameLabel}</Text>
101116
</HStack>
102-
<Button
103-
size="extraSmall"
104-
colorScheme={device.remember ? 'redElevation0' : 'primary'}
105-
onPress={() => (device.remember ? handleDisableViewOnly() : toggleViewOnly())}
106-
>
107-
<Translation
108-
id={
109-
device.remember
110-
? 'moduleSettings.viewOnly.button.disable'
111-
: 'moduleSettings.viewOnly.button.enable'
112-
}
113-
/>
114-
</Button>
117+
{showToggleButton ? (
118+
<Button
119+
size="extraSmall"
120+
colorScheme={device.remember ? 'redElevation0' : 'primary'}
121+
onPress={() => (device.remember ? handleDisableViewOnly() : toggleViewOnly())}
122+
>
123+
<Translation
124+
id={
125+
device.remember
126+
? 'moduleSettings.viewOnly.button.disable'
127+
: 'moduleSettings.viewOnly.button.enable'
128+
}
129+
/>
130+
</Button>
131+
) : (
132+
<Loader size="small" />
133+
)}
115134
</HStack>
116135
);
117136
};

0 commit comments

Comments
 (0)