fix(storage): cache childrens proxies
This commit is contained in:
parent
d09ce3894b
commit
b1cd040993
2 changed files with 13 additions and 6 deletions
|
|
@ -67,7 +67,6 @@ export default function AddonPage<T extends object>({ card: CardComponent, ...pr
|
||||||
data={data}
|
data={data}
|
||||||
estimatedItemSize={136}
|
estimatedItemSize={136}
|
||||||
ListHeaderComponent={headerElement}
|
ListHeaderComponent={headerElement}
|
||||||
onLoad={console.log}
|
|
||||||
contentContainerStyle={{ paddingBottom: 90, paddingHorizontal: 5 }}
|
contentContainerStyle={{ paddingBottom: 90, paddingHorizontal: 5 }}
|
||||||
renderItem={({ item }: any) => (
|
renderItem={({ item }: any) => (
|
||||||
<View style={{ paddingVertical: 6, paddingHorizontal: 8 }}>
|
<View style={{ paddingVertical: 6, paddingHorizontal: 8 }}>
|
||||||
|
|
|
||||||
|
|
@ -31,22 +31,30 @@ function createFileBackend<T>(filePath: string, dflt = {} as T): StorageBackend<
|
||||||
}
|
}
|
||||||
|
|
||||||
function _createProxy(target: any, path: string[], emitter: Emitter): any {
|
function _createProxy(target: any, path: string[], emitter: Emitter): any {
|
||||||
|
// cache the children proxies so proxy.child === proxy.child (yields the same value)
|
||||||
|
const objChildrens = new WeakMap<object, object>();
|
||||||
|
|
||||||
return new Proxy(target, {
|
return new Proxy(target, {
|
||||||
get(target, prop: string) {
|
get(target, prop: string) {
|
||||||
if ((prop as unknown) === emitterSymbol) return emitter;
|
if ((prop as unknown) === emitterSymbol) return emitter;
|
||||||
|
|
||||||
const newPath = [...path, prop];
|
const newPath = [...path, prop];
|
||||||
const value: any = target[prop];
|
let value: any = target[prop];
|
||||||
|
|
||||||
|
if (value && typeof value === "object") {
|
||||||
|
const origValue = value;
|
||||||
|
value = objChildrens.get(origValue);
|
||||||
|
if (!value) {
|
||||||
|
value = _createProxy(value, newPath, emitter);
|
||||||
|
objChildrens.set(origValue, value!);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (value != null) {
|
if (value != null) {
|
||||||
emitter.emit("GET", {
|
emitter.emit("GET", {
|
||||||
path: newPath,
|
path: newPath,
|
||||||
value,
|
value,
|
||||||
});
|
});
|
||||||
if (typeof value === "object") {
|
|
||||||
return _createProxy(value, newPath, emitter);
|
|
||||||
}
|
|
||||||
return value;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return value;
|
return value;
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue