@oberoncms/core
Version:
OberonCMS is a cloud deployable CMS written in typescript based on the Puck visual editor
77 lines (76 loc) • 3 kB
JavaScript
"use client";
import { jsx, jsxs } from "react/jsx-runtime";
import { createContext, useMemo } from "react";
import { Toaster, toast } from "@tohuhono/ui/toast";
const ClientContext = createContext(null);
const ActionsContext = createContext(null);
function hasMessage(value) {
return typeof value === "object" && value !== null && "message" in value && typeof value.message === "string";
}
function unwrapServerAction(key, action) {
return async (...props) => {
const response = await action(...props);
if (response?.message) {
toast({
variant: response.status === "error" ? "destructive" : "default",
title: response.message
});
}
if (response?.status === "success") {
if (hasMessage(response.result)) {
toast({ title: response.result.message });
}
return response.result;
}
if (response?.status === "error") {
throw new Error(
response.message || `${String(key)}: An unknown error has occured`
);
}
throw new Error(`${String(key)}: Invalid action response`);
};
}
const OberonClientProvider = ({
children,
serverActions,
context
}) => {
const actions = useMemo(() => {
const unwrappedActions = {
addPage: unwrapServerAction("addPage", serverActions.addPage),
addImage: unwrapServerAction("addImage", serverActions.addImage),
addUser: unwrapServerAction("addUser", serverActions.addUser),
deletePage: unwrapServerAction("deletePage", serverActions.deletePage),
deleteImage: unwrapServerAction("deleteImage", serverActions.deleteImage),
deleteUser: unwrapServerAction("deleteUser", serverActions.deleteUser),
can: unwrapServerAction("can", serverActions.can),
changeRole: unwrapServerAction("changeRole", serverActions.changeRole),
getAllImages: unwrapServerAction(
"getAllImages",
serverActions.getAllImages
),
getAllPages: unwrapServerAction("getAllPages", serverActions.getAllPages),
getAllPaths: unwrapServerAction("getAllPaths", serverActions.getAllPaths),
getAllUsers: unwrapServerAction("getAllUsers", serverActions.getAllUsers),
getConfig: unwrapServerAction("getConfig", serverActions.getConfig),
getPageData: unwrapServerAction("getPageData", serverActions.getPageData),
migrateData: unwrapServerAction("migrateData", serverActions.migrateData),
publishPageData: unwrapServerAction(
"publishPageData",
serverActions.publishPageData
),
signIn: unwrapServerAction("signIn", serverActions.signIn),
signOut: unwrapServerAction("signOut", serverActions.signOut)
};
return unwrappedActions;
}, [serverActions]);
return /* @__PURE__ */ jsx(ActionsContext.Provider, { value: actions, children: /* @__PURE__ */ jsxs(ClientContext.Provider, { value: context, children: [
children,
/* @__PURE__ */ jsx(Toaster, {})
] }) });
};
export {
ActionsContext,
ClientContext,
OberonClientProvider
};