From 1e268be742ef570ad036528a9a2027100d4d629a Mon Sep 17 00:00:00 2001 From: Seth Trowbridge Date: Mon, 3 Feb 2025 22:57:13 -0500 Subject: [PATCH] add gateway initial state still huge problem --- lib/van/van.js | 91 +++++++++++++++++++++++++++++--------------------- 1 file changed, 53 insertions(+), 38 deletions(-) diff --git a/lib/van/van.js b/lib/van/van.js index 205f89b..fb1200e 100644 --- a/lib/van/van.js +++ b/lib/van/van.js @@ -119,6 +119,7 @@ let handler = ns => ({get: (_, name) => tag.bind(_undefined, ns, name)}) let update = (dom, newDom) => newDom ? newDom !== dom && dom.replaceWith(newDom) : dom.remove() + //let updateDoms = () => { // let iter = 0, derivedStatesArray = [...changedStates].filter(s => s.rawVal !== s._oldVal) // do { @@ -133,22 +134,41 @@ let update = (dom, newDom) => newDom ? newDom !== dom && dom.replaceWith(newDom) // for (let s of changedStatesArray) s._oldVal = s.rawVal //} /*********************************************** */ -// Map to track state-to-DOM relationships -const stateDomMap = new Map(); -function pathHash(/** @type {HTMLElement} */element) { +const Gateway = { + Time: 0, + Temp:{}, + Tick() + { + for(let k in Gateway.Temp) + { + localStorage.setItem(k, Gateway.Temp[k]); + } + Gateway.Temp = {}; + Gateway.Time = 0; + }, + Save(key, value) + { + Gateway.Temp[key] = value; + if(!Gateway.Time) + { + Gateway.Time = setTimeout(Gateway.Tick, 500); + } + }, + Load(key) + { + return localStorage.getItem(key); + } +} + +function pathHash(/** @type {HTMLElement} */element) +{ const path = []; - let currentElement = element; + while (element && element !== document.body) { - while (currentElement && currentElement !== document.body && currentElement.parentNode) { - const siblings = Array.from(currentElement.parentNode.children); - const index = siblings.indexOf(currentElement); - path.unshift(index); // Push the index of the current element at the start of the path - currentElement = currentElement.parentNode; + const parent = element.parentElement + path.unshift(Array.from(parent.children).indexOf(element)); // Push the index of the current element at the start of the path + element = parent; } - - // Include the body in the path as the final part, with index 0 (since it's the root) - path.unshift(0); - return path.join('-'); // Return the path as a string, e.g., "1-0-0-2" } @@ -158,36 +178,31 @@ function pathHash(/** @type {HTMLElement} */element) { * @param {Element} dom - The DOM element affected by the state. */ const trackStateDomRelationship = (state, doms) => { - doms.forEach(dom => { - const hash = pathHash(dom); - stateDomMap.set(hash, state); - }); + doms.forEach(dom => { + if(dom) + { + const hash = pathHash(dom); + Gateway.Save(hash, JSON.stringify(state)); + } + }); }; // Enhanced updateDoms function let updateDoms = () => { - let iter = 0; - let derivedStatesArray = [...changedStates].filter(s => s.rawVal !== s._oldVal); - + let iter = 0, derivedStatesArray = [...changedStates].filter(s => s.rawVal !== s._oldVal) do { - // Clear derivedStates for this iteration - derivedStates = new Set(); + derivedStates = new Set + for (let l of new Set(derivedStatesArray.flatMap(s => s._listeners = keepConnected(s._listeners)))) + derive(l.f, l.s, l._dom), l._dom = _undefined + } while (++iter < 100 && (derivedStatesArray = [...derivedStates]).length) + let changedStatesArray = [...changedStates].filter(s => s.rawVal !== s._oldVal) + changedStates = _undefined - // Process listeners for derived states - for (let l of new Set(derivedStatesArray.flatMap(s => s._listeners = keepConnected(s._listeners)))) { - derive(l.f, l.s, l._dom); - l._dom = _undefined; - } - } while (++iter < 100 && (derivedStatesArray = [...derivedStates]).length); - - // Update bindings for changed states - let changedStatesArray = [...changedStates].filter(s => s.rawVal !== s._oldVal); - changedStates = _undefined; - - const _block = new Set(changedStatesArray.flatMap(s =>{ - trackStateDomRelationship(s.rawVal, s._bindings.map(b=>b._dom)) - return s._bindings = keepConnected(s._bindings); - })); + const _block = new Set(changedStatesArray.flatMap(s =>{ + trackStateDomRelationship(s.rawVal, s._bindings.map(b=>b._dom)); + s.rawVal = "FORCE"; + return s._bindings = keepConnected(s._bindings); + })); for (let b of _block) { update(b._dom, bind(b.f, b._dom)); @@ -201,7 +216,7 @@ let updateDoms = () => { }; // Debugging helper to log the state-DOM relationships -globalThis.Divulge = () => console.log(stateDomMap.entries()); +globalThis.Divulge = () => console.log(Gateway.Temp); globalThis.path = pathHash; /*********************************************** */