♻️(frontend) update already existing tasks
When a task was already existing, we were not updating it. This commit fixes that.
This commit is contained in:
@@ -8,7 +8,20 @@ interface BroadcastState {
|
|||||||
getBroadcastProvider: () => HocuspocusProvider | undefined;
|
getBroadcastProvider: () => HocuspocusProvider | undefined;
|
||||||
provider?: HocuspocusProvider;
|
provider?: HocuspocusProvider;
|
||||||
setBroadcastProvider: (provider: HocuspocusProvider) => void;
|
setBroadcastProvider: (provider: HocuspocusProvider) => void;
|
||||||
tasks: { [taskLabel: string]: Y.Array<string> };
|
setTask: (
|
||||||
|
taskLabel: string,
|
||||||
|
task: Y.Array<string>,
|
||||||
|
action: () => void,
|
||||||
|
) => void;
|
||||||
|
tasks: {
|
||||||
|
[taskLabel: string]: {
|
||||||
|
task: Y.Array<string>;
|
||||||
|
observer: (
|
||||||
|
event: Y.YArrayEvent<string>,
|
||||||
|
transaction: Y.Transaction,
|
||||||
|
) => void;
|
||||||
|
};
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
export const useBroadcastStore = create<BroadcastState>((set, get) => ({
|
export const useBroadcastStore = create<BroadcastState>((set, get) => ({
|
||||||
@@ -25,26 +38,47 @@ export const useBroadcastStore = create<BroadcastState>((set, get) => ({
|
|||||||
return provider;
|
return provider;
|
||||||
},
|
},
|
||||||
addTask: (taskLabel, action) => {
|
addTask: (taskLabel, action) => {
|
||||||
const taskExistAlready = get().tasks[taskLabel];
|
|
||||||
const provider = get().getBroadcastProvider();
|
const provider = get().getBroadcastProvider();
|
||||||
if (taskExistAlready || !provider) {
|
if (!provider) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const existingTask = get().tasks[taskLabel];
|
||||||
|
if (existingTask) {
|
||||||
|
existingTask.task.unobserve(existingTask.observer);
|
||||||
|
get().setTask(taskLabel, existingTask.task, action);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const task = provider.document.getArray<string>(taskLabel);
|
const task = provider.document.getArray<string>(taskLabel);
|
||||||
task.observe(() => {
|
get().setTask(taskLabel, task, action);
|
||||||
action();
|
},
|
||||||
});
|
setTask: (taskLabel: string, task: Y.Array<string>, action: () => void) => {
|
||||||
|
let isInitializing = true;
|
||||||
|
const observer = () => {
|
||||||
|
if (!isInitializing) {
|
||||||
|
action();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
task.observe(observer);
|
||||||
|
|
||||||
|
setTimeout(() => {
|
||||||
|
isInitializing = false;
|
||||||
|
}, 1000);
|
||||||
|
|
||||||
set((state) => ({
|
set((state) => ({
|
||||||
tasks: {
|
tasks: {
|
||||||
...state.tasks,
|
...state.tasks,
|
||||||
[taskLabel]: task,
|
[taskLabel]: {
|
||||||
|
task,
|
||||||
|
observer,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
}));
|
}));
|
||||||
},
|
},
|
||||||
broadcast: (taskLabel) => {
|
broadcast: (taskLabel) => {
|
||||||
const task = get().tasks[taskLabel];
|
const { task } = get().tasks[taskLabel];
|
||||||
if (!task) {
|
if (!task) {
|
||||||
console.warn(`Task ${taskLabel} is not defined`);
|
console.warn(`Task ${taskLabel} is not defined`);
|
||||||
return;
|
return;
|
||||||
|
|||||||
Reference in New Issue
Block a user