From 4c2be53a2231d2a6e9e67cf363f1c708ccc09a92 Mon Sep 17 00:00:00 2001 From: lawvs <18554747+lawvs@users.noreply.github.com> Date: Thu, 25 Aug 2022 16:32:36 +0800 Subject: [PATCH 1/4] refactor: update progress --- .../src/render-block/RenderKanbanBlock.tsx | 27 +++---------------- 1 file changed, 3 insertions(+), 24 deletions(-) diff --git a/libs/components/editor-core/src/render-block/RenderKanbanBlock.tsx b/libs/components/editor-core/src/render-block/RenderKanbanBlock.tsx index f9b532f6b3..4f323213f3 100644 --- a/libs/components/editor-core/src/render-block/RenderKanbanBlock.tsx +++ b/libs/components/editor-core/src/render-block/RenderKanbanBlock.tsx @@ -40,6 +40,8 @@ export const KanbanParentBlockRender = ({ }; const useBlockProgress = (block?: AsyncBlock) => { + // Progress of the progress bar. The range is between 0 and 1. + // Default progress is 1, that is 100%. const [progress, setProgress] = useState(1); useEffect(() => { @@ -57,36 +59,13 @@ const useBlockProgress = (block?: AsyncBlock) => { setProgress(checkedTodoChildren.length / todoChildren.length); }; - let childrenQueue: (() => void)[] = []; - const childrenUnobserve = () => { - childrenQueue.forEach(fn => fn()); - childrenQueue = []; - }; - - const observeChildren = async () => { - const children = await block.children(); - - childrenUnobserve(); - children.forEach(child => { - const unobserve = child.onUpdate(() => { - updateProgress(); - }); - childrenQueue.push(unobserve); - }); - }; - - observeChildren(); updateProgress(); const unobserve = block.onUpdate(() => { - observeChildren(); updateProgress(); }); - return () => { - unobserve(); - childrenUnobserve(); - }; + return unobserve; }, [block]); return progress; From a713d9d649315044d55973db69d4d81c94654a83 Mon Sep 17 00:00:00 2001 From: lawvs <18554747+lawvs@users.noreply.github.com> Date: Thu, 25 Aug 2022 18:22:39 +0800 Subject: [PATCH 2/4] feat: async block support deep observe --- .../src/editor/block/async-block.ts | 44 ++++++++++++++++++- 1 file changed, 42 insertions(+), 2 deletions(-) diff --git a/libs/components/editor-core/src/editor/block/async-block.ts b/libs/components/editor-core/src/editor/block/async-block.ts index 73db5de087..1bdc7ef086 100644 --- a/libs/components/editor-core/src/editor/block/async-block.ts +++ b/libs/components/editor-core/src/editor/block/async-block.ts @@ -180,9 +180,49 @@ export class AsyncBlock { return this.event_emitter.emit(eventName, eventData); } - onUpdate(callback: (event: EventData) => void) { - this.on('update', callback); + /** + * @param deep observe deep + * + * NOTICE: the observe of children is async, + * so there maybe have some delay before observe done. + */ + onUpdate(callback: (event: EventData) => void, deep = 0) { + let expired = false; + const unobserveMap: Record void> = {}; + const observeChildren = () => { + if (deep <= 0) { + return; + } + this.children().then(children => { + // Check current event listeners is not expired + if (expired) { + return; + } + children.forEach(child => { + if (unobserveMap[child.id]) return; + const unobserve = child.onUpdate(callback, deep - 1); + unobserveMap[child.id] = unobserve; + }); + }); + }; + + const unobserveChildren = () => { + Object.values(unobserveMap).forEach(unobserve => { + unobserve(); + }); + }; + + this.on('update', e => { + callback(e); + // Update children observe + observeChildren(); + }); + + observeChildren(); + return () => { + expired = true; + unobserveChildren(); this.off('update', callback); }; } From 827e7425c52b20601d52a783a605135062702bec Mon Sep 17 00:00:00 2001 From: lawvs <18554747+lawvs@users.noreply.github.com> Date: Thu, 25 Aug 2022 18:23:16 +0800 Subject: [PATCH 3/4] chore: cancel cascade update temp --- libs/datasource/db-service/src/services/database/index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libs/datasource/db-service/src/services/database/index.ts b/libs/datasource/db-service/src/services/database/index.ts index d6d013a3d3..3d70345f0f 100644 --- a/libs/datasource/db-service/src/services/database/index.ts +++ b/libs/datasource/db-service/src/services/database/index.ts @@ -168,7 +168,7 @@ export class Database { block.on('children', observer_name, listener); block.on('content', observer_name, listener); block.on('parent', observer_name, listener); - block.on('cascade', observer_name, listener); + // block.on('cascade', observer_name, listener); } this.#observers.setStatus(observer_name, 'observing'); @@ -189,7 +189,7 @@ export class Database { block.off('children', observer_name); block.off('content', observer_name); block.off('parent', observer_name); - block.off('cascade', observer_name); + // block.off('cascade', observer_name); } } } From 2fd6921fe1a7f57ffebd777a73ac38f3e0e91593 Mon Sep 17 00:00:00 2001 From: lawvs <18554747+lawvs@users.noreply.github.com> Date: Thu, 25 Aug 2022 18:24:30 +0800 Subject: [PATCH 4/4] chore: support kanban progress update --- .../editor-core/src/render-block/RenderKanbanBlock.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/components/editor-core/src/render-block/RenderKanbanBlock.tsx b/libs/components/editor-core/src/render-block/RenderKanbanBlock.tsx index 4f323213f3..0044a4e6aa 100644 --- a/libs/components/editor-core/src/render-block/RenderKanbanBlock.tsx +++ b/libs/components/editor-core/src/render-block/RenderKanbanBlock.tsx @@ -63,7 +63,7 @@ const useBlockProgress = (block?: AsyncBlock) => { const unobserve = block.onUpdate(() => { updateProgress(); - }); + }, 1); return unobserve; }, [block]);