Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .jules/bolt.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
## 2024-05-24 - [Defer Expensive Synchronous Work During Fake Streaming]
**Learning:** Fake text streaming with `setInterval` at rapid intervals (e.g. 24ms) can severely block the main thread if expensive synchronous computations (like text analysis/scoring) depend directly on the streaming state.
**Action:** Always wrap rapidly changing state in `useDeferredValue` before feeding it into expensive `useMemo` hooks to keep the UI thread unblocked.
9 changes: 7 additions & 2 deletions apps/quill/client/components/playground-view.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
import { AnimatePresence, motion } from "framer-motion";
import { useEffect, useMemo, useRef, useState } from "react";
import { useDeferredValue, useEffect, useMemo, useRef, useState } from "react";
import { USE_CASE_PRESETS } from "../../src/lib/presets";
import { analyzeText, scoreDeterministic } from "../../src/lib/rubric";
import type { Guide, UseCase } from "../../src/lib/types";
Expand Down Expand Up @@ -255,7 +255,12 @@ export function PlaygroundView({
};
}, [output]);

const snapshot = useMemo(() => analyzeText(visibleOutput), [visibleOutput]);
const deferredVisibleOutput = useDeferredValue(visibleOutput);

const snapshot = useMemo(
() => analyzeText(deferredVisibleOutput),
[deferredVisibleOutput]
);
const { score, details } = useMemo(
() =>
guide
Expand Down
Loading