drawdb/src/context/TypesContext.jsx
2024-03-13 01:27:42 +02:00

78 lines
1.7 KiB
JavaScript

import { createContext, useState } from "react";
import { Action, ObjectType } from "../data/data";
import useUndoRedo from "../hooks/useUndoRedo";
export const TypesContext = createContext(null);
export default function TypesContextProvider({ children }) {
const [types, setTypes] = useState([]);
const { setUndoStack, setRedoStack } = useUndoRedo();
const addType = (addToHistory = true, data) => {
if (data) {
setTypes((prev) => {
const temp = prev.slice();
temp.splice(data.id, 0, data);
return temp;
});
} else {
setTypes((prev) => [
...prev,
{
name: `type_${prev.length}`,
fields: [],
comment: "",
},
]);
}
if (addToHistory) {
setUndoStack((prev) => [
...prev,
{
action: Action.ADD,
element: ObjectType.TYPE,
message: `Add new type`,
},
]);
setRedoStack([]);
}
};
const deleteType = (id, addToHistory = true) => {
if (addToHistory) {
setUndoStack((prev) => [
...prev,
{
action: Action.DELETE,
element: ObjectType.TYPE,
id: id,
data: types[id],
message: `Delete type`,
},
]);
setRedoStack([]);
}
setTypes((prev) => prev.filter((e, i) => i !== id));
};
const updateType = (id, values) => {
setTypes((prev) =>
prev.map((e, i) => (i === id ? { ...e, ...values } : e))
);
};
return (
<TypesContext.Provider
value={{
types,
setTypes,
addType,
updateType,
deleteType,
}}
>
{children}
</TypesContext.Provider>
);
}