Files

57 lines
2.5 KiB
TypeScript
Raw Permalink Normal View History

// Copyright 2024, Command Line Inc.
// SPDX-License-Identifier: Apache-2.0
2024-06-11 17:42:10 -07:00
import { WOS } from "@/app/store/global";
2024-08-14 18:40:41 -07:00
import { Atom, atom, Getter } from "jotai";
import { LayoutTreeState, WritableLayoutTreeStateAtom } from "./types";
2024-06-04 13:05:44 -07:00
2024-08-14 18:40:41 -07:00
const layoutStateAtomMap: WeakMap<Atom<Tab>, WritableLayoutTreeStateAtom> = new WeakMap();
2024-08-14 18:40:41 -07:00
function getLayoutStateAtomFromTab(tabAtom: Atom<Tab>, get: Getter): WritableWaveObjectAtom<LayoutState> {
const tabData = get(tabAtom);
if (!tabData) return;
const layoutStateOref = WOS.makeORef("layout", tabData.layoutstate);
const layoutStateAtom = WOS.getWaveObjectAtom<LayoutState>(layoutStateOref);
return layoutStateAtom;
2024-06-04 13:05:44 -07:00
}
2024-08-14 18:40:41 -07:00
export function withLayoutTreeStateAtomFromTab(tabAtom: Atom<Tab>): WritableLayoutTreeStateAtom {
if (layoutStateAtomMap.has(tabAtom)) {
return layoutStateAtomMap.get(tabAtom);
}
const generationAtom = atom(1);
const treeStateAtom: WritableLayoutTreeStateAtom = atom(
2024-06-04 13:05:44 -07:00
(get) => {
2024-08-14 18:40:41 -07:00
const stateAtom = getLayoutStateAtomFromTab(tabAtom, get);
if (!stateAtom) return;
const layoutStateData = get(stateAtom);
const layoutTreeState: LayoutTreeState = {
rootNode: layoutStateData?.rootnode,
focusedNodeId: layoutStateData?.focusednodeid,
2024-08-14 18:40:41 -07:00
magnifiedNodeId: layoutStateData?.magnifiednodeid,
pendingBackendActions: layoutStateData?.pendingbackendactions,
2024-08-14 18:40:41 -07:00
generation: get(generationAtom),
};
return layoutTreeState;
2024-06-04 13:05:44 -07:00
},
(get, set, value) => {
2024-08-14 18:40:41 -07:00
if (get(generationAtom) < value.generation) {
const stateAtom = getLayoutStateAtomFromTab(tabAtom, get);
if (!stateAtom) return;
const waveObjVal = get(stateAtom);
waveObjVal.rootnode = value.rootNode;
waveObjVal.magnifiednodeid = value.magnifiedNodeId;
waveObjVal.focusednodeid = value.focusedNodeId;
waveObjVal.leaforder = value.leafOrder; // only set leaforder, never get it, since this value is driven by the frontend
waveObjVal.pendingbackendactions = value.pendingBackendActions?.length
? value.pendingBackendActions
: undefined;
2024-06-06 18:07:00 -07:00
set(generationAtom, value.generation);
2024-08-14 18:40:41 -07:00
set(stateAtom, waveObjVal);
2024-06-06 18:07:00 -07:00
}
2024-06-04 13:05:44 -07:00
}
);
2024-08-14 18:40:41 -07:00
layoutStateAtomMap.set(tabAtom, treeStateAtom);
return treeStateAtom;
2024-06-04 13:05:44 -07:00
}