refactor: 重寫消息顯示相關邏輯

This commit is contained in:
CrescentLeaf
2025-09-21 16:11:13 +08:00
parent 28ffd134df
commit b3d620a329
2 changed files with 24 additions and 17 deletions

View File

@@ -1,15 +1,25 @@
import Client from "../../api/Client.ts"
import DataCaches from "../../api/DataCaches.ts"
import Avatar from "../Avatar.tsx" import Avatar from "../Avatar.tsx"
import useAsyncEffect from "../useAsyncEffect.ts"
import React from "react"
interface Args extends React.HTMLAttributes<HTMLElement> {
userId: string
}
export default function Message({ userId, children, ...props }: Args) {
const isAtRight = Client.myUserProfile?.id == userId
const [ nickName, setNickName ] = React.useState("")
const [ avatarUrl, setAvatarUrl ] = React.useState<string | undefined>("")
useAsyncEffect(async () => {
const user = await DataCaches.getUserProfile(userId)
setNickName(user.nickname)
setAvatarUrl(user?.avatar)
}, [userId])
/**
*
* @param { Object } param
* @param { "left" | "right" } [param.direction="left"]
* @param { String } [param.avatar]
* @param { String } [param.nickName]
* @returns { React.JSX.Element }
*/
export default function Message({ direction = 'left', avatar, nickName, children, ...props } = {}) {
let isAtRight = direction == 'right'
return ( return (
<div <div
slot="trigger" slot="trigger"
@@ -39,7 +49,7 @@ export default function Message({ direction = 'left', avatar, nickName, children
// 发送者头像 // 发送者头像
} }
<Avatar <Avatar
src={avatar} src={avatarUrl}
text={nickName} text={nickName}
style={{ style={{
width: "43px", width: "43px",

View File

@@ -1,8 +1,6 @@
/** interface Args extends React.HTMLAttributes<HTMLElement> {}
*
* @returns { React.JSX.Element } export default function MessageContainer({ children, style, ...props }: Args) {
*/
export default function MessageContainer({ children, style, ...props } = {}) {
return ( return (
<div style={{ <div style={{
display: 'flex', display: 'flex',
@@ -10,7 +8,6 @@ export default function MessageContainer({ children, style, ...props } = {}) {
justifyContent: 'flex-end', justifyContent: 'flex-end',
alignItems: 'center', alignItems: 'center',
marginBottom: '20px', marginBottom: '20px',
height: "100%",
...style, ...style,
}} }}
{...props}> {...props}>