@snowcone-app/ui 0.9.5 → 0.9.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -5704,6 +5704,7 @@ import { jsx as jsx52 } from "react/jsx-runtime";
5704
5704
  var DEFAULT_ARTBOARD_SIZE = 2e3;
5705
5705
  var MAX_CONCURRENT_BLOBS = 5;
5706
5706
  var FRAME_SUPERSEDE_GRACE_MS = 2e3;
5707
+ var RERENDER_MIN_INTERVAL_MS = 550;
5707
5708
  function mergeMockupIds(current, extra) {
5708
5709
  const out = [...current];
5709
5710
  for (const id of extra) if (!out.includes(id)) out.push(id);
@@ -5861,6 +5862,9 @@ function RealtimeProvider({
5861
5862
  const serverStampsVersionsRef = useRef12(false);
5862
5863
  const pendingRerenderRef = useRef12([]);
5863
5864
  const forceRerenderByConfigRef = useRef12(null);
5865
+ const lastRerenderAtRef = useRef12(0);
5866
+ const rerenderQueueRef = useRef12([]);
5867
+ const rerenderTimerRef = useRef12(null);
5864
5868
  const fullFrameRerenderIdsRef = useRef12(/* @__PURE__ */ new Set());
5865
5869
  const fullFrameRerenderTimerRef = useRef12(null);
5866
5870
  useEffect17(
@@ -5943,6 +5947,28 @@ function RealtimeProvider({
5943
5947
  [sendFullFrameConfig]
5944
5948
  );
5945
5949
  forceRerenderByConfigRef.current = forceRerenderByConfig;
5950
+ const sendRerenderPaced = useCallback10(
5951
+ (ids) => {
5952
+ rerenderQueueRef.current = mergeMockupIds(rerenderQueueRef.current, ids);
5953
+ if (rerenderTimerRef.current) return;
5954
+ const wait = Math.max(0, lastRerenderAtRef.current + RERENDER_MIN_INTERVAL_MS - Date.now());
5955
+ const flush = () => {
5956
+ rerenderTimerRef.current = null;
5957
+ const batch = rerenderQueueRef.current;
5958
+ rerenderQueueRef.current = [];
5959
+ if (batch.length === 0) return;
5960
+ lastRerenderAtRef.current = Date.now();
5961
+ pendingRerenderRef.current = mergeMockupIds(pendingRerenderRef.current, batch);
5962
+ if (!rerenderRaw(batch)) {
5963
+ pendingRerenderRef.current = [];
5964
+ forceRerenderByConfigRef.current?.(batch);
5965
+ }
5966
+ };
5967
+ if (wait === 0) flush();
5968
+ else rerenderTimerRef.current = setTimeout(flush, wait);
5969
+ },
5970
+ [rerenderRaw]
5971
+ );
5946
5972
  const rerenderFullFrame = useCallback10(
5947
5973
  (mockupId) => {
5948
5974
  fullFrameRerenderIdsRef.current.add(mockupId);
@@ -5963,14 +5989,13 @@ function RealtimeProvider({
5963
5989
  }
5964
5990
  if (serverStampsVersionsRef.current) {
5965
5991
  sendFullFrameConfig(ids);
5966
- pendingRerenderRef.current = failed;
5967
- if (rerenderRaw(failed)) return;
5968
- pendingRerenderRef.current = [];
5992
+ sendRerenderPaced(failed);
5993
+ return;
5969
5994
  }
5970
5995
  forceRerenderByConfig(failed);
5971
5996
  }, 0);
5972
5997
  },
5973
- [sendFullFrameConfig, forceRerenderByConfig, rerenderRaw]
5998
+ [sendFullFrameConfig, forceRerenderByConfig, sendRerenderPaced]
5974
5999
  );
5975
6000
  const maybeFlipCrop = useCallback10(() => {
5976
6001
  if (!croppedDeliveryEnabled || !cropCapableRef.current) return;