add gateway
initial state still huge problem
This commit is contained in:
parent
d4aa91fe70
commit
1e268be742
@ -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 update = (dom, newDom) => newDom ? newDom !== dom && dom.replaceWith(newDom) : dom.remove()
|
||||||
|
|
||||||
|
|
||||||
//let updateDoms = () => {
|
//let updateDoms = () => {
|
||||||
// let iter = 0, derivedStatesArray = [...changedStates].filter(s => s.rawVal !== s._oldVal)
|
// let iter = 0, derivedStatesArray = [...changedStates].filter(s => s.rawVal !== s._oldVal)
|
||||||
// do {
|
// do {
|
||||||
@ -133,22 +134,41 @@ let update = (dom, newDom) => newDom ? newDom !== dom && dom.replaceWith(newDom)
|
|||||||
// for (let s of changedStatesArray) s._oldVal = s.rawVal
|
// for (let s of changedStatesArray) s._oldVal = s.rawVal
|
||||||
//}
|
//}
|
||||||
/*********************************************** */
|
/*********************************************** */
|
||||||
// Map to track state-to-DOM relationships
|
const Gateway = {
|
||||||
const stateDomMap = new Map();
|
Time: 0,
|
||||||
function pathHash(/** @type {HTMLElement} */element) {
|
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 = [];
|
const path = [];
|
||||||
let currentElement = element;
|
while (element && element !== document.body) {
|
||||||
|
|
||||||
while (currentElement && currentElement !== document.body && currentElement.parentNode) {
|
const parent = element.parentElement
|
||||||
const siblings = Array.from(currentElement.parentNode.children);
|
path.unshift(Array.from(parent.children).indexOf(element)); // Push the index of the current element at the start of the path
|
||||||
const index = siblings.indexOf(currentElement);
|
element = parent;
|
||||||
path.unshift(index); // Push the index of the current element at the start of the path
|
|
||||||
currentElement = currentElement.parentNode;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 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"
|
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.
|
* @param {Element} dom - The DOM element affected by the state.
|
||||||
*/
|
*/
|
||||||
const trackStateDomRelationship = (state, doms) => {
|
const trackStateDomRelationship = (state, doms) => {
|
||||||
doms.forEach(dom => {
|
doms.forEach(dom => {
|
||||||
const hash = pathHash(dom);
|
if(dom)
|
||||||
stateDomMap.set(hash, state);
|
{
|
||||||
});
|
const hash = pathHash(dom);
|
||||||
|
Gateway.Save(hash, JSON.stringify(state));
|
||||||
|
}
|
||||||
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
// Enhanced updateDoms function
|
// Enhanced updateDoms function
|
||||||
let updateDoms = () => {
|
let updateDoms = () => {
|
||||||
let iter = 0;
|
let iter = 0, derivedStatesArray = [...changedStates].filter(s => s.rawVal !== s._oldVal)
|
||||||
let derivedStatesArray = [...changedStates].filter(s => s.rawVal !== s._oldVal);
|
|
||||||
|
|
||||||
do {
|
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
|
const _block = new Set(changedStatesArray.flatMap(s =>{
|
||||||
for (let l of new Set(derivedStatesArray.flatMap(s => s._listeners = keepConnected(s._listeners)))) {
|
trackStateDomRelationship(s.rawVal, s._bindings.map(b=>b._dom));
|
||||||
derive(l.f, l.s, l._dom);
|
s.rawVal = "FORCE";
|
||||||
l._dom = _undefined;
|
return s._bindings = keepConnected(s._bindings);
|
||||||
}
|
}));
|
||||||
} 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);
|
|
||||||
}));
|
|
||||||
|
|
||||||
for (let b of _block) {
|
for (let b of _block) {
|
||||||
update(b._dom, bind(b.f, b._dom));
|
update(b._dom, bind(b.f, b._dom));
|
||||||
@ -201,7 +216,7 @@ let updateDoms = () => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// Debugging helper to log the state-DOM relationships
|
// Debugging helper to log the state-DOM relationships
|
||||||
globalThis.Divulge = () => console.log(stateDomMap.entries());
|
globalThis.Divulge = () => console.log(Gateway.Temp);
|
||||||
globalThis.path = pathHash;
|
globalThis.path = pathHash;
|
||||||
/*********************************************** */
|
/*********************************************** */
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user