1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
| import classNames from 'classnames';
import PropTypes from 'prop-types';
import React, { Component } from 'react'; import { LiveMessage } from 'react-aria-live';
import { connect } from '../../../utils/PerfUtils'; import { bem } from '../../../utils/CssUtils';
import { selectCurrentPageIndex, selectDossierPagesCount, selectDossierNavBarTitles, selectIsShowPageIndicator } from '../dossierSelectors';
import { formatMessage } from '../../../utils/Intl/IntlUtils';
import './styles.scss';
const bemPageIndicator = bem('DossierPageIndicator');
class DossierPageIndicatorContainer extends Component {
static propTypes = { currentPageIndex: PropTypes.number, pageCount: PropTypes.number, dossierTitles: PropTypes.array, left: PropTypes.number.isRequired, isShowPageIndicator: PropTypes.bool };
constructor(props) { super(props);
this.state = { show: true }; }
componentDidMount() { this.mounted = true; this.toggleTimer.call(this); }
componentDidUpdate() { this.toggleTimer.call(this); }
componentWillUpdate(nextProps) { if (this.props.currentPageIndex !== nextProps.currentPageIndex) { this.setState({ show: true }); } }
componentWillUnmount() { this.mounted = false; }
toggleTimer() { window.clearTimeout(this.tmr);
if (this.state.show) { this.tmr = window.setTimeout( () => { if (this.mounted) { this.setState({show: false}); } }, 3000 ); } }
render() { const { currentPageIndex, pageCount, left, dossierTitles, isShowPageIndicator } = this.props; const pageInfo = formatMessage(182, 'Page {currentPage} of {totalPages}', {currentPage: currentPageIndex + 1, totalPages: pageCount});
const cls = classNames(bemPageIndicator(), { 'mstrd-show': this.state.show && currentPageIndex >= 0 && pageCount > 0 || isShowPageIndicator });
return ( <div className={cls} style={{left: left + 'px'}}> { pageInfo } {!!pageCount && !!dossierTitles.length && <LiveMessage message={`${dossierTitles[currentPageIndex].name} ${pageInfo}`} aria-live="polite"/> } </div> ); } }
function mapStateToProps(state) { return { currentPageIndex: selectCurrentPageIndex(state), pageCount: selectDossierPagesCount(state), dossierTitles: selectDossierNavBarTitles(state), isShowPageIndicator: selectIsShowPageIndicator(state) }; }
export default connect(mapStateToProps, {})(DossierPageIndicatorContainer);
|