Search code examples
javascriptreactjsjsxreact-dates

How can I trigger a method when end date is changed


I'm using Airbnb react-dates. I've added it to my project and it's working fine, the component looks like this:

<DateRangePicker
    startDate={this.state.startDate} // momentPropTypes.momentObj or null,
    startDateId="your_unique_start_date_id" // PropTypes.string.isRequired,
    endDate={this.state.endDate} // momentPropTypes.momentObj or null,
    endDateId="your_unique_end_date_id" // PropTypes.string.isRequired,
    onDatesChange={this.onDatesChange} // PropTypes.func.isRequired,
    focusedInput={this.state.focusedInput} // PropTypes.oneOf([START_DATE, END_DATE]) or null,
    onFocusChange={focusedInput => this.setState({ focusedInput })} // PropTypes.func.isRequired,
    daySize={50}
    noBorder={true}
    isOutsideRange={() => false}
  />

I just added it to my project, and as you can see there is my method onDatesChange and everything is fine, but I'm wondering how can I trigger some method when END_DATE is selected.

For example, I would like to filter something when the end date is touched...


Solution

  • You need to use onFocusChange and onDatesChange props of <DateRangePicker>, and also componentDidUpdate() React lifecycle method:

    CodeSandbox

    import React, { Component } from "react";
    import "react-dates/initialize";
    import "react-dates/lib/css/_datepicker.css";
    import { DateRangePicker } from "react-dates";
    import { START_DATE, END_DATE } from "react-dates/constants";
    
    export default class Dates extends Component {
      state = {
        startDate: null,
        endDate: null,
        focusedInput: null
      };
    
      onDatesChange = ({ startDate, endDate }) =>
        this.setState({ startDate, endDate });
    
      onFocusChange = focusedInput => this.setState({ focusedInput });
    
      componentDidUpdate(prevProps, prevState) {
        if (
          prevState.focusedInput !== this.state.focusedInput &&
          this.state.focusedInput === END_DATE
        ) {
          alert("End date is focused!"); // your code here
        }
    
        if (prevState.endDate !== this.state.endDate) {
          alert("End date is changed!"); // your code here
        }
      }
    
      render() {
        const { startDate, endDate, focusedInput } = this.state;
    
        return (
          <DateRangePicker
            startDate={startDate}
            startDateId={START_DATE}
            endDate={endDate}
            endDateId={END_DATE}
            onDatesChange={this.onDatesChange}
            focusedInput={focusedInput}
            onFocusChange={this.onFocusChange}
          />
        );
      }
    }