From 73100aa1ceeca1a2a54a7825bffa3fe3fde7bd93 Mon Sep 17 00:00:00 2001 From: randy-ar Date: Thu, 15 Jan 2026 16:53:39 +0700 Subject: [PATCH] fix(FE): implement lazy loading select button on project flock index --- .../project-flock/ProjectFlockTable.tsx | 83 +++++++------------ 1 file changed, 28 insertions(+), 55 deletions(-) diff --git a/src/components/pages/production/project-flock/ProjectFlockTable.tsx b/src/components/pages/production/project-flock/ProjectFlockTable.tsx index 5ca0e789..6b935812 100644 --- a/src/components/pages/production/project-flock/ProjectFlockTable.tsx +++ b/src/components/pages/production/project-flock/ProjectFlockTable.tsx @@ -5,7 +5,10 @@ import Button from '@/components/Button'; import FloatingActionsButton from '@/components/FloatingActionsButton'; import CheckboxInput from '@/components/input/CheckboxInput'; import DebouncedTextInput from '@/components/input/DebouncedTextInput'; -import SelectInput, { OptionType } from '@/components/input/SelectInput'; +import SelectInput, { + OptionType, + useSelect, +} from '@/components/input/SelectInput'; import { useModal } from '@/components/Modal'; import ConfirmationModal from '@/components/modal/ConfirmationModal'; import ConfirmationModalWithNotes from '@/components/modal/ConfirmationModalWithNotes'; @@ -59,9 +62,6 @@ const ProjectFlockTable = ({ refresh }: { refresh?: () => void }) => { const selectedRowIds = Object.keys(rowSelection) .filter((id) => rowSelection[id]) .map((id) => parseInt(id)); - const [locationSelectInputValue, setLocationSelectInputValue] = useState(''); - const [areaSelectInputValue, setAreaSelectInputValue] = useState(''); - const [kandangSelectInputValue, setKandangSelectInputValue] = useState(''); const [selectedArea, setSelectedArea] = useState(null); const [selectedLocation, setSelectedLocation] = useState( null @@ -90,55 +90,25 @@ const ProjectFlockTable = ({ refresh }: { refresh?: () => void }) => { { revalidateOnMount: true } ); - const areaUrl = `${AreaApi.basePath}?${new URLSearchParams({ - search: areaSelectInputValue, - limit: '100', - }).toString()}`; - const { data: areas, isLoading: isLoadingAreas } = useSWR( - areaUrl, - AreaApi.getAllFetcher - ); - - const locationUrl = `${LocationApi.basePath}?${new URLSearchParams({ - search: locationSelectInputValue, - area_id: selectedArea != null ? selectedArea.value.toString() : '', - limit: '100', - }).toString()}`; - const { data: locations, isLoading: isLoadingLocations } = useSWR( - locationUrl, - LocationApi.getAllFetcher - ); - - const kandangUrl = `${KandangApi.basePath}?${new URLSearchParams({ - search: kandangSelectInputValue, - location_id: - selectedLocation != null ? selectedLocation.value.toString() : '', - limit: '100', - }).toString()}`; - const { data: kandangs, isLoading: isLoadingKandang } = useSWR( - kandangUrl, - KandangApi.getAllFetcher - ); - - // ===== Data to Options Mapping ====== - const optionsArea = isResponseSuccess(areas) - ? areas?.data.map((area) => ({ - value: area.id, - label: area.name, - })) - : []; - const optionsKandang = isResponseSuccess(kandangs) - ? kandangs?.data.map((kandang) => ({ - value: kandang.id, - label: kandang.name, - })) - : []; - const optionsLocation = isResponseSuccess(locations) - ? locations?.data.map((location) => ({ - value: location.id, - label: location.name, - })) - : []; + // ===== Fetch Data Select ===== + const { + options: optionsArea, + isLoadingOptions: isLoadingArea, + setInputValue: setAreaSelectInputValue, + loadMore: loadMoreArea, + } = useSelect(AreaApi.basePath, 'id', 'name'); + const { + options: optionsLocation, + isLoadingOptions: isLoadingLocation, + setInputValue: setLocationSelectInputValue, + loadMore: loadMoreLocation, + } = useSelect(LocationApi.basePath, 'id', 'name'); + const { + options: optionsKandang, + isLoadingOptions: isLoadingKandang, + setInputValue: setKandangSelectInputValue, + loadMore: loadMoreKandang, + } = useSelect(KandangApi.basePath, 'id', 'name'); // ====== HANDLER ====== const confirmationModalDeleteClickHandler = async () => { @@ -385,7 +355,7 @@ const ProjectFlockTable = ({ refresh }: { refresh?: () => void }) => { { setSelectedArea(val as OptionType); @@ -395,12 +365,13 @@ const ProjectFlockTable = ({ refresh }: { refresh?: () => void }) => { ); }} onInputChange={setAreaSelectInputValue} + onMenuScrollToBottom={loadMoreArea} isClearable /> { setSelectedLocation(val as OptionType); @@ -410,6 +381,7 @@ const ProjectFlockTable = ({ refresh }: { refresh?: () => void }) => { ); }} onInputChange={setLocationSelectInputValue} + onMenuScrollToBottom={loadMoreLocation} isClearable /> void }) => { ); }} onInputChange={setKandangSelectInputValue} + onMenuScrollToBottom={loadMoreKandang} isClearable />