Compare commits
2 Commits
940845db84
...
3514f87699
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3514f87699 | ||
|
|
cf560909e7 |
@@ -12,6 +12,7 @@ import TextFieldPreference from "../preference/TextFieldPreference"
|
|||||||
import * as React from 'react'
|
import * as React from 'react'
|
||||||
import ChatMessageContainer from "./ChatMessageContainer"
|
import ChatMessageContainer from "./ChatMessageContainer"
|
||||||
import AppStateContext from "../app-state/AppStateContext"
|
import AppStateContext from "../app-state/AppStateContext"
|
||||||
|
import ChatPanel, { ChatPanelRef } from "./ChatPanel"
|
||||||
|
|
||||||
interface MduiTabFitSizeArgs extends React.HTMLAttributes<HTMLElement & Tab> {
|
interface MduiTabFitSizeArgs extends React.HTMLAttributes<HTMLElement & Tab> {
|
||||||
value: string
|
value: string
|
||||||
@@ -41,6 +42,9 @@ export default function ChatFragment({
|
|||||||
|
|
||||||
const chatPanelRef = React.useRef<HTMLElement>()
|
const chatPanelRef = React.useRef<HTMLElement>()
|
||||||
const inputRef = React.useRef<TextField>()
|
const inputRef = React.useRef<TextField>()
|
||||||
|
const chatPagePanelRef = React.useRef<ChatPanelRef>()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div style={{
|
<div style={{
|
||||||
@@ -126,6 +130,7 @@ export default function ChatFragment({
|
|||||||
const scrollTop = (e.target as HTMLDivElement).scrollTop
|
const scrollTop = (e.target as HTMLDivElement).scrollTop
|
||||||
if (scrollTop == 0) {
|
if (scrollTop == 0) {
|
||||||
// 加载更多
|
// 加载更多
|
||||||
|
chatPagePanelRef.current?.setOffset(chatPagePanelRef.current.getOffset() + 15)
|
||||||
}
|
}
|
||||||
}}>
|
}}>
|
||||||
<div style={{
|
<div style={{
|
||||||
@@ -135,7 +140,7 @@ export default function ChatFragment({
|
|||||||
}}>
|
}}>
|
||||||
{/* 这里显示一些提示 */}
|
{/* 这里显示一些提示 */}
|
||||||
</div>
|
</div>
|
||||||
<ChatMessageContainer chatInfo={chatInfo} />
|
<ChatPanel ref={chatPagePanelRef} chat={chatInfo} />
|
||||||
{
|
{
|
||||||
// 输入框
|
// 输入框
|
||||||
}
|
}
|
||||||
@@ -180,8 +185,10 @@ export default function ChatFragment({
|
|||||||
}}></mdui-button-icon>
|
}}></mdui-button-icon>
|
||||||
<mdui-button-icon icon="send" style={{
|
<mdui-button-icon icon="send" style={{
|
||||||
marginRight: '7px',
|
marginRight: '7px',
|
||||||
}} onClick={() => {
|
}} onClick={async () => {
|
||||||
// 发送消息
|
// 发送消息
|
||||||
|
await chatInfo.sendMessageOrThrow(inputRef.current!.value)
|
||||||
|
inputRef.current!.value = ''
|
||||||
}}></mdui-button-icon>
|
}}></mdui-button-icon>
|
||||||
<div style={{
|
<div style={{
|
||||||
display: 'none'
|
display: 'none'
|
||||||
|
|||||||
5
client/ui/chat-fragment/ChatMessage.tsx
Normal file
5
client/ui/chat-fragment/ChatMessage.tsx
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
import { Message } from "lingchair-client-protocol"
|
||||||
|
|
||||||
|
export default function ChatMessage({ message }: { message: Message }) {
|
||||||
|
return null
|
||||||
|
}
|
||||||
@@ -1,13 +1,7 @@
|
|||||||
import { Chat, Message } from 'lingchair-client-protocol'
|
import { Chat, Message } from 'lingchair-client-protocol'
|
||||||
import * as React from 'react'
|
import * as React from 'react'
|
||||||
|
|
||||||
export default function ChatMessageContainer({
|
export default function ChatMessageContainer({ messages }: { messages: Message[] }) {
|
||||||
chat,
|
|
||||||
}: {
|
|
||||||
chat: Chat
|
|
||||||
}) {
|
|
||||||
const [messages, setMessages] = React.useState<Message[]>()
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div style={{
|
<div style={{
|
||||||
display: 'flex',
|
display: 'flex',
|
||||||
|
|||||||
32
client/ui/chat-fragment/ChatPanel.tsx
Normal file
32
client/ui/chat-fragment/ChatPanel.tsx
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
import { Chat, Message } from "lingchair-client-protocol"
|
||||||
|
import ChatMessageContainer from "./ChatMessageContainer"
|
||||||
|
import useAsyncEffect from "../../utils/useAsyncEffect"
|
||||||
|
import * as React from 'react'
|
||||||
|
|
||||||
|
function ChatPanelInner({ chat }: { chat: Chat }, ref: React.ForwardedRef<any>) {
|
||||||
|
const [messages, setMessages] = React.useState<Message[]>([])
|
||||||
|
const [offset, setOffset] = React.useState(0)
|
||||||
|
|
||||||
|
React.useImperativeHandle(ref, () => {
|
||||||
|
return {
|
||||||
|
setOffset: (offset: number) => setOffset(offset),
|
||||||
|
getOffset: () => offset,
|
||||||
|
}
|
||||||
|
}, [chat])
|
||||||
|
|
||||||
|
useAsyncEffect(async () => {
|
||||||
|
const messages = await chat.getMessagesOrThrow({ offset })
|
||||||
|
setMessages(messages)
|
||||||
|
}, [chat, offset])
|
||||||
|
|
||||||
|
return <ChatMessageContainer messages={messages} />
|
||||||
|
}
|
||||||
|
|
||||||
|
const ChatPanel = React.forwardRef(ChatPanelInner)
|
||||||
|
|
||||||
|
export type ChatPanelRef = {
|
||||||
|
setOffset: (offset: number) => void
|
||||||
|
getOffset: () => number
|
||||||
|
}
|
||||||
|
|
||||||
|
export default ChatPanel
|
||||||
@@ -91,7 +91,7 @@ export default class ChatApi extends BaseApi {
|
|||||||
msg: "参数缺失",
|
msg: "参数缺失",
|
||||||
code: 400,
|
code: 400,
|
||||||
}
|
}
|
||||||
if (!args.page && !args.offset) return {
|
if (args.page == null && args.offset == null) return {
|
||||||
msg: "参数缺失",
|
msg: "参数缺失",
|
||||||
code: 400,
|
code: 400,
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user