import { Component } from 'react'; import cx from 'classnames'; import { Optional } from 'utility-types'; import Button, { IButtonProps } from '../../../button'; import Pop, { IPopProps } from '../../../pop'; import Icon from '../../../icon'; export interface IPaginationArrowButtonProps { direction: 'left' | 'right'; double?: boolean; active?: boolean; bordered?: boolean; disabled?: boolean; disabledHelp?: IPopProps; onClick?: React.MouseEventHandler; } interface IPaginationDoubleArrowButtonState { showArrow: boolean; prevActive: boolean; } const DEFAULT_DISABLED_POP_PROPS: Optional = { position: 'top-right', trigger: 'hover', centerArrow: true, }; export class ArrowButton extends Component< IPaginationArrowButtonProps & Partial > { static defaultProps = { double: false, active: false, bordered: true, }; render() { const { direction, double, active, bordered, disabledHelp, ...rest } = this.props; if (double) { return ( ); } let Arrow = null as unknown as React.FC; if (direction === 'left') { Arrow = LeftArrow; } else if (direction === 'right') { Arrow = RightArrow; } const btn = ( ); if (disabledHelp && rest.disabled) { const popProps = { ...DEFAULT_DISABLED_POP_PROPS, ...disabledHelp }; if (popProps.trigger === 'hover') { // Required when using disabled elements as Pop's children popProps.fixMouseEventsOnDisabledChildren = true; } return {btn}; } return btn; } } class DoubleArrowButton extends Component< IPaginationArrowButtonProps & Partial, IPaginationDoubleArrowButtonState > { static defaultProps = { double: false, active: false, bordered: true, }; state = { showArrow: false, prevActive: false, }; render() { const { direction, active, bordered, double: _, ...rest } = this.props; const { showArrow } = this.state; let Arrow = null as unknown as React.FC; if (direction === 'left') { Arrow = LeftDoubleArrow; } else if (direction === 'right') { Arrow = RightDoubleArrow; } const isActive = showArrow; return ( ); } static getDerivedStateFromProps( props: IPaginationArrowButtonProps & Partial, state: IPaginationDoubleArrowButtonState ) { const { active } = props; const stateDiff = { prevActive: active, showArrow: state.showArrow, } as IPaginationDoubleArrowButtonState; if (active !== state.prevActive) { stateDiff.showArrow = !!active; } return stateDiff; } onMouseOver = () => { this.setState({ showArrow: true, }); }; onMouseOut = () => { this.setState({ showArrow: false, }); }; } function LeftArrow() { return ; } function RightArrow() { return ; } function LeftDoubleArrow() { return ; } function RightDoubleArrow() { return ; } export default ArrowButton;