@airplane/views
Version:
A React library for building Airplane views. Views components are optimized in style and functionality to produce internal apps that are easy to build and maintain.
58 lines (57 loc) • 1.6 kB
JavaScript
import { jsx } from "react/jsx-runtime";
import { useState, useEffect, useCallback } from "react";
import { sanitizeMessage } from "../../message/sanitizeMessage.js";
import { sendViewMessage } from "../../message/sendViewMessage.js";
import { ComponentStateContext } from "./context.js";
const ComponentStateProvider = ({
children
}) => {
const [components, setComponents] = useState({});
useEffect(() => {
try {
const state = sanitizeMessage(components);
sendViewMessage({
type: "component_state",
state
});
} catch (e) {
if (e instanceof DOMException && e.name === "DataCloneError") {
sendViewMessage({
type: "component_state",
state: {},
error: e.message
});
return;
}
throw e;
}
}, [components]);
const updateComponent = useCallback((id, state) => {
setComponents((currentComponents) => ({
...currentComponents,
[id]: state
}));
}, []);
const removeComponent = useCallback((id) => {
setComponents((currentComponents) => {
const hasComponent = currentComponents[id];
if (!hasComponent)
return currentComponents;
const newComponents = {
...currentComponents
};
delete newComponents[id];
return newComponents;
});
}, []);
const context = {
components,
updateComponent,
removeComponent
};
return /* @__PURE__ */ jsx(ComponentStateContext.Provider, { value: context, children });
};
export {
ComponentStateProvider
};
//# sourceMappingURL=ComponentStateProvider.js.map