blob: 3b4b2e4521382addfbd371cb374c7f0b101cbed6 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
import { Deserializable } from "../client/util/SerializationHelper";
import { RefField, Id, ObjectField } from "./Doc";
import { primitive, serializable } from "serializr";
import { observable } from "mobx";
@Deserializable("proxy")
export class ProxyField<T extends RefField> extends ObjectField {
constructor();
constructor(value: T);
constructor(value?: T) {
super();
if (value) {
this.cache = value;
this.fieldId = value[Id];
}
}
@serializable(primitive())
readonly fieldId: string = "";
// This getter/setter and nested object thing is
// because mobx doesn't play well with observable proxies
@observable.ref
private _cache: { readonly field: T | undefined } = { field: undefined };
private get cache(): T | undefined {
return this._cache.field;
}
private set cache(field: T | undefined) {
this._cache = { field };
}
private failed = false;
private promise?: Promise<any>;
value(callback?: ((field: T | undefined) => void)): T | undefined | null {
if (this.cache) {
callback && callback(this.cache);
return this.cache;
}
if (this.failed) {
return undefined;
}
if (!this.promise) {
// this.promise = Server.GetField(this.fieldId).then(action((field: any) => {
// this.promise = undefined;
// this.cache = field;
// if (field === undefined) this.failed = true;
// return field;
// }));
this.promise = new Promise(r => r());
}
callback && this.promise.then(callback);
return null;
}
}
|