avoid edge case with undo (#78)

This commit is contained in:
Will Chen
2025-05-02 16:27:45 -07:00
committed by GitHub
parent 4e4bf51bba
commit 30662118d7

View File

@@ -11,7 +11,7 @@ import { Loader2, RefreshCw, Undo } from "lucide-react";
import { Button } from "@/components/ui/button"; import { Button } from "@/components/ui/button";
import { useVersions } from "@/hooks/useVersions"; import { useVersions } from "@/hooks/useVersions";
import { selectedAppIdAtom } from "@/atoms/appAtoms"; import { selectedAppIdAtom } from "@/atoms/appAtoms";
import { showError } from "@/lib/toast"; import { showError, showSuccess } from "@/lib/toast";
import { IpcClient } from "@/ipc/ipc_client"; import { IpcClient } from "@/ipc/ipc_client";
import { chatMessagesAtom } from "@/atoms/chatAtoms"; import { chatMessagesAtom } from "@/atoms/chatAtoms";
@@ -26,10 +26,11 @@ export const MessagesList = forwardRef<HTMLDivElement, MessagesListProps>(
const { versions, revertVersion } = useVersions(appId); const { versions, revertVersion } = useVersions(appId);
const { streamMessage, isStreaming, error, setError } = useStreamChat(); const { streamMessage, isStreaming, error, setError } = useStreamChat();
const { isAnyProviderSetup } = useSettings(); const { isAnyProviderSetup } = useSettings();
const selectedChatId = useAtomValue(selectedChatIdAtom);
const setMessages = useSetAtom(chatMessagesAtom); const setMessages = useSetAtom(chatMessagesAtom);
const [isUndoLoading, setIsUndoLoading] = useState(false); const [isUndoLoading, setIsUndoLoading] = useState(false);
const [isRetryLoading, setIsRetryLoading] = useState(false); const [isRetryLoading, setIsRetryLoading] = useState(false);
const [selectedChatId, setSelectedChatId] = useAtom(selectedChatIdAtom);
return ( return (
<div className="flex-1 overflow-y-auto p-4" ref={ref}> <div className="flex-1 overflow-y-auto p-4" ref={ref}>
@@ -45,63 +46,61 @@ export const MessagesList = forwardRef<HTMLDivElement, MessagesListProps>(
{!isAnyProviderSetup() && <SetupBanner />} {!isAnyProviderSetup() && <SetupBanner />}
</div> </div>
)} )}
{messages.length > 0 && !isStreaming && ( {messages.length > 3 && !isStreaming && (
<div className="flex max-w-3xl mx-auto gap-2"> <div className="flex max-w-3xl mx-auto gap-2">
{messages[messages.length - 1].role === "assistant" && ( {messages[messages.length - 1].role === "assistant" &&
<Button messages[messages.length - 1].commitHash && (
variant="outline" <Button
size="sm" variant="outline"
disabled={isUndoLoading} size="sm"
onClick={async () => { disabled={isUndoLoading}
if (!selectedChatId || !appId) { onClick={async () => {
console.error("No chat selected or app ID not available"); if (!selectedChatId || !appId) {
return; console.error("No chat selected or app ID not available");
} return;
if (versions.length < 2) { }
showError("Cannot undo; no previous version"); if (versions.length < 2) {
return; showError("Cannot undo; no previous version");
} return;
}
setIsUndoLoading(true); setIsUndoLoading(true);
try { try {
const previousAssistantMessage = const previousAssistantMessage =
messages[messages.length - 3]; messages[messages.length - 3];
if ( if (
previousAssistantMessage?.role === "assistant" && previousAssistantMessage?.role === "assistant" &&
previousAssistantMessage?.commitHash previousAssistantMessage?.commitHash
) { ) {
console.debug("Reverting to previous assistant version"); console.debug(
await revertVersion({ "Reverting to previous assistant version"
versionId: previousAssistantMessage.commitHash, );
}); await revertVersion({
} else { versionId: previousAssistantMessage.commitHash,
// Revert to the previous version });
await revertVersion({ if (selectedChatId) {
versionId: versions[1].oid, const chat = await IpcClient.getInstance().getChat(
}); selectedChatId
);
setMessages(chat.messages);
}
}
} catch (error) {
console.error("Error during undo operation:", error);
showError("Failed to undo changes");
} finally {
setIsUndoLoading(false);
} }
if (selectedChatId) { }}
const chat = await IpcClient.getInstance().getChat( >
selectedChatId {isUndoLoading ? (
); <Loader2 size={16} className="mr-1 animate-spin" />
setMessages(chat.messages); ) : (
} <Undo size={16} />
} catch (error) { )}
console.error("Error during undo operation:", error); Undo
showError("Failed to undo changes"); </Button>
} finally { )}
setIsUndoLoading(false);
}
}}
>
{isUndoLoading ? (
<Loader2 size={16} className="mr-1 animate-spin" />
) : (
<Undo size={16} />
)}
Undo
</Button>
)}
<Button <Button
variant="outline" variant="outline"
size="sm" size="sm"
@@ -138,10 +137,9 @@ export const MessagesList = forwardRef<HTMLDivElement, MessagesListProps>(
}); });
reverted = true; reverted = true;
} else { } else {
console.debug("Reverting to previous version"); showSuccess(
await revertVersion({ "You will need to manually revert to an earlier revision"
versionId: versions[1].oid, );
});
} }
} }