diff --git a/webapp/_webapp/src/components/code-block.tsx b/webapp/_webapp/src/components/code-block.tsx
index 16c71ec5..f237456d 100644
--- a/webapp/_webapp/src/components/code-block.tsx
+++ b/webapp/_webapp/src/components/code-block.tsx
@@ -3,7 +3,7 @@ import "highlight.js/styles/default.min.css";
import latex from "highlight.js/lib/languages/latex";
hljs.registerLanguage("latex", latex);
-import { useState, useEffect } from "react";
+import { useMemo } from "react";
type CodeBlockProps = {
code: string;
@@ -11,11 +11,7 @@ type CodeBlockProps = {
};
export const CodeBlock = ({ code, className }: CodeBlockProps) => {
- const [highlightedCode, setHighlightedCode] = useState(code);
-
- useEffect(() => {
- setHighlightedCode(hljs.highlight(code, { language: "latex" }).value);
- }, [code]);
+ const highlightedCode = useMemo(() => hljs.highlight(code, { language: "latex" }).value, [code]);
return (
{
// State
- const [progress, setProgress] = useState(0);
- const [phase, setPhase] = useState("green");
- const [isTimeout, setIsTimeout] = useState(false);
+ const [{ progress, phase, isTimeout }, dispatch] = useReducer(indicatorReducer, {
+ progress: 0,
+ phase: "green",
+ isTimeout: false,
+ });
// Handle progress animation
useEffect(() => {
@@ -103,18 +129,18 @@ export const LoadingIndicator = ({ text = "Thinking", estimatedSeconds = 0, erro
// we spend 100% of estimatedDuration in green,
// 50% in orange, and 50% in red before warning.
if (phase === "green") {
- setPhase("orange");
+ dispatch({ type: "ADVANCE_PHASE", nextPhase: "orange" });
currentProgress = 0;
} else if (phase === "orange") {
- setPhase("red");
+ dispatch({ type: "ADVANCE_PHASE", nextPhase: "red" });
currentProgress = 0;
} else if (phase === "red") {
- setIsTimeout(true);
+ dispatch({ type: "SET_TIMEOUT" });
return;
}
}
- setProgress(currentProgress);
+ dispatch({ type: "SET_PROGRESS", progress: currentProgress });
if (!isTimeout) {
animationFrameId = requestAnimationFrame(updateProgress);
diff --git a/webapp/_webapp/src/components/message-entry-container/assistant.tsx b/webapp/_webapp/src/components/message-entry-container/assistant.tsx
index 47743da3..ca692d44 100644
--- a/webapp/_webapp/src/components/message-entry-container/assistant.tsx
+++ b/webapp/_webapp/src/components/message-entry-container/assistant.tsx
@@ -132,8 +132,8 @@ export const AssistantMessageContainer = ({
)}
{/* PaperDebugger blocks */}
- {parsedMessage.paperDebuggerContent.map((content, index) => (
-
+ {parsedMessage.paperDebuggerContent.map((content) => (
+
{content}
))}
@@ -147,7 +147,7 @@ export const AssistantMessageContainer = ({
{((parsedMessage.regularContent?.length || 0) > 0 || parsedMessage.paperDebuggerContent.length > 0) && (
-
+ { if (e.key === 'Enter' || e.key === ' ') { handleCopy(); } }} tabIndex={0} role="button" aria-label="Copy message">
diff --git a/webapp/_webapp/src/components/message-entry-container/tools/general.tsx b/webapp/_webapp/src/components/message-entry-container/tools/general.tsx
index f07a1c3a..c381ff03 100644
--- a/webapp/_webapp/src/components/message-entry-container/tools/general.tsx
+++ b/webapp/_webapp/src/components/message-entry-container/tools/general.tsx
@@ -95,7 +95,7 @@ export const GeneralToolCard = ({
// When there is a message, show the compact card with collapsible content
return (
-
+
{ if (e.key === 'Enter' || e.key === ' ') { toggleCollapse(); } }}>