Skip to content

Commit bfd792e

Browse files
committed
fix(router): decode route params before path regeneration
1 parent 69937e0 commit bfd792e

8 files changed

Lines changed: 37 additions & 8 deletions

File tree

src/app/components/BackRouteHandler.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import {
88
getSpacePath,
99
} from '../pages/pathUtils';
1010
import { DIRECT_PATH, EXPLORE_PATH, HOME_PATH, INBOX_PATH, SPACE_PATH } from '../pages/paths';
11+
import { tryDecodeURIComponent } from '../utils/dom';
1112

1213
type BackRouteHandlerProps = {
1314
children: (onBack: () => void) => ReactNode;
@@ -52,7 +53,7 @@ export function BackRouteHandler({ children }: BackRouteHandlerProps) {
5253
location.pathname
5354
);
5455
if (spaceMatch?.params.spaceIdOrAlias) {
55-
navigate(getSpacePath(spaceMatch.params.spaceIdOrAlias));
56+
navigate(getSpacePath(tryDecodeURIComponent(spaceMatch.params.spaceIdOrAlias)));
5657
return;
5758
}
5859
if (

src/app/hooks/router/useSelectedRoom.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11
import { useParams } from 'react-router-dom';
22
import { getCanonicalAliasRoomId, isRoomAlias } from '$appUtils/matrix';
3+
import { tryDecodeURIComponent } from '$appUtils/dom';
34
import { useMatrixClient } from '../useMatrixClient';
45

56
export const useSelectedRoom = (): string | undefined => {
67
const mx = useMatrixClient();
78

8-
const { roomIdOrAlias } = useParams();
9+
const { roomIdOrAlias: encodedRoomIdOrAlias } = useParams();
10+
const roomIdOrAlias = encodedRoomIdOrAlias
11+
? tryDecodeURIComponent(encodedRoomIdOrAlias)
12+
: undefined;
913
const roomId =
1014
roomIdOrAlias && isRoomAlias(roomIdOrAlias)
1115
? getCanonicalAliasRoomId(mx, roomIdOrAlias)

src/app/hooks/router/useSelectedSpace.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,16 @@
11
import { useMatch, useParams } from 'react-router-dom';
22
import { getCanonicalAliasRoomId, isRoomAlias } from '$appUtils/matrix';
3+
import { tryDecodeURIComponent } from '$appUtils/dom';
34
import { useMatrixClient } from '../useMatrixClient';
45
import { getSpaceLobbyPath, getSpaceSearchPath } from '$pages/pathUtils';
56

67
export const useSelectedSpace = (): string | undefined => {
78
const mx = useMatrixClient();
89

9-
const { spaceIdOrAlias } = useParams();
10+
const { spaceIdOrAlias: encodedSpaceIdOrAlias } = useParams();
11+
const spaceIdOrAlias = encodedSpaceIdOrAlias
12+
? tryDecodeURIComponent(encodedSpaceIdOrAlias)
13+
: undefined;
1014

1115
const spaceId =
1216
spaceIdOrAlias && isRoomAlias(spaceIdOrAlias)

src/app/pages/Router.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ import { Create } from './client/create';
6868
import { CreateSpaceModalRenderer } from '../features/create-space';
6969
import { SearchModalRenderer } from '../features/search';
7070
import { getFallbackSession } from '../state/sessions';
71+
import { tryDecodeURIComponent } from '../utils/dom';
7172
import { pushSessionToSW } from '../../sw-session';
7273

7374
export const createRouter = (clientConfig: ClientConfig, screenSize: ScreenSize) => {
@@ -225,7 +226,7 @@ export const createRouter = (clientConfig: ClientConfig, screenSize: ScreenSize)
225226
loader={({ params }) => {
226227
const { spaceIdOrAlias } = params;
227228
if (spaceIdOrAlias) {
228-
return redirect(getSpaceLobbyPath(spaceIdOrAlias));
229+
return redirect(getSpaceLobbyPath(tryDecodeURIComponent(spaceIdOrAlias)));
229230
}
230231
return null;
231232
}}

src/app/pages/client/direct/RoomProvider.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,17 @@ import { IsDirectRoomProvider, RoomProvider } from '$hooks/useRoom';
55
import { useMatrixClient } from '$hooks/useMatrixClient';
66
import { JoinBeforeNavigate } from '$features/join-before-navigate';
77
import { useDirectRooms } from './useDirectRooms';
8+
import { tryDecodeURIComponent } from '$appUtils/dom';
89

910
export function DirectRouteRoomProvider({ children }: { children: ReactNode }) {
1011
const mx = useMatrixClient();
1112
const rooms = useDirectRooms();
1213

13-
const { roomIdOrAlias, eventId } = useParams();
14+
const { roomIdOrAlias: encodedRoomIdOrAlias, eventId: encodedEventId } = useParams();
15+
const roomIdOrAlias = encodedRoomIdOrAlias
16+
? tryDecodeURIComponent(encodedRoomIdOrAlias)
17+
: undefined;
18+
const eventId = encodedEventId ? tryDecodeURIComponent(encodedEventId) : undefined;
1419
const roomId = useSelectedRoom();
1520
const room = mx.getRoom(roomId);
1621

src/app/pages/client/home/RoomProvider.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,17 @@ import { useMatrixClient } from '$hooks/useMatrixClient';
66
import { JoinBeforeNavigate } from '$features/join-before-navigate';
77
import { useHomeRooms } from './useHomeRooms';
88
import { useSearchParamsViaServers } from '$hooks/router/useSearchParamsViaServers';
9+
import { tryDecodeURIComponent } from '$appUtils/dom';
910

1011
export function HomeRouteRoomProvider({ children }: { children: ReactNode }) {
1112
const mx = useMatrixClient();
1213
const rooms = useHomeRooms();
1314

14-
const { roomIdOrAlias, eventId } = useParams();
15+
const { roomIdOrAlias: encodedRoomIdOrAlias, eventId: encodedEventId } = useParams();
16+
const roomIdOrAlias = encodedRoomIdOrAlias
17+
? tryDecodeURIComponent(encodedRoomIdOrAlias)
18+
: undefined;
19+
const eventId = encodedEventId ? tryDecodeURIComponent(encodedEventId) : undefined;
1520
const viaServers = useSearchParamsViaServers();
1621
const roomId = useSelectedRoom();
1722
const room = mx.getRoom(roomId);

src/app/pages/client/space/RoomProvider.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { useMatrixClient } from '$hooks/useMatrixClient';
77
import { JoinBeforeNavigate } from '$features/join-before-navigate';
88
import { useSpace } from '$hooks/useSpace';
99
import { getAllParents, getSpaceChildren } from '$appUtils/room';
10+
import { tryDecodeURIComponent } from '$appUtils/dom';
1011
import { roomToParentsAtom } from '$state/room/roomToParents';
1112
import { allRoomsAtom } from '$state/room-list/roomList';
1213
import { useSearchParamsViaServers } from '$hooks/router/useSearchParamsViaServers';
@@ -22,7 +23,11 @@ export function SpaceRouteRoomProvider({ children }: { children: ReactNode }) {
2223
const mDirects = useAtomValue(mDirectAtom);
2324
const allRooms = useAtomValue(allRoomsAtom);
2425

25-
const { roomIdOrAlias, eventId } = useParams();
26+
const { roomIdOrAlias: encodedRoomIdOrAlias, eventId: encodedEventId } = useParams();
27+
const roomIdOrAlias = encodedRoomIdOrAlias
28+
? tryDecodeURIComponent(encodedRoomIdOrAlias)
29+
: undefined;
30+
const eventId = encodedEventId ? tryDecodeURIComponent(encodedEventId) : undefined;
2631
const viaServers = useSearchParamsViaServers();
2732
const roomId = useSelectedRoom();
2833
const room = mx.getRoom(roomId);

src/app/pages/client/space/SpaceProvider.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { useSelectedSpace } from '$hooks/router/useSelectedSpace';
77
import { SpaceProvider } from '$hooks/useSpace';
88
import { JoinBeforeNavigate } from '$features/join-before-navigate';
99
import { useSearchParamsViaServers } from '$hooks/router/useSearchParamsViaServers';
10+
import { tryDecodeURIComponent } from '$appUtils/dom';
1011

1112
type RouteSpaceProviderProps = {
1213
children: ReactNode;
@@ -15,7 +16,10 @@ export function RouteSpaceProvider({ children }: RouteSpaceProviderProps) {
1516
const mx = useMatrixClient();
1617
const joinedSpaces = useSpaces(mx, allRoomsAtom);
1718

18-
const { spaceIdOrAlias } = useParams();
19+
const { spaceIdOrAlias: encodedSpaceIdOrAlias } = useParams();
20+
const spaceIdOrAlias = encodedSpaceIdOrAlias
21+
? tryDecodeURIComponent(encodedSpaceIdOrAlias)
22+
: undefined;
1923
const viaServers = useSearchParamsViaServers();
2024

2125
const selectedSpaceId = useSelectedSpace();

0 commit comments

Comments
 (0)