Skip to content

Commit 9e27261

Browse files
committed
additional extraction in ReportActionItemSingle
1 parent 3e5cdde commit 9e27261

3 files changed

Lines changed: 67 additions & 39 deletions

File tree

src/pages/inbox/report/DelegateOnBehalfOfText.tsx

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,24 @@ import React from 'react';
33
import Text from '@components/Text';
44
import useLocalize from '@hooks/useLocalize';
55
import useOnyx from '@hooks/useOnyx';
6+
import usePersonalDetailsByLogin from '@hooks/usePersonalDetailsByLogin';
67
import useThemeStyles from '@hooks/useThemeStyles';
7-
import {getPersonalDetailByEmail} from '@libs/PersonalDetailsUtils';
88
import CONST from '@src/CONST';
99
import ONYXKEYS from '@src/ONYXKEYS';
1010

11+
type DelegateOnBehalfOfTextFallbackProps = {
12+
/** Fallback login looked up in the personal-details map when the account ID is not yet hydrated. */
13+
fallbackLogin: string | undefined;
14+
};
15+
16+
function DelegateOnBehalfOfTextFallback({fallbackLogin}: DelegateOnBehalfOfTextFallbackProps) {
17+
const styles = useThemeStyles();
18+
const {translate} = useLocalize();
19+
const personalDetailsByLogin = usePersonalDetailsByLogin();
20+
const detail = personalDetailsByLogin[fallbackLogin?.toLowerCase() ?? ''];
21+
return <Text style={[styles.chatDelegateMessage]}>{translate('delegate.onBehalfOfMessage', detail?.displayName ?? '')}</Text>;
22+
}
23+
1124
type DelegateOnBehalfOfTextProps = {
1225
/** The account ID whose login drives the "on behalf of" name. */
1326
mainAccountID: number | undefined;
@@ -20,9 +33,11 @@ function DelegateOnBehalfOfText({mainAccountID, fallbackLogin}: DelegateOnBehalf
2033
const styles = useThemeStyles();
2134
const {translate} = useLocalize();
2235
const [resolvedDetail] = useOnyx(ONYXKEYS.PERSONAL_DETAILS_LIST, {selector: personalDetailsSelector(mainAccountID ?? CONST.DEFAULT_NUMBER_ID)});
23-
const mainAccountLogin = resolvedDetail?.login ?? fallbackLogin;
24-
const accountOwnerDetails = getPersonalDetailByEmail(String(mainAccountLogin ?? ''));
25-
return <Text style={[styles.chatDelegateMessage]}>{translate('delegate.onBehalfOfMessage', accountOwnerDetails?.displayName ?? '')}</Text>;
36+
37+
if (!resolvedDetail?.login) {
38+
return <DelegateOnBehalfOfTextFallback fallbackLogin={fallbackLogin} />;
39+
}
40+
return <Text style={[styles.chatDelegateMessage]}>{translate('delegate.onBehalfOfMessage', resolvedDetail.displayName ?? '')}</Text>;
2641
}
2742

2843
export default DelegateOnBehalfOfText;

src/pages/inbox/report/ReportActionItemSingle.tsx

Lines changed: 4 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,7 @@ import useThemeStyles from '@hooks/useThemeStyles';
1616
import ControlSelection from '@libs/ControlSelection';
1717
import DateUtils from '@libs/DateUtils';
1818
import Navigation from '@libs/Navigation/Navigation';
19-
import {getPersonalDetailByEmail} from '@libs/PersonalDetailsUtils';
20-
import {
21-
getDelegateAccountIDFromReportAction,
22-
getHumanAgentAccountIDFromReportAction,
23-
getManagerOnVacation,
24-
getModerationFlagState,
25-
getOriginalMessage,
26-
getSubmittedTo,
27-
getVacationer,
28-
} from '@libs/ReportActionsUtils';
19+
import {getDelegateAccountIDFromReportAction, getHumanAgentAccountIDFromReportAction, getManagerOnVacation, getModerationFlagState, getVacationer} from '@libs/ReportActionsUtils';
2920
import {isOptimisticPersonalDetail} from '@libs/ReportUtils';
3021
import CONST from '@src/CONST';
3122
import ROUTES from '@src/ROUTES';
@@ -35,6 +26,7 @@ import DelegateOnBehalfOfText from './DelegateOnBehalfOfText';
3526
import HumanAgentAssistedByText from './HumanAgentAssistedByText';
3627
import ReportActionItemDate from './ReportActionItemDate';
3728
import ReportActionItemFragment from './ReportActionItemFragment';
29+
import VacationDelegateText from './VacationDelegateText';
3830

3931
type ReportActionItemSingleProps = Partial<ChildrenProps> & {
4032
/** All the data of the action */
@@ -98,19 +90,7 @@ function ReportActionItemSingle({
9890
const mainAccountID = delegateAccountID ? (reportPreviewSenderID ?? potentialIOUReport?.ownerAccountID ?? action?.childOwnerAccountID) : undefined;
9991
const currentUserPersonalDetails = useCurrentUserPersonalDetails();
10092

101-
// Vacation delegate details for submitted action
102-
const vacationer = getVacationer(action);
103-
const submittedTo = getSubmittedTo(action);
104-
const vacationDelegateDetailsForSubmit = getPersonalDetailByEmail(vacationer ?? '');
105-
const submittedToDetails = getPersonalDetailByEmail(submittedTo ?? '');
106-
107-
// Vacation delegate details for approved action
108-
const managerOnVacation = getManagerOnVacation(action);
109-
const vacationDelegateDetailsForApprove = getPersonalDetailByEmail(managerOnVacation ?? '');
110-
111-
// Check if this is an automatic action
112-
const originalMessage = getOriginalMessage(action);
113-
const isAutomaticAction = originalMessage && 'automaticAction' in originalMessage ? originalMessage.automaticAction : false;
93+
const hasVacationDelegate = !!getVacationer(action) || !!getManagerOnVacation(action);
11494

11595
const headingText = avatarType === CONST.REPORT_ACTION_AVATARS.TYPE.MULTIPLE ? `${primaryAvatar.name} & ${secondaryAvatar.name}` : primaryAvatar.name;
11696

@@ -233,18 +213,7 @@ function ReportActionItemSingle({
233213
/>
234214
)}
235215
{!!humanAgentAccountID && <HumanAgentAssistedByText action={action} />}
236-
{!!vacationer && !!submittedTo && (
237-
<Text style={[styles.chatDelegateMessage]}>
238-
{translate(
239-
'statusPage.toAsVacationDelegate',
240-
submittedToDetails?.displayName ?? submittedTo ?? '',
241-
vacationDelegateDetailsForSubmit?.displayName ?? vacationer ?? '',
242-
)}
243-
</Text>
244-
)}
245-
{!!managerOnVacation && !isAutomaticAction && (
246-
<Text style={[styles.chatDelegateMessage]}>{translate('statusPage.asVacationDelegate', vacationDelegateDetailsForApprove?.displayName ?? managerOnVacation ?? '')}</Text>
247-
)}
216+
{hasVacationDelegate && <VacationDelegateText action={action} />}
248217
<View style={hasBeenFlagged ? styles.blockquote : {}}>{children}</View>
249218
</View>
250219
</View>
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import React from 'react';
2+
import type {OnyxEntry} from 'react-native-onyx';
3+
import Text from '@components/Text';
4+
import useLocalize from '@hooks/useLocalize';
5+
import usePersonalDetailsByLogin from '@hooks/usePersonalDetailsByLogin';
6+
import useThemeStyles from '@hooks/useThemeStyles';
7+
import {getManagerOnVacation, getOriginalMessage, getSubmittedTo, getVacationer} from '@libs/ReportActionsUtils';
8+
import type * as OnyxTypes from '@src/types/onyx';
9+
10+
type VacationDelegateTextProps = {
11+
/** The action whose vacation context drives the labels. */
12+
action: OnyxEntry<OnyxTypes.ReportAction>;
13+
};
14+
15+
function VacationDelegateText({action}: VacationDelegateTextProps) {
16+
const styles = useThemeStyles();
17+
const {translate} = useLocalize();
18+
const personalDetailsByLogin = usePersonalDetailsByLogin();
19+
20+
const vacationer = getVacationer(action);
21+
const submittedTo = getSubmittedTo(action);
22+
const managerOnVacation = getManagerOnVacation(action);
23+
const originalMessage = getOriginalMessage(action);
24+
const isAutomaticAction = originalMessage && 'automaticAction' in originalMessage ? originalMessage.automaticAction : false;
25+
26+
const vacationDelegateDetailsForSubmit = personalDetailsByLogin[vacationer?.toLowerCase() ?? ''];
27+
const submittedToDetails = personalDetailsByLogin[submittedTo?.toLowerCase() ?? ''];
28+
const vacationDelegateDetailsForApprove = personalDetailsByLogin[managerOnVacation?.toLowerCase() ?? ''];
29+
30+
return (
31+
<>
32+
{!!vacationer && !!submittedTo && (
33+
<Text style={[styles.chatDelegateMessage]}>
34+
{translate('statusPage.toAsVacationDelegate', submittedToDetails?.displayName ?? submittedTo ?? '', vacationDelegateDetailsForSubmit?.displayName ?? vacationer ?? '')}
35+
</Text>
36+
)}
37+
{!!managerOnVacation && !isAutomaticAction && (
38+
<Text style={[styles.chatDelegateMessage]}>{translate('statusPage.asVacationDelegate', vacationDelegateDetailsForApprove?.displayName ?? managerOnVacation ?? '')}</Text>
39+
)}
40+
</>
41+
);
42+
}
43+
44+
export default VacationDelegateText;

0 commit comments

Comments
 (0)