import { useEffect } from "react"; import { useProtocolState } from "../ProtocolProvider/useProtocolState"; import { ProtocolState } from "../ProtocolProvider/ProtocolProvider"; import { useDatabase } from "../DatabaseProvider/useDatabase"; import { usePublicKey } from "../AccountProvider/usePublicKey"; import { PacketSync, SyncStatus } from "../ProtocolProvider/protocol/packets/packet.sync"; import { useSender } from "../ProtocolProvider/useSender"; import { usePacket } from "../ProtocolProvider/usePacket"; import { whenFinish } from "./dialogQueue"; /** * Хук отвечает за синхронизацию сообщений, запрос синхронизации * при подключении */ export function useSynchronize() { const [protocolState, setProtocolState] = useProtocolState(); const {getQuery} = useDatabase(); const publicKey = usePublicKey(); const send = useSender(); useEffect(() => { if(protocolState == ProtocolState.CONNECTED){ trySync(); setProtocolState(ProtocolState.SYNCHRONIZATION); } }, [protocolState]); const trySync = async () => { const lastMessage = await getQuery("SELECT timestamp FROM messages WHERE account = ? ORDER BY timestamp DESC LIMIT 1", [publicKey]); if(!lastMessage){ sendSynchronize(0); return; } sendSynchronize(lastMessage.timestamp); } const sendSynchronize = (timestamp: number) => { const packet = new PacketSync(); packet.setStatus(0); packet.setTimestamp(timestamp); send(packet); } usePacket(25, async (packet: PacketSync) => { const status = packet.getStatus(); if(status == SyncStatus.BATCH_END){ await whenFinish(); trySync(); } if(status == SyncStatus.NOT_NEEDED){ /** * Синхронизация не нужна, все данные актуальны */ setProtocolState(ProtocolState.CONNECTED); } }); }