feat(chat): add image messages and enforce readonly sessions

This commit is contained in:
zetaloop
2026-02-22 08:17:09 +08:00
parent 5542015abe
commit ea822aaa8d
2 changed files with 87 additions and 10 deletions
+34
View File
@@ -14,6 +14,7 @@ interface ChatState {
messages: ChatMessage[]
ensureOrderSession: (order: Order) => ChatSession
sendTextMessage: (sessionId: string, sender: Sender, content: string) => void
sendImageMessage: (sessionId: string, sender: Sender, imageUrl: string) => void
}
function resolveAvatar(userId: string) {
@@ -74,6 +75,8 @@ export const useChatStore = create<ChatState>((set, get) => ({
sendTextMessage: (sessionId, sender, content) => {
const text = content.trim()
if (!text) return
const session = get().sessions.find((item) => item.id === sessionId)
if (!session || session.readonly) return
const now = new Date().toISOString()
const message: ChatMessage = {
@@ -100,4 +103,35 @@ export const useChatStore = create<ChatState>((set, get) => ({
),
}))
},
sendImageMessage: (sessionId, sender, imageUrl) => {
const content = imageUrl.trim()
if (!content) return
const session = get().sessions.find((item) => item.id === sessionId)
if (!session || session.readonly) return
const now = new Date().toISOString()
const message: ChatMessage = {
id: generateId("msg"),
sessionId,
senderId: sender.id,
senderName: sender.name,
senderAvatar: sender.avatar,
type: "image",
content,
createdAt: now,
}
set((state) => ({
messages: [...state.messages, message],
sessions: state.sessions.map((item) =>
item.id === sessionId
? {
...item,
lastMessage: "[图片]",
lastMessageAt: now,
}
: item,
),
}))
},
}))