UNPKG

dash-core-components

Version:

Core component suite for Dash

81 lines (79 loc) 2.28 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _propTypes = _interopRequireDefault(require("prop-types")); var _react = require("react"); var _base64Js = require("base64-js"); var _fileSaver = require("file-saver"); function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } var getValue = (src, fallback, key) => key in src ? src[key] : fallback[key]; /** * The Download component opens a download dialog when the data property changes. */ class Download extends _react.Component { componentDidUpdate(prevProps) { var data = this.props.data; // If the data hasn't changed, do nothing. if (!data || data === prevProps.data) { return; } // Extract options from data if provided, fallback to props. var type = getValue(data, this.props, 'type'); var base64 = getValue(data, this.props, 'base64'); // Invoke the download using a Blob. var content = base64 ? (0, _base64Js.toByteArray)(data.content) : data.content; var blob = new Blob([content], { type: type }); (0, _fileSaver.saveAs)(blob, data.filename); } render() { return null; } } exports.default = Download; Download.propTypes = { /** * The ID of this component, used to identify dash components in callbacks. */ id: _propTypes.default.string, /** * On change, a download is invoked. */ data: _propTypes.default.exact({ /** * Suggested filename in the download dialogue. */ filename: _propTypes.default.string.isRequired, /** * File content. */ content: _propTypes.default.string.isRequired, /** * Set to true, when data is base64 encoded. */ base64: _propTypes.default.bool, /** * Blob type, usually a MIME-type. */ type: _propTypes.default.string }), /** * Default value for base64, used when not set as part of the data property. */ base64: _propTypes.default.bool, /** * Default value for type, used when not set as part of the data property. */ type: _propTypes.default.string, /** * Dash-supplied function for updating props. */ setProps: _propTypes.default.func }; Download.defaultProps = { type: 'text/plain', base64: false };