UNPKG

@peergrade/react-pdf

Version:

Display PDFs in your React app as easily as if they were images.

509 lines (404 loc) 14.7 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.PageInternal = undefined; var _extends2 = require('babel-runtime/helpers/extends'); var _extends3 = _interopRequireDefault(_extends2); var _regenerator = require('babel-runtime/regenerator'); var _regenerator2 = _interopRequireDefault(_regenerator); var _asyncToGenerator2 = require('babel-runtime/helpers/asyncToGenerator'); var _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2); var _getPrototypeOf = require('babel-runtime/core-js/object/get-prototype-of'); var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf); var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck'); var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); var _createClass2 = require('babel-runtime/helpers/createClass'); var _createClass3 = _interopRequireDefault(_createClass2); var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn'); var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2); var _inherits2 = require('babel-runtime/helpers/inherits'); var _inherits3 = _interopRequireDefault(_inherits2); var _react = require('react'); var _react2 = _interopRequireDefault(_react); var _propTypes = require('prop-types'); var _propTypes2 = _interopRequireDefault(_propTypes); var _mergeClassNames = require('merge-class-names'); var _mergeClassNames2 = _interopRequireDefault(_mergeClassNames); var _DocumentContext = require('./DocumentContext'); var _DocumentContext2 = _interopRequireDefault(_DocumentContext); var _PageContext = require('./PageContext'); var _PageContext2 = _interopRequireDefault(_PageContext); var _PageCanvas = require('./Page/PageCanvas'); var _PageCanvas2 = _interopRequireDefault(_PageCanvas); var _PageSVG = require('./Page/PageSVG'); var _PageSVG2 = _interopRequireDefault(_PageSVG); var _TextLayer = require('./Page/TextLayer'); var _TextLayer2 = _interopRequireDefault(_TextLayer); var _AnnotationLayer = require('./Page/AnnotationLayer'); var _AnnotationLayer2 = _interopRequireDefault(_AnnotationLayer); var _utils = require('./shared/utils'); var _events = require('./shared/events'); var _propTypes3 = require('./shared/propTypes'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var PageInternal = exports.PageInternal = function (_PureComponent) { (0, _inherits3.default)(PageInternal, _PureComponent); function PageInternal() { var _ref, _this2 = this; var _temp, _this, _ret; (0, _classCallCheck3.default)(this, PageInternal); for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } return _ret = (_temp = (_this = (0, _possibleConstructorReturn3.default)(this, (_ref = PageInternal.__proto__ || (0, _getPrototypeOf2.default)(PageInternal)).call.apply(_ref, [this].concat(args))), _this), _this.state = { page: null }, _this.onLoadSuccess = function () { (0, _utils.callIfDefined)(_this.props.onLoadSuccess, (0, _utils.makePageCallback)(_this.state.page, _this.scale)); (0, _utils.callIfDefined)(_this.props.registerPage, _this.pageIndex, _this.ref); }, _this.onLoadError = function (error) { if (error.name === 'RenderingCancelledException' || error.name === 'PromiseCancelledException') { return; } (0, _utils.errorOnDev)(error); (0, _utils.callIfDefined)(_this.props.onLoadError, error); }, _this.loadPage = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee() { var pdf, pageNumber, page, cancellable; return _regenerator2.default.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: pdf = _this.props.pdf; pageNumber = _this.getPageNumber(); if (pageNumber) { _context.next = 4; break; } return _context.abrupt('return'); case 4: _this.setState(function (prevState) { if (!prevState.page) { return null; } return { page: null }; }); page = null; _context.prev = 6; cancellable = (0, _utils.makeCancellable)(pdf.getPage(pageNumber)); _this.runningTask = cancellable; _context.next = 11; return cancellable.promise; case 11: page = _context.sent; _this.setState({ page: page }, _this.onLoadSuccess); _context.next = 19; break; case 15: _context.prev = 15; _context.t0 = _context['catch'](6); _this.setState({ page: false }); _this.onLoadError(_context.t0); case 19: case 'end': return _context.stop(); } } }, _callee, _this2, [[6, 15]]); })), _temp), (0, _possibleConstructorReturn3.default)(_this, _ret); } (0, _createClass3.default)(PageInternal, [{ key: 'componentDidMount', value: function componentDidMount() { if (!this.props.pdf) { throw new Error('Attempted to load a page, but no document was specified.'); } this.loadPage(); } }, { key: 'componentDidUpdate', value: function componentDidUpdate(prevProps) { if (prevProps.pdf && this.props.pdf !== prevProps.pdf || this.getPageNumber() !== this.getPageNumber(prevProps)) { (0, _utils.callIfDefined)(this.props.unregisterPage, this.getPageIndex(prevProps)); this.loadPage(); } } }, { key: 'componentWillUnmount', value: function componentWillUnmount() { (0, _utils.callIfDefined)(this.props.unregisterPage, this.pageIndex); (0, _utils.cancelRunningTask)(this.runningTask); } }, { key: 'getPageIndex', value: function getPageIndex() { var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.props; if ((0, _utils.isProvided)(props.pageNumber)) { return props.pageNumber - 1; } if ((0, _utils.isProvided)(props.pageIndex)) { return props.pageIndex; } return null; } }, { key: 'getPageNumber', value: function getPageNumber() { var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.props; if ((0, _utils.isProvided)(props.pageNumber)) { return props.pageNumber; } if ((0, _utils.isProvided)(props.pageIndex)) { return props.pageIndex + 1; } return null; } }, { key: 'renderTextLayer', value: function renderTextLayer() { var renderTextLayer = this.props.renderTextLayer; if (!renderTextLayer) { return null; } return _react2.default.createElement(_TextLayer2.default, { key: this.pageKey + '_text' }); } }, { key: 'renderAnnotations', value: function renderAnnotations() { var renderAnnotations = this.props.renderAnnotations; if (!renderAnnotations) { return null; } return _react2.default.createElement(_AnnotationLayer2.default, { key: this.pageKey + '_annotations' }); } }, { key: 'renderSVG', value: function renderSVG() { return [_react2.default.createElement(_PageSVG2.default, { key: this.pageKeyNoScale + '_svg' }), /** * As of now, PDF.js 2.0.474 returns warnings on unimplemented annotations. * Therefore, as a fallback, we render "traditional" AnnotationLayer component. */ this.renderAnnotations()]; } }, { key: 'renderCanvas', value: function renderCanvas() { return [_react2.default.createElement(_PageCanvas2.default, { key: this.pageKey + '_canvas' }), this.renderTextLayer(), this.renderAnnotations()]; } }, { key: 'renderNoData', value: function renderNoData() { return _react2.default.createElement( 'div', { className: 'react-pdf__message react-pdf__message--no-data' }, this.props.noData ); } }, { key: 'renderError', value: function renderError() { return _react2.default.createElement( 'div', { className: 'react-pdf__message react-pdf__message--error' }, this.props.error ); } }, { key: 'renderLoader', value: function renderLoader() { return _react2.default.createElement( 'div', { className: 'react-pdf__message react-pdf__message--loading' }, this.props.loading ); } }, { key: 'renderChildren', value: function renderChildren() { var _props = this.props, children = _props.children, renderMode = _props.renderMode; return _react2.default.createElement( _PageContext2.default.Provider, { value: this.childContext }, renderMode === 'svg' ? this.renderSVG() : this.renderCanvas(), children ); } }, { key: 'render', value: function render() { var _this3 = this; var pageNumber = this.pageNumber; var _props2 = this.props, className = _props2.className, pdf = _props2.pdf; var page = this.state.page; var content = void 0; if (!pageNumber) { content = this.renderNoData(); } else if (pdf === null || page === null) { content = this.renderLoader(); } else if (pdf === false || page === false) { content = this.renderError(); } else { content = this.renderChildren(); } return _react2.default.createElement( 'div', (0, _extends3.default)({ className: (0, _mergeClassNames2.default)('react-pdf__Page', className), ref: function ref(_ref3) { var inputRef = _this3.props.inputRef; if (inputRef) { inputRef(_ref3); } _this3.ref = _ref3; }, style: { position: 'relative' }, 'data-page-number': pageNumber }, this.eventProps), content ); } }, { key: 'childContext', get: function get() { if (!this.state.page) { return {}; } return { customTextRenderer: this.props.customTextRenderer, onGetAnnotationsError: this.props.onGetAnnotationsError, onGetAnnotationsSuccess: this.props.onGetAnnotationsSuccess, onGetTextError: this.props.onGetTextError, onGetTextSuccess: this.props.onGetTextSuccess, onRenderAnnotationsError: this.props.onRenderAnnotationsError, onRenderAnnotationsSuccess: this.props.onRenderAnnotationsSuccess, onRenderError: this.props.onRenderError, onRenderSuccess: this.props.onRenderSuccess, page: this.state.page, renderInteractiveForms: this.props.renderInteractiveForms, rotate: this.rotate, scale: this.scale }; } /** * Called when a page is loaded successfully */ /** * Called when a page failed to load */ }, { key: 'pageIndex', get: function get() { return this.getPageIndex(); } }, { key: 'pageNumber', get: function get() { return this.getPageNumber(); } }, { key: 'rotate', get: function get() { if ((0, _utils.isProvided)(this.props.rotate)) { return this.props.rotate; } var page = this.state.page; if (!page) { return null; } return page.rotate; } }, { key: 'scale', get: function get() { var _props3 = this.props, scale = _props3.scale, width = _props3.width; var page = this.state.page; if (!page) { return null; } var rotate = this.rotate; // Be default, we'll render page at 100% * scale width. var pageScale = 1; // If width is defined, calculate the scale of the page so it could be of desired width. if (width) { var viewport = page.getViewport(scale, rotate); pageScale = width / viewport.width; } return scale * pageScale; } }, { key: 'eventProps', get: function get() { var _this4 = this; return (0, _events.makeEventProps)(this.props, function () { if (!_this4.state.page) { return _this4.state.page; } return (0, _utils.makePageCallback)(_this4.state.page, _this4.scale); }); } }, { key: 'pageKey', get: function get() { return this.state.page.pageIndex + '@' + this.scale + '/' + this.rotate; } }, { key: 'pageKeyNoScale', get: function get() { return this.state.page.pageIndex + '/' + this.rotate; } }]); return PageInternal; }(_react.PureComponent); PageInternal.defaultProps = { error: 'Failed to load the page.', loading: 'Loading page…', noData: 'No page specified.', renderAnnotations: true, renderInteractiveForms: false, renderMode: 'canvas', renderTextLayer: true, scale: 1.0 }; PageInternal.propTypes = (0, _extends3.default)({ children: _propTypes2.default.node, className: _propTypes3.isClassName, customTextRenderer: _propTypes2.default.func, error: _propTypes2.default.string, inputRef: _propTypes2.default.func, loading: _propTypes2.default.string, noData: _propTypes2.default.node, onGetTextError: _propTypes2.default.func, onGetTextSuccess: _propTypes2.default.func, onLoadError: _propTypes2.default.func, onLoadSuccess: _propTypes2.default.func, onRenderError: _propTypes2.default.func, onRenderSuccess: _propTypes2.default.func, pageIndex: _propTypes3.isPageIndex, pageNumber: _propTypes3.isPageNumber, pdf: _propTypes3.isPdf, registerPage: _propTypes2.default.func, renderAnnotations: _propTypes2.default.bool, renderInteractiveForms: _propTypes2.default.bool, renderMode: _propTypes2.default.oneOf(['canvas', 'svg']), renderTextLayer: _propTypes2.default.bool, rotate: _propTypes3.isRotate, scale: _propTypes2.default.number, unregisterPage: _propTypes2.default.func, width: _propTypes2.default.number }, (0, _propTypes3.eventsProps)()); var Page = function Page(props) { return _react2.default.createElement( _DocumentContext2.default.Consumer, null, function (context) { return _react2.default.createElement(PageInternal, (0, _extends3.default)({}, context, props)); } ); }; exports.default = Page;