Как хранить и форматировать даты в Firebase (ReactJS / Firebase Realtime Database)? - PullRequest
0 голосов
/ 03 августа 2020

Я пытаюсь отформатировать и сохранить даты в Firebase. В настоящее время я использую ReactJS, response-datepicker и moment. js.

У меня есть продукты с датами выпуска. Я хотел бы иметь возможность выбрать дату при публикации нового продукта, сохранить ее в базе данных и иметь возможность упорядочивать по датам все мои продукты позже.

Я начинаю в React и никогда не использовал даты before!

В настоящее время мой компонент выглядит так:

import React, { Component } from 'react';
import Popup from './Popup';
import actions from '../../actions';
import DatePicker, { registerLocale, setDefaultLocale } from 'react-datepicker';
import * as moment from 'moment';
import 'moment/locale/fr';
import fr from 'date-fns/locale/fr';
registerLocale('fr', fr);
import 'react-datepicker/dist/react-datepicker.css';

class PostPopup extends Component {
  constructor() {
    super();
    this.state = {
      isRaffle: false,
      brands: '',
      sellers: [],
      releaseDate: new Date(),
    };

    this.handleCheck = this.handleCheck.bind(this);
    this.handleSelect = this.handleSelect.bind(this);
    this.handleSellers = this.handleSellers.bind(this);
    this.handleReleaseDate = this.handleReleaseDate.bind(this);
  }

  handleReleaseDate = (date) => {
    this.setState({
      releaseDate: date,
    });
  };

  handlePost = () => {
    const newProduct = {
      name: this.refs.productName.value,
      tagline: this.refs.productTagline.value,
      releaseDate: this.state.releaseDate,
      isRaffle: this.refs.checkRaffle.checked,
      productDescription: this.refs.productDescription.value,
      thumbnail: this.refs.productThumbnail.value,
      media: this.refs.productMedia.value,
      upvote: 0,
      brands: this.state.brands,
      sellers: this.state.sellers,
      publisher: {
        name: this.props.user.name,
        avatar: this.props.user.avatar,
      },
    };

    actions.addProduct(newProduct);
  };

  handleCheck = (event) => {
    const target = event.target;
    const value = target.value;

    if (target.checked) {
      this.setState({ isRaffle: true });
    } else {
      this.setState({ isRaffle: false });
    }
  };

  handleSelect = (e) => {
    this.setState({ brands: e.target.value });
  };

  handleSellers = (e) => {
    const target = e.target;
    var value = target.value;

    if (target.checked) {
      this.state.sellers[value] = true;
      this.setState({ state: this.state });
    } else {
      this.state.sellers[value] = false;
      // this.state.sellers.splice(value, 1);
      // this.state.sellers.every(seller => Object.key)
      this.setState({ state: this.state });
    }
  };

  render() {
    var message = 'You selected ' + this.state.brands;
    // console.log(this.state.isRaffle);
    // console.log(this.state.brands);
    // console.log(this.state.sellers);

    return (
      <Popup {...this.props} style="post-popup">
        <header>Mettre un produit en ligne</header>
        <section className="post-popup_content">
          <form>
            <div className="form-row">
              <div className="form-group col-md-6">
                <label htmlFor="inputName">Nom du produit</label>
                <input
                  type="productName"
                  ref="productName"
                  className="form-control"
                  id="inputName"
                  aria-describedby="inputName"
                  placeholder="Entrez le nom du produit.."
                  maxLength="40"
                ></input>
                <small id="emailHelp" className="form-text text-muted">
                  40 caractères maximum
                </small>
              </div>

              <div className="from-group col-md-6">
                <label htmlFor="productBrands">Marque du produit</label>
                <select
                  className="form-control"
                  ref="productBrands"
                  id="productBrands"
                  value={this.state.brands}
                  onChange={this.handleSelect}
                >
                  <option value="">Sélectionner...</option>
                  <option value="Nike">Nike</option>
                  <option value="Puma">Puma</option>
                </select>
                <p>{message}</p>
              </div>
            </div>

            <div className="form-row">
              <div className="form-group col-md-6">
                <label htmlFor="inputReleaseDate">Date de sortie du produit</label>
                <DatePicker
                  selected={this.state.releaseDate}
                  onChange={this.handleReleaseDate}
                  name="releaseDate"
                  locale="fr"
                  dateFormat="dd/MM/yyyy"
                  defaultValue={this.state.releaseDate}
                />
                <button className="btn btn-primary">Date</button>
                {console.log(this.state.releaseDate)}
              </div>

              <div className="form-check col-md-6 pl-5">
                <input
                  className="form-check-input"
                  type="checkbox"
                  value=""
                  id="checkRaffle"
                  ref="checkRaffle"
                  onChange={this.handleCheck}
                ></input>
                <label className="form-check-label" htmlFor="checkRaffle">
                  Sortie en RAFFLE
                </label>
              </div>
            </div>

            <div className="form-group">
              <label htmlFor="inputTagline">Tagline du produit</label>
              <input
                type="productTagline"
                ref="productTagline"
                className="form-control"
                id="inputTagline"
                aria-describedby="inputTagline"
                placeholder="Tagline du produit"
                maxLength="60"
              ></input>
              <small id="emailHelp" className="form-text text-muted">
                60 caractères maximum
              </small>
            </div>

            <div className="form-group">
              <label htmlFor="inputDescription">Description du produit</label>
              <input
                type="productDescription"
                ref="productDescription"
                className="form-control"
                id="inputDescription"
                aria-describedby="inputDescription"
                placeholder="Description du produit"
                maxLength="260"
              ></input>
              <small id="emailHelp" className="form-text text-muted">
                260 caractères maximum
              </small>
            </div>

            <div className="form-group">
              <label htmlFor="inputThumbnail">Thumbnail produit</label>
              <input
                type="productThumbnail"
                ref="productThumbnail"
                className="form-control"
                id="inputThumbnail"
                aria-describedby="inputThumbnail"
                placeholder="Lien vers l'image (https://www...)"
              ></input>
            </div>

            <div className="form-group">
              <label htmlFor="inputMedia">Image produit</label>
              <input
                type="productMedia"
                ref="productMedia"
                className="form-control"
                id="inputMedia"
                aria-describedby="inputMedia"
                placeholder="Lien vers l'image (https://www...)"
              ></input>
            </div>

            <div className="form-row">
              <div className="form-group col-md-6">
                <label>Vendeurs :</label>
                <br />
                <div className="form-check form-check-inline">
                  <input
                    className="form-check-input"
                    type="checkbox"
                    name="sellers"
                    id="sellerCheckbox1"
                    value="Nike"
                    onChange={this.handleSellers}
                  />
                  <label className="form-check-label" htmlFor="sellerCheckbox1">
                    Nike
                  </label>
                </div>

                <div className="form-check form-check-inline">
                  <input
                    className="form-check-input"
                    type="checkbox"
                    name="sellers"
                    id="sellerCheckbox2"
                    value="Opium Paris"
                    onChange={this.handleSellers}
                  />
                  <label className="form-check-label" htmlFor="sellerCheckbox2">
                    Opium Paris
                  </label>
                </div>

                <div className="form-check form-check-inline">
                  <input
                    className="form-check-input"
                    type="checkbox"
                    name="sellers"
                    id="sellerCheckbox3"
                    value="Puma"
                    onChange={this.handleSellers}
                  />
                  <label className="form-check-label" htmlFor="sellerCheckbox3">
                    Puma
                  </label>
                </div>
              </div>
            </div>

            <button type="submit" className="btn btn-primary" onClick={this.handlePost}>
              Envoyer
            </button>
          </form>
        </section>
      </Popup>
    );
  }
}

export default PostPopup;

Когда я console.log(this.state.releaseDate), я получаю в консоли следующий формат: Mon Aug 03 2020 17:59:54 GMT+0200 (Central European Summer Time).

Первая проблема: когда я отправляю свою форму, продукт появляется в базе данных, НО нет даты выпуска.

Одна вещь, которую я пробовал, - это добавить .toString () в мою функцию handlePost: releaseDate: this.state.releaseDate. При этом дата сохраняется, но в этом странном формате.

У меня есть 2 вопроса:

  • Как я могу отформатировать ее, чтобы я мог, например, иметь "DD-MM- ГГГГ ЧЧ: ММ "? Я могу изменить dateFormat в своем компоненте DatePicker, но console.log по-прежнему имеет тот же формат (например, пятница, 14 августа 2020 г., 18:15:42 GMT + 0200 (Центральноевропейское летнее время))
  • Могу ли я еще сортировать мои предметы, если я храню даты в виде строки? Думаю, нет .. Но как тогда я могу правильно хранить даты в firebase? Если я не использую .toString (), при отправке
ничего не сохраняется.
...