| |
| export const DIGITS_MERGE_STORAGE_KEY = 'info_radar_digits_merge_enabled'; |
|
|
| const renderListeners = new Set<() => void>(); |
|
|
| function invokeRenderListener(cb: () => void): void { |
| try { |
| cb(); |
| } catch (e) { |
| console.error('[digitsMerge] render listener failed', e); |
| } |
| } |
|
|
| function notifyDigitsMergeRenderListeners(): void { |
| for (const cb of Array.from(renderListeners)) { |
| invokeRenderListener(cb); |
| } |
| } |
|
|
| let storageListenerAttached = false; |
|
|
| function ensureStorageListener(): void { |
| if (storageListenerAttached) return; |
| storageListenerAttached = true; |
| window.addEventListener('storage', (e: StorageEvent) => { |
| if (e.key !== DIGITS_MERGE_STORAGE_KEY) return; |
| notifyDigitsMergeRenderListeners(); |
| }); |
| } |
|
|
| |
| |
| |
| |
| |
| export function addDigitsMergeRenderListener(callback: () => void): void { |
| renderListeners.add(callback); |
| ensureStorageListener(); |
| } |
|
|
| export function getDigitsMergeEnabled(): boolean { |
| const v = localStorage.getItem(DIGITS_MERGE_STORAGE_KEY); |
| if (v === null) return true; |
| return v === 'true'; |
| } |
|
|
| export function setDigitsMergeEnabled(enabled: boolean): void { |
| localStorage.setItem(DIGITS_MERGE_STORAGE_KEY, enabled ? 'true' : 'false'); |
| notifyDigitsMergeRenderListeners(); |
| } |
|
|