streetmix/streetmix

View on GitHub
client/src/app/WelcomePanel/NewStreet.jsx

Summary

Maintainability
C
1 day
Test Coverage
import React, { useState } from 'react'
import { useSelector, useDispatch } from 'react-redux'
import { FormattedMessage } from 'react-intl'
import { NEW_STREET_DEFAULT, NEW_STREET_EMPTY } from '../../streets/constants'
import {
  onNewStreetDefaultClick,
  onNewStreetEmptyClick
} from '../../streets/creation'
import { getLastStreet } from '../../store/actions/street'

function NewStreet (props) {
  const newStreetPreference = useSelector(
    (state) => state.settings.newStreetPreference
  )
  const priorLastStreetId = useSelector((state) => state.app.priorLastStreetId)
  const street = useSelector((state) => state.street)
  const dispatch = useDispatch()

  // If welcomeType is WELCOME_NEW_STREET, there is an additional state
  // property that determines which of the new street modes is selected
  let selectedNewStreetType
  switch (newStreetPreference) {
    case NEW_STREET_EMPTY:
      selectedNewStreetType = 'new-street-empty'
      break
    case NEW_STREET_DEFAULT:
    default:
      selectedNewStreetType = 'new-street-default'
      break
  }

  const [state, setState] = useState({ selectedNewStreetType })

  // Handles changing the "checked" state of the input buttons.
  function handleChangeNewStreetType (event) {
    setState({
      selectedNewStreetType: event.target.id
    })
  }

  function handleGetLastStreet (event) {
    dispatch(getLastStreet())
  }

  return (
    <div className="welcome-panel-content new-street">
      <h1>
        <FormattedMessage
          id="dialogs.new-street.heading"
          defaultMessage="Here’s your new street."
        />
      </h1>
      <ul>
        <li>
          <input
            type="radio"
            name="new-street"
            id="new-street-default"
            checked={
              state.selectedNewStreetType === 'new-street-default' ||
              !state.selectedNewStreetType
            }
            onChange={handleChangeNewStreetType}
            onClick={onNewStreetDefaultClick}
          />
          <label htmlFor="new-street-default">
            <FormattedMessage
              id="dialogs.new-street.default"
              defaultMessage="Start with an example street"
            />
          </label>
        </li>
        <li>
          <input
            type="radio"
            name="new-street"
            id="new-street-empty"
            checked={state.selectedNewStreetType === 'new-street-empty'}
            onChange={handleChangeNewStreetType}
            onClick={onNewStreetEmptyClick}
          />
          <label htmlFor="new-street-empty">
            <FormattedMessage
              id="dialogs.new-street.empty"
              defaultMessage="Start with an empty street"
            />
          </label>
        </li>
        {/* Display this button only if there is a previous street to copy
            from that is not the same as the current street */}
        {priorLastStreetId && priorLastStreetId !== street.id && (
          <li>
            <input
              type="radio"
              name="new-street"
              id="new-street-last"
              checked={state.selectedNewStreetType === 'new-street-last'}
              onChange={handleChangeNewStreetType}
              onClick={handleGetLastStreet}
            />
            <label htmlFor="new-street-last">
              <FormattedMessage
                id="dialogs.new-street.last"
                defaultMessage="Start with a copy of last street"
              />
            </label>
          </li>
        )}
      </ul>
    </div>
  )
}

export default NewStreet