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,9 +46,10 @@ 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" &&
messages[messages.length - 1].commitHash && (
<Button <Button
variant="outline" variant="outline"
size="sm" size="sm"
@@ -70,22 +72,19 @@ export const MessagesList = forwardRef<HTMLDivElement, MessagesListProps>(
previousAssistantMessage?.role === "assistant" && previousAssistantMessage?.role === "assistant" &&
previousAssistantMessage?.commitHash previousAssistantMessage?.commitHash
) { ) {
console.debug("Reverting to previous assistant version"); console.debug(
"Reverting to previous assistant version"
);
await revertVersion({ await revertVersion({
versionId: previousAssistantMessage.commitHash, versionId: previousAssistantMessage.commitHash,
}); });
} else {
// Revert to the previous version
await revertVersion({
versionId: versions[1].oid,
});
}
if (selectedChatId) { if (selectedChatId) {
const chat = await IpcClient.getInstance().getChat( const chat = await IpcClient.getInstance().getChat(
selectedChatId selectedChatId
); );
setMessages(chat.messages); setMessages(chat.messages);
} }
}
} catch (error) { } catch (error) {
console.error("Error during undo operation:", error); console.error("Error during undo operation:", error);
showError("Failed to undo changes"); showError("Failed to undo changes");
@@ -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, );
});
} }
} }