DateRangePicker (из дат реакции) выдает и ошибку после реализации localStorage - PullRequest
0 голосов
/ 13 июля 2020

У меня есть простая установка DateRangePicker в моем компоненте React:

/* ========= App Dependencies ============= */
import React, { useState } from "react";
import { connect } from "react-redux";
import { DateRangePicker } from "react-dates";
import { AiFillCaretDown } from "react-icons/ai";
import { BsPlusCircleFill, BsPencilSquare } from "react-icons/bs";
import {
  setTextFilter,
  sortByDate,
  sortByPatientsName,
  setStartDate,
  setEndDate,
} from "../../store/filtersAction";
/* ========= Code ============= */
const SearchAppointments = (props) => {
  const [calendarFocused, setState] = useState(null);
  const [isAccordionOpen, setAccordion] = useState(false);

  function onDatesChange({ startDate, endDate }) {
    props.dispatch(setStartDate(startDate));
    props.dispatch(setEndDate(endDate));
  }
  function onFocusChange(calendarFocused) {
    setState(() => calendarFocused);
  }
  const toggleAccordion = () => setAccordion(!isAccordionOpen);

  return (
    <article className="appointments-article">
      <section
        className={isAccordionOpen ? "accordion accordion-open" : "accordion"}
      >
        <header className="accordion__header">
          <h2 className="accordion__heading h-heading-styles">
            Search Appointments
          </h2>
          <BsPlusCircleFill className="plus-circle" onClick={toggleAccordion} />
        </header>
        <div
          className={
            isAccordionOpen
              ? "accordion__body js-accordion-open-search"
              : "accordion__body"
          }
        >
          <div className="searchblock">
            <input
              className="searchblock__input"
              placeholder="Search appointments"
              type="text"
              value={props.filters.text}
              onChange={(e) => {
                props.dispatch(setTextFilter(e.target.value));
              }}
            />
            <div className="searchblock__select-wrapper">
              <select
                className="searchblock__select-btn h-btn-styles"
                value={props.filters.sortBy}
                onChange={(e) => {
                  if (e.target.value === "date") {
                    props.dispatch(sortByDate());
                  } else if (e.target.value === "patient's name") {
                    props.dispatch(sortByPatientsName());
                  }
                }}
              >
                <option value="date">Date</option>
                <option value="patient's name">Name</option>
              </select>
              <AiFillCaretDown className="caret-down" />
            </div>
          </div>

          <div className="datepicker-block">
            <DateRangePicker
              startDate={props.filters.startDate}
              endDate={props.filters.endDate}
              onDatesChange={onDatesChange}
              focusedInput={calendarFocused}
              onFocusChange={onFocusChange}
              startDateId={"dwjkhqkehwqjkeq"}
              endDateId={"cxzvcxbzbczxbz"}
              showClearDates={true}
              numberOfMonths={1}
              isOutsideRange={() => false}
              daySize={33}
            />
          </div>
        </div>
      </section>
    </article>
  );
};

const mapStateToProps = (state) => {
  return {
    filters: state.filters,
  };
};
export default connect(mapStateToProps)(SearchAppointments);

У меня также есть конфигурация хранилища Redux, в которой я реализовал localStorage:

import { createStore, combineReducers } from "redux";
import appointmentsReducer from "./appointmentsReducer";
import filtersReducer from "./filtersReducer";

/* =================================================
=========== STORE CONFIGURATION ================
================================================= */
const appName = "Appointments_Schedulling_App";
//localStorage.clear();
function saveToLocalStorage(state) {
  try {
    const serializedState = JSON.stringify(state);
    localStorage.setItem("state", serializedState);
  } catch (e) {
    console.log(e);
  }
}
function loadFromLocalStorage() {
  try {
    const serializedState = localStorage.getItem("state");
    if (serializedState === null) return undefined;
    return JSON.parse(serializedState);
  } catch (e) {
    console.log(e);
    return undefined;
  }
}
const rootReducer = combineReducers({
  appointments: appointmentsReducer,
  filters: filtersReducer,
});
const persistedState = loadFromLocalStorage();

const store = createStore(
  rootReducer,
  persistedState,
  window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__()
);
store.subscribe(() => saveToLocalStorage(store.getState()));
export default store;

Однако после реализации локального хранилища , Я получаю сообщение об ошибке в консоли, которое выглядит следующим образом::

Предупреждение: Неудачный тип опоры: Недействительный тип ввода: startDate типа string передано withStyles(DateRangePicker), ожидается object. в withStyles (DateRangePicker) (создается SearchAppointments) в SearchAppointments (создается ConnectFunction) в ConnectFunction (создается AppointmentsDashboardPage) в статье (создается AppointmentsDashboardPage) в div (создается AppointmentsDashboardPage) в AppointmentsDashboardPage (создается Context.Consumer) созданный AppRouter) в Switch (созданный AppRouter) в div (созданный AppRouter) в Router (созданный BrowserRouter) в BrowserRouter (созданный AppRouter) в AppRouter в Provider

Если я закомментирую persistedState переменной в моем магазине Redux, все возвращается в нормальное русло. Поэтому я подозреваю, что что-то не так с моей реализацией локального хранилища, но раньше я мало работал с ней, поэтому я не имею понятия, что может быть не так. Есть идеи, как это исправить?

...