From bbbd7065744e1abb0ba4362b701bf9fcca46e4ca Mon Sep 17 00:00:00 2001 From: Eric <5089238+emizzle@users.noreply.github.com> Date: Fri, 28 Jun 2024 12:37:19 +1000 Subject: [PATCH] fix cross-tab state sync --- src/App.vue | 30 +++++++++++++++++++++++++++--- src/stores/serializer.js | 13 +++++++++++++ src/utils/ids.js | 5 +++++ 3 files changed, 45 insertions(+), 3 deletions(-) create mode 100644 src/stores/serializer.js diff --git a/src/App.vue b/src/App.vue index 46571c9..70c5f0c 100644 --- a/src/App.vue +++ b/src/App.vue @@ -8,9 +8,11 @@ import ToastNotification from '@/components/toasts/ToastNotification.vue' import AppNav from '@/components/AppNav.vue' import ContractEventAlerts from '@/components/ContractEventAlerts.vue' import { initDrawers, initDismisses } from 'flowbite' -import NavBreadcrumb from './components/NavBreadcrumb.vue' +import NavBreadcrumb from '@/components/NavBreadcrumb.vue' import { storeToRefs } from 'pinia' import NetworkConnectionState from './components/NetworkConnectionState.vue' +import serializer from '@/stores/serializer' +import { generateUniqueId } from '@/utils/ids' const alerts = ref([]) const id = ref(0) @@ -108,6 +110,8 @@ function onSlotFilled(blockNumber, requestId, slotIdx) { }) } +window.name = generateUniqueId() + onMounted(() => { initDrawers() initDismisses() @@ -129,11 +133,31 @@ onMounted(() => { const getLocalStorageKey = inject('getLocalStorageKey') const localStorageKey = getLocalStorageKey(requestsStore.$id) +const localStorageMetaKey = `${localStorageKey}_storeEventMeta` function handleStorageEvent(event) { if (event.key === localStorageKey) { - requestsStore.$hydrate() + let serialized = window.localStorage.getItem(localStorageMetaKey) + if (serialized) { + let { source, timestamp } = serializer.deserialize(serialized) + // prevent our own window local storage updates from hydrating (infinite + // loop) and prevent stale updates from hydrating + if (source !== window.name && timestamp > lastStoreTimestamp) { + requestsStore.$hydrate() + } + } } } +let lastStoreTimestamp = 0 +requestsStore.$subscribe( + (_mutation, state) => { + lastStoreTimestamp = Date.now() + const storeEventMeta = { + source: window.name, + timestamp: Date.now() + } + window.localStorage.setItem(localStorageMetaKey, serializer.serialize(storeEventMeta)) + } +) async function detectRunningCodexNode() { try { @@ -206,7 +230,7 @@ onUnmounted(() => {