nitropage
Version:
A free and open source, extensible visual page builder based on SolidStart.
104 lines (92 loc) • 2.34 kB
text/typescript
import { State } from "#../types";
import { NitroPage } from "@prisma/client";
import { difference, isEqual, omit } from "es-toolkit";
import { logger } from "../../log";
import {
colors,
rteTextColors,
setColors,
setRteTextColors,
} from "../../settings";
import { DEBUG_PAGE_UPDATE } from "../../util";
export const updateColors = async ({
page,
state,
prevState,
}: {
page: NitroPage;
state: State;
prevState?: State;
}) => {
if (isEqual(state.colors, prevState?.colors)) {
return;
}
if (DEBUG_PAGE_UPDATE) logger.info("Update color presets");
let nextColors =
(
await colors({
projectId: page.projectId,
})
).value ?? {};
for (const id of Object.keys(state.colors)) {
const color = state.colors[id];
const prevColor = prevState?.colors[id];
if (!nextColors[id]) {
nextColors[id] = color;
continue;
}
if (!isEqual(color.light, prevColor?.light)) {
nextColors[id].light = color.light;
}
if (!isEqual(color.dark, prevColor?.dark)) {
nextColors[id].dark = color.dark;
}
}
const deletedColors = difference(
Object.keys(prevState?.colors ?? {}),
Object.keys(state.colors),
);
nextColors = omit(nextColors, deletedColors);
await setColors(nextColors, {
projectId: page.projectId,
});
};
export const updateRteColors = async ({
page,
state,
prevState,
}: {
page: NitroPage;
state: State;
prevState?: State;
}) => {
if (isEqual(state.richtext.textColors, prevState?.richtext.textColors)) {
return;
}
if (DEBUG_PAGE_UPDATE) logger.info("Update richtext colors");
let nextColors =
(
await rteTextColors({
projectId: page.projectId,
})
).value ?? {};
for (const id of Object.keys(state.richtext.textColors)) {
const color = state.richtext.textColors[id];
const prevColor = prevState?.richtext.textColors[id];
if (isEqual(color, prevColor)) {
continue;
}
nextColors[id] = color;
}
const deletedColors = difference(
Object.keys(prevState?.richtext.textColors ?? {}),
Object.keys(state.richtext.textColors),
);
nextColors = omit(nextColors, deletedColors);
await setRteTextColors(
Object.keys(nextColors).length ? nextColors : undefined,
{
projectId: page.projectId,
},
);
};