From 81d0de8f871293890a5f78e7eb6d1489b8c29c3d Mon Sep 17 00:00:00 2001 From: Ginger <75683114+gingershaped@users.noreply.github.com> Date: Thu, 20 Mar 2025 11:33:15 -0400 Subject: [PATCH] Add a button to remove servers in the header for mobile devices --- src/app/pages/client/explore/Server.tsx | 93 ++++++++++++++++++++++++- 1 file changed, 92 insertions(+), 1 deletion(-) diff --git a/src/app/pages/client/explore/Server.tsx b/src/app/pages/client/explore/Server.tsx index 1f493df1..d080849e 100644 --- a/src/app/pages/client/explore/Server.tsx +++ b/src/app/pages/client/explore/Server.tsx @@ -24,6 +24,8 @@ import { Scroll, Spinner, Text, + Tooltip, + TooltipProvider, config, toRem, } from 'folds'; @@ -45,6 +47,8 @@ import { getMxIdServer } from '../../../utils/matrix'; import { stopPropagation } from '../../../utils/keyboard'; import { ScreenSize, useScreenSizeContext } from '../../../hooks/useScreenSize'; import { BackRouteHandler } from '../../../components/BackRouteHandler'; +import { AsyncStatus, useAsyncCallback } from '../../../hooks/useAsyncCallback'; +import { useExploreServers } from '../../../hooks/useExploreServers'; const useServerSearchParams = (searchParams: URLSearchParams): ExploreServerPathSearchParams => useMemo( @@ -348,6 +352,7 @@ export function PublicRooms() { const allRooms = useAtomValue(allRoomsAtom); const { navigateSpace, navigateRoom } = useRoomNavigate(); const screenSize = useScreenSizeContext(); + const [menuAnchor, setMenuAnchor] = useState(); const [searchParams] = useSearchParams(); const serverSearchParams = useServerSearchParams(searchParams); @@ -356,6 +361,8 @@ export function PublicRooms() { const searchInputRef = useRef(null); const navigate = useNavigate(); const roomTypeFilters = useRoomTypeFilters(); + const [exploreServers, , removeServer] = useExploreServers(); + const isUserAddedServer = server && exploreServers.includes(server); const currentLimit: number = useMemo(() => { const limitParam = serverSearchParams.limit; @@ -468,6 +475,20 @@ export function PublicRooms() { explore({ instance: instanceId, since: undefined }); }; + const handleOpenMenu: MouseEventHandler = (evt) => { + setMenuAnchor(evt.currentTarget.getBoundingClientRect()); + }; + + const [removeServerState, handleRemoveServer] = useAsyncCallback( + useCallback(async () => { + if (!server) return; + + setMenuAnchor(undefined); + await removeServer(server); + }, [server, removeServer]) + ); + const isRemoving = removeServerState.status === AsyncStatus.Loading; + return ( @@ -512,7 +533,77 @@ export function PublicRooms() { {server} - + + + More Options + + } + > + {(triggerRef) => + isUserAddedServer && ( + + + + ) + } + + setMenuAnchor(undefined), + clickOutsideDeactivates: true, + isKeyForward: (evt: KeyboardEvent) => evt.key === 'ArrowDown', + isKeyBackward: (evt: KeyboardEvent) => evt.key === 'ArrowUp', + escapeDeactivates: stopPropagation, + }} + > + + + + ) : ( + + ) + } + radii="300" + disabled={isRemoving} + > + + Remove Server + + + + + + } + /> + )}