11import React , { useCallback , useEffect , useMemo , useState } from 'react' ;
22import type { SectionListData } from 'react-native' ;
33import { useOnyx } from 'react-native-onyx' ;
4- import Badge from '@components/Badge' ;
54import BlockingView from '@components/BlockingViews/BlockingView' ;
65import FullPageNotFoundView from '@components/BlockingViews/FullPageNotFoundView' ;
76import FormAlertWithSubmitButton from '@components/FormAlertWithSubmitButton' ;
@@ -14,6 +13,7 @@ import InviteMemberListItem from '@components/SelectionList/InviteMemberListItem
1413import type { Section } from '@components/SelectionList/types' ;
1514import Text from '@components/Text' ;
1615import useDebouncedState from '@hooks/useDebouncedState' ;
16+ import useDeepCompareRef from '@hooks/useDeepCompareRef' ;
1717import useLocalize from '@hooks/useLocalize' ;
1818import useThemeStyles from '@hooks/useThemeStyles' ;
1919import { setApprovalWorkflowMembers } from '@libs/actions/Workflow' ;
@@ -25,6 +25,7 @@ import {getSearchValueForPhoneOrEmail, sortAlphabetically} from '@libs/OptionsLi
2525import { getMemberAccountIDsForWorkspace , goBackFromInvalidPolicy , isPendingDeletePolicy , isPolicyAdmin } from '@libs/PolicyUtils' ;
2626import tokenizedSearch from '@libs/tokenizedSearch' ;
2727import AccessOrNotFoundWrapper from '@pages/workspace/AccessOrNotFoundWrapper' ;
28+ import MemberRightIcon from '@pages/workspace/MemberRightIcon' ;
2829import withPolicyAndFullscreenLoading from '@pages/workspace/withPolicyAndFullscreenLoading' ;
2930import type { WithPolicyAndFullscreenLoadingProps } from '@pages/workspace/withPolicyAndFullscreenLoading' ;
3031import variables from '@styles/variables' ;
@@ -57,6 +58,8 @@ function WorkspaceWorkflowsApprovalsExpensesFromPage({policy, isLoadingReportDat
5758 const { translate} = useLocalize ( ) ;
5859 const [ searchTerm , debouncedSearchTerm , setSearchTerm ] = useDebouncedState ( '' ) ;
5960 const [ approvalWorkflow , approvalWorkflowResults ] = useOnyx ( ONYXKEYS . APPROVAL_WORKFLOW , { canBeMissing : true } ) ;
61+ const [ personalDetails ] = useOnyx ( ONYXKEYS . PERSONAL_DETAILS_LIST , { canBeMissing : false } ) ;
62+
6063 const isLoadingApprovalWorkflow = isLoadingOnyxValue ( approvalWorkflowResults ) ;
6164 const [ selectedMembers , setSelectedMembers ] = useState < SelectionListMember [ ] > ( [ ] ) ;
6265
@@ -66,6 +69,8 @@ function WorkspaceWorkflowsApprovalsExpensesFromPage({policy, isLoadingReportDat
6669 const shouldShowListEmptyContent = ! isLoadingApprovalWorkflow && approvalWorkflow && approvalWorkflow . availableMembers . length === 0 ;
6770 const firstApprover = approvalWorkflow ?. approvers ?. [ 0 ] ?. email ?? '' ;
6871
72+ const personalDetailLogins = useDeepCompareRef ( Object . fromEntries ( Object . entries ( personalDetails ?? { } ) . map ( ( [ id , details ] ) => [ id , details ?. login ] ) ) ) ;
73+
6974 useEffect ( ( ) => {
7075 if ( ! approvalWorkflow ?. members ) {
7176 return ;
@@ -75,7 +80,7 @@ function WorkspaceWorkflowsApprovalsExpensesFromPage({policy, isLoadingReportDat
7580 approvalWorkflow . members . map ( ( member ) => {
7681 const policyMemberEmailsToAccountIDs = getMemberAccountIDsForWorkspace ( policy ?. employeeList ) ;
7782 const accountID = Number ( policyMemberEmailsToAccountIDs [ member . email ] ?? '' ) ;
78- const isAdmin = policy ?. employeeList ?. [ member . email ] ?. role === CONST . REPORT . ROLE . ADMIN ;
83+ const login = personalDetailLogins ?. [ accountID ] ;
7984
8085 return {
8186 text : member . displayName ,
@@ -84,11 +89,17 @@ function WorkspaceWorkflowsApprovalsExpensesFromPage({policy, isLoadingReportDat
8489 isSelected : true ,
8590 login : member . email ,
8691 icons : [ { source : member . avatar ?? FallbackAvatar , type : CONST . ICON_TYPE_AVATAR , name : member . displayName , id : accountID } ] ,
87- rightElement : isAdmin ? < Badge text = { translate ( 'common.admin' ) } /> : undefined ,
92+ rightElement : (
93+ < MemberRightIcon
94+ role = { policy ?. employeeList ?. [ member . email ] ?. role }
95+ owner = { policy ?. owner }
96+ login = { login }
97+ />
98+ ) ,
8899 } ;
89100 } ) ,
90101 ) ;
91- } , [ approvalWorkflow ?. members , policy ?. employeeList , translate ] ) ;
102+ } , [ approvalWorkflow ?. members , policy ?. employeeList , policy ?. owner , personalDetailLogins , translate ] ) ;
92103
93104 const approversEmail = useMemo ( ( ) => approvalWorkflow ?. approvers . map ( ( member ) => member ?. email ) , [ approvalWorkflow ?. approvers ] ) ;
94105 const sections : MembersSection [ ] = useMemo ( ( ) => {
@@ -97,9 +108,9 @@ function WorkspaceWorkflowsApprovalsExpensesFromPage({policy, isLoadingReportDat
97108 if ( approvalWorkflow ?. availableMembers ) {
98109 const availableMembers = approvalWorkflow . availableMembers
99110 . map ( ( member ) => {
100- const isAdmin = policy ?. employeeList ?. [ member . email ] ?. role === CONST . REPORT . ROLE . ADMIN ;
101111 const policyMemberEmailsToAccountIDs = getMemberAccountIDsForWorkspace ( policy ?. employeeList ) ;
102112 const accountID = Number ( policyMemberEmailsToAccountIDs [ member . email ] ?? '' ) ;
113+ const login = personalDetailLogins ?. [ accountID ] ;
103114
104115 return {
105116 text : member . displayName ,
@@ -108,7 +119,13 @@ function WorkspaceWorkflowsApprovalsExpensesFromPage({policy, isLoadingReportDat
108119 isSelected : false ,
109120 login : member . email ,
110121 icons : [ { source : member . avatar ?? FallbackAvatar , type : CONST . ICON_TYPE_AVATAR , name : member . displayName , id : accountID } ] ,
111- rightElement : isAdmin ? < Badge text = { translate ( 'common.admin' ) } /> : undefined ,
122+ rightElement : (
123+ < MemberRightIcon
124+ role = { policy ?. employeeList ?. [ member . email ] ?. role }
125+ owner = { policy ?. owner }
126+ login = { login }
127+ />
128+ ) ,
112129 } ;
113130 } )
114131 . filter (
@@ -128,7 +145,7 @@ function WorkspaceWorkflowsApprovalsExpensesFromPage({policy, isLoadingReportDat
128145 shouldShow : true ,
129146 } ,
130147 ] ;
131- } , [ approvalWorkflow ?. availableMembers , debouncedSearchTerm , policy ?. preventSelfApproval , policy ?. employeeList , selectedMembers , translate , approversEmail ] ) ;
148+ } , [ approvalWorkflow ?. availableMembers , debouncedSearchTerm , policy ?. preventSelfApproval , policy ?. employeeList , policy ?. owner , selectedMembers , approversEmail , personalDetailLogins ] ) ;
132149
133150 const goBack = useCallback ( ( ) => {
134151 let backTo ;
0 commit comments