react-dates-rtl
Version:
Based on react-dates by airbnb [with RTL support]
155 lines (137 loc) • 4.22 kB
JSX
import React from 'react';
import PropTypes from 'prop-types';
import { forbidExtraProps } from 'airbnb-prop-types';
import cx from 'classnames';
import { SingleDatePickerInputPhrases } from '../defaultPhrases';
import getPhrasePropTypes from '../utils/getPhrasePropTypes';
import DateInput from './DateInput';
import CloseButton from '../svg/close.svg';
const propTypes = forbidExtraProps({
id: PropTypes.string.isRequired,
placeholder: PropTypes.string, // also used as label
displayValue: PropTypes.string,
inputValue: PropTypes.string,
screenReaderMessage: PropTypes.string,
focused: PropTypes.bool,
isFocused: PropTypes.bool, // describes actual DOM focus
disabled: PropTypes.bool,
required: PropTypes.bool,
showCaret: PropTypes.bool,
showClearDate: PropTypes.bool,
customCloseIcon: PropTypes.node,
onChange: PropTypes.func,
onClearDate: PropTypes.func,
onFocus: PropTypes.func,
onKeyDownShiftTab: PropTypes.func,
onKeyDownTab: PropTypes.func,
onKeyDownArrowDown: PropTypes.func,
// i18n
phrases: PropTypes.shape(getPhrasePropTypes(SingleDatePickerInputPhrases)),
});
const defaultProps = {
placeholder: 'Select Date',
displayValue: '',
inputValue: '',
screenReaderMessage: '',
focused: false,
isFocused: false,
disabled: false,
required: false,
showCaret: false,
showClearDate: false,
customCloseIcon: null,
onChange() {},
onClearDate() {},
onFocus() {},
onKeyDownShiftTab() {},
onKeyDownTab() {},
onKeyDownArrowDown() {},
// i18n
phrases: SingleDatePickerInputPhrases,
};
export default class SingleDatePickerInput extends React.Component {
constructor(props) {
super(props);
this.state = {
isClearDateHovered: false,
};
this.onClearDateMouseEnter = this.onClearDateMouseEnter.bind(this);
this.onClearDateMouseLeave = this.onClearDateMouseLeave.bind(this);
}
onClearDateMouseEnter() {
this.setState({
isClearDateHovered: true,
});
}
onClearDateMouseLeave() {
this.setState({
isClearDateHovered: false,
});
}
render() {
const { isClearDateHovered } = this.state;
const {
id,
placeholder,
displayValue,
inputValue,
focused,
isFocused,
disabled,
required,
showCaret,
showClearDate,
phrases,
onClearDate,
onChange,
onFocus,
onKeyDownShiftTab,
onKeyDownTab,
onKeyDownArrowDown,
screenReaderMessage,
customCloseIcon,
} = this.props;
const closeIcon = customCloseIcon || (<CloseButton />);
const screenReaderText = screenReaderMessage || phrases.keyboardNavigationInstructions;
return (
<div className="SingleDatePickerInput">
<DateInput
id={id}
placeholder={placeholder} // also used as label
displayValue={displayValue}
inputValue={inputValue}
screenReaderMessage={screenReaderText}
focused={focused}
isFocused={isFocused}
disabled={disabled}
required={required}
showCaret={showCaret}
onChange={onChange}
onFocus={onFocus}
onKeyDownShiftTab={onKeyDownShiftTab}
onKeyDownTab={onKeyDownTab}
onKeyDownArrowDown={onKeyDownArrowDown}
/>
{showClearDate && (
<button
type="button"
className={cx('SingleDatePickerInput__clear-date', {
'SingleDatePickerInput__clear-date--hide': !displayValue,
'SingleDatePickerInput__clear-date--hover': isClearDateHovered,
})}
aria-label={phrases.clearDate}
onMouseEnter={this.onClearDateMouseEnter}
onMouseLeave={this.onClearDateMouseLeave}
onClick={onClearDate}
>
<div className="DateRangePickerInput__close">
{closeIcon}
</div>
</button>
)}
</div>
);
}
}
SingleDatePickerInput.propTypes = propTypes;
SingleDatePickerInput.defaultProps = defaultProps;