feat(ui): 拉到最頂部加載更多消息

This commit is contained in:
CrescentLeaf
2025-09-22 23:05:21 +08:00
parent 43385780f8
commit fc197ea41a

View File

@@ -50,11 +50,11 @@ export default function ChatFragment({ target, ...props }: Args) {
if (checkApiSuccessOrSncakbar(re, "拉取歷史記錄失敗")) return if (checkApiSuccessOrSncakbar(re, "拉取歷史記錄失敗")) return
const returnMsgs = (re.data!.messages as Message[]).reverse() const returnMsgs = (re.data!.messages as Message[]).reverse()
if (returnMsgs.length == 0) if (returnMsgs.length == 0) {
return snackbar({ setShowNoMoreMessagesTip(true)
message: "已經沒有消息了哦~", setTimeout(() => setShowNoMoreMessagesTip(false), 1000)
placement: 'top', return
}) }
setMessagesList(returnMsgs.concat(messagesList)) setMessagesList(returnMsgs.concat(messagesList))
if (page.current == 0) if (page.current == 0)
@@ -83,6 +83,8 @@ export default function ChatFragment({ target, ...props }: Args) {
}) })
const inputRef = React.useRef<TextField>(null) const inputRef = React.useRef<TextField>(null)
const [showLoadingMoreMessagesTip, setShowLoadingMoreMessagesTip] = React.useState(false)
const [showNoMoreMessagesTip, setShowNoMoreMessagesTip] = React.useState(false)
async function sendMessage() { async function sendMessage() {
const text = inputRef.current!.value const text = inputRef.current!.value
@@ -124,14 +126,37 @@ export default function ChatFragment({ target, ...props }: Args) {
display: tabItemSelected == "Chat" ? "flex" : "none", display: tabItemSelected == "Chat" ? "flex" : "none",
flexDirection: "column", flexDirection: "column",
height: "100%", height: "100%",
}} onScroll={async (e) => {
const scrollTop = (e.target as HTMLDivElement).scrollTop
if (scrollTop == 0 && !showLoadingMoreMessagesTip) {
setShowLoadingMoreMessagesTip(true)
await loadMore()
setShowLoadingMoreMessagesTip(false)
}
}}> }}>
<div style={{ <div style={{
display: "flex", display: 'flex',
justifyContent: "center", justifyContent: "center",
paddingTop: "15px", paddingTop: "15px",
}}> }}>
<mdui-button variant="text" onClick={() => ()}></mdui-button> <div style={{
display: showLoadingMoreMessagesTip ? 'flex' : 'none',
}}>
<mdui-circular-progress style={{
width: '30px',
height: '30px',
}}></mdui-circular-progress>
<span style={{
alignSelf: 'center',
paddingLeft: '12px',
}}>...</span>
</div>
<div style={{
display: showNoMoreMessagesTip ? undefined : 'none',
alignSelf: 'center',
}}>
~
</div>
</div> </div>
<MessageContainer style={{ <MessageContainer style={{
paddingTop: "15px", paddingTop: "15px",