import { Listbox, Transition } from '@headlessui/react'; import { CheckIcon, ChevronDownIcon } from '@heroicons/react/solid'; import { hasFlag } from 'country-flag-icons'; import 'country-flag-icons/3x2/flags.css'; import React, { useEffect, useMemo, useState } from 'react'; import { defineMessages, useIntl } from 'react-intl'; import useSWR from 'swr'; import type { Region } from '../../../server/lib/settings'; import useSettings from '../../hooks/useSettings'; const messages = defineMessages({ regionDefault: 'All Regions', regionServerDefault: 'Default ({region})', }); interface RegionSelectorProps { value: string; name: string; isUserSetting?: boolean; onChange?: (fieldName: string, region: string) => void; } const RegionSelector: React.FC = ({ name, value, isUserSetting = false, onChange, }) => { const { currentSettings } = useSettings(); const intl = useIntl(); const { data: regions } = useSWR('/api/v1/regions'); const [selectedRegion, setSelectedRegion] = useState(null); const allRegion: Region = useMemo( () => ({ iso_3166_1: 'all', english_name: 'All', }), [] ); const sortedRegions = useMemo( () => regions?.sort((region1, region2) => { const region1Name = intl.formatDisplayName(region1.iso_3166_1, { type: 'region', fallback: 'none', }) ?? region1.english_name; const region2Name = intl.formatDisplayName(region2.iso_3166_1, { type: 'region', fallback: 'none', }) ?? region2.english_name; return region1Name === region2Name ? 0 : region1Name > region2Name ? 1 : -1; }), [intl, regions] ); const defaultRegionNameFallback = regions?.find((region) => region.iso_3166_1 === currentSettings.region) ?.english_name ?? currentSettings.region; useEffect(() => { if (regions && value) { if (value === 'all') { setSelectedRegion(allRegion); } else { const matchedRegion = regions.find( (region) => region.iso_3166_1 === value ); setSelectedRegion(matchedRegion ?? null); } } }, [value, regions, allRegion]); useEffect(() => { if (onChange && regions) { onChange(name, selectedRegion?.iso_3166_1 ?? ''); } }, [onChange, selectedRegion, name, regions]); return (
{({ open }) => (
{((selectedRegion && hasFlag(selectedRegion?.iso_3166_1)) || (isUserSetting && !selectedRegion && currentSettings.region && hasFlag(currentSettings.region))) && ( )} {selectedRegion && selectedRegion.iso_3166_1 !== 'all' ? intl.formatDisplayName(selectedRegion.iso_3166_1, { type: 'region', fallback: 'none', }) ?? selectedRegion.english_name : isUserSetting && selectedRegion?.iso_3166_1 !== 'all' ? intl.formatMessage(messages.regionServerDefault, { region: currentSettings.region ? intl.formatDisplayName(currentSettings.region, { type: 'region', fallback: 'none', }) ?? defaultRegionNameFallback : intl.formatMessage(messages.regionDefault), }) : intl.formatMessage(messages.regionDefault)} {isUserSetting && ( {({ selected, active }) => (
{intl.formatMessage(messages.regionServerDefault, { region: currentSettings.region ? intl.formatDisplayName( currentSettings.region, { type: 'region', fallback: 'none', } ) ?? defaultRegionNameFallback : intl.formatMessage(messages.regionDefault), })} {selected && ( )}
)}
)} {({ selected, active }) => (
{intl.formatMessage(messages.regionDefault)} {selected && ( )}
)}
{sortedRegions?.map((region) => ( {({ selected, active }) => (
{intl.formatDisplayName(region.iso_3166_1, { type: 'region', fallback: 'none', }) ?? region.english_name} {selected && ( )}
)}
))}
)}
); }; export default RegionSelector;