import React, { useCallback, useId, useMemo, useState } from 'react'; import { InlineLoading, InlineNotification, RadioButton, RadioButtonGroup, RadioButtonSkeleton, Search, } from '@carbon/react'; import { getCoreTranslation } from '@openmrs/esm-translations'; import { useOnVisible } from '@openmrs/esm-framework'; import { useLocationByUuid, useLocations } from './location-picker.resource'; import styles from './location-picker.module.scss'; interface LocationPickerProps { selectedLocationUuid?: string; defaultLocationUuid?: string; locationTag?: string; locationsPerRequest?: number; onChange: (locationUuid?: string) => void; } export const LocationPicker: React.FC = ({ selectedLocationUuid, defaultLocationUuid, locationTag, locationsPerRequest = 50, onChange, }) => { const [searchTerm, setSearchTerm] = useState(''); const searchId = useId(); const { location: defaultLocation } = useLocationByUuid(defaultLocationUuid); const { locations: fetchedLocations, isLoading, hasMore, loadingNewData, error, setPage, } = useLocations(locationTag, locationsPerRequest, searchTerm); const locations = useMemo(() => { if (defaultLocation && !searchTerm && defaultLocationUuid) { return [defaultLocation, ...fetchedLocations.filter(({ resource }) => resource.id !== defaultLocationUuid)]; } return fetchedLocations ?? []; }, [defaultLocation, fetchedLocations, defaultLocationUuid, searchTerm]); const handleSearchChange = useCallback( (searchQuery: string) => { onChange(); setSearchTerm(searchQuery.trim()); }, [onChange], ); const loadMore = useCallback(() => { if (loadingNewData || !hasMore) { return; } setPage((page) => page + 1); }, [loadingNewData, hasMore, setPage]); const loadingIconRef = useOnVisible(loadMore); const infiniteScrollTriggerIndex = hasMore ? Math.max(0, Math.floor(locations.length - locationsPerRequest / 2)) : -1; return ( <> handleSearchChange(event.target.value)} size="lg" /> {error && (
)}
{isLoading ? (
{Array.from({ length: 5 }).map((_, index) => ( ))}
) : ( <>
{locations.length > 0 ? ( { onChange(value?.toString()); }} orientation="vertical" valueSelected={selectedLocationUuid} > {locations.map((entry, i) => ( {entry.resource.name} } name={entry.resource.name} value={entry.resource.id} /> ))} ) : (

{getCoreTranslation('noResultsToDisplay')}

)}
{loadingNewData && (
)} )}
); };