Spaces:
Running
Running
/** | |
* | |
* Copyright 2023-2024 InspectorRAGet Team | |
* | |
* Licensed under the Apache License, Version 2.0 (the "License"); | |
* you may not use this file except in compliance with the License. | |
* You may obtain a copy of the License at | |
* | |
* http://www.apache.org/licenses/LICENSE-2.0 | |
* | |
* Unless required by applicable law or agreed to in writing, software | |
* distributed under the License is distributed on an "AS IS" BASIS, | |
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
* See the License for the specific language governing permissions and | |
* limitations under the License. | |
* | |
**/ | |
'use client'; | |
import { createContext, useState, useContext } from 'react'; | |
import { Task, Data } from '@/src/types'; | |
interface DataStoreContext { | |
item: Data | undefined; | |
set: (data: Data) => void; | |
taskMap: Map<string, Task> | undefined; | |
updateTask: (taskId: string, update: {}) => void; | |
} | |
export const DataStore = createContext<DataStoreContext>({ | |
item: undefined, | |
set(data) {}, | |
taskMap: new Map<string, Task>(), | |
updateTask(taskId, update) {}, | |
}); | |
export function DataStoreProvider({ children }: { children: any }) { | |
const [item, setItem] = useState<Data>(); | |
const [taskMap, setTaskMap] = useState<Map<string, Task>>(); | |
const set = (data: Data) => { | |
// Step 1: Set data | |
setItem(data); | |
// Step 2: Set task's map based on tasks in data | |
setTaskMap(new Map(data.tasks.map((task) => [task.taskId, task]))); | |
}; | |
const updateTask = (taskId: string, update: {}) => { | |
const task = taskMap?.get(taskId); | |
if (task) { | |
setTaskMap(new Map(taskMap?.set(taskId, { ...task, ...update }))); | |
} | |
}; | |
return ( | |
<DataStore.Provider | |
value={{ item: item, set: set, taskMap: taskMap, updateTask: updateTask }} | |
> | |
{children} | |
</DataStore.Provider> | |
); | |
} | |
export function useDataStore() { | |
return useContext(DataStore); | |
} | |