import React, { ChangeEventHandler, KeyboardEventHandler, MouseEventHandler, useEffect, useRef, useState, } from 'react'; import { Header, Icon, IconButton, Icons, Input, Menu, MenuItem, PopOut, Text, config, } from 'folds'; import FocusTrap from 'focus-trap-react'; import { useDebounce } from '../../hooks/useDebounce'; export function ServerPicker({ server, serverList, allowCustomServer, onServerChange, }: { server: string; serverList: string[]; allowCustomServer?: boolean; onServerChange: (server: string) => void; }) { const [serverMenu, setServerMenu] = useState(false); 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(); setServerMenu(true); } 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); } setServerMenu(false); }; return ( setServerMenu(true)} after={ serverList.length === 0 || (serverList.length === 1 && !allowCustomServer) ? undefined : ( setServerMenu(false), clickOutsideDeactivates: true, isKeyForward: (evt: KeyboardEvent) => evt.key === 'ArrowDown', isKeyBackward: (evt: KeyboardEvent) => evt.key === 'ArrowUp', }} >
Homeserver List
{serverList?.map((serverName) => ( {serverName} ))}
} > {(anchorRef) => ( setServerMenu(true)} variant={allowCustomServer ? 'Background' : 'Surface'} size="300" aria-pressed={serverMenu} radii="300" > )}
) } /> ); }