feat: 消息菜单

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

View File

@@ -1,18 +1,27 @@
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("")
const [ avatarUrl, setAvatarUrl ] = React.useState<string | undefined>("") const [avatarUrl, setAvatarUrl] = React.useState<string | undefined>("")
useAsyncEffect(async () => { useAsyncEffect(async () => {
const user = await DataCaches.getUserProfile(userId) const user = await DataCaches.getUserProfile(userId)
@@ -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",
}}> }}>
<span <mdui-dropdown trigger={isMobileUI() ? 'click' : 'contextmenu'} ref={dropDownRef}>
id="msg" <span
style={{ slot="trigger"
fontSize: "94%" id="msg"
}}> style={{
{ fontSize: "94%"
// 消息内容 }}
children dangerouslySetInnerHTML={{
} __html: renderHTML
</span> }} />
<mdui-menu>
<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>
) )
} }