From b1a5ce00bf2ca81b1668d8113fe8c2e59cb6c5c9 Mon Sep 17 00:00:00 2001
From: Ajay Bura <32841439+ajbura@users.noreply.github.com>
Date: Tue, 30 Jul 2024 13:49:24 +0530
Subject: [PATCH] add create direct search options to open/create dm with url

---
 src/app/pages/Router.tsx                     |  4 +--
 src/app/pages/client/direct/DirectCreate.tsx | 33 ++++++++++++++++++++
 src/app/pages/client/direct/index.ts         |  1 +
 src/app/pages/pathSearchParam.ts             |  8 ++++-
 src/app/pages/paths.ts                       |  3 ++
 5 files changed, 46 insertions(+), 3 deletions(-)
 create mode 100644 src/app/pages/client/direct/DirectCreate.tsx

diff --git a/src/app/pages/Router.tsx b/src/app/pages/Router.tsx
index 7d0f4fde..88fa9932 100644
--- a/src/app/pages/Router.tsx
+++ b/src/app/pages/Router.tsx
@@ -41,7 +41,7 @@ import {
 } from './pathUtils';
 import { ClientBindAtoms, ClientLayout, ClientRoot } from './client';
 import { Home, HomeRouteRoomProvider, HomeSearch } from './client/home';
-import { Direct, DirectRouteRoomProvider } from './client/direct';
+import { Direct, DirectCreate, DirectRouteRoomProvider } from './client/direct';
 import { RouteSpaceProvider, Space, SpaceRouteRoomProvider, SpaceSearch } from './client/space';
 import { Explore, FeaturedRooms, PublicRooms } from './client/explore';
 import { Notifications, Inbox, Invites } from './client/inbox';
@@ -160,7 +160,7 @@ export const createRouter = (clientConfig: ClientConfig, screenSize: ScreenSize)
           }
         >
           {mobile ? null : <Route index element={<WelcomePage />} />}
-          <Route path={_CREATE_PATH} element={<p>create</p>} />
+          <Route path={_CREATE_PATH} element={<DirectCreate />} />
           <Route
             path={_ROOM_PATH}
             element={
diff --git a/src/app/pages/client/direct/DirectCreate.tsx b/src/app/pages/client/direct/DirectCreate.tsx
new file mode 100644
index 00000000..3affb9c1
--- /dev/null
+++ b/src/app/pages/client/direct/DirectCreate.tsx
@@ -0,0 +1,33 @@
+import React, { useEffect } from 'react';
+import { useNavigate, useSearchParams } from 'react-router-dom';
+import { WelcomePage } from '../WelcomePage';
+import { useMatrixClient } from '../../../hooks/useMatrixClient';
+import { getDirectCreateSearchParams } from '../../pathSearchParam';
+import { getDirectPath, getDirectRoomPath } from '../../pathUtils';
+import { getDMRoomFor } from '../../../utils/matrix';
+import { openInviteUser } from '../../../../client/action/navigation';
+import { useDirectRooms } from './useDirectRooms';
+
+export function DirectCreate() {
+  const mx = useMatrixClient();
+  const navigate = useNavigate();
+  const [searchParams] = useSearchParams();
+  const { userId } = getDirectCreateSearchParams(searchParams);
+  const directs = useDirectRooms();
+
+  useEffect(() => {
+    if (userId) {
+      const room = getDMRoomFor(mx, userId);
+      const { roomId } = room ?? {};
+      if (roomId && directs.includes(roomId)) {
+        navigate(getDirectRoomPath(roomId), { replace: true });
+      } else {
+        openInviteUser(undefined, userId);
+      }
+    } else {
+      navigate(getDirectPath(), { replace: true });
+    }
+  }, [mx, navigate, directs, userId]);
+
+  return <WelcomePage />;
+}
diff --git a/src/app/pages/client/direct/index.ts b/src/app/pages/client/direct/index.ts
index 36f44d63..d247bbc0 100644
--- a/src/app/pages/client/direct/index.ts
+++ b/src/app/pages/client/direct/index.ts
@@ -1,2 +1,3 @@
 export * from './Direct';
 export * from './RoomProvider';
+export * from './DirectCreate';
diff --git a/src/app/pages/pathSearchParam.ts b/src/app/pages/pathSearchParam.ts
index 2dac2c90..8e4c93e5 100644
--- a/src/app/pages/pathSearchParam.ts
+++ b/src/app/pages/pathSearchParam.ts
@@ -1,7 +1,13 @@
-import { _RoomSearchParams } from './paths';
+import { _RoomSearchParams, DirectCreateSearchParams } from './paths';
 
 type SearchParamsGetter<T> = (searchParams: URLSearchParams) => T;
 
 export const getRoomSearchParams: SearchParamsGetter<_RoomSearchParams> = (searchParams) => ({
   viaServers: searchParams.get('viaServers') ?? undefined,
 });
+
+export const getDirectCreateSearchParams: SearchParamsGetter<DirectCreateSearchParams> = (
+  searchParams
+) => ({
+  userId: searchParams.get('userId') ?? undefined,
+});
diff --git a/src/app/pages/paths.ts b/src/app/pages/paths.ts
index ba76aea7..57750383 100644
--- a/src/app/pages/paths.ts
+++ b/src/app/pages/paths.ts
@@ -49,6 +49,9 @@ export const HOME_SEARCH_PATH = `/home/${_SEARCH_PATH}`;
 export const HOME_ROOM_PATH = `/home/${_ROOM_PATH}`;
 
 export const DIRECT_PATH = '/direct/';
+export type DirectCreateSearchParams = {
+  userId?: string;
+};
 export const DIRECT_CREATE_PATH = `/direct/${_CREATE_PATH}`;
 export const DIRECT_ROOM_PATH = `/direct/${_ROOM_PATH}`;