import useSettings from '@app/hooks/useSettings'; import { Listbox, Transition } from '@headlessui/react'; import { CheckIcon, ChevronDownIcon } from '@heroicons/react/24/solid'; import type { Region } from '@server/lib/settings'; import { hasFlag } from 'country-flag-icons'; import 'country-flag-icons/3x2/flags.css'; import { sortBy } from 'lodash'; import { useEffect, useMemo, useState } from 'react'; import { defineMessages, useIntl } from 'react-intl'; import useSWR from 'swr'; const messages = defineMessages({ regionDefault: 'All Regions', regionServerDefault: 'Default ({region})', }); interface RegionSelectorProps { value: string; name: string; isUserSetting?: boolean; disableAll?: boolean; watchProviders?: boolean; onChange?: (fieldName: string, region: string) => void; } const RegionSelector = ({ name, value, isUserSetting = false, disableAll = false, watchProviders = false, onChange, }: RegionSelectorProps) => { const { currentSettings } = useSettings(); const intl = useIntl(); const { data: regions } = useSWR( watchProviders ? '/api/v1/watchproviders/regions' : '/api/v1/regions' ); const [selectedRegion, setSelectedRegion] = useState(null); const allRegion: Region = useMemo( () => ({ iso_3166_1: 'all', english_name: 'All', }), [] ); const sortedRegions = useMemo(() => { regions?.forEach((region) => { region.name = intl.formatDisplayName(region.iso_3166_1, { type: 'region', fallback: 'none', }) ?? region.english_name; }); return sortBy(regions, 'name'); }, [intl, regions]); const regionName = (regionCode: string) => sortedRegions?.find((region) => region.iso_3166_1 === regionCode)?.name ?? regionCode; 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) { if (selectedRegion) { onChange(name, selectedRegion.iso_3166_1); } else { onChange(name, ''); } } }, [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' ? regionName(selectedRegion.iso_3166_1) : isUserSetting && selectedRegion?.iso_3166_1 !== 'all' ? intl.formatMessage(messages.regionServerDefault, { region: currentSettings.region ? regionName(currentSettings.region) : intl.formatMessage(messages.regionDefault), }) : intl.formatMessage(messages.regionDefault)} {isUserSetting && ( {({ selected, active }) => (
{intl.formatMessage(messages.regionServerDefault, { region: currentSettings.region ? regionName(currentSettings.region) : intl.formatMessage(messages.regionDefault), })} {selected && ( )}
)}
)} {!disableAll && ( {({ selected, active }) => (
{intl.formatMessage(messages.regionDefault)} {selected && ( )}
)}
)} {sortedRegions?.map((region) => ( {({ selected, active }) => (
{regionName(region.iso_3166_1)} {selected && ( )}
)}
))}
)}
); }; export default RegionSelector;