chore: got rid of timestamp checking on server

This commit is contained in:
Dmitry Popov
2025-05-28 12:25:19 +02:00
parent 97cec2e127
commit 17e12e9263
4 changed files with 32 additions and 18 deletions

View File

@@ -1,7 +1,8 @@
import { MutableRefObject, useCallback, useEffect, useRef } from 'react';
import { Command, Commands, MapHandlers } from '@/hooks/Mapper/types';
import { MapEvent } from '@/hooks/Mapper/events';
import { useThrottle } from '@/hooks/Mapper/hooks';
import { useMapRootState } from '@/hooks/Mapper/mapRootProvider';
import { Command, Commands, MapHandlers } from '@/hooks/Mapper/types';
import { MutableRefObject, useCallback, useEffect, useRef } from 'react';
export const useCommonMapEventProcessor = () => {
const mapRef = useRef<MapHandlers>() as MutableRefObject<MapHandlers>;
@@ -26,9 +27,16 @@ export const useCommonMapEventProcessor = () => {
mapRef.current?.command(name, data);
}, []);
useEffect(() => {
refQueue.current.forEach(x => mapRef.current?.command(x.name, x.data));
const processQueue = useCallback(() => {
const commands = [...refQueue.current];
refQueue.current = [];
commands.forEach(x => mapRef.current?.command(x.name, x.data));
}, []);
const throttledProcessQueue = useThrottle(processQueue, 200);
useEffect(() => {
throttledProcessQueue();
}, [systems]);
return {

View File

@@ -1,5 +1,6 @@
export * from './usePageVisibility';
export * from './useActualizeSettings';
export * from './useClipboard';
export * from './useHotkey';
export * from './usePageVisibility';
export * from './useSkipContextMenu';
export * from './useActualizeSettings';
export * from './useThrottle';

View File

@@ -0,0 +1,13 @@
import { useCallback, useRef } from 'react';
export const useThrottle = (callback: any, limit: number) => {
const lastCallRef = useRef(0);
const throttledCallback = useCallback(() => {
const now = Date.now();
if (now - lastCallRef.current >= limit) {
lastCallRef.current = now;
callback();
}
}, [callback, limit]);
return throttledCallback;
};

View File

@@ -4,8 +4,6 @@ defmodule WandererAppWeb.MapLive do
require Logger
@server_event_unsync_timeout :timer.minutes(2)
@impl true
def mount(%{"slug" => map_slug} = _params, _session, socket) when is_connected?(socket) do
Process.send_after(self(), %{event: :load_map}, Enum.random(10..800))
@@ -96,17 +94,11 @@ defmodule WandererAppWeb.MapLive do
|> push_navigate(to: ~p"/tracking/#{map_slug}")}
@impl true
def handle_info(%{timestamp: timestamp} = info, %{assigns: %{map_slug: map_slug}} = socket) do
duration = DateTime.diff(DateTime.utc_now(), timestamp, :millisecond)
if duration > @server_event_unsync_timeout do
{:noreply, socket |> push_navigate(to: ~p"/#{map_slug}")}
else
def handle_info(info, %{assigns: %{map_slug: map_slug}} = socket) do
{:noreply,
socket
|> WandererAppWeb.MapEventHandler.handle_event(info)}
end
end
@impl true
def handle_info(info, socket),