Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
64 changes: 23 additions & 41 deletions src/ROUTES.ts
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,28 @@ const DYNAMIC_ROUTES = {
SCREENS.REPORT_CHANGE_WORKSPACE.ROOT,
],
},
EDIT_REPORT_FIELD: {
path: 'edit/policyField/:policyID/:fieldID',
entryScreens: [SCREENS.REPORT, SCREENS.RIGHT_MODAL.SEARCH_REPORT, SCREENS.RIGHT_MODAL.EXPENSE_REPORT, SCREENS.RIGHT_MODAL.SEARCH_MONEY_REQUEST_REPORT, SCREENS.REPORT_DETAILS.ROOT],
getRoute: (policyID: string, fieldID: string) => `edit/policyField/${policyID}/${encodeURIComponent(fieldID)}` as const,
},
PROFILE: {
path: 'a/:accountID',
entryScreens: ['*'],
getRoute: (accountID?: number, login?: string) => getUrlWithParams(`a/${accountID}`, {login}),
queryParams: ['login'],
},
PROFILE_AVATAR: {
path: 'avatar/:accountID',
Comment thread
huult marked this conversation as resolved.
entryScreens: ['*'],
getRoute: (accountID: number) => `avatar/${accountID}` as const,
},
NEW_REPORT_WORKSPACE_SELECTION: {
path: 'new-report-workspace-selection',
entryScreens: ['*'],
getRoute: (isMovingExpenses?: boolean) => `new-report-workspace-selection${isMovingExpenses ? '?isMovingExpenses=true' : ''}` as const,
queryParams: ['isMovingExpenses'],
},
NETSUITE_AUTO_SYNC: {
path: 'netsuite-autosync',
entryScreens: [SCREENS.WORKSPACE.ACCOUNTING.NETSUITE_ADVANCED, SCREENS.WORKSPACE.ACCOUNTING.CARD_RECONCILIATION],
Expand Down Expand Up @@ -407,7 +429,7 @@ const DYNAMIC_ROUTES = {
},
NOTIFICATION_PREFERENCES: {
path: 'notification-preferences',
entryScreens: [SCREENS.REPORT_SETTINGS.ROOT, SCREENS.PROFILE_ROOT],
entryScreens: [SCREENS.REPORT_SETTINGS.ROOT, SCREENS.DYNAMIC_PROFILE],
getRoute: (reportID: string) => getUrlWithParams('notification-preferences', {reportID}),
queryParams: ['reportID'],
},
Expand Down Expand Up @@ -714,20 +736,6 @@ const ROUTES = {
CONCIERGE: 'concierge',
TRACK_EXPENSE: 'track-expense',
SUBMIT_EXPENSE: 'submit-expense',
PROFILE: {
route: 'a/:accountID',
getRoute: (accountID?: number, backTo?: string, login?: string) => {
const baseRoute = getUrlWithBackToParam(`a/${accountID}`, backTo);
const loginParam = login ? `?login=${encodeURIComponent(login)}` : '';
return `${baseRoute}${loginParam}` as const;
},
},
PROFILE_AVATAR: {
route: 'a/:accountID/avatar',

getRoute: (accountID: number, backTo?: string) => getUrlWithBackToParam(`a/${accountID}/avatar` as const, backTo),
},

// This is a special validation URL that will take the user to /workspace/new after validation. This is used
// when linking users from e.com in order to share a session in this app.
ENABLE_PAYMENTS: 'enable-payments',
Expand Down Expand Up @@ -1173,19 +1181,6 @@ const ROUTES = {
NEW_CHAT_EDIT_NAME: 'new/chat/confirm/name/edit',
NEW_ROOM: 'new/room',

NEW_REPORT_WORKSPACE_SELECTION: {
route: 'new-report-workspace-selection',
getRoute: (isMovingExpenses?: boolean, backTo?: string) => {
const params = new URLSearchParams();
if (isMovingExpenses) {
params.set('isMovingExpenses', 'true');
}
const query = params.toString();
const baseRoute = `new-report-workspace-selection${query ? `?${query}` : ''}` as const;

return getUrlWithBackToParam(baseRoute, backTo);
},
},
REPORT: 'r',
REPORT_WITH_ID: {
route: 'r/:reportID?/:reportActionID?',
Expand Down Expand Up @@ -1240,19 +1235,6 @@ const ROUTES = {
route: 'r/:threadReportID/edit/currency',
getRoute: (threadReportID: string, currency: string, backTo: string) => `r/${threadReportID}/edit/currency?currency=${currency}&backTo=${backTo}` as const,
},
EDIT_REPORT_FIELD_REQUEST: {
route: 'r/:reportID/edit/policyField/:policyID/:fieldID',
getRoute: (reportID: string | undefined, policyID: string | undefined, fieldID: string, backTo?: string) => {
if (!policyID || !reportID) {
Log.warn('Invalid policyID or reportID is used to build the EDIT_REPORT_FIELD_REQUEST route', {
policyID,
reportID,
});
}

return getUrlWithBackToParam(`r/${reportID}/edit/policyField/${policyID}/${encodeURIComponent(fieldID)}` as const, backTo);
},
},
REPORT_WITH_ID_DETAILS_SHARE_CODE: {
route: 'r/:reportID/details/shareCode',
getRoute: (reportID: string | undefined, backTo?: string) => {
Expand Down
8 changes: 4 additions & 4 deletions src/SCREENS.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ const PROTECTED_SCREENS = {
const SCREENS = {
...PROTECTED_SCREENS,
REPORT: 'Report',
PROFILE_AVATAR: 'ProfileAvatar',
DYNAMIC_PROFILE_AVATAR: 'Dynamic_Profile_Avatar',
WORKSPACE_AVATAR: 'WorkspaceAvatar',
WORKSPACE_DOCUMENT: 'WorkspaceDocument',
REPORT_AVATAR: 'ReportAvatar',
Expand Down Expand Up @@ -515,7 +515,7 @@ const SCREENS = {
},

NEW_REPORT_WORKSPACE_SELECTION: {
ROOT: 'NewReportWorkspaceSelection_Root',
DYNAMIC_ROOT: 'Dynamic_NewReportWorkspaceSelection_Root',
},

SET_DEFAULT_WORKSPACE: 'SetDefaultWorkspace',
Expand Down Expand Up @@ -907,7 +907,7 @@ const SCREENS = {

EDIT_REQUEST: {
CURRENCY: 'EditRequest_Currency',
REPORT_FIELD: 'EditRequest_ReportField',
DYNAMIC_REPORT_FIELD: 'Dynamic_EditRequest_ReportField',
},

NEW_CHAT: {
Expand Down Expand Up @@ -970,7 +970,7 @@ const SCREENS = {
WALLET_STATEMENT_ROOT: 'WalletStatement_Root',
SIGN_IN_ROOT: 'SignIn_Root',
DETAILS_ROOT: 'Details_Root',
PROFILE_ROOT: 'Profile_Root',
DYNAMIC_PROFILE: 'Dynamic_Profile_Root',
AUTO_SUBMIT_ROOT: 'AutoSubmit_Modal_Root',
DYNAMIC_CHANGE_POLICY_EDUCATIONAL_ROOT: 'DynamicChangePolicyEducational_Root',
REPORT_DESCRIPTION_ROOT: 'Report_Description_Root',
Expand Down
13 changes: 9 additions & 4 deletions src/components/AvatarWithDisplayName.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import useResponsiveLayout from '@hooks/useResponsiveLayout';
import useStyleUtils from '@hooks/useStyleUtils';
import useTheme from '@hooks/useTheme';
import useThemeStyles from '@hooks/useThemeStyles';
import createDynamicRoute from '@libs/Navigation/helpers/dynamicRoutesUtils/createDynamicRoute';
import Navigation from '@libs/Navigation/Navigation';
import {getPersonalDetailsForAccountIDs} from '@libs/OptionsListUtils';
import {getHumanAgentAccountIDFromReportAction, getHumanAgentFirstName} from '@libs/ReportActionsUtils';
Expand All @@ -37,7 +38,7 @@ import {
import variables from '@styles/variables';
import CONST from '@src/CONST';
import ONYXKEYS from '@src/ONYXKEYS';
import ROUTES from '@src/ROUTES';
import ROUTES, {DYNAMIC_ROUTES} from '@src/ROUTES';
import type {Policy, Report} from '@src/types/onyx';
import {getButtonRole} from './Button/utils';
import DisplayNames from './DisplayNames';
Expand Down Expand Up @@ -232,7 +233,11 @@ function AvatarWithDisplayName({

const navigateToEditReportTitle = (event?: GestureResponderEvent | KeyboardEvent) => {
event?.stopPropagation?.();
Navigation.navigate(ROUTES.EDIT_REPORT_FIELD_REQUEST.getRoute(report?.reportID, report?.policyID, CONST.REPORT_FIELD_TITLE_FIELD_ID, Navigation.getReportRHPActiveRoute()));
if (!report?.policyID) {
return;
}

Navigation.navigate(createDynamicRoute(DYNAMIC_ROUTES.EDIT_REPORT_FIELD.getRoute(report.policyID, CONST.REPORT_FIELD_TITLE_FIELD_ID)));
};

const showActorDetails = () => {
Expand All @@ -243,7 +248,7 @@ function AvatarWithDisplayName({
}

if (isExpenseReport(report) && report?.ownerAccountID) {
Navigation.navigate(ROUTES.PROFILE.getRoute(report.ownerAccountID));
Navigation.navigate(createDynamicRoute(DYNAMIC_ROUTES.PROFILE.getRoute(report.ownerAccountID)));
return;
}

Expand All @@ -255,7 +260,7 @@ function AvatarWithDisplayName({
if (isChatThread(report)) {
// In an ideal situation account ID won't be 0
if (actorAccountID.current && actorAccountID.current > 0) {
Navigation.navigate(ROUTES.PROFILE.getRoute(actorAccountID.current));
Navigation.navigate(createDynamicRoute(DYNAMIC_ROUTES.PROFILE.getRoute(actorAccountID.current)));
return;
}
}
Expand Down
7 changes: 4 additions & 3 deletions src/components/FrozenCardHeader.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,12 @@ import useOnyx from '@hooks/useOnyx';
import useTheme from '@hooks/useTheme';
import useThemeStyles from '@hooks/useThemeStyles';
import DateUtils from '@libs/DateUtils';
import createDynamicRoute from '@libs/Navigation/helpers/dynamicRoutesUtils/createDynamicRoute';
import {getDisplayNameOrDefault} from '@libs/PersonalDetailsUtils';
import Navigation from '@navigation/Navigation';
import CONST from '@src/CONST';
import ONYXKEYS from '@src/ONYXKEYS';
import ROUTES from '@src/ROUTES';
import {DYNAMIC_ROUTES} from '@src/ROUTES';
import Button from './Button';
import Icon from './Icon';
import Text from './Text';
Expand Down Expand Up @@ -55,7 +56,7 @@ function FrozenCardHeader({cardPreview, onUnfreezePress, onAskToUnfreezePress, c
<>
{adminFrozenTextPrefix}
<TextLink
onPress={() => Navigation.navigate(ROUTES.PROFILE.getRoute(Number(frozenByAccountID), Navigation.getActiveRoute()))}
onPress={() => Navigation.navigate(createDynamicRoute(DYNAMIC_ROUTES.PROFILE.getRoute(Number(frozenByAccountID))))}
style={[styles.textLabel, styles.link]}
>
{frozenByName}
Expand All @@ -70,7 +71,7 @@ function FrozenCardHeader({cardPreview, onUnfreezePress, onAskToUnfreezePress, c
<>
{frozenNeedsUnfreezePrefix}
<TextLink
onPress={() => Navigation.navigate(ROUTES.PROFILE.getRoute(Number(frozenByAccountID), Navigation.getActiveRoute()))}
onPress={() => Navigation.navigate(createDynamicRoute(DYNAMIC_ROUTES.PROFILE.getRoute(Number(frozenByAccountID))))}
style={[styles.textLabel, styles.link]}
>
{frozenByName}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,11 @@ import type {WithCurrentUserPersonalDetailsProps} from '@components/withCurrentU
import useLocalize from '@hooks/useLocalize';
import useStyleUtils from '@hooks/useStyleUtils';
import useThemeStyles from '@hooks/useThemeStyles';
import createDynamicRoute from '@libs/Navigation/helpers/dynamicRoutesUtils/createDynamicRoute';
import Navigation from '@libs/Navigation/Navigation';
import {getAccountIDsByLogins, getDisplayNameOrDefault, getShortMentionIfFound} from '@libs/PersonalDetailsUtils';
import CONST from '@src/CONST';
import ROUTES from '@src/ROUTES';
import {DYNAMIC_ROUTES} from '@src/ROUTES';
import type {Route} from '@src/ROUTES';
import asMutable from '@src/types/utils/asMutable';
import {isEmptyObject} from '@src/types/utils/EmptyObject';
Expand All @@ -45,7 +46,7 @@ function MentionUserRenderer({style, tnode, TDefaultRenderer, currentUserPersona
accountID = parseInt(htmlAttribAccountID, 10);
mentionDisplayText = formatPhoneNumber(user?.login ?? '') || getDisplayNameOrDefault(user);
mentionDisplayText = getShortMentionIfFound(mentionDisplayText, htmlAttributeAccountID, currentUserPersonalDetails, user?.login ?? '') ?? '';
navigationRoute = ROUTES.PROFILE.getRoute(accountID, Navigation.getReportRHPActiveRoute());
navigationRoute = createDynamicRoute(DYNAMIC_ROUTES.PROFILE.getRoute(accountID), Navigation.getReportRHPActiveRoute());
} else if ('data' in tnode && !isEmptyObject(tnode.data)) {
tnodeClone = cloneDeep(tnode);
// We need to remove the LTR unicode and leading @ from data as it is not part of the login
Expand All @@ -57,13 +58,13 @@ function MentionUserRenderer({style, tnode, TDefaultRenderer, currentUserPersona
);

accountID = getAccountIDsByLogins([mentionDisplayText])?.at(0) ?? -1;
navigationRoute = ROUTES.PROFILE.getRoute(accountID, Navigation.getReportRHPActiveRoute(), mentionDisplayText);
navigationRoute = createDynamicRoute(DYNAMIC_ROUTES.PROFILE.getRoute(accountID, mentionDisplayText), Navigation.getReportRHPActiveRoute());
mentionDisplayText = Str.removeSMSDomain(mentionDisplayText);
} else if (!isEmpty(htmlAttribAccountID)) {
// accountID not found in personal details and mention data not provided
accountID = parseInt(htmlAttribAccountID, 10);
mentionDisplayText = getDisplayNameOrDefault();
navigationRoute = ROUTES.PROFILE.getRoute(accountID, Navigation.getReportRHPActiveRoute());
navigationRoute = createDynamicRoute(DYNAMIC_ROUTES.PROFILE.getRoute(accountID), Navigation.getReportRHPActiveRoute());
} else {
// If neither an account ID or email is provided, don't render anything
return null;
Expand All @@ -86,10 +87,10 @@ function MentionUserRenderer({style, tnode, TDefaultRenderer, currentUserPersona
onPress={(event) => {
event.preventDefault();
if (!isEmpty(htmlAttribAccountID)) {
Navigation.navigate(ROUTES.PROFILE.getRoute(parseInt(htmlAttribAccountID, 10), Navigation.getReportRHPActiveRoute()));
Navigation.navigate(createDynamicRoute(DYNAMIC_ROUTES.PROFILE.getRoute(parseInt(htmlAttribAccountID, 10)), Navigation.getReportRHPActiveRoute()));
return;
}
Navigation.navigate(ROUTES.PROFILE.getRoute(accountID, Navigation.getReportRHPActiveRoute(), mentionDisplayText));
Navigation.navigate(createDynamicRoute(DYNAMIC_ROUTES.PROFILE.getRoute(accountID, mentionDisplayText), Navigation.getReportRHPActiveRoute()));
}}
role={CONST.ROLE.LINK}
accessibilityLabel={`/${navigationRoute}`}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,11 @@ import {TNodeChildrenRenderer} from 'react-native-render-html';
import Text from '@components/Text';
import UserDetailsTooltip from '@components/UserDetailsTooltip';
import useThemeStyles from '@hooks/useThemeStyles';
import createDynamicRoute from '@libs/Navigation/helpers/dynamicRoutesUtils/createDynamicRoute';
import Navigation from '@libs/Navigation/Navigation';
import {isOptimisticPersonalDetail} from '@libs/ReportUtils';
import CONST from '@src/CONST';
import ROUTES from '@src/ROUTES';
import {DYNAMIC_ROUTES} from '@src/ROUTES';

type UserDetailsRendererProps = CustomRendererProps<TText | TPhrasing>;

Expand Down Expand Up @@ -35,7 +36,7 @@ function UserDetailsRenderer({tnode, ...defaultRendererProps}: UserDetailsRender
<Text
{...defaultRendererProps}
style={[styles.textStrong]}
onPress={() => Navigation.navigate(ROUTES.PROFILE.getRoute(accountID, Navigation.getActiveRoute()))}
onPress={() => Navigation.navigate(createDynamicRoute(DYNAMIC_ROUTES.PROFILE.getRoute(accountID)))}
suppressHighlighting
role={CONST.ROLE.LINK}
>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -454,7 +454,7 @@ function MoneyRequestReportActionsList({onLayout}: MoneyRequestReportListProps)
hasNewestReportAction,
setIsFloatingMessageCounterVisible,
scrollToEnd: reportScrollManager.scrollToEnd,
resetKey: report.reportID,
resetKey: report?.reportID ?? reportIDFromRoute ?? '',
});

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails'
import useThemeStyles from '@hooks/useThemeStyles';
import {clearReportFieldKeyErrors} from '@libs/actions/Report';
import {resolveReportFieldValue} from '@libs/Formula';
import createDynamicRoute from '@libs/Navigation/helpers/dynamicRoutesUtils/createDynamicRoute';
import Navigation from '@libs/Navigation/Navigation';
import {
getFieldViolation,
Expand All @@ -23,7 +24,7 @@ import {
} from '@libs/ReportUtils';
import type {ThemeStyles} from '@styles/index';
import CONST from '@src/CONST';
import ROUTES from '@src/ROUTES';
import {DYNAMIC_ROUTES} from '@src/ROUTES';
import type {Policy, PolicyReportField, Report, ReportViolationName} from '@src/types/onyx';
import type {PendingAction} from '@src/types/onyx/OnyxCommon';

Expand Down Expand Up @@ -62,7 +63,11 @@ function ReportFieldView(reportField: EnrichedPolicyReportField, report: OnyxEnt
description={Str.UCFirst(reportField.name)}
title={reportField.fieldValue}
onPress={() => {
Navigation.navigate(ROUTES.EDIT_REPORT_FIELD_REQUEST.getRoute(report?.reportID, report?.policyID, reportField.fieldID, Navigation.getActiveRoute()));
if (!report?.policyID) {
return;
}

Navigation.navigate(createDynamicRoute(DYNAMIC_ROUTES.EDIT_REPORT_FIELD.getRoute(report.policyID, reportField.fieldID)));
}}
shouldShowRightIcon={!reportField.isFieldDisabled}
wrapperStyle={[styles.pv2, styles.taskDescriptionMenuItem]}
Expand Down
5 changes: 3 additions & 2 deletions src/components/Navigation/QuickCreationActionsBar/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import useThemeStyles from '@hooks/useThemeStyles';
import {startDistanceRequest, startMoneyRequest} from '@libs/actions/IOU/MoneyRequest';
import {createNewReport} from '@libs/actions/Report';
import interceptAnonymousUser from '@libs/interceptAnonymousUser';
import createDynamicRoute from '@libs/Navigation/helpers/dynamicRoutesUtils/createDynamicRoute';
import isSearchTopmostFullScreenRoute from '@libs/Navigation/helpers/isSearchTopmostFullScreenRoute';
import Navigation from '@libs/Navigation/Navigation';
import {openTravelDotLink} from '@libs/openTravelDotLink';
Expand All @@ -26,7 +27,7 @@ import {generateReportID, hasViolations as hasViolationsReportUtils} from '@libs
import {shouldRestrictUserBillableActions} from '@libs/SubscriptionUtils';
import CONST from '@src/CONST';
import ONYXKEYS from '@src/ONYXKEYS';
import ROUTES from '@src/ROUTES';
import ROUTES, {DYNAMIC_ROUTES} from '@src/ROUTES';
import {primaryLoginSelector} from '@src/selectors/Account';
import {groupPaidPoliciesWithExpenseChatEnabledSelector} from '@src/selectors/Policy';
import type * as OnyxTypes from '@src/types/onyx';
Expand Down Expand Up @@ -152,7 +153,7 @@ function QuickCreationActionsBar() {
(shouldRestrictUserBillableActions(defaultChatEnabledPolicy, ownerBillingGracePeriodEnd, userBillingGracePeriodEnds, amountOwed, currentUserPersonalDetails.accountID) &&
groupPoliciesWithChatEnabled.length > 1)
) {
Navigation.navigate(ROUTES.NEW_REPORT_WORKSPACE_SELECTION.getRoute());
Navigation.navigate(createDynamicRoute(DYNAMIC_ROUTES.NEW_REPORT_WORKSPACE_SELECTION.path));
return;
}

Expand Down
6 changes: 4 additions & 2 deletions src/components/ReportActionAvatars/ReportActionAvatar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -19,13 +19,14 @@ import useTheme from '@hooks/useTheme';
import useThemeIllustrations from '@hooks/useThemeIllustrations';
import useThemeStyles from '@hooks/useThemeStyles';
import {getCardFeedIcon} from '@libs/CardUtils';
import createDynamicRoute from '@libs/Navigation/helpers/dynamicRoutesUtils/createDynamicRoute';
import {getUserDetailTooltipText, sortIconsByName} from '@libs/ReportUtils';
import type {AvatarSource} from '@libs/UserAvatarUtils';
import Navigation from '@navigation/Navigation';
import variables from '@styles/variables';
import CONST from '@src/CONST';
import ONYXKEYS from '@src/ONYXKEYS';
import ROUTES from '@src/ROUTES';
import ROUTES, {DYNAMIC_ROUTES} from '@src/ROUTES';
import type {CardFeed} from '@src/types/onyx/CardFeeds';
import type {Icon as IconType} from '@src/types/onyx/OnyxCommon';

Expand Down Expand Up @@ -85,7 +86,8 @@ function ProfileAvatar(props: Parameters<typeof Avatar>[0] & {useProfileNavigati
}
return Navigation.navigate(ROUTES.WORKSPACE_AVATAR.getRoute(String(avatarID), firstLetter));
}
return Navigation.navigate(ROUTES.PROFILE_AVATAR.getRoute(Number(avatarID), Navigation.getActiveRoute()));

return Navigation.navigate(createDynamicRoute(DYNAMIC_ROUTES.PROFILE_AVATAR.getRoute(Number(avatarID))));
};

return (
Expand Down
Loading
Loading