import FocusTrap from 'focus-trap-react'; import { Text, Overlay, OverlayBackdrop, OverlayCenter, Dialog, Header, config, Box, IconButton, Icon, Icons, Input, toRem, MenuItem, Button } from 'folds'; import React, { useRef, useState, useMemo, useCallback, useEffect } from 'react'; import { CutoutCard } from '../../../../components/cutout-card'; import { SettingTile } from '../../../../components/setting-tile'; import { FieldContext } from '../Profile'; import { ProfileFieldElementProps } from './ProfileFieldContext'; export function ProfileTimezone({ value, setValue, busy, }: ProfileFieldElementProps<'us.cloke.msc4175.tz', FieldContext>) { const disabled = busy; const inputRef = useRef(null); const scrollRef = useRef(null); const [overlayOpen, setOverlayOpen] = useState(false); const [query, setQuery] = useState(''); // @ts-expect-error Intl.supportedValuesOf isn't in the types yet const timezones = useMemo(() => Intl.supportedValuesOf('timeZone') as string[], []); const filteredTimezones = timezones.filter( (timezone) => query.length === 0 || timezone.toLowerCase().replace('_', ' ').includes(query.toLowerCase()) ); const handleSelect = useCallback( (timezone: string) => { setOverlayOpen(false); setValue(timezone); }, [setOverlayOpen, setValue] ); useEffect(() => { if (overlayOpen) { const scrollView = scrollRef.current; const focusedItem = scrollView?.querySelector(`[data-tz="${value}"]`); if (value && focusedItem && scrollView) { focusedItem.scrollIntoView({ block: 'center', }); } } }, [scrollRef, value, overlayOpen]); return ( Timezone } > }> inputRef.current, allowOutsideClick: true, clickOutsideDeactivates: true, onDeactivate: () => setOverlayOpen(false), escapeDeactivates: (evt) => { evt.stopPropagation(); return true; }, }} >
Choose a Timezone setOverlayOpen(false)} radii="300">
} value={query} onChange={(evt) => setQuery(evt.currentTarget.value)} /> {filteredTimezones.length === 0 && ( No Results )} {filteredTimezones.map((timezone) => ( } onClick={() => handleSelect(timezone)} > {timezone} ))}
{value && ( )}
); }