diff --git a/config.json b/config.json index de6015a1..e1f477d8 100644 --- a/config.json +++ b/config.json @@ -9,7 +9,6 @@ "xmr.se" ], "allowCustomHomeservers": true, - "featuredCommunities": { "openAsDefault": false, "spaces": [ @@ -28,11 +27,16 @@ "#PrivSec.dev:arcticfoxes.net", "#disroot:aria-net.org" ], - "servers": ["envs.net", "matrix.org", "monero.social", "mozilla.org"] + "servers": [ + "envs.net", + "matrix.org", + "monero.social", + "mozilla.org" + ], + "directoryServer": "matrixrooms.info" }, - "hashRouter": { "enabled": false, "basename": "/" } -} +} \ No newline at end of file diff --git a/src/app/hooks/router/useExploreSelected.ts b/src/app/hooks/router/useExploreSelected.ts index be7615ca..7ca00a13 100644 --- a/src/app/hooks/router/useExploreSelected.ts +++ b/src/app/hooks/router/useExploreSelected.ts @@ -1,5 +1,6 @@ import { useMatch, useParams } from 'react-router-dom'; import { getExploreFeaturedPath, getExplorePath } from '../../pages/pathUtils'; +import { useClientConfig } from '../useClientConfig'; export const useExploreSelected = (): boolean => { const match = useMatch({ @@ -26,3 +27,8 @@ export const useExploreServer = (): string | undefined => { return server; }; + +export const useDirectoryServer = (): string | undefined => { + const { featuredCommunities } = useClientConfig(); + return featuredCommunities?.directoryServer; +}; diff --git a/src/app/hooks/useClientConfig.ts b/src/app/hooks/useClientConfig.ts index e5fc6cc6..98d7eb92 100644 --- a/src/app/hooks/useClientConfig.ts +++ b/src/app/hooks/useClientConfig.ts @@ -15,6 +15,7 @@ export type ClientConfig = { spaces?: string[]; rooms?: string[]; servers?: string[]; + directoryServer?: string; }; hashRouter?: HashRouterConfig; diff --git a/src/app/pages/client/explore/Explore.tsx b/src/app/pages/client/explore/Explore.tsx index 3733b615..4e06830e 100644 --- a/src/app/pages/client/explore/Explore.tsx +++ b/src/app/pages/client/explore/Explore.tsx @@ -32,6 +32,7 @@ import { } from '../../../components/nav'; import { getExploreFeaturedPath, getExploreServerPath } from '../../pathUtils'; import { + useDirectoryServer, useExploreFeaturedRooms, useExploreServer, } from '../../../hooks/router/useExploreSelected'; @@ -250,28 +251,31 @@ export function Explore() { useNavToActivePathMapper('explore'); const userId = mx.getUserId(); const userServer = userId ? getMxIdServer(userId) : undefined; + const directoryServer = useDirectoryServer(); const [bookmarkedServers, addServerBookmark, removeServerBookmark] = useBookmarkedServers(); - const selectedServer = useExploreServer(); + const exploringFeaturedRooms = useExploreFeaturedRooms(); + const exploringDirectory = directoryServer !== undefined && selectedServer === directoryServer; const exploringUnlistedServer = useMemo( () => !( selectedServer === undefined || selectedServer === userServer || + exploringDirectory || bookmarkedServers.includes(selectedServer) ), - [bookmarkedServers, selectedServer, userServer] + [bookmarkedServers, selectedServer, userServer, exploringDirectory] ); const viewServerCallback = useCallback( async (server: string, saveBookmark: boolean) => { - if (saveBookmark && server !== userServer && selectedServer) { + if (saveBookmark && server !== userServer && server !== directoryServer && selectedServer) { await addServerBookmark(server); } navigate(getExploreServerPath(server)); }, - [addServerBookmark, navigate, userServer, selectedServer] + [addServerBookmark, navigate, userServer, directoryServer, selectedServer] ); const removeServerBookmarkCallback = useCallback( @@ -312,6 +316,24 @@ export function Explore() { + {directoryServer && ( + + + + + + + + + + Public Room Directory + + + + + + + )} {userServer && ( useMemo( @@ -349,6 +352,7 @@ export function PublicRooms() { const mx = useMatrixClient(); const userId = mx.getUserId(); const userServer = userId && getMxIdServer(userId); + const directoryServer = useDirectoryServer(); const allRooms = useAtomValue(allRoomsAtom); const { navigateSpace, navigateRoom } = useRoomNavigate(); const screenSize = useScreenSizeContext(); @@ -363,6 +367,15 @@ export function PublicRooms() { const [bookmarkedServers, addServerBookmark, removeServerBookmark] = useBookmarkedServers(); const isUserHomeserver = server !== undefined && server === userServer; const isBookmarkedServer = server !== undefined && bookmarkedServers.includes(server); + const isDirectoryServer = server !== undefined && server === directoryServer; + let headerIcon: IconSrc; + if (isUserHomeserver) { + headerIcon = Icons.Home; + } else if (isDirectoryServer) { + headerIcon = Icons.Search; + } else { + headerIcon = Icons.Server; + } const currentLimit: number = useMemo(() => { const limitParam = serverSearchParams.limit; @@ -526,40 +539,70 @@ export function PublicRooms() { )} - {screenSize !== ScreenSize.Mobile && ( - - )} + {screenSize !== ScreenSize.Mobile && } - {server} + {isDirectoryServer ? 'Public Room Directory' : server} - - {isBookmarkedServer ? 'Remove Bookmark' : 'Add Bookmark'} - - } - > - {(triggerRef) => - !isUserHomeserver && ( - - handleBookmarkAction( - isBookmarkedServer ? removeServerBookmark : addServerBookmark - ) - } - ref={triggerRef} - disabled={bookmarkActionLoading} + {isDirectoryServer ? ( + + provided by {directoryServer} + + } + > + {(triggerRef) => ( + } > - - - ) - } - + + provided by {directoryServer} + + + )} + + ) : ( + + {isBookmarkedServer ? 'Remove Bookmark' : 'Add Bookmark'} + + } + > + {(triggerRef) => + !isUserHomeserver && ( + + handleBookmarkAction( + isBookmarkedServer ? removeServerBookmark : addServerBookmark + ) + } + ref={triggerRef} + disabled={bookmarkActionLoading} + > + + + ) + } + + )} )}