diff --git a/.claude/worktrees/agent-a4cb7be95d74ab7e7 b/.claude/worktrees/agent-a4cb7be95d74ab7e7 new file mode 160000 index 000000000..f7c39e20a --- /dev/null +++ b/.claude/worktrees/agent-a4cb7be95d74ab7e7 @@ -0,0 +1 @@ +Subproject commit f7c39e20a932fb6779ea2c9cad464b4380b849d9 diff --git a/.claude/worktrees/agent-aaee4049508b9f175 b/.claude/worktrees/agent-aaee4049508b9f175 new file mode 160000 index 000000000..f7c39e20a --- /dev/null +++ b/.claude/worktrees/agent-aaee4049508b9f175 @@ -0,0 +1 @@ +Subproject commit f7c39e20a932fb6779ea2c9cad464b4380b849d9 diff --git a/.claude/worktrees/agent-ac5c7e09bae2b0939 b/.claude/worktrees/agent-ac5c7e09bae2b0939 new file mode 160000 index 000000000..f7c39e20a --- /dev/null +++ b/.claude/worktrees/agent-ac5c7e09bae2b0939 @@ -0,0 +1 @@ +Subproject commit f7c39e20a932fb6779ea2c9cad464b4380b849d9 diff --git a/src/app/components/QuickSwitcher.tsx b/src/app/components/QuickSwitcher.tsx deleted file mode 100644 index 02f90acd9..000000000 --- a/src/app/components/QuickSwitcher.tsx +++ /dev/null @@ -1,206 +0,0 @@ -import React, { - ChangeEventHandler, - KeyboardEventHandler, - useCallback, - useEffect, - useRef, - useState, -} from 'react'; -import { useAtomValue } from 'jotai'; -import { Avatar, Box, Icon, Icons, Input, Text, config } from 'folds'; -import { Room } from 'matrix-js-sdk'; -import { useMatrixClient } from '../hooks/useMatrixClient'; -import { allRoomsAtom } from '../state/room-list/roomList'; -import { useRoomNavigate } from '../hooks/useRoomNavigate'; -import { useMediaAuthentication } from '../hooks/useMediaAuthentication'; -import { mDirectAtom } from '../state/mDirectList'; -import { getDirectRoomAvatarUrl, getRoomAvatarUrl } from '../utils/room'; -import { RoomAvatar, RoomIcon } from './room-avatar'; -import { nameInitials } from '../utils/common'; - -const MAX_RESULTS = 10; - -function RoomFallback({ room }: { room: Room }) { - return ( - - {nameInitials(room.name)} - - ); -} - -type QuickSwitcherProps = { - onClose: () => void; -}; - -export function QuickSwitcher({ onClose }: QuickSwitcherProps) { - const mx = useMatrixClient(); - const useAuthentication = useMediaAuthentication(); - const allRoomIds = useAtomValue(allRoomsAtom); - const mDirects = useAtomValue(mDirectAtom); - const { navigateRoom } = useRoomNavigate(); - - const [query, setQuery] = useState(''); - const [selectedIdx, setSelectedIdx] = useState(0); - const inputRef = useRef(null); - - useEffect(() => { - inputRef.current?.focus(); - }, []); - - const filteredRooms = query.trim() - ? allRoomIds - .map((id) => ({ id, room: mx.getRoom(id) })) - .filter(({ room }) => room && room.name.toLowerCase().includes(query.trim().toLowerCase())) - .slice(0, MAX_RESULTS) - : allRoomIds - .map((id) => ({ id, room: mx.getRoom(id) })) - .filter(({ room }) => !!room) - .slice(0, MAX_RESULTS); - - const handleChange: ChangeEventHandler = (evt) => { - setQuery(evt.currentTarget.value); - setSelectedIdx(0); - }; - - const navigateToRoom = useCallback( - (roomId: string) => { - navigateRoom(roomId); - onClose(); - }, - [navigateRoom, onClose], - ); - - const handleKeyDown: KeyboardEventHandler = useCallback( - (evt) => { - if (evt.key === 'ArrowDown') { - evt.preventDefault(); - setSelectedIdx((i) => Math.min(i + 1, filteredRooms.length - 1)); - } else if (evt.key === 'ArrowUp') { - evt.preventDefault(); - setSelectedIdx((i) => Math.max(i - 1, 0)); - } else if (evt.key === 'Enter') { - const item = filteredRooms[selectedIdx]; - if (item) navigateToRoom(item.id); - } else if (evt.key === 'Escape') { - onClose(); - } - }, - [filteredRooms, selectedIdx, navigateToRoom, onClose], - ); - - return ( - <> - {/* Backdrop */} -
- - {/* Modal */} -
- {/* Search input */} - - } - placeholder="Search rooms…" - size="500" - variant="Background" - outlined - /> - - - {/* Results list */} - {filteredRooms.length > 0 && ( - - {filteredRooms.map(({ id, room }, idx) => { - if (!room) return null; - const dm = mDirects.has(id); - const avatarUrl = dm - ? getDirectRoomAvatarUrl(mx, room, 32, useAuthentication) - : getRoomAvatarUrl(mx, room, 32, useAuthentication); - const isSelected = idx === selectedIdx; - - return ( - - ); - })} - - )} - - {filteredRooms.length === 0 && ( - - - {query.trim() ? `No rooms matching "${query}"` : 'No rooms'} - - - )} -
- - ); -} diff --git a/src/app/features/settings/general/General.tsx b/src/app/features/settings/general/General.tsx index 32cbe5bcc..7aa0a7e61 100644 --- a/src/app/features/settings/general/General.tsx +++ b/src/app/features/settings/general/General.tsx @@ -1316,43 +1316,6 @@ function Messages() { ); } -function KeyboardShortcuts() { - const [quickSwitcherKey, setQuickSwitcherKey] = useSetting(settingsAtom, 'quickSwitcherKey'); - const qsBind = useKeyBind(setQuickSwitcherKey); - - return ( - - Keyboard Shortcuts - - - - {qsBind.listening ? 'Press a key…' : `Ctrl+${keyLabel(quickSwitcherKey)}`} - - - } - /> - - - ); -} - type GeneralProps = { requestClose: () => void; }; @@ -1383,7 +1346,6 @@ export function General({ requestClose }: GeneralProps) { - diff --git a/src/app/pages/client/ClientNonUIFeatures.tsx b/src/app/pages/client/ClientNonUIFeatures.tsx index c8757ac1d..899ca2ad6 100644 --- a/src/app/pages/client/ClientNonUIFeatures.tsx +++ b/src/app/pages/client/ClientNonUIFeatures.tsx @@ -27,7 +27,6 @@ import { useSelectedRoom } from '../../hooks/router/useSelectedRoom'; import { useInboxNotificationsSelected } from '../../hooks/router/useInbox'; import { useMediaAuthentication } from '../../hooks/useMediaAuthentication'; import { usePresenceUpdater } from '../../hooks/usePresenceUpdater'; -import { QuickSwitcher } from '../../components/QuickSwitcher'; function SystemEmojiFeature() { const [twitterEmoji] = useSetting(settingsAtom, 'twitterEmoji'); @@ -262,27 +261,6 @@ function MessageNotifications() { ); } -function QuickSwitcherFeature() { - const [open, setOpen] = useState(false); - const [quickSwitcherKey] = useSetting(settingsAtom, 'quickSwitcherKey'); - - useEffect(() => { - const handleKeyDown = (e: KeyboardEvent) => { - if ((e.ctrlKey || e.metaKey) && e.code === quickSwitcherKey) { - e.preventDefault(); - setOpen((prev) => !prev); - } - }; - window.addEventListener('keydown', handleKeyDown); - return () => { - window.removeEventListener('keydown', handleKeyDown); - }; - }, [quickSwitcherKey]); - - if (!open) return null; - return setOpen(false)} />; -} - type ClientNonUIFeaturesProps = { children: ReactNode; }; @@ -296,7 +274,6 @@ export function ClientNonUIFeatures({ children }: ClientNonUIFeaturesProps) { - {children} ); diff --git a/src/app/state/settings.ts b/src/app/state/settings.ts index f40a73b0a..619976441 100644 --- a/src/app/state/settings.ts +++ b/src/app/state/settings.ts @@ -82,7 +82,6 @@ export interface Settings { nightLightOpacity: number; deafenKey: string; - quickSwitcherKey: string; } const defaultSettings: Settings = { @@ -134,7 +133,6 @@ const defaultSettings: Settings = { nightLightOpacity: 30, deafenKey: 'KeyM', - quickSwitcherKey: 'KeyP', }; export const getSettings = (): Settings => {