diff --git a/native/profile/linked-devices-bottom-sheet.react.js b/native/profile/linked-devices-bottom-sheet.react.js --- a/native/profile/linked-devices-bottom-sheet.react.js +++ b/native/profile/linked-devices-bottom-sheet.react.js @@ -27,6 +27,7 @@ export type LinkedDevicesBottomSheetParams = { +deviceID: string, + +shouldDisplayRemoveButton: boolean, }; type Props = { @@ -38,7 +39,7 @@ const { navigation, route: { - params: { deviceID }, + params: { deviceID, shouldDisplayRemoveButton }, }, } = props; @@ -134,6 +135,18 @@ ); }, [insets.bottom, setContentHeight]); + let removeDeviceButton; + if (shouldDisplayRemoveButton) { + removeDeviceButton = ( + + ); + } + return ( - + {removeDeviceButton} ); diff --git a/native/profile/linked-devices-list-item.react.js b/native/profile/linked-devices-list-item.react.js --- a/native/profile/linked-devices-list-item.react.js +++ b/native/profile/linked-devices-list-item.react.js @@ -19,10 +19,17 @@ +platformDetails: ?IdentityPlatformDetails, +isPrimary: boolean, +isThisDevice: boolean, + +shouldAllowDeviceRemoval: boolean, }; function LinkedDevicesListItem(props: Props): React.Node { - const { deviceID, platformDetails, isPrimary, isThisDevice } = props; + const { + deviceID, + platformDetails, + isPrimary, + isThisDevice, + shouldAllowDeviceRemoval, + } = props; const styles = useStyles(unboundStyles); const colors = useColors(); @@ -30,13 +37,17 @@ const { navigate } = useNavigation(); const onPress = React.useCallback(() => { + if (!shouldAllowDeviceRemoval) { + return; + } navigate<'LinkedDevicesBottomSheet'>({ name: LinkedDevicesBottomSheetRouteName, params: { deviceID, + shouldDisplayRemoveButton: shouldAllowDeviceRemoval, }, }); - }, [deviceID, navigate]); + }, [deviceID, navigate, shouldAllowDeviceRemoval]); const deviceType = platformDetails?.deviceType; diff --git a/native/profile/linked-devices.react.js b/native/profile/linked-devices.react.js --- a/native/profile/linked-devices.react.js +++ b/native/profile/linked-devices.react.js @@ -22,22 +22,32 @@ function renderDeviceListItem({ item, - index, thisDeviceID, + isPrimary, + allowEdits, }: { +item: DeviceIDAndPlatformDetails, - +index: number, +thisDeviceID: ?string, + +isPrimary: boolean, + +allowEdits: boolean, ... }) { + const isThisDevice = item.deviceID === thisDeviceID; + const shouldAllowDeviceRemoval = allowEdits && !isPrimary && !isThisDevice; return ( ); } + +type ViewerInfo = { + deviceID: ?string, + canEdit: boolean, +}; type Props = { +navigation: ProfileNavigationProp<'LinkedDevices'>, +route: NavigationRoute<'LinkedDevices'>, @@ -48,18 +58,25 @@ const userDevicesInfos: $ReadOnlyArray = useSelector(getOwnPeerDevices); + const primaryDeviceID = userDevicesInfos[0].deviceID; const identityContext = React.useContext(IdentityClientContext); invariant(identityContext, 'identity context not set'); const { getAuthMetadata } = identityContext; - const [thisDeviceID, setThisDeviceID] = React.useState(null); + const [viewerInfo, setViewerInfo] = React.useState({ + deviceID: null, + canEdit: false, + }); React.useEffect(() => { void (async () => { const { deviceID } = await getAuthMetadata(); - setThisDeviceID(deviceID); + setViewerInfo({ + deviceID, + canEdit: deviceID === primaryDeviceID, + }); })(); - }, [getAuthMetadata]); + }, [getAuthMetadata, primaryDeviceID]); const separatorComponent = React.useCallback( () => , @@ -73,7 +90,12 @@ - renderDeviceListItem({ item, index, thisDeviceID }) + renderDeviceListItem({ + item, + isPrimary: index === 0, + thisDeviceID: viewerInfo.deviceID, + allowEdits: viewerInfo.canEdit, + }) } keyExtractor={keyExtractor} contentContainerStyle={styles.deviceListContentContainer} @@ -82,12 +104,12 @@ ), [ - separatorComponent, - userDevicesInfos, styles.container, styles.header, styles.deviceListContentContainer, - thisDeviceID, + userDevicesInfos, + separatorComponent, + viewerInfo, ], );