UNPKG

react-bpmn

Version:

Embed BPMN 2.0 diagrams in your React app

118 lines (84 loc) 2.13 kB
import React from 'react'; import BpmnJS from 'bpmn-js/dist/bpmn-navigated-viewer.production.min.js'; export default class ReactBpmn extends React.Component { constructor(props) { super(props); this.state = { }; this.containerRef = React.createRef(); } componentDidMount() { const { url, diagramXML } = this.props; const container = this.containerRef.current; this.bpmnViewer = new BpmnJS({ container }); this.bpmnViewer.on('import.done', (event) => { const { error, warnings } = event; if (error) { return this.handleError(error); } this.bpmnViewer.get('canvas').zoom('fit-viewport'); return this.handleShown(warnings); }); if (url) { return this.fetchDiagram(url); } if (diagramXML) { return this.displayDiagram(diagramXML); } } componentWillUnmount() { this.bpmnViewer.destroy(); } componentDidUpdate(prevProps, prevState) { const { props, state } = this; if (props.url !== prevProps.url) { return this.fetchDiagram(props.url); } const currentXML = props.diagramXML || state.diagramXML; const previousXML = prevProps.diagramXML || prevState.diagramXML; if (currentXML && currentXML !== previousXML) { return this.displayDiagram(currentXML); } } displayDiagram(diagramXML) { this.bpmnViewer.importXML(diagramXML); } fetchDiagram(url) { this.handleLoading(); fetch(url) .then(response => response.text()) .then(text => this.setState({ diagramXML: text })) .catch(err => this.handleError(err)); } handleLoading() { const { onLoading } = this.props; if (onLoading) { onLoading(); } } handleError(err) { const { onError } = this.props; if (onError) { onError(err); } } handleShown(warnings) { const { onShown } = this.props; if (onShown) { onShown(warnings); } } render() { return ( <div className="react-bpmn-diagram-container" ref={ this.containerRef }></div> ); } }