ui: 微調消息菜單

* 仿照電報邏輯
* 添加 JsonView
This commit is contained in:
CrescentLeaf
2025-10-01 11:51:28 +08:00
parent 459fca064c
commit f376de2b48
3 changed files with 24 additions and 11 deletions

View File

@@ -14,7 +14,6 @@ import useAsyncEffect from "../useAsyncEffect.ts"
import * as marked from 'marked' import * as marked from 'marked'
import DOMPurify from 'dompurify' import DOMPurify from 'dompurify'
import randomUUID from "../../randomUUID.ts" import randomUUID from "../../randomUUID.ts"
import { time } from "node:console";
interface Args extends React.HTMLAttributes<HTMLElement> { interface Args extends React.HTMLAttributes<HTMLElement> {
target: string target: string

View File

@@ -1,4 +1,4 @@
import { alert, Dropdown } from "mdui" import { Dropdown, Dialog } from "mdui"
import { $ } from "mdui/jq" 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 Data_Message from "../../api/client_data/Message.ts"
@@ -6,9 +6,11 @@ import DataCaches from "../../api/DataCaches.ts"
import Avatar from "../Avatar.tsx" import Avatar from "../Avatar.tsx"
import copyToClipboard from "../copyToClipboard.ts" import copyToClipboard from "../copyToClipboard.ts"
import useAsyncEffect from "../useAsyncEffect.ts" import useAsyncEffect from "../useAsyncEffect.ts"
import useEventListener from "../useEventListener.ts"
import React from "react" import React from "react"
import useEventListener from "../useEventListener.ts" import useEventListener from "../useEventListener.ts"
import isMobileUI from "../isMobileUI.ts" import isMobileUI from "../isMobileUI.ts"
import ReactJson from 'react-json-view'
interface Args extends React.HTMLAttributes<HTMLElement> { interface Args extends React.HTMLAttributes<HTMLElement> {
userId: string userId: string
@@ -30,10 +32,23 @@ export default function Message({ userId, rawData, renderHTML, message, ...props
}, [userId]) }, [userId])
const dropDownRef = React.useRef<Dropdown>(null) const dropDownRef = React.useRef<Dropdown>(null)
const messageJsonDialogRef = React.useRef<Dialog>(null)
const [isDropDownOpen, setDropDownOpen] = React.useState(false)
return ( return (
<div <div
slot="trigger" slot="trigger"
onContextMenu={(e) => {
if (isMobileUI()) return
e.preventDefault()
setDropDownOpen(!isDropDownOpen)
}}
onClick={(e) => {
if (!isMobileUI()) return
e.preventDefault()
setDropDownOpen(!isDropDownOpen)
}}
style={{ style={{
width: "100%", width: "100%",
display: "flex", display: "flex",
@@ -88,7 +103,10 @@ export default function Message({ userId, rawData, renderHTML, message, ...props
padding: "15px", padding: "15px",
alignSelf: isAtRight ? "flex-end" : "flex-start", alignSelf: isAtRight ? "flex-end" : "flex-start",
}}> }}>
<mdui-dropdown trigger={isMobileUI() ? 'click' : 'contextmenu'} ref={dropDownRef}> <mdui-dialog close-on-overlay-click close-on-esc ref={messageJsonDialogRef}>
<ReactJson src={message} />
</mdui-dialog>
<mdui-dropdown trigger="manual" ref={dropDownRef} open={isDropDownOpen}>
<span <span
slot="trigger" slot="trigger"
id="msg" id="msg"
@@ -98,15 +116,10 @@ export default function Message({ userId, rawData, renderHTML, message, ...props
dangerouslySetInnerHTML={{ dangerouslySetInnerHTML={{
__html: renderHTML __html: renderHTML
}} /> }} />
<mdui-menu> <mdui-menu onClick={(e) => e.stopPropagation()}>
<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($(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="content_copy" onClick={() => copyToClipboard(rawData)}></mdui-menu-item>
<mdui-menu-item icon="info" onClick={() => alert({ <mdui-menu-item icon="info" onClick={() => messageJsonDialogRef.current.open = true}></mdui-menu-item>
headline: "消息详情",
description: JSON.stringify(message),
confirmText: "关闭",
onConfirm: () => { },
})}></mdui-menu-item>
</mdui-menu> </mdui-menu>
</mdui-dropdown> </mdui-dropdown>
</mdui-card> </mdui-card>

View File

@@ -29,7 +29,8 @@ customElements.define('chat-image', class extends HTMLElement {
}) })
} }
e.src = $(this).attr('src') as string e.src = $(this).attr('src') as string
e.onclick = () => { e.onclick = (event) => {
event.stopPropagation()
openImageViewer($(this).attr('src') as string) openImageViewer($(this).attr('src') as string)
} }
this.appendChild(e) this.appendChild(e)