Промежуточный этап синхронизации
This commit is contained in:
57
app/providers/DialogProvider/useSynchronize.ts
Normal file
57
app/providers/DialogProvider/useSynchronize.ts
Normal file
@@ -0,0 +1,57 @@
|
||||
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);
|
||||
}
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user