55 lines
1.6 KiB
JavaScript
55 lines
1.6 KiB
JavaScript
import { ref, onMounted, onUnmounted } from 'vue';
|
|
import { getContacts } from '../services/contactsService';
|
|
import { getAllMessages } from '../services/messagesService';
|
|
|
|
export function useContactsAndMessagesWebSocket() {
|
|
const contacts = ref([]);
|
|
const messages = ref([]);
|
|
const newContacts = ref([]);
|
|
const newMessages = ref([]);
|
|
let ws = null;
|
|
let lastContactId = null;
|
|
let lastMessageId = null;
|
|
|
|
async function fetchContacts() {
|
|
const all = await getContacts();
|
|
contacts.value = all;
|
|
if (lastContactId) {
|
|
newContacts.value = all.filter(c => c.id > lastContactId);
|
|
} else {
|
|
newContacts.value = [];
|
|
}
|
|
if (all.length) lastContactId = Math.max(...all.map(c => c.id));
|
|
}
|
|
|
|
async function fetchMessages() {
|
|
const all = await getAllMessages();
|
|
messages.value = all;
|
|
if (lastMessageId) {
|
|
newMessages.value = all.filter(m => m.id > lastMessageId);
|
|
} else {
|
|
newMessages.value = [];
|
|
}
|
|
if (all.length) lastMessageId = Math.max(...all.map(m => m.id));
|
|
}
|
|
|
|
onMounted(() => {
|
|
fetchContacts();
|
|
fetchMessages();
|
|
ws = new WebSocket('ws://localhost:8000');
|
|
ws.onmessage = (event) => {
|
|
try {
|
|
const data = JSON.parse(event.data);
|
|
if (data.type === 'contacts-updated') fetchContacts();
|
|
if (data.type === 'messages-updated') fetchMessages();
|
|
} catch (e) {}
|
|
};
|
|
});
|
|
|
|
onUnmounted(() => { if (ws) ws.close(); });
|
|
|
|
function markContactsAsRead() { newContacts.value = []; }
|
|
function markMessagesAsRead() { newMessages.value = []; }
|
|
|
|
return { contacts, messages, newContacts, newMessages, markContactsAsRead, markMessagesAsRead };
|
|
}
|