feat: 消息菜单

This commit is contained in:
CrescentLeaf
2025-10-01 00:01:39 +08:00
parent 6c17a0e4eb
commit b3ffdf8469

View File

@@ -1,14 +1,23 @@
import { alert, Dropdown } from "mdui"
import { $ } from "mdui/jq"
import Client from "../../api/Client.ts" import Client from "../../api/Client.ts"
import Data_Message from "../../api/client_data/Message.ts"
import DataCaches from "../../api/DataCaches.ts" import DataCaches from "../../api/DataCaches.ts"
import Avatar from "../Avatar.tsx" import Avatar from "../Avatar.tsx"
import copyToClipboard from "../copyToClipboard.ts"
import useAsyncEffect from "../useAsyncEffect.ts" import useAsyncEffect from "../useAsyncEffect.ts"
import React from "react" import React from "react"
import useEventListener from "../useEventListener.ts"
import isMobileUI from "../isMobileUI.ts"
interface Args extends React.HTMLAttributes<HTMLElement> { interface Args extends React.HTMLAttributes<HTMLElement> {
userId: string userId: string
rawData: string
renderHTML: string
message: Data_Message
} }
export default function Message({ userId, children, ...props }: Args) { export default function Message({ userId, rawData, renderHTML, message, ...props }: Args) {
const isAtRight = Client.myUserProfile?.id == userId const isAtRight = Client.myUserProfile?.id == userId
const [nickName, setNickName] = React.useState("") const [nickName, setNickName] = React.useState("")
@@ -20,6 +29,8 @@ export default function Message({ userId, children, ...props }: Args) {
setAvatarUrl(user?.avatar) setAvatarUrl(user?.avatar)
}, [userId]) }, [userId])
const dropDownRef = React.useRef<Dropdown>(null)
return ( return (
<div <div
slot="trigger" slot="trigger"
@@ -77,17 +88,29 @@ export default function Message({ userId, children, ...props }: Args) {
padding: "15px", padding: "15px",
alignSelf: isAtRight ? "flex-end" : "flex-start", alignSelf: isAtRight ? "flex-end" : "flex-start",
}}> }}>
<mdui-dropdown trigger={isMobileUI() ? 'click' : 'contextmenu'} ref={dropDownRef}>
<span <span
slot="trigger"
id="msg" id="msg"
style={{ style={{
fontSize: "94%" fontSize: "94%"
}}> }}
{ dangerouslySetInnerHTML={{
// 消息内容 __html: renderHTML
children }} />
} <mdui-menu>
</span> <mdui-menu-item icon="content_copy" onClick={() => copyToClipboard($(dropDownRef.current as HTMLElement).find('#msg').text())}></mdui-menu-item>
<mdui-menu-item icon="content_copy" onClick={() => copyToClipboard(rawData)}></mdui-menu-item>
<mdui-menu-item icon="info" onClick={() => alert({
headline: "消息详情",
description: JSON.stringify(message),
confirmText: "关闭",
onConfirm: () => { },
})}></mdui-menu-item>
</mdui-menu>
</mdui-dropdown>
</mdui-card> </mdui-card>
</div> </div>
) )
} }