From 4b160a8d96e8a464eb9fd8ccbc38110e145c5157 Mon Sep 17 00:00:00 2001 From: giannacastr <62898067+giannacastr@users.noreply.github.com> Date: Mon, 9 Mar 2026 02:12:03 -0400 Subject: [PATCH 1/5] Working manual generation button. --- src/components/WishlistSummary.tsx | 49 ++++++++++++++++++------------ 1 file changed, 29 insertions(+), 20 deletions(-) diff --git a/src/components/WishlistSummary.tsx b/src/components/WishlistSummary.tsx index 5dfb0c65..36a47534 100644 --- a/src/components/WishlistSummary.tsx +++ b/src/components/WishlistSummary.tsx @@ -2,7 +2,6 @@ import { useStreamClient } from "@/hooks/useStreamClient"; import { useEffect, useState, useRef } from "react"; -import ReactMarkdown from "react-markdown"; export default function WishlistSummary() { const [fullText, setFullText] = useState(""); @@ -11,6 +10,7 @@ export default function WishlistSummary() { const { isStreaming, streamClient } = useStreamClient(); const hasStreamed = useRef(false); const typewriterInterval = useRef(null); + const [isRequested, setIsRequested] = useState(false); useEffect(() => { if (!isLoading) return; @@ -60,10 +60,11 @@ export default function WishlistSummary() { }, [fullText, isLoading, displayedText]); useEffect(() => { - if (hasStreamed.current) return; - hasStreamed.current = true; + if (!isRequested || hasStreamed.current) return; const startStream = async () => { + hasStreamed.current = true; + try { await streamClient.stream("/api/wishlists/summary", { onChunk: (chunk) => { @@ -76,12 +77,14 @@ export default function WishlistSummary() { console.error("Streaming error:", error); setFullText("Unable to load summary."); setIsLoading(false); + hasStreamed.current = false; }, }); } catch (error) { console.error("Failed to start stream:", error); setFullText("Unable to load summary."); setIsLoading(false); + hasStreamed.current = false; } }; @@ -90,29 +93,35 @@ export default function WishlistSummary() { return () => { streamClient.cancel(); }; - }, [streamClient]); + + }, [streamClient, isRequested]); const showContainer = displayedText.length > 0; const showCursor = isLoading || isStreaming || displayedText.length < fullText.length; return ( -
- {displayedText.split("\n").map((line, index, array) => ( -
- - {line} - - {showCursor && index === array.length - 1 && ( - | - )} +
+ {!isRequested && ( +
+
- ))} + )} + +
+ {displayedText} + {showCursor && |} +
); } From c690e2b1ff4cf0a9fedbbbebb676e0bbc9bcb079 Mon Sep 17 00:00:00 2001 From: Nathan Date: Mon, 9 Mar 2026 23:42:56 -0400 Subject: [PATCH 2/5] styling consistencies --- src/components/WishlistSummary.tsx | 6 +++--- src/screens/Wishlist/AdminWishlistScreen.tsx | 1 - 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/components/WishlistSummary.tsx b/src/components/WishlistSummary.tsx index 36a47534..d23aa931 100644 --- a/src/components/WishlistSummary.tsx +++ b/src/components/WishlistSummary.tsx @@ -102,12 +102,12 @@ export default function WishlistSummary() { return (
{!isRequested && ( -
+
)} diff --git a/src/screens/Wishlist/AdminWishlistScreen.tsx b/src/screens/Wishlist/AdminWishlistScreen.tsx index fae17af2..f4bcee49 100644 --- a/src/screens/Wishlist/AdminWishlistScreen.tsx +++ b/src/screens/Wishlist/AdminWishlistScreen.tsx @@ -42,7 +42,6 @@ export default function AdminWishlistScreen() {

Wishlists

- Date: Tue, 10 Mar 2026 11:24:19 -0400 Subject: [PATCH 3/5] incorporate react-markdown --- src/components/WishlistSummary.tsx | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/components/WishlistSummary.tsx b/src/components/WishlistSummary.tsx index 36a47534..66079fba 100644 --- a/src/components/WishlistSummary.tsx +++ b/src/components/WishlistSummary.tsx @@ -2,6 +2,7 @@ import { useStreamClient } from "@/hooks/useStreamClient"; import { useEffect, useState, useRef } from "react"; +import ReactMarkdown from 'react-markdown'; export default function WishlistSummary() { const [fullText, setFullText] = useState(""); @@ -119,7 +120,11 @@ export default function WishlistSummary() { : "hidden" } transition-all duration-200`} > - {displayedText} +
+ + {displayedText} + +
{showCursor && |}
From f23e38b3e0300c4a59a0f2a7fc72e5be7d9cb900 Mon Sep 17 00:00:00 2001 From: Gia Castro <62898067+giannacastr@users.noreply.github.com> Date: Tue, 10 Mar 2026 12:27:03 -0400 Subject: [PATCH 4/5] Update src/components/WishlistSummary.tsx Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> --- src/components/WishlistSummary.tsx | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/components/WishlistSummary.tsx b/src/components/WishlistSummary.tsx index ccb56b96..1c652ef4 100644 --- a/src/components/WishlistSummary.tsx +++ b/src/components/WishlistSummary.tsx @@ -60,6 +60,9 @@ export default function WishlistSummary() { }; }, [fullText, isLoading, displayedText]); + useEffect(() => { + if (!isRequested || hasStreamed.current) return; + useEffect(() => { if (!isRequested || hasStreamed.current) return; @@ -79,6 +82,7 @@ export default function WishlistSummary() { setFullText("Unable to load summary."); setIsLoading(false); hasStreamed.current = false; + setIsRequested(false); }, }); } catch (error) { @@ -86,6 +90,7 @@ export default function WishlistSummary() { setFullText("Unable to load summary."); setIsLoading(false); hasStreamed.current = false; + setIsRequested(false); } }; From 4367066b455660ecba66c8e3b5ce16a6c847e062 Mon Sep 17 00:00:00 2001 From: giannacastr <62898067+giannacastr@users.noreply.github.com> Date: Tue, 10 Mar 2026 12:40:12 -0400 Subject: [PATCH 5/5] fixed duplicate command from greptile suggestion --- src/components/WishlistSummary.tsx | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/components/WishlistSummary.tsx b/src/components/WishlistSummary.tsx index 1c652ef4..8985c189 100644 --- a/src/components/WishlistSummary.tsx +++ b/src/components/WishlistSummary.tsx @@ -60,9 +60,6 @@ export default function WishlistSummary() { }; }, [fullText, isLoading, displayedText]); - useEffect(() => { - if (!isRequested || hasStreamed.current) return; - useEffect(() => { if (!isRequested || hasStreamed.current) return;