diff options
-rw-r--r-- | src/client/util/LinkManager.ts | 31 |
1 files changed, 17 insertions, 14 deletions
diff --git a/src/client/util/LinkManager.ts b/src/client/util/LinkManager.ts index 01f4df723..fe7bfe6ed 100644 --- a/src/client/util/LinkManager.ts +++ b/src/client/util/LinkManager.ts @@ -66,26 +66,29 @@ export class LinkManager { const watchUserLinkDB = (userLinkDBDoc: Doc) => { LinkManager.links.push(...DocListCast(userLinkDBDoc.data)); const toRealField = (field: Field) => (field instanceof ProxyField ? field.value() : field); // see List.ts. data structure is not a simple list of Docs, but a list of ProxyField/Fields - observe( - userLinkDBDoc.data as Doc, - change => { - // observe pushes/splices on a user link DB 'data' field (should only happen for local changes) - switch (change.type as any) { - case 'splice': - (change as any).added.forEach((link: any) => addLinkToDoc(toRealField(link))); - (change as any).removed.forEach((link: any) => remLinkFromDoc(toRealField(link))); - break; - case 'update': //let oldValue = change.oldValue; - } - }, - true - ); + const observeLinkDB = (linkDB: List<Doc>) => + observe( + linkDB, + change => { + // observe pushes/splices on a user link DB 'data' field (should only happen for local changes) + switch (change.type as any) { + case 'splice': + (change as any).added.forEach((link: any) => addLinkToDoc(toRealField(link))); + (change as any).removed.forEach((link: any) => remLinkFromDoc(toRealField(link))); + break; + case 'update': //let oldValue = change.oldValue; + } + }, + true + ); + if (userLinkDBDoc.data) observeLinkDB(userLinkDBDoc.data as List<Doc>); observe( userLinkDBDoc, 'data', // obsever when a new array of links is assigned as the link DB 'data' field (should happen whenever a remote user adds/removes a link) change => { switch (change.type as any) { case 'update': + if (!change.oldValue) observeLinkDB(change.newValue as List<Doc>); Promise.all([...((change.oldValue as any as Doc[]) || []), ...((change.newValue as any as Doc[]) || [])]).then(doclist => { const oldDocs = doclist.slice(0, ((change.oldValue as any as Doc[]) || []).length); const newDocs = doclist.slice(((change.oldValue as any as Doc[]) || []).length, doclist.length); |