@@ -120,60 +120,67 @@ export const NormalMessage: React.FC<ChatMessageItemProps> = React.memo(
120120 </ div >
121121
122122 { /* 主体 */ }
123- < div
124- className = "flex flex-col flex-1 overflow-auto group"
125- onContextMenu = { stopPropagation }
123+ < Dropdown
124+ menu = { moreActions }
125+ placement = "bottomLeft"
126+ trigger = { [ 'contextMenu' ] }
127+ onOpenChange = { setIsActionBtnActive }
126128 >
127- { showAvatar && (
128- < div className = "flex items-center" >
129- < div className = "font-bold" >
130- { userInfo . nickname ?? < span > </ span > }
131- </ div >
132- < div className = "hidden group-hover:block opacity-40 ml-1 text-sm" >
133- { formatShortTime ( payload . createdAt ) }
129+ < div
130+ className = "flex flex-col flex-1 overflow-auto group"
131+ onContextMenu = { stopPropagation }
132+ >
133+ { showAvatar && (
134+ < div className = "flex items-center" >
135+ < div className = "font-bold" >
136+ { userInfo . nickname ?? < span > </ span > }
137+ </ div >
138+ < div className = "hidden group-hover:block opacity-40 ml-1 text-sm" >
139+ { formatShortTime ( payload . createdAt ) }
140+ </ div >
134141 </ div >
135- </ div >
136- ) }
142+ ) }
137143
138- { /* 消息内容 */ }
139- < AutoFolder
140- maxHeight = { 340 }
141- backgroundColor = "var(--tc-content-background-color)"
142- showFullText = {
143- < div className = "inline-block rounded-full bg-white dark:bg-black opacity-80 py-2 px-3 hover:opacity-100" >
144- { t ( '点击展开更多' ) }
145- </ div >
146- }
147- >
148- < div className = "chat-message-item_body leading-6 break-words" >
149- < MessageQuote payload = { payload } />
144+ { /* 消息内容 */ }
145+ < AutoFolder
146+ maxHeight = { 340 }
147+ backgroundColor = "var(--tc-content-background-color)"
148+ showFullText = {
149+ < div className = "inline-block rounded-full bg-white dark:bg-black opacity-80 py-2 px-3 hover:opacity-100" >
150+ { t ( '点击展开更多' ) }
151+ </ div >
152+ }
153+ >
154+ < div className = "chat-message-item_body leading-6 break-words" >
155+ < MessageQuote payload = { payload } />
150156
151- < span > { getMessageRender ( payload . content ) } </ span >
157+ < span > { getMessageRender ( payload . content ) } </ span >
152158
153- { payload . sendFailed === true && (
154- < Icon
155- className = "inline-block ml-1"
156- icon = "emojione:cross-mark-button"
157- />
158- ) }
159+ { payload . sendFailed === true && (
160+ < Icon
161+ className = "inline-block ml-1"
162+ icon = "emojione:cross-mark-button"
163+ />
164+ ) }
165+
166+ { /* 解释器按钮 */ }
167+ { useRenderPluginMessageInterpreter ( payload . content ) }
168+ </ div >
169+ </ AutoFolder >
159170
160- { /* 解释器按钮 */ }
161- { useRenderPluginMessageInterpreter ( payload . content ) }
171+ { /* 额外渲染 */ }
172+ < div >
173+ { pluginMessageExtraParsers . map ( ( parser ) => (
174+ < React . Fragment key = { parser . name } >
175+ { parser . render ( payload ) }
176+ </ React . Fragment >
177+ ) ) }
162178 </ div >
163- </ AutoFolder >
164179
165- { /* 额外渲染 */ }
166- < div >
167- { pluginMessageExtraParsers . map ( ( parser ) => (
168- < React . Fragment key = { parser . name } >
169- { parser . render ( payload ) }
170- </ React . Fragment >
171- ) ) }
180+ { /* 消息反应 */ }
181+ { reactions }
172182 </ div >
173-
174- { /* 消息反应 */ }
175- { reactions }
176- </ div >
183+ </ Dropdown >
177184
178185 { /* 操作 */ }
179186 { ! disableOperate && (
@@ -201,7 +208,7 @@ export const NormalMessage: React.FC<ChatMessageItemProps> = React.memo(
201208
202209 < Dropdown
203210 menu = { moreActions }
204- placement = "bottomLeft "
211+ placement = "bottomRight "
205212 trigger = { [ 'click' ] }
206213 onOpenChange = { setIsActionBtnActive }
207214 >
0 commit comments