Skip to content

Commit

Permalink
feat(mobile): make feature flags more dummy proof
Browse files Browse the repository at this point in the history
  • Loading branch information
Nodonisko committed Jan 8, 2025
1 parent 126fd7e commit f7cfe41
Show file tree
Hide file tree
Showing 17 changed files with 36 additions and 30 deletions.
2 changes: 1 addition & 1 deletion suite-native/accounts/src/components/AddAccountsButton.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ export const AddAccountButton = ({ flowType, testID }: AddAccountButtonProps) =>

const isSelectedDevicePortfolioTracker = useSelector(selectIsPortfolioTrackerDevice);
const hasDiscovery = useSelector(selectHasDeviceDiscovery);
const [isDeviceConnectEnabled] = useFeatureFlag(FeatureFlag.IsDeviceConnectEnabled);
const isDeviceConnectEnabled = useFeatureFlag(FeatureFlag.IsDeviceConnectEnabled);
const { showViewOnlyAddAccountAlert } = useAccountAlerts();
const isDeviceInViewOnlyMode = useSelector(selectIsDeviceInViewOnlyMode);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import { DeviceManagerContent } from './DeviceManagerContent';
import { PortfolioTrackerDeviceManagerContent } from './PortfolioTrackerDeviceManagerContent';

export const DeviceManager = () => {
const [isUsbDeviceConnectFeatureEnabled] = useFeatureFlag(FeatureFlag.IsDeviceConnectEnabled);
const isUsbDeviceConnectFeatureEnabled = useFeatureFlag(FeatureFlag.IsDeviceConnectEnabled);

return (
<Box flexDirection="row" flex={1}>
Expand Down
1 change: 1 addition & 0 deletions suite-native/feature-flags/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
export * from './featureFlagsSlice';
export * from './useFeatureFlag';
export * from './useToggleFeatureFlag';
15 changes: 3 additions & 12 deletions suite-native/feature-flags/src/useFeatureFlag.tsx
Original file line number Diff line number Diff line change
@@ -1,24 +1,15 @@
import { useDispatch, useSelector } from 'react-redux';
import { useSelector } from 'react-redux';

import {
FeatureFlag,
FeatureFlagsRootState,
selectIsFeatureFlagEnabled,
toggleFeatureFlag,
} from './featureFlagsSlice';

type FeatureFlagHookReturnType = [boolean, () => void];

export const useFeatureFlag = (featureFlag: FeatureFlag): FeatureFlagHookReturnType => {
const dispatch = useDispatch();

export const useFeatureFlag = (featureFlag: FeatureFlag): boolean => {
const isFeatureFlagEnabled = useSelector((state: FeatureFlagsRootState) =>
selectIsFeatureFlagEnabled(state, featureFlag),
);

const toggleIsFeatureFlagEnabled = () => {
dispatch(toggleFeatureFlag({ featureFlag }));
};

return [isFeatureFlagEnabled, toggleIsFeatureFlagEnabled];
return isFeatureFlagEnabled;
};
9 changes: 9 additions & 0 deletions suite-native/feature-flags/src/useToggleFeatureFlag.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import { useDispatch } from 'react-redux';

import { FeatureFlag, toggleFeatureFlag } from './featureFlagsSlice';

export const useToggleFeatureFlag = (featureFlag: FeatureFlag): (() => void) => {
const dispatch = useDispatch();

return () => dispatch(toggleFeatureFlag({ featureFlag }));
};
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ export const AccountImportSummaryScreen = ({
>) => {
const { accountInfo, networkSymbol } = route.params;

const [isRegtestEnabled] = useFeatureFlag(FeatureFlag.IsRegtestEnabled);
const isRegtestEnabled = useFeatureFlag(FeatureFlag.IsRegtestEnabled);
const account = useSelector((state: AccountsRootState & DeviceRootState) =>
selectDeviceAccountByDescriptorAndNetworkSymbol(
state,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ const TransactionListHeaderContent = ({
export const TransactionListHeader = memo(
({ accountKey, tokenContract }: TransactionListHeaderProps) => {
const navigation = useNavigation<AccountsNavigationProps>();
const [isDeviceConnectEnabled] = useFeatureFlag(FeatureFlag.IsDeviceConnectEnabled);
const isDeviceConnectEnabled = useFeatureFlag(FeatureFlag.IsDeviceConnectEnabled);

const account = useSelector((state: AccountsRootState) =>
selectAccountByKey(state, accountKey),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ const isConnectPopupUrl = (url: string): boolean => {
// TODO: will be necessary to handle if device is not connected/unlocked so we probably want to wait until user unlock device
// we already have some modals like biometrics or coin enabled which are waiting for device to be connected
export const useConnectPopupNavigation = () => {
const [featureFlagEnabled] = useFeatureFlag(FeatureFlag.IsConnectPopupEnabled);
const featureFlagEnabled = useFeatureFlag(FeatureFlag.IsConnectPopupEnabled);
const navigation = useNavigation<NavigationProp>();

const navigateToConnectPopup = useCallback(
Expand Down
11 changes: 8 additions & 3 deletions suite-native/module-dev-utils/src/components/FeatureFlags.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
import { Box, Card, CheckBox, Text, VStack } from '@suite-native/atoms';
import { FeatureFlag as FeatureFlagEnum, useFeatureFlag } from '@suite-native/feature-flags';
import {
FeatureFlag as FeatureFlagEnum,
useFeatureFlag,
useToggleFeatureFlag,
} from '@suite-native/feature-flags';

const featureFlagsTitleMap = {
[FeatureFlagEnum.IsDeviceConnectEnabled]: 'Connect device',
Expand All @@ -12,12 +16,13 @@ const featureFlagsTitleMap = {
} as const satisfies Record<FeatureFlagEnum, string>;

const FeatureFlag = ({ featureFlag }: { featureFlag: FeatureFlagEnum }) => {
const [value, setValue] = useFeatureFlag(featureFlag);
const value = useFeatureFlag(featureFlag);
const toggleFeatureFlag = useToggleFeatureFlag(featureFlag);

return (
<Box flexDirection="row" justifyContent="space-between">
<Text>{featureFlagsTitleMap[featureFlag]}</Text>
<CheckBox isChecked={value} onChange={setValue} />
<CheckBox isChecked={value} onChange={toggleFeatureFlag} />
</Box>
);
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ export const DeviceFirmwareCard = () => {
selectIsDiscoveryActiveByDeviceState(state, device?.state),
);
const navigation = useNavigation<NavigationProp>();
const [isFirmwareUpdateEnabled] = useFeatureFlag(FeatureFlag.IsFirmwareUpdateEnabled);
const isFirmwareUpdateEnabled = useFeatureFlag(FeatureFlag.IsFirmwareUpdateEnabled);

if (!device || !deviceModel) {
return null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import { EmptyConnectedDeviceState } from './EmptyConnectedDeviceState';
import { EmptyPortfolioCrossroads } from './EmptyPortfolioCrossroads';

export const EmptyHomeRenderer = () => {
const [isUsbDeviceConnectFeatureEnabled] = useFeatureFlag(FeatureFlag.IsDeviceConnectEnabled);
const isUsbDeviceConnectFeatureEnabled = useFeatureFlag(FeatureFlag.IsDeviceConnectEnabled);

const isDeviceAuthorized = useSelector(selectIsDeviceAuthorized);
const isPortfolioTrackerDevice = useSelector(selectIsPortfolioTrackerDevice);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ export const OnboardingScreenHeader = ({
}: OnboardingScreenHeaderProps) => {
const { applyStyle } = useNativeStyles();

const [isUsbDeviceConnectFeatureEnabled] = useFeatureFlag(FeatureFlag.IsDeviceConnectEnabled);
const isUsbDeviceConnectFeatureEnabled = useFeatureFlag(FeatureFlag.IsDeviceConnectEnabled);

return (
<Box alignItems="center" style={applyStyle(wrapperStyle)} alignSelf="center">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ const receiveScreenContentMap = {
} as const satisfies Record<'device' | 'portfolioTracker', ScreenContent>;

const IconWrapper = ({ children }: { children: ReactNode }) => {
const [isUsbDeviceConnectFeatureEnabled] = useFeatureFlag(FeatureFlag.IsDeviceConnectEnabled);
const isUsbDeviceConnectFeatureEnabled = useFeatureFlag(FeatureFlag.IsDeviceConnectEnabled);

if (!isUsbDeviceConnectFeatureEnabled) return <>{children}</>;

Expand All @@ -53,7 +53,7 @@ const IconWrapper = ({ children }: { children: ReactNode }) => {

export const FeatureReceiveScreen = () => {
const navigation = useNavigation<NavigationProps>();
const [isUsbDeviceConnectFeatureEnabled] = useFeatureFlag(FeatureFlag.IsDeviceConnectEnabled);
const isUsbDeviceConnectFeatureEnabled = useFeatureFlag(FeatureFlag.IsDeviceConnectEnabled);

const content =
receiveScreenContentMap[isUsbDeviceConnectFeatureEnabled ? 'device' : 'portfolioTracker'];
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ type NavigationProp = StackNavigationProps<
>;

const IconWrapper = ({ children }: { children: ReactNode }) => {
const [isUsbDeviceConnectFeatureEnabled] = useFeatureFlag(FeatureFlag.IsDeviceConnectEnabled);
const isUsbDeviceConnectFeatureEnabled = useFeatureFlag(FeatureFlag.IsDeviceConnectEnabled);

if (!isUsbDeviceConnectFeatureEnabled) return <>{children}</>;

Expand All @@ -52,7 +52,7 @@ const IconWrapper = ({ children }: { children: ReactNode }) => {
};

export const TrackBalancesScreen = () => {
const [isUsbDeviceConnectFeatureEnabled] = useFeatureFlag(FeatureFlag.IsDeviceConnectEnabled);
const isUsbDeviceConnectFeatureEnabled = useFeatureFlag(FeatureFlag.IsDeviceConnectEnabled);

const navigation = useNavigation<NavigationProp>();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ const trezorLinkStyle = prepareNativeStyle(utils => ({
}));

export const WelcomeScreen = () => {
const [isUsbDeviceConnectFeatureEnabled] = useFeatureFlag(FeatureFlag.IsDeviceConnectEnabled);
const isUsbDeviceConnectFeatureEnabled = useFeatureFlag(FeatureFlag.IsDeviceConnectEnabled);

const navigation =
useNavigation<
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ const DisabledUsbFAQ = () => {
};

export const FAQInfoPanel = () => {
const [isUsbDeviceConnectFeatureEnabled] = useFeatureFlag(FeatureFlag.IsDeviceConnectEnabled);
const isUsbDeviceConnectFeatureEnabled = useFeatureFlag(FeatureFlag.IsDeviceConnectEnabled);

return (
<VStack paddingHorizontal="sp8">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ import { isDevButtonVisibleAtom } from './ProductionDebug';

export const FeaturesSettings = () => {
const isDevButtonVisible = useAtomValue(isDevButtonVisibleAtom);
const [isUsbDeviceConnectFeatureEnabled] = useFeatureFlag(FeatureFlag.IsDeviceConnectEnabled);
const isUsbDeviceConnectFeatureEnabled = useFeatureFlag(FeatureFlag.IsDeviceConnectEnabled);
const navigation = useNavigation<StackNavigationProps<RootStackParamList, RootStackRoutes>>();
const navigateTo = useSettingsNavigateTo();

Expand Down

0 comments on commit f7cfe41

Please sign in to comment.