54 lines
1.3 KiB
TypeScript
54 lines
1.3 KiB
TypeScript
import { createContext, useCallback, useContext, useState } from "react";
|
|
|
|
import type { Subtask } from "./types";
|
|
|
|
export interface SubtaskContextValue {
|
|
tasks: Record<string, Subtask>;
|
|
setTasks: (tasks: Record<string, Subtask>) => void;
|
|
}
|
|
|
|
export const SubtaskContext = createContext<SubtaskContextValue>({
|
|
tasks: {},
|
|
setTasks: () => {
|
|
/* noop */
|
|
},
|
|
});
|
|
|
|
export function SubtasksProvider({ children }: { children: React.ReactNode }) {
|
|
const [tasks, setTasks] = useState<Record<string, Subtask>>({});
|
|
return (
|
|
<SubtaskContext.Provider value={{ tasks, setTasks }}>
|
|
{children}
|
|
</SubtaskContext.Provider>
|
|
);
|
|
}
|
|
|
|
export function useSubtaskContext() {
|
|
const context = useContext(SubtaskContext);
|
|
if (context === undefined) {
|
|
throw new Error(
|
|
"useSubtaskContext must be used within a SubtaskContext.Provider",
|
|
);
|
|
}
|
|
return context;
|
|
}
|
|
|
|
export function useSubtask(id: string) {
|
|
const { tasks } = useSubtaskContext();
|
|
return tasks[id];
|
|
}
|
|
|
|
export function useUpdateSubtask() {
|
|
const { tasks, setTasks } = useSubtaskContext();
|
|
const updateSubtask = useCallback(
|
|
(task: Partial<Subtask> & { id: string }) => {
|
|
tasks[task.id] = { ...tasks[task.id], ...task } as Subtask;
|
|
if (task.latestMessage) {
|
|
setTasks({ ...tasks });
|
|
}
|
|
},
|
|
[tasks, setTasks],
|
|
);
|
|
return updateSubtask;
|
|
}
|