import React, { ChangeEventHandler, KeyboardEventHandler, MouseEventHandler, useEffect, useRef, useState, } from 'react'; import { Header, Icon, IconButton, Icons, Input, Menu, MenuItem, PopOut, RectCords, Text, config, } from 'folds'; import FocusTrap from 'focus-trap-react'; import { useDebounce } from '../../hooks/useDebounce'; import { stopPropagation } from '../../utils/keyboard'; export function ServerPicker({ server, serverList, allowCustomServer, onServerChange, }: { server: string; serverList: string[]; allowCustomServer?: boolean; onServerChange: (server: string) => void; }) { const [serverMenuAnchor, setServerMenuAnchor] = useState(); const serverInputRef = useRef(null); useEffect(() => { // sync input with it outside server changes if (serverInputRef.current && serverInputRef.current.value !== server) { serverInputRef.current.value = server; } }, [server]); const debounceServerSelect = useDebounce(onServerChange, { wait: 700 }); const handleServerChange: ChangeEventHandler = (evt) => { const inputServer = evt.target.value.trim(); if (inputServer) debounceServerSelect(inputServer); }; const handleKeyDown: KeyboardEventHandler = (evt) => { if (evt.key === 'ArrowDown') { evt.preventDefault(); setServerMenuAnchor(undefined); } if (evt.key === 'Enter') { evt.preventDefault(); const inputServer = evt.currentTarget.value.trim(); if (inputServer) onServerChange(inputServer); } }; const handleServerSelect: MouseEventHandler = (evt) => { const selectedServer = evt.currentTarget.getAttribute('data-server'); if (selectedServer) { onServerChange(selectedServer); } setServerMenuAnchor(undefined); }; const handleOpenServerMenu: MouseEventHandler = (evt) => { const target = evt.currentTarget.parentElement ?? evt.currentTarget; setServerMenuAnchor(target.getBoundingClientRect()); }; return ( setServerMenuAnchor(undefined), clickOutsideDeactivates: true, isKeyForward: (evt: KeyboardEvent) => evt.key === 'ArrowDown', isKeyBackward: (evt: KeyboardEvent) => evt.key === 'ArrowUp', escapeDeactivates: stopPropagation, }} >
Homeserver List
{serverList?.map((serverName) => ( {serverName} ))}
} > ) } /> ); }