refactor(webui): shrink fork implementation
This commit is contained in:
@@ -278,8 +278,6 @@ export function ThreadShell({
|
||||
const [filePreviewPath, setFilePreviewPath] = useState<string | null>(null);
|
||||
const [filePreviewClosing, setFilePreviewClosing] = useState(false);
|
||||
const [filePreviewWidth, setFilePreviewWidth] = useState(FILE_PREVIEW_DEFAULT_WIDTH);
|
||||
const [forkError, setForkError] = useState<string | null>(null);
|
||||
const [forkHydratingChatId, setForkHydratingChatId] = useState<string | null>(null);
|
||||
const shellRef = useRef<HTMLElement | null>(null);
|
||||
const filePreviewWidthRef = useRef(FILE_PREVIEW_DEFAULT_WIDTH);
|
||||
const filePreviewCloseTimerRef = useRef<number | null>(null);
|
||||
@@ -288,7 +286,6 @@ export function ThreadShell({
|
||||
const messageCacheRef = useRef<Map<string, UIMessage[]>>(new Map());
|
||||
/** Last chatId we associated with the in-memory thread (for cache-on-switch). */
|
||||
const prevChatIdForCacheRef = useRef<string | null>(null);
|
||||
const prevChatIdForComposerRef = useRef<string | null>(chatId);
|
||||
/** Skip one message-cache write right after chatId changes (messages may not match yet). */
|
||||
const skipLayoutCacheRef = useRef(false);
|
||||
const appliedHistoryVersionRef = useRef<Map<string, number>>(new Map());
|
||||
@@ -340,12 +337,6 @@ export function ThreadShell({
|
||||
};
|
||||
}, []);
|
||||
|
||||
useEffect(() => {
|
||||
if (prevChatIdForComposerRef.current === chatId) return;
|
||||
prevChatIdForComposerRef.current = chatId;
|
||||
setForkError(null);
|
||||
}, [chatId]);
|
||||
|
||||
const displayMessages = useMemo(() => projectWebuiThreadMessages(messages), [messages]);
|
||||
|
||||
const showHeroComposer = messages.length === 0 && !loading;
|
||||
@@ -455,12 +446,6 @@ export function ThreadShell({
|
||||
setMessages(projectWebuiThreadMessages(historical));
|
||||
}, [chatId, historical, setMessages]);
|
||||
|
||||
useEffect(() => {
|
||||
if (!chatId || loading || forkHydratingChatId !== chatId) return;
|
||||
setForkHydratingChatId(null);
|
||||
setScrollToBottomSignal((value) => value + 1);
|
||||
}, [chatId, forkHydratingChatId, loading]);
|
||||
|
||||
useLayoutEffect(() => {
|
||||
if (chatId) {
|
||||
const prev = prevChatIdForCacheRef.current;
|
||||
@@ -539,7 +524,6 @@ export function ThreadShell({
|
||||
|
||||
const handleThreadSend = useCallback(
|
||||
(content: string, images?: SendImage[], options?: SendOptions) => {
|
||||
setForkError(null);
|
||||
setScrollToBottomSignal((value) => value + 1);
|
||||
send(content, images, withWorkspaceScope(options));
|
||||
},
|
||||
@@ -637,21 +621,13 @@ export function ThreadShell({
|
||||
const handleForkFromMessage = useCallback(
|
||||
async (beforeUserIndex: number) => {
|
||||
if (!chatId || !onForkChat) return;
|
||||
setForkError(null);
|
||||
const forkedChatId = await onForkChat(chatId, beforeUserIndex);
|
||||
if (!forkedChatId) {
|
||||
setForkError(t("thread.fork.failed", {
|
||||
defaultValue: "Could not fork this chat. Try again.",
|
||||
}));
|
||||
return;
|
||||
}
|
||||
if (!forkedChatId) return;
|
||||
messageCacheRef.current.delete(forkedChatId);
|
||||
appliedHistoryVersionRef.current.delete(forkedChatId);
|
||||
pendingCanonicalHydrateRef.current.add(forkedChatId);
|
||||
setForkHydratingChatId(forkedChatId);
|
||||
setForkError(null);
|
||||
},
|
||||
[chatId, onForkChat, t],
|
||||
[chatId, onForkChat],
|
||||
);
|
||||
|
||||
const composer = (
|
||||
@@ -665,7 +641,7 @@ export function ThreadShell({
|
||||
{session ? (
|
||||
<ThreadComposer
|
||||
onSend={handleThreadSend}
|
||||
disabled={!chatId || forkHydratingChatId === chatId}
|
||||
disabled={!chatId}
|
||||
isStreaming={isStreaming}
|
||||
placeholder={
|
||||
showHeroComposer
|
||||
@@ -692,7 +668,6 @@ export function ThreadShell({
|
||||
workspaceError={workspaceError}
|
||||
onWorkspaceScopeChange={onWorkspaceScopeChange}
|
||||
pendingQueueKey={chatId}
|
||||
externalError={forkError}
|
||||
/>
|
||||
) : (
|
||||
<ThreadComposer
|
||||
@@ -776,7 +751,6 @@ export function ThreadShell({
|
||||
showScrollToBottomButton={!!session}
|
||||
cliApps={cliApps}
|
||||
mcpPresets={mcpPresets}
|
||||
allMessages={displayMessages}
|
||||
forkBoundaryMessageCount={forkBoundaryMessageCount}
|
||||
onOpenFilePreview={historyKey ? handleOpenFilePreview : undefined}
|
||||
onForkFromMessage={onForkChat ? handleForkFromMessage : undefined}
|
||||
|
||||
Reference in New Issue
Block a user