Skip to content

Commit 6cb2702

Browse files
committed
♻️(frontend) update already existing tasks
When a task was already existing, we were not updating it. This commit fixes that.
1 parent 94a9f7a commit 6cb2702

File tree

1 file changed

+42
-8
lines changed

1 file changed

+42
-8
lines changed

src/frontend/apps/impress/src/stores/useBroadcastStore.tsx

Lines changed: 42 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,20 @@ interface BroadcastState {
88
getBroadcastProvider: () => HocuspocusProvider | undefined;
99
provider?: HocuspocusProvider;
1010
setBroadcastProvider: (provider: HocuspocusProvider) => void;
11-
tasks: { [taskLabel: string]: Y.Array<string> };
11+
setTask: (
12+
taskLabel: string,
13+
task: Y.Array<string>,
14+
action: () => void,
15+
) => void;
16+
tasks: {
17+
[taskLabel: string]: {
18+
task: Y.Array<string>;
19+
observer: (
20+
event: Y.YArrayEvent<string>,
21+
transaction: Y.Transaction,
22+
) => void;
23+
};
24+
};
1225
}
1326

1427
export const useBroadcastStore = create<BroadcastState>((set, get) => ({
@@ -25,26 +38,47 @@ export const useBroadcastStore = create<BroadcastState>((set, get) => ({
2538
return provider;
2639
},
2740
addTask: (taskLabel, action) => {
28-
const taskExistAlready = get().tasks[taskLabel];
2941
const provider = get().getBroadcastProvider();
30-
if (taskExistAlready || !provider) {
42+
if (!provider) {
43+
return;
44+
}
45+
46+
const existingTask = get().tasks[taskLabel];
47+
if (existingTask) {
48+
existingTask.task.unobserve(existingTask.observer);
49+
get().setTask(taskLabel, existingTask.task, action);
3150
return;
3251
}
3352

3453
const task = provider.document.getArray<string>(taskLabel);
35-
task.observe(() => {
36-
action();
37-
});
54+
get().setTask(taskLabel, task, action);
55+
},
56+
setTask: (taskLabel: string, task: Y.Array<string>, action: () => void) => {
57+
let isInitializing = true;
58+
const observer = () => {
59+
if (!isInitializing) {
60+
action();
61+
}
62+
};
63+
64+
task.observe(observer);
65+
66+
setTimeout(() => {
67+
isInitializing = false;
68+
}, 1000);
3869

3970
set((state) => ({
4071
tasks: {
4172
...state.tasks,
42-
[taskLabel]: task,
73+
[taskLabel]: {
74+
task,
75+
observer,
76+
},
4377
},
4478
}));
4579
},
4680
broadcast: (taskLabel) => {
47-
const task = get().tasks[taskLabel];
81+
const { task } = get().tasks[taskLabel];
4882
if (!task) {
4983
console.warn(`Task ${taskLabel} is not defined`);
5084
return;

0 commit comments

Comments
 (0)