Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
B
bit-pm
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
燕伟桐
bit-pm
Commits
30662118
Unverified
提交
30662118
authored
5月 02, 2025
作者:
Will Chen
提交者:
GitHub
5月 02, 2025
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
avoid edge case with undo (#78)
上级
4e4bf51b
隐藏空白字符变更
内嵌
并排
正在显示
1 个修改的文件
包含
58 行增加
和
60 行删除
+58
-60
MessagesList.tsx
src/components/chat/MessagesList.tsx
+58
-60
没有找到文件。
src/components/chat/MessagesList.tsx
浏览文件 @
30662118
...
@@ -11,7 +11,7 @@ import { Loader2, RefreshCw, Undo } from "lucide-react";
...
@@ -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>(
...
@@ -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>(
...
@@ -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"
);
return
;
}
setIsUndoLoading
(
true
);
try
{
const
previousAssistantMessage
=
messages
[
messages
.
length
-
3
];
if
(
previousAssistantMessage
?.
role
===
"assistant"
&&
previousAssistantMessage
?.
commitHash
)
{
console
.
debug
(
"Reverting to previous assistant version"
);
await
revertVersion
({
versionId
:
previousAssistantMessage
.
commitHash
,
});
}
else
{
// Revert to the previous version
await
revertVersion
({
versionId
:
versions
[
1
].
oid
,
});
}
}
if
(
selectedChatId
)
{
if
(
versions
.
length
<
2
)
{
const
chat
=
await
IpcClient
.
getInstance
().
getChat
(
showError
(
"Cannot undo; no previous version"
);
selectedChatId
return
;
);
setMessages
(
chat
.
messages
);
}
}
}
catch
(
error
)
{
console
.
error
(
"Error during undo operation:"
,
error
);
setIsUndoLoading
(
true
);
showError
(
"Failed to undo changes"
);
try
{
}
finally
{
const
previousAssistantMessage
=
setIsUndoLoading
(
false
);
messages
[
messages
.
length
-
3
];
}
if
(
}
}
previousAssistantMessage
?.
role
===
"assistant"
&&
>
previousAssistantMessage
?.
commitHash
{
isUndoLoading
?
(
)
{
<
Loader2
size=
{
16
}
className=
"mr-1 animate-spin"
/>
console
.
debug
(
)
:
(
"Reverting to previous assistant version"
<
Undo
size=
{
16
}
/>
);
)
}
await
revertVersion
({
Undo
versionId
:
previousAssistantMessage
.
commitHash
,
</
Button
>
});
)
}
if
(
selectedChatId
)
{
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
);
}
}
}
>
{
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>(
...
@@ -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
,
);
});
}
}
}
}
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论