feat(chat): add image messages and enforce readonly sessions
This commit is contained in:
@@ -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,
|
||||
),
|
||||
}))
|
||||
},
|
||||
}))
|
||||
|
||||
Reference in New Issue
Block a user