eduardomoroni/mtgx

View on GitHub
src/modules/cardSearch/containers/cardSearchContainer.js

Summary

Maintainability
A
1 hr
Test Coverage
// @flow

import React, { Component } from 'react'
import { connect } from 'react-redux'
import { reduxForm, formValueSelector } from 'redux-form/immutable'

// TODO: What about isolate realm/core access?
import { distinctValues } from '../../../services/realm/core'
import { CardSearchScreen } from '../components/cardSearchScreen'
import { queryCardByForm } from '../../../redux/thunks/cardsThunks'
import { navigatorStyle } from '../../../constants/navigation'
import { onNavigatorEvent } from '../../../configuration/navigation/deeplinks'

class CardSearchScreenContainer extends Component {
  constructor (props) {
    super(props)
    this.props.navigator.setOnNavigatorEvent(onNavigatorEvent.bind(this))
  }

  static navigatorStyle = navigatorStyle

  render () {
    const {
      set,
      sets,
      type,
      types,
      rarity,
      colors,
      format,
      formats,
      subType,
      subTypes,
      rarities,
      navigator,
      handleSubmit,
      colorsIdentity,
      submitCardSearchForm
    } = this.props

    const cardSearchProps = {
      set,
      sets,
      type,
      types,
      rarity,
      colors,
      format,
      formats,
      subType,
      subTypes,
      rarities,
      navigator,
      handleSubmit,
      colorsIdentity,
      submitCardSearchForm
    }

    return (
      <CardSearchScreen {...cardSearchProps} />
    )
  }
}

const form = 'CardSearch'

const mapStateToProps = (state) => {
  const selector = formValueSelector(form)

  const rarities = ['Common', 'Uncommon', 'Rare', 'Mythic Rare']
  const types = distinctValues('Type')
  const subTypes = distinctValues('SubType')

  types.unshift('')
  subTypes.unshift('')

  return {
    types,
    subTypes,
    rarities,
    set: selector(state, 'set'),
    type: selector(state, 'type'),
    rarity: selector(state, 'rarity'),
    format: selector(state, 'format'),
    colors: selector(state, 'colors'),
    subType: selector(state, 'subType'),
    formats: distinctValues('Legality'),
    sets: distinctValues('Printing')
  }
}

const mapDispatchToProps = (dispatch: Function) => {
  return { submitCardSearchForm: (form) => dispatch(queryCardByForm(form)) }
}

const cardSearchContainerDecorated = reduxForm({ form })(CardSearchScreenContainer)
export default connect(mapStateToProps, mapDispatchToProps)(cardSearchContainerDecorated)