aboutsummaryrefslogtreecommitdiff
path: root/src/client/util/LinkManager.ts
diff options
context:
space:
mode:
authorZachary Zhang <zacharyzhang7@gmail.com>2024-08-31 00:46:29 -0400
committerZachary Zhang <zacharyzhang7@gmail.com>2024-08-31 00:46:29 -0400
commit196294f331496262bef256da8b8e9dbc80288bea (patch)
tree85ff27b7a8070585f9a5ef71dff63566e03232ba /src/client/util/LinkManager.ts
parent0cf61501ec9be34294935f01973c1bd9cad6d267 (diff)
parentc36607691e0b7f5c04f3209a64958f5e51ddd785 (diff)
Merge branch 'master' into zach-starter
Diffstat (limited to 'src/client/util/LinkManager.ts')
-rw-r--r--src/client/util/LinkManager.ts43
1 files changed, 16 insertions, 27 deletions
diff --git a/src/client/util/LinkManager.ts b/src/client/util/LinkManager.ts
index 56d5dce4e..e11482572 100644
--- a/src/client/util/LinkManager.ts
+++ b/src/client/util/LinkManager.ts
@@ -31,13 +31,13 @@ export class LinkManager {
@observable public currentLink: Opt<Doc> = undefined;
@observable public currentLinkAnchor: Opt<Doc> = undefined;
public static get Instance(): LinkManager {
- return Doc.UserDoc() ? LinkManager._instance ?? new LinkManager() : (undefined as any as LinkManager);
+ return Doc.UserDoc() ? (LinkManager._instance ?? new LinkManager()) : (undefined as unknown as LinkManager);
}
public static Links(doc: Doc | undefined) {
return doc ? LinkManager.Instance.getAllRelatedLinks(doc) : [];
}
- public addLinkDB = async (linkDb: any) => {
+ public addLinkDB = async (linkDb: Doc) => {
await Promise.all(
((await DocListCastAsync(linkDb.data)) ?? []).map(link =>
// makes sure link anchors are loaded to avoid incremental updates to computedFns in LinkManager
@@ -95,35 +95,24 @@ export class LinkManager {
const watchUserLinkDB = (userLinkDBDoc: Doc) => {
const toRealField = (field: FieldType) => (field instanceof ProxyField ? field.value : field); // see List.ts. data structure is not a simple list of Docs, but a list of ProxyField/Fields
if (userLinkDBDoc.data) {
+ // observe pushes/splices on a user link DB 'data' field (should only happen for local changes)
observe(
- userLinkDBDoc.data,
+ userLinkDBDoc.data as unknown as Doc[],
change => {
- // observe pushes/splices on a user link DB 'data' field (should only happen for local changes)
- switch (change.type as any) {
+ switch (change.type) {
case 'splice':
- (change as any).added.forEach((link: any) => addLinkToDoc(toRealField(link)));
- (change as any).removed.forEach((link: any) => remLinkFromDoc(toRealField(link)));
+ change.added.forEach(link => addLinkToDoc(toRealField(link)));
+ change.removed.forEach(link => remLinkFromDoc(toRealField(link)));
break;
- case 'update': // let oldValue = change.oldValue;
- default:
- }
- },
- true
- );
- 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':
- 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);
+ Promise.all([...((change.oldValue as unknown as Doc[]) || []), ...((change.newValue as unknown as Doc[]) || [])]).then(doclist => {
+ const oldDocs = doclist.slice(0, ((change.oldValue as unknown as Doc[]) || []).length);
+ const newDocs = doclist.slice(((change.oldValue as unknown as Doc[]) || []).length, doclist.length);
const added = newDocs?.filter(link => !(oldDocs || []).includes(link));
const removed = oldDocs?.filter(link => !(newDocs || []).includes(link));
- added?.forEach((link: any) => addLinkToDoc(toRealField(link)));
- removed?.forEach((link: any) => remLinkFromDoc(toRealField(link)));
+ added?.forEach(link => addLinkToDoc(toRealField(link)));
+ removed?.forEach(link => remLinkFromDoc(toRealField(link)));
});
break;
default:
@@ -136,9 +125,9 @@ export class LinkManager {
observe(
this.userLinkDBs,
change => {
- switch (change.type as any) {
+ switch (change.type) {
case 'splice':
- (change as any).added.forEach(watchUserLinkDB);
+ change.added.forEach(watchUserLinkDB);
break;
case 'update': // let oldValue = change.oldValue;
default:
@@ -188,7 +177,7 @@ export class LinkManager {
return [];
}
- const dirLinks = Array.from(anchor[DocData][DirectLinks]).filter(l => Doc.GetProto(anchor) === anchor[DocData] || ['1', '2'].includes(LinkManager.anchorIndex(l, anchor) as any));
+ const dirLinks = Array.from(anchor[DocData][DirectLinks]).filter(l => Doc.GetProto(anchor) === anchor[DocData] || ['1', '2'].includes(LinkManager.anchorIndex(l, anchor) as '0' | '1' | '2'));
const anchorRoot = DocCast(anchor.rootDocument, anchor); // template Doc fields store annotations on the topmost root of a template (not on themselves since the template layout items are only for layout)
const annos = DocListCast(anchorRoot[Doc.LayoutFieldKey(anchor) + '_annotations']);
return Array.from(
@@ -283,7 +272,7 @@ export function UPDATE_SERVER_CACHE() {
ScriptingGlobals.add(
// eslint-disable-next-line prefer-arrow-callback
- function links(doc: any) {
+ function links(doc: Doc) {
return new List(LinkManager.Links(doc));
},
'returns all the links to the document or its annotations',