dbl-components
Version:
Framework based on bootstrap 5
94 lines (74 loc) • 2.27 kB
JavaScript
import React from "react";
import PropTypes from "prop-types";
import { eventHandler, resolveRefs, deepMerge } from "dbl-utils";
import JsonRender from "../json-render";
import Container from "./container";
export default class JsonRenderContainer extends Container {
static jsClass = 'JsonRenderContainer';
static template = {
view: {}, definitions: {}
};
static propTypes = {
...Container.propTypes,
content: PropTypes.oneOfType([
PropTypes.string,
PropTypes.array,
PropTypes.object
])
}
static defaultProps = {
...Container.defaultProps,
fullWidth: true,
view: null,
childrenIn: false,
definitions: {}
}
tag = 'div';
events = [];
constructor(props) {
super(props);
Object.assign(this.state, {
});
this.jsonRender = new JsonRender(this.fixedProps, this.mutations.bind(this));
}
get fixedProps() {
return this.props;
}
get childrenIn() {
return this.props.childrenIn;
}
get theView() {
return this.constructor.template.view;
}
componentDidMount() {
super.componentDidMount();
this.events.forEach(([evtName, callback]) => eventHandler.subscribe(evtName, callback, this.name));
const definitions = deepMerge(this.constructor.template.definitions || {}, this.props.definitions);
this.templateSolved = this.props.view
? resolveRefs(this.props.view, {
template: this.theView,
definitions,
props: this.props,
state: this.state
})
: resolveRefs(this.theView, {
definitions,
props: this.props,
state: this.state
});
}
componentWillUnmount() {
super.componentWillUnmount();
this.events.forEach(([eName]) => eventHandler.unsubscribe(eName, this.name));
}
mutations(sectionName, section) {
return this.state[sectionName];
}
content(children = this.props.children) {
if (!(this.breakpoint && this.templateSolved)) return this.waitBreakpoint;
const builded = this.jsonRender.buildContent(this.templateSolved);
return !this.childrenIn
? React.createElement(React.Fragment, {}, builded, children)
: builded;
}
}