ваше сообщение коммита
This commit is contained in:
55
frontend/src/composables/useContactsWebSocket.js
Normal file
55
frontend/src/composables/useContactsWebSocket.js
Normal file
@@ -0,0 +1,55 @@
|
||||
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 };
|
||||
}
|
||||
Reference in New Issue
Block a user