From 6930696692443bc5de59ee4a803dfe299d9fd786 Mon Sep 17 00:00:00 2001 From: rstubryan Date: Thu, 8 Jan 2026 10:37:17 +0700 Subject: [PATCH] refactor(FE): Lazy-load uniformity details and show spinner --- .../uniformity/detail/UniformityDetail.tsx | 64 +++++++++++++++++-- 1 file changed, 60 insertions(+), 4 deletions(-) diff --git a/src/components/pages/production/uniformity/detail/UniformityDetail.tsx b/src/components/pages/production/uniformity/detail/UniformityDetail.tsx index a89c15d2..05572099 100644 --- a/src/components/pages/production/uniformity/detail/UniformityDetail.tsx +++ b/src/components/pages/production/uniformity/detail/UniformityDetail.tsx @@ -1,6 +1,6 @@ 'use client'; -import { useMemo, useEffect } from 'react'; +import { useMemo, useEffect, useState } from 'react'; import { useRouter } from 'next/navigation'; import { Icon } from '@iconify/react'; import { ColumnDef } from '@tanstack/react-table'; @@ -14,6 +14,9 @@ import { UniformityDetail as UniformityDetailType } from '@/types/api/production import { formatDate, formatNumber } from '@/lib/helper'; import { useUiStore } from '@/stores/ui/ui.store'; import UniformityDetailsPreview from '@/components/pages/production/uniformity/detail/UniformityDetailsPreview'; +import { UniformityApi } from '@/services/api/uniformity'; +import useSWR from 'swr'; +import { isResponseSuccess } from '@/lib/api-helper'; import { getStatusColor, getStatusIndicatorColor, @@ -33,6 +36,22 @@ const UniformityDetail: React.FC = ({ const setExpandedDrawerContent = useUiStore( (s) => s.setExpandedDrawerContent ); + const [shouldFetchDetails, setShouldFetchDetails] = useState(false); + const [hasFetchedDetails, setHasFetchedDetails] = useState(false); + + const { data: uniformityDetailResponse, isLoading } = useSWR( + shouldFetchDetails + ? `uniformity-detail-${initialValues.id}-with-details` + : null, + () => UniformityApi.getUniformityDetail(initialValues.id, true) + ); + + const uniformity_details = useMemo(() => { + if (shouldFetchDetails && isResponseSuccess(uniformityDetailResponse)) { + return uniformityDetailResponse.data.uniformity_details; + } + return initialValues.uniformity_details; + }, [shouldFetchDetails, uniformityDetailResponse, initialValues]); const handleApprove = () => { router.push(`/production/uniformity?action=approve&id=${initialValues.id}`); @@ -43,10 +62,15 @@ const UniformityDetail: React.FC = ({ }; const handleViewUniformityDetails = () => { + if (!uniformity_details || uniformity_details.length === 0) { + setShouldFetchDetails(true); + return; + } + setExpandedDrawerContent( ); @@ -56,6 +80,28 @@ const UniformityDetail: React.FC = ({ }, 0); }; + useEffect(() => { + if ( + shouldFetchDetails && + uniformity_details && + uniformity_details.length > 0 && + !hasFetchedDetails + ) { + setExpandedDrawerContent( + + ); + + setHasFetchedDetails(true); + setTimeout(() => { + setExpandedDrawerOpen(true); + }, 0); + } + }, [shouldFetchDetails, uniformity_details, hasFetchedDetails]); + useEffect(() => { return () => { setExpandedDrawerOpen(false); @@ -154,10 +200,20 @@ const UniformityDetail: React.FC = ({ {valueMap[id]}