ui: 微調消息菜單
* 仿照電報邏輯 * 添加 JsonView
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user