import { types } from "mobx-state-tree";
|
import { CustomJSON, StringOrNumberID } from "./types";
|
|
const registry = new Map();
|
|
export const registerModel = (name, model) => {
|
registry.set(name, model);
|
};
|
|
export const DynamicModel = (name, columns, properties) => {
|
const modelProperties = {};
|
|
const typeWrapper = (type) => types.optional(types.maybeNull(type), null);
|
|
columns?.forEach((col) => {
|
if (col.parent || col.id === "id") return;
|
|
let propertyType;
|
|
switch (col.type) {
|
case "Number":
|
propertyType = typeWrapper(types.number);
|
break;
|
case "Boolean":
|
propertyType = typeWrapper(types.boolean);
|
break;
|
case "List":
|
propertyType = typeWrapper(CustomJSON);
|
break;
|
default:
|
propertyType = typeWrapper(types.union(types.string, types.number));
|
break;
|
}
|
modelProperties[col.id] = propertyType;
|
});
|
|
Object.assign(modelProperties, {
|
id: StringOrNumberID,
|
...(properties ?? {}),
|
});
|
|
const model = types.model(name, modelProperties);
|
|
registerModel(name, types.model(name, modelProperties));
|
|
return model;
|
};
|
|
DynamicModel.get = (name) => {
|
return registry.get(name);
|
};
|