81 lines
2.0 KiB
JavaScript
81 lines
2.0 KiB
JavaScript
export const useChatStore = defineStore('chat', {
|
||
// ℹ️ arrow function recommended for full type inference
|
||
state: () => ({
|
||
contacts: [],
|
||
chatsContacts: [],
|
||
profileUser: undefined,
|
||
activeChat: null,
|
||
}),
|
||
actions: {
|
||
async fetchChatsAndContacts(q) {
|
||
const { data, error } = await useApi(createUrl('/apps/chat/chats-and-contacts', {
|
||
query: {
|
||
q,
|
||
},
|
||
}))
|
||
|
||
if (error.value) {
|
||
console.log(error.value)
|
||
}
|
||
else {
|
||
const { chatsContacts, contacts, profileUser } = data.value
|
||
|
||
this.chatsContacts = chatsContacts
|
||
this.contacts = contacts
|
||
this.profileUser = profileUser
|
||
}
|
||
},
|
||
async getChat(userId) {
|
||
const res = await $api(`/apps/chat/chats/${userId}`)
|
||
|
||
this.activeChat = res
|
||
},
|
||
async sendMsg(message) {
|
||
const senderId = this.profileUser?.id
|
||
|
||
const response = await $api(`apps/chat/chats/${this.activeChat?.contact.id}`, {
|
||
method: 'POST',
|
||
body: { message, senderId },
|
||
})
|
||
|
||
const { msg, chat } = response
|
||
|
||
// ? If it's not undefined => New chat is created (Contact is not in list of chats)
|
||
if (chat !== undefined) {
|
||
const activeChat = this.activeChat
|
||
|
||
this.chatsContacts.push({
|
||
...activeChat.contact,
|
||
chat: {
|
||
id: chat.id,
|
||
lastMessage: [],
|
||
unseenMsgs: 0,
|
||
messages: [msg],
|
||
},
|
||
})
|
||
if (this.activeChat) {
|
||
this.activeChat.chat = {
|
||
id: chat.id,
|
||
messages: [msg],
|
||
unseenMsgs: 0,
|
||
userId: this.activeChat?.contact.id,
|
||
}
|
||
}
|
||
}
|
||
else {
|
||
this.activeChat?.chat?.messages.push(msg)
|
||
}
|
||
|
||
// Set Last Message for active contact
|
||
const contact = this.chatsContacts.find(c => {
|
||
if (this.activeChat)
|
||
return c.id === this.activeChat.contact.id
|
||
|
||
return false
|
||
})
|
||
|
||
contact.chat.lastMessage = msg
|
||
},
|
||
},
|
||
})
|