TimePickerInput.tsx 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. import React, { PureComponent, ChangeEvent } from 'react';
  2. import { TimeFragment, TIME_FORMAT, TimeZone } from '../../types/time';
  3. import { Input } from '../Input/Input';
  4. import { stringToDateTimeType, isValidTimeString } from './time';
  5. import { isDateTime } from '../../utils/moment_wrapper';
  6. export interface Props {
  7. value: TimeFragment;
  8. roundup?: boolean;
  9. timeZone?: TimeZone;
  10. onChange: (value: string, isValid: boolean) => void;
  11. tabIndex?: number;
  12. }
  13. export class TimePickerInput extends PureComponent<Props> {
  14. isValid = (value: string) => {
  15. const { timeZone, roundup } = this.props;
  16. if (value.indexOf('now') !== -1) {
  17. const isValid = isValidTimeString(value);
  18. return isValid;
  19. }
  20. const parsed = stringToDateTimeType(value, roundup, timeZone);
  21. const isValid = parsed.isValid();
  22. return isValid;
  23. };
  24. onChange = (event: ChangeEvent<HTMLInputElement>) => {
  25. const { onChange } = this.props;
  26. const value = event.target.value;
  27. onChange(value, this.isValid(value));
  28. };
  29. valueToString = (value: TimeFragment) => {
  30. if (isDateTime(value)) {
  31. return value.format(TIME_FORMAT);
  32. } else {
  33. return value;
  34. }
  35. };
  36. render() {
  37. const { value, tabIndex } = this.props;
  38. const valueString = this.valueToString(value);
  39. const error = !this.isValid(valueString);
  40. return (
  41. <Input
  42. type="text"
  43. onChange={this.onChange}
  44. onBlur={this.onChange}
  45. hideErrorMessage={true}
  46. value={valueString}
  47. className={`time-picker-input${error ? '-error' : ''}`}
  48. tabIndex={tabIndex}
  49. />
  50. );
  51. }
  52. }