Skip to content

Commit b3d1f13

Browse files
committed
migrate REPORT_SETTINGS_NAME
1 parent f43469c commit b3d1f13

9 files changed

Lines changed: 97 additions & 26 deletions

File tree

src/ROUTES.ts

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,10 @@ const DYNAMIC_ROUTES = {
9797
path: 'owner-selector',
9898
entryScreens: [],
9999
},
100+
REPORT_SETTINGS_NAME: {
101+
path: 'settings/name',
102+
entryScreens: [SCREENS.REPORT_DETAILS.ROOT, SCREENS.RIGHT_MODAL.REPORT_SETTINGS, SCREENS.REPORT, SCREENS.RIGHT_MODAL.SEARCH_REPORT, SCREENS.SEARCH.ROOT],
103+
},
100104
} as const satisfies DynamicRoutes;
101105

102106
const ROUTES = {
@@ -783,12 +787,6 @@ const ROUTES = {
783787
// eslint-disable-next-line no-restricted-syntax -- Legacy route generation
784788
getRoute: (reportID: string, backTo?: string) => getUrlWithBackToParam(`r/${reportID}/settings` as const, backTo),
785789
},
786-
REPORT_SETTINGS_NAME: {
787-
route: 'r/:reportID/settings/name',
788-
789-
// eslint-disable-next-line no-restricted-syntax -- Legacy route generation
790-
getRoute: (reportID: string, backTo?: string) => getUrlWithBackToParam(`r/${reportID}/settings/name` as const, backTo),
791-
},
792790
REPORT_SETTINGS_NOTIFICATION_PREFERENCES: {
793791
route: 'r/:reportID/settings/notification-preferences',
794792

src/SCREENS.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -443,7 +443,7 @@ const SCREENS = {
443443

444444
REPORT_SETTINGS: {
445445
ROOT: 'Report_Settings_Root',
446-
NAME: 'Report_Settings_Name',
446+
DYNAMIC_SETTINGS_NAME: 'Dynamic_Report_Settings_Name',
447447
NOTIFICATION_PREFERENCES: 'Report_Settings_Notification_Preferences',
448448
WRITE_CAPABILITY: 'Report_Settings_Write_Capability',
449449
VISIBILITY: 'Report_Settings_Visibility',
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import {useRoute} from '@react-navigation/native';
2+
import {useMemo} from 'react';
3+
import ONYXKEYS from '@src/ONYXKEYS';
4+
import type {Report} from '@src/types/onyx';
5+
import useOnyx from './useOnyx';
6+
7+
type UseReportFromDynamicRouteResult = {
8+
report: Report | null | undefined;
9+
reportID: string;
10+
isLoading: boolean;
11+
};
12+
13+
/**
14+
* Hook to extract reportID from dynamic route path and fetch the report
15+
* Use this for dynamic routes like /r/123/settings/name where reportID is in the URL path
16+
*/
17+
function useReportFromDynamicRoute(): UseReportFromDynamicRouteResult {
18+
const route = useRoute();
19+
20+
// Extract reportID from the current path
21+
const reportID = useMemo(() => {
22+
const currentPath = route.path ?? '';
23+
const match = currentPath.match(/\/r\/([^/]+)/);
24+
return match ? match[1] : '';
25+
}, [route.path]);
26+
27+
const [report] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${reportID}`);
28+
const [isLoadingReportData] = useOnyx(ONYXKEYS.IS_LOADING_REPORT_DATA);
29+
30+
return {
31+
report,
32+
reportID,
33+
isLoading: !reportID || (!report && !!isLoadingReportData),
34+
};
35+
}
36+
37+
export default useReportFromDynamicRoute;

src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -277,7 +277,7 @@ const ReportChangeApproverModalStackNavigator = createModalStackNavigator<Report
277277

278278
const ReportSettingsModalStackNavigator = createModalStackNavigator<ReportSettingsNavigatorParamList>({
279279
[SCREENS.REPORT_SETTINGS.ROOT]: () => require<ReactComponentModule>('../../../../pages/settings/Report/ReportSettingsPage').default,
280-
[SCREENS.REPORT_SETTINGS.NAME]: () => require<ReactComponentModule>('../../../../pages/settings/Report/NamePage').default,
280+
[SCREENS.REPORT_SETTINGS.DYNAMIC_SETTINGS_NAME]: () => require<ReactComponentModule>('../../../../pages/settings/Report/DynamicNamePage').default,
281281
[SCREENS.REPORT_SETTINGS.NOTIFICATION_PREFERENCES]: () => require<ReactComponentModule>('../../../../pages/settings/Report/NotificationPreferencePage').default,
282282
[SCREENS.REPORT_SETTINGS.WRITE_CAPABILITY]: () => require<ReactComponentModule>('../../../../pages/settings/Report/WriteCapabilityPage').default,
283283
[SCREENS.REPORT_SETTINGS.VISIBILITY]: () => require<ReactComponentModule>('../../../../pages/settings/Report/VisibilityPage').default,

src/libs/Navigation/linkingConfig/config.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1399,9 +1399,7 @@ const config: LinkingOptions<RootNavigatorParamList>['config'] = {
13991399
[SCREENS.REPORT_SETTINGS.ROOT]: {
14001400
path: ROUTES.REPORT_SETTINGS.route,
14011401
},
1402-
[SCREENS.REPORT_SETTINGS.NAME]: {
1403-
path: ROUTES.REPORT_SETTINGS_NAME.route,
1404-
},
1402+
[SCREENS.REPORT_SETTINGS.DYNAMIC_SETTINGS_NAME]: DYNAMIC_ROUTES.REPORT_SETTINGS_NAME.path,
14051403
[SCREENS.REPORT_SETTINGS.NOTIFICATION_PREFERENCES]: {
14061404
path: ROUTES.REPORT_SETTINGS_NOTIFICATION_PREFERENCES.route,
14071405
},

src/libs/Navigation/types.ts

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1685,11 +1685,7 @@ type ReportSettingsNavigatorParamList = {
16851685
// eslint-disable-next-line no-restricted-syntax -- `backTo` usages in this file are legacy. Do not add new `backTo` params to screens. See contributingGuides/NAVIGATION.md
16861686
backTo?: Routes;
16871687
};
1688-
[SCREENS.REPORT_SETTINGS.NAME]: {
1689-
reportID: string;
1690-
// eslint-disable-next-line no-restricted-syntax -- `backTo` usages in this file are legacy. Do not add new `backTo` params to screens. See contributingGuides/NAVIGATION.md
1691-
backTo?: Routes;
1692-
};
1688+
[SCREENS.REPORT_SETTINGS.DYNAMIC_SETTINGS_NAME]: undefined;
16931689
[SCREENS.REPORT_SETTINGS.NOTIFICATION_PREFERENCES]: {
16941690
reportID: string;
16951691
// eslint-disable-next-line no-restricted-syntax -- `backTo` usages in this file are legacy. Do not add new `backTo` params to screens. See contributingGuides/NAVIGATION.md

src/pages/ReportDetailsPage.tsx

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ import useResponsiveLayout from '@hooks/useResponsiveLayout';
4343
import useThemeStyles from '@hooks/useThemeStyles';
4444
import getBase62ReportID from '@libs/getBase62ReportID';
4545
import getNonEmptyStringOnyxID from '@libs/getNonEmptyStringOnyxID';
46+
import createDynamicRoute from '@libs/Navigation/helpers/createDynamicRoute';
4647
import Navigation, {navigationRef} from '@libs/Navigation/Navigation';
4748
import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types';
4849
import type {ReportDetailsNavigatorParamList, RightModalNavigatorParamList} from '@libs/Navigation/types';
@@ -125,7 +126,7 @@ import CONST from '@src/CONST';
125126
import type {TranslationPaths} from '@src/languages/types';
126127
import ONYXKEYS from '@src/ONYXKEYS';
127128
import type {Route} from '@src/ROUTES';
128-
import ROUTES from '@src/ROUTES';
129+
import ROUTES, {DYNAMIC_ROUTES} from '@src/ROUTES';
129130
import SCREENS from '@src/SCREENS';
130131
import type * as OnyxTypes from '@src/types/onyx';
131132
import type DeepValueOf from '@src/types/utils/DeepValueOf';
@@ -818,7 +819,9 @@ function ReportDetailsPage({policy, report, route, reportMetadata}: ReportDetail
818819
furtherDetails={chatRoomSubtitle && !isGroupChat ? additionalRoomDetails : ''}
819820
furtherDetailsNumberOfLines={isWorkspaceChat ? 0 : undefined}
820821
furtherDetailsStyle={isWorkspaceChat ? [styles.textAlignCenter, styles.breakWord] : undefined}
821-
onPress={() => Navigation.navigate(ROUTES.REPORT_SETTINGS_NAME.getRoute(report.reportID, backTo))}
822+
onPress={() => {
823+
Navigation.navigate(createDynamicRoute(DYNAMIC_ROUTES.REPORT_SETTINGS_NAME.path));
824+
}}
822825
numberOfLinesTitle={isThread ? 2 : 0}
823826
shouldBreakWord
824827
/>
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import React from 'react';
2+
import FullPageNotFoundView from '@components/BlockingViews/FullPageNotFoundView';
3+
import FullscreenLoadingIndicator from '@components/FullscreenLoadingIndicator';
4+
import useDynamicBackPath from '@hooks/useDynamicBackPath';
5+
import useReportFromDynamicRoute from '@hooks/useReportFromDynamicRoute';
6+
import {isGroupChat, isTripRoom} from '@libs/ReportUtils';
7+
import GroupChatNameEditPage from '@pages/GroupChatNameEditPage';
8+
import TripChatNameEditPage from '@pages/TripChatNameEditPage';
9+
import {DYNAMIC_ROUTES} from '@src/ROUTES';
10+
import {isEmptyObject} from '@src/types/utils/EmptyObject';
11+
import RoomNamePage from './RoomNamePage';
12+
13+
function DynamicNamePage() {
14+
const backPath = useDynamicBackPath(DYNAMIC_ROUTES.REPORT_SETTINGS_NAME.path);
15+
const {report, isLoading} = useReportFromDynamicRoute();
16+
17+
if (isLoading) {
18+
return <FullscreenLoadingIndicator />;
19+
}
20+
21+
if (isEmptyObject(report)) {
22+
return <FullPageNotFoundView shouldShow />;
23+
}
24+
25+
if (isTripRoom(report)) {
26+
return <TripChatNameEditPage report={report} />;
27+
}
28+
29+
if (isGroupChat(report)) {
30+
return <GroupChatNameEditPage report={report} />;
31+
}
32+
33+
return (
34+
<RoomNamePage
35+
report={report}
36+
navigateBackTo={backPath}
37+
/>
38+
);
39+
}
40+
41+
export default DynamicNamePage;

src/pages/settings/Report/RoomNamePage.tsx

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import {useIsFocused, useRoute} from '@react-navigation/native';
1+
import {useIsFocused} from '@react-navigation/native';
22
import React, {useCallback, useRef} from 'react';
33
import {View} from 'react-native';
44
import FullPageNotFoundView from '@components/BlockingViews/FullPageNotFoundView';
@@ -15,24 +15,22 @@ import useReportIsArchived from '@hooks/useReportIsArchived';
1515
import useThemeStyles from '@hooks/useThemeStyles';
1616
import {addErrorMessage} from '@libs/ErrorUtils';
1717
import Navigation from '@libs/Navigation/Navigation';
18-
import type {PlatformStackRouteProp} from '@libs/Navigation/PlatformStackNavigation/types';
19-
import type {ReportSettingsNavigatorParamList} from '@libs/Navigation/types';
2018
import {shouldDisableRename} from '@libs/ReportUtils';
2119
import {isExistingRoomName, isReservedRoomName, isValidRoomNameWithoutLimits} from '@libs/ValidationUtils';
2220
import {updatePolicyRoomName as updatePolicyRoomNameReportAction} from '@userActions/Report';
2321
import CONST from '@src/CONST';
2422
import ONYXKEYS from '@src/ONYXKEYS';
2523
import ROUTES from '@src/ROUTES';
26-
import type SCREENS from '@src/SCREENS';
24+
import type {Route} from '@src/ROUTES';
2725
import INPUT_IDS from '@src/types/form/RoomNameForm';
2826
import type {Report} from '@src/types/onyx';
2927

3028
type RoomNamePageProps = {
3129
report: Report;
30+
navigateBackTo?: Route;
3231
};
3332

34-
function RoomNamePage({report}: RoomNamePageProps) {
35-
const route = useRoute<PlatformStackRouteProp<ReportSettingsNavigatorParamList, typeof SCREENS.REPORT_SETTINGS.NAME>>();
33+
function RoomNamePage({report, navigateBackTo}: RoomNamePageProps) {
3634
const styles = useThemeStyles();
3735
const roomNameInputRef = useRef<AnimatedTextInputRef>(null);
3836
const isFocused = useIsFocused();
@@ -42,8 +40,8 @@ function RoomNamePage({report}: RoomNamePageProps) {
4240
const isReportArchived = useReportIsArchived(report?.reportID);
4341

4442
const goBack = useCallback(() => {
45-
Navigation.setNavigationActionToMicrotaskQueue(() => Navigation.goBack(ROUTES.REPORT_WITH_ID_DETAILS.getRoute(reportID, route.params.backTo)));
46-
}, [reportID, route.params.backTo]);
43+
Navigation.setNavigationActionToMicrotaskQueue(() => Navigation.goBack(ROUTES.REPORT_WITH_ID_DETAILS.getRoute(reportID, navigateBackTo)));
44+
}, [reportID, navigateBackTo]);
4745

4846
const validate = useCallback(
4947
(values: FormOnyxValues<typeof ONYXKEYS.FORMS.ROOM_NAME_FORM>) => {

0 commit comments

Comments
 (0)