57 lines
2.0 KiB
TypeScript
57 lines
2.0 KiB
TypeScript
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);
|
|
}
|
|
});
|
|
} |