11import { useIsFocused } from '@react-navigation/native' ;
2- import { deepEqual } from 'fast-equals' ;
32import React , { useCallback , useContext , useEffect , useMemo , useRef , useState } from 'react' ;
43import { InteractionManager , View } from 'react-native' ;
54import type { ValueOf } from 'type-fest' ;
65import Button from '@components/Button' ;
76import ButtonWithDropdownMenu from '@components/ButtonWithDropdownMenu' ;
87import type { DropdownOption , WorkspaceMemberBulkActionType } from '@components/ButtonWithDropdownMenu/types' ;
9- import ConfirmModal from '@components/ConfirmModal' ;
108import DecisionModal from '@components/DecisionModal' ;
119// eslint-disable-next-line no-restricted-imports
1210import { Plus } from '@components/Icon/Expensicons' ;
1311import { LockedAccountContext } from '@components/LockedAccountModalProvider' ;
1412import MessagesRow from '@components/MessagesRow' ;
13+ import { ModalActions } from '@components/Modal/Global/ModalContext' ;
1514import SearchBar from '@components/SearchBar' ;
1615import TableListItem from '@components/SelectionList/ListItem/TableListItem' ;
1716import type { ListItem , SelectionListHandle } from '@components/SelectionList/types' ;
1817import SelectionListWithModal from '@components/SelectionListWithModal' ;
1918import CustomListHeader from '@components/SelectionListWithModal/CustomListHeader' ;
2019import Text from '@components/Text' ;
2120import type { BaseTextInputRef } from '@components/TextInput/BaseTextInput/types' ;
21+ import useConfirmModal from '@hooks/useConfirmModal' ;
2222import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails' ;
2323import useFilteredSelection from '@hooks/useFilteredSelection' ;
2424import { useMemoizedLazyExpensifyIcons , useMemoizedLazyIllustrations } from '@hooks/useLazyAsset' ;
@@ -103,14 +103,13 @@ function WorkspaceMembersPage({personalDetails, route, policy}: WorkspaceMembers
103103 const employeeListDetails = useMemo ( ( ) => policy ?. employeeList ?? ( { } as PolicyEmployeeList ) , [ policy ?. employeeList ] ) ;
104104 const currentUserPersonalDetails = useCurrentUserPersonalDetails ( ) ;
105105 const styles = useThemeStyles ( ) ;
106+ const { showConfirmModal} = useConfirmModal ( ) ;
106107 const StyleUtils = useStyleUtils ( ) ;
107- const [ removeMembersConfirmModalVisible , setRemoveMembersConfirmModalVisible ] = useState ( false ) ;
108108 const { isOffline} = useNetwork ( ) ;
109109 const prevIsOffline = usePrevious ( isOffline ) ;
110110 const accountIDs = useMemo ( ( ) => Object . values ( policyMemberEmailsToAccountIDs ?? { } ) . map ( ( accountID ) => Number ( accountID ) ) , [ policyMemberEmailsToAccountIDs ] ) ;
111111 const prevAccountIDs = usePrevious ( accountIDs ) ;
112112 const textInputRef = useRef < BaseTextInputRef > ( null ) ;
113- const [ isOfflineModalVisible , setIsOfflineModalVisible ] = useState ( false ) ;
114113 const [ isDownloadFailureModalVisible , setIsDownloadFailureModalVisible ] = useState ( false ) ;
115114 const isOfflineAndNoMemberDataAvailable = isEmptyObject ( policy ?. employeeList ) && isOffline ;
116115 const { translate, formatPhoneNumber, localeCompare} = useLocalize ( ) ;
@@ -202,14 +201,6 @@ function WorkspaceMembersPage({personalDetails, route, policy}: WorkspaceMembers
202201 getWorkspaceMembers ( ) ;
203202 } , [ getWorkspaceMembers ] ) ;
204203
205- useEffect ( ( ) => {
206- if ( ! removeMembersConfirmModalVisible || deepEqual ( accountIDs , prevAccountIDs ) ) {
207- return ;
208- }
209- setRemoveMembersConfirmModalVisible ( false ) ;
210- // eslint-disable-next-line react-hooks/exhaustive-deps
211- } , [ accountIDs ] ) ;
212-
213204 useEffect ( ( ) => {
214205 const isReconnecting = prevIsOffline && ! isOffline ;
215206 if ( ! isReconnecting ) {
@@ -266,8 +257,6 @@ function WorkspaceMembersPage({personalDetails, route, policy}: WorkspaceMembers
266257 }
267258 }
268259
269- setRemoveMembersConfirmModalVisible ( false ) ;
270-
271260 // eslint-disable-next-line @typescript-eslint/no-deprecated
272261 InteractionManager . runAfterInteractions ( ( ) => {
273262 setSelectedEmployees ( [ ] ) ;
@@ -278,9 +267,26 @@ function WorkspaceMembersPage({personalDetails, route, policy}: WorkspaceMembers
278267 /**
279268 * Show the modal to confirm removal of the selected members
280269 */
281- const askForConfirmationToRemove = ( ) => {
282- setRemoveMembersConfirmModalVisible ( true ) ;
283- } ;
270+ const askForConfirmationToRemove = useCallback ( async ( ) => {
271+ const result = await showConfirmModal ( {
272+ danger : true ,
273+ title : translate ( 'workspace.people.removeMembersTitle' , { count : selectedEmployees . length } ) ,
274+ prompt : confirmModalPrompt ,
275+ confirmText : translate ( 'common.remove' ) ,
276+ cancelText : translate ( 'common.cancel' ) ,
277+ onModalHide : ( ) => {
278+ if ( ! textInputRef . current ) {
279+ return ;
280+ }
281+ textInputRef . current . focus ( ) ;
282+ } ,
283+ } ) ;
284+ if ( result . action !== ModalActions . CONFIRM ) {
285+ return ;
286+ }
287+
288+ removeUsers ( ) ;
289+ } , [ confirmModalPrompt , removeUsers , selectedEmployees . length , showConfirmModal , translate ] ) ;
284290
285291 /**
286292 * Add or remove all users passed from the selectedEmployees list
@@ -486,6 +492,7 @@ function WorkspaceMembersPage({personalDetails, route, policy}: WorkspaceMembers
486492 styles . cursorDefault ,
487493 styles . flex1 ,
488494 styles . pr3 ,
495+ translate ,
489496 styles . alignSelfStart ,
490497 styles . alignSelfEnd ,
491498 isControlPolicyWithWideLayout ,
@@ -667,6 +674,16 @@ function WorkspaceMembersPage({personalDetails, route, policy}: WorkspaceMembers
667674 return options ;
668675 } ;
669676
677+ const showRequiresInternetModal = useCallback ( ( ) => {
678+ showConfirmModal ( {
679+ title : translate ( 'common.youAppearToBeOffline' ) ,
680+ prompt : translate ( 'common.thisFeatureRequiresInternet' ) ,
681+ confirmText : translate ( 'common.buttonConfirm' ) ,
682+ shouldShowCancelButton : false ,
683+ shouldHandleNavigationBack : true ,
684+ } ) ;
685+ } , [ showConfirmModal , translate ] ) ;
686+
670687 const secondaryActions = useMemo ( ( ) => {
671688 if ( ! isPolicyAdmin ) {
672689 return [ ] ;
@@ -682,7 +699,7 @@ function WorkspaceMembersPage({personalDetails, route, policy}: WorkspaceMembers
682699 return ;
683700 }
684701 if ( isOffline ) {
685- close ( ( ) => setIsOfflineModalVisible ( true ) ) ;
702+ close ( showRequiresInternetModal ) ;
686703 return ;
687704 }
688705 Navigation . navigate ( ROUTES . WORKSPACE_MEMBERS_IMPORT . getRoute ( policyID ) ) ;
@@ -694,7 +711,7 @@ function WorkspaceMembersPage({personalDetails, route, policy}: WorkspaceMembers
694711 text : translate ( 'spreadsheet.downloadCSV' ) ,
695712 onSelected : ( ) => {
696713 if ( isOffline ) {
697- close ( ( ) => setIsOfflineModalVisible ( true ) ) ;
714+ close ( showRequiresInternetModal ) ;
698715 return ;
699716 }
700717
@@ -713,7 +730,7 @@ function WorkspaceMembersPage({personalDetails, route, policy}: WorkspaceMembers
713730 ] ;
714731
715732 return menuItems ;
716- } , [ icons . Download , icons . Table , policyID , translate , isOffline , isPolicyAdmin , isAccountLocked , showLockedAccountModal ] ) ;
733+ } , [ isPolicyAdmin , icons . Table , icons . Download , translate , isAccountLocked , isOffline , policyID , showLockedAccountModal , showRequiresInternetModal ] ) ;
717734
718735 const getHeaderButtons = ( ) => {
719736 if ( ! isPolicyAdmin ) {
@@ -811,36 +828,6 @@ function WorkspaceMembersPage({personalDetails, route, policy}: WorkspaceMembers
811828 { ( ) => (
812829 < >
813830 { shouldUseNarrowLayout && < View style = { [ styles . pl5 , styles . pr5 ] } > { getHeaderButtons ( ) } </ View > }
814- < ConfirmModal
815- isVisible = { isOfflineModalVisible }
816- onConfirm = { ( ) => setIsOfflineModalVisible ( false ) }
817- title = { translate ( 'common.youAppearToBeOffline' ) }
818- prompt = { translate ( 'common.thisFeatureRequiresInternet' ) }
819- confirmText = { translate ( 'common.buttonConfirm' ) }
820- shouldShowCancelButton = { false }
821- onCancel = { ( ) => setIsOfflineModalVisible ( false ) }
822- shouldHandleNavigationBack
823- />
824-
825- < ConfirmModal
826- danger
827- title = { translate ( 'workspace.people.removeMembersTitle' , { count : selectedEmployees . length } ) }
828- isVisible = { removeMembersConfirmModalVisible }
829- onConfirm = { removeUsers }
830- onCancel = { ( ) => setRemoveMembersConfirmModalVisible ( false ) }
831- prompt = { confirmModalPrompt }
832- confirmText = { translate ( 'common.remove' ) }
833- cancelText = { translate ( 'common.cancel' ) }
834- onModalHide = { ( ) => {
835- // eslint-disable-next-line @typescript-eslint/no-deprecated
836- InteractionManager . runAfterInteractions ( ( ) => {
837- if ( ! textInputRef . current ) {
838- return ;
839- }
840- textInputRef . current . focus ( ) ;
841- } ) ;
842- } }
843- />
844831 < DecisionModal
845832 title = { translate ( 'common.downloadFailedTitle' ) }
846833 prompt = { translate ( 'common.downloadFailedDescription' ) }
@@ -861,7 +848,6 @@ function WorkspaceMembersPage({personalDetails, route, policy}: WorkspaceMembers
861848 onSelectAll = { filteredData . length > 0 ? ( ) => toggleAllUsers ( filteredData ) : undefined }
862849 style = { { listHeaderWrapperStyle : [ styles . ph9 , styles . pv3 , styles . pb5 ] , listItemTitleContainerStyles : shouldUseNarrowLayout ? undefined : [ styles . pr3 ] } }
863850 onTurnOnSelectionMode = { ( item ) => item && toggleUser ( item . login ) }
864- disableKeyboardShortcuts = { removeMembersConfirmModalVisible }
865851 shouldPreventDefaultFocusOnSelectRow = { ! canUseTouchScreen ( ) }
866852 onCheckboxPress = { ( item ) => toggleUser ( item . login ) }
867853 shouldUseDefaultRightHandSideCheckmark = { false }
0 commit comments