From 13306e6628e86a97c59e2e47583d377f4fa2d83e Mon Sep 17 00:00:00 2001 From: LuisMSuarez <140195810+LuisMSuarez@users.noreply.github.com> Date: Sat, 25 Oct 2025 16:21:24 -0700 Subject: [PATCH 1/2] Add loading state for summary generation Introduces a 'generatingSummary' state to display a skeleton loader while the review summary is being generated. Improves user feedback during asynchronous summary creation. --- .../src/components/reviews/ReviewList.tsx | 25 +++++++++++++++---- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/packages/client/src/components/reviews/ReviewList.tsx b/packages/client/src/components/reviews/ReviewList.tsx index 87d0fd2..b043b56 100644 --- a/packages/client/src/components/reviews/ReviewList.tsx +++ b/packages/client/src/components/reviews/ReviewList.tsx @@ -23,8 +23,14 @@ type GetReviewsResponse = { reviews: Review[]; }; +type SummarizeResponse = { + summary: string; +}; + const ReviewList = ({ productId }: Props) => { const [summaryRegenerated, setSummaryRegenerated] = useState(false); + const [generatingSummary, setGeneratingSummary] = useState(false); + const { data: reviewData, isLoading, @@ -42,11 +48,16 @@ const ReviewList = ({ productId }: Props) => { }; const generateSummary = async () => { - const { data } = await axios.post( - `/api/products/${productId}/summaries` - ); - setSummaryRegenerated(true); - return data; + setGeneratingSummary(true); + try { + const { data } = await axios.post( + `/api/products/${productId}/summaries` + ); + setSummaryRegenerated(true); + return data; + } finally { + setGeneratingSummary(false); + } }; if (isLoading) { @@ -80,6 +91,10 @@ const ReviewList = ({ productId }: Props) => {
{reviewData?.summary ? (

{reviewData.summary}

+ ) : generatingSummary ? ( +
+ {/* Review placeholder (2-liner) */} +
) : ( diff --git a/packages/client/src/components/reviews/ReviewSkeleton.tsx b/packages/client/src/components/reviews/ReviewSkeleton.tsx new file mode 100644 index 0000000..448587e --- /dev/null +++ b/packages/client/src/components/reviews/ReviewSkeleton.tsx @@ -0,0 +1,13 @@ +import Skeleton from 'react-loading-skeleton'; + +const ReviewSkeleton = () => { + return ( +
+ {/* User name placeholder */} + {/* Stars placeholder */} + {/* Review placeholder (2-liner) */} +
+ ); +}; + +export default ReviewSkeleton;