@hackplan/polaris
Version:
Shopify’s product component library
75 lines (74 loc) • 3.65 kB
JavaScript
import React from 'react';
import { ArrowLeftMinor, ArrowRightMinor } from '@shopify/polaris-icons';
import { classNames } from '../../utilities/css';
import isInputFocused from '../../utilities/isInputFocused';
import { withAppProvider } from '../AppProvider';
import Icon from '../Icon';
import UnstyledLink from '../UnstyledLink';
import Tooltip from '../Tooltip';
import KeypressListener from '../KeypressListener';
import { handleMouseUpByBlurring } from '../../utilities/focus';
import styles from './Pagination.scss';
function Pagination({ hasNext, hasPrevious, nextURL, previousURL, onNext, onPrevious, nextTooltip, previousTooltip, nextKeys, previousKeys, plain, accessibilityLabel, polaris: { intl }, }) {
const node = React.createRef();
let label;
if (accessibilityLabel) {
label = accessibilityLabel;
}
else {
label = intl.translate('Polaris.Pagination.pagination');
}
const className = classNames(styles.Pagination, plain && styles.plain);
const previousClassName = classNames(styles.Button, styles.PreviousButton);
const nextClassName = classNames(styles.Button, styles.NextButton);
const previousButton = previousURL ? (<UnstyledLink className={previousClassName} url={previousURL} onMouseUp={handleMouseUpByBlurring} aria-label={intl.translate('Polaris.Pagination.previous')} id="previousURL">
<Icon source={ArrowLeftMinor}/>
</UnstyledLink>) : (<button onClick={onPrevious} type="button" onMouseUp={handleMouseUpByBlurring} className={previousClassName} aria-label={intl.translate('Polaris.Pagination.previous')} disabled={!hasPrevious}>
<Icon source={ArrowLeftMinor}/>
</button>);
const nextButton = nextURL ? (<UnstyledLink className={nextClassName} url={nextURL} onMouseUp={handleMouseUpByBlurring} aria-label={intl.translate('Polaris.Pagination.next')} id="nextURL">
<Icon source={ArrowRightMinor}/>
</UnstyledLink>) : (<button onClick={onNext} type="button" onMouseUp={handleMouseUpByBlurring} className={nextClassName} aria-label={intl.translate('Polaris.Pagination.next')} disabled={!hasNext}>
<Icon source={ArrowRightMinor}/>
</button>);
const constructedPrevious = previousTooltip ? (<Tooltip content={previousTooltip}>{previousButton}</Tooltip>) : (previousButton);
const constructedNext = nextTooltip ? (<Tooltip content={nextTooltip}>{nextButton}</Tooltip>) : (nextButton);
const previousButtonEvents = previousKeys &&
(previousURL || onPrevious) &&
hasPrevious &&
previousKeys.map((key) => (<KeypressListener key={key} keyCode={key} handler={previousURL
? handleCallback(clickPaginationLink('previousURL', node))
: handleCallback(onPrevious)}/>));
const nextButtonEvents = nextKeys &&
(nextURL || onNext) &&
hasNext &&
nextKeys.map((key) => (<KeypressListener key={key} keyCode={key} handler={nextURL
? handleCallback(clickPaginationLink('nextURL', node))
: handleCallback(onNext)}/>));
return (<nav className={className} aria-label={label} ref={node}>
{previousButtonEvents}
{constructedPrevious}
{nextButtonEvents}
{constructedNext}
</nav>);
}
function clickPaginationLink(id, node) {
return () => {
if (node.current == null) {
return;
}
const link = node.current.querySelector(`#${id}`);
if (link) {
link.click();
}
};
}
function handleCallback(fn) {
return () => {
if (isInputFocused()) {
return;
}
fn();
};
}
export default withAppProvider()(Pagination);