nitropage
Version:
A free and open source, extensible visual page builder based on SolidStart.
61 lines (55 loc) • 1.54 kB
text/typescript
import { NitroPage } from "@prisma/client";
import { blueprintDefaults, setBlueprintDefaults } from "../../settings";
import { BlueprintDefaults, State } from "../../../../../types";
import { DEBUG_PAGE_UPDATE } from "../../util";
import { logger } from "../../log";
import { mergeElementData } from "./elementData";
import { uniq } from "es-toolkit";
const mergeBlueprintDefaults = (
target: BlueprintDefaults = {},
next: BlueprintDefaults,
prev: BlueprintDefaults = {},
) => {
let dirty = false;
const result: BlueprintDefaults = {};
const ids = uniq([...Object.keys(next), ...Object.keys(prev)]);
for (const id of ids) {
const [data, dataIsDirty] = mergeElementData(
target[id],
next[id],
prev[id],
`blueprint defaults ${id}`,
);
if (dataIsDirty) dirty = true;
result[id] = data;
}
return [result, dirty] as const;
};
const updateBlueprintDefaults = async ({
page,
state,
prevState,
}: {
page: NitroPage;
state: State;
prevState?: State;
}) => {
const dbBlueprintDefaults = (
await blueprintDefaults({
projectId: page.projectId,
})
).value;
const [nextDefaults, defaultsDirty] = mergeBlueprintDefaults(
dbBlueprintDefaults,
state.blueprintDefaults.project,
prevState?.blueprintDefaults.project,
);
if (!defaultsDirty) {
return;
}
if (DEBUG_PAGE_UPDATE) logger.info("Update blueprint defaults");
await setBlueprintDefaults(nextDefaults, {
projectId: page.projectId,
});
};
export default updateBlueprintDefaults;