index.js 4.05 KB
import moment from 'moment'
import React, { Component } from 'react'
import {
  View,
  ScrollView,
  Share
} from 'react-native'
import { connect } from 'react-redux'
import { HeaderBackButton } from 'react-navigation'
import { map, contains } from 'ramda'
import { Card, Divider, Text, Button } from 'react-native-elements'
import HTML from 'react-native-render-html'

import { INFO_PY_URL, ESTADOS_SOLICITUDES } from '../../constants'
import { fetchFlujo } from '../../redux/actions/solicitudes'
import { requestValoracion } from '../../redux/actions/valoraciones'
import { requestReporte } from '../../redux/actions/reportes'

import css from './style'
import DefaultIndicator from '../../components/DefaultIndicator'
import BotonValoracion from '../../components/BotonValoracion'

const makeSolicitudURL = (solicitud) => `${INFO_PY_URL}/#!/ciudadano/solicitud/${solicitud.id}`

const esFinal = (solicitud) => contains(
  solicitud.estado.nombre,
  ESTADOS_SOLICITUDES.finalizados)

class PaginaDetalle extends Component {
  static navigationOptions = ({ navigation }) => ({
      title: 'Detalles de solicitud',
      headerStyle: css.headerStyle,
      headerTitleStyle: css.headerTitleStyle,
      headerLeft: (<HeaderBackButton
        tintColor='#FFFFFF' onPress={() => navigation.dispatch({ type: 'Navigation/BACK' })}
      />),
      headerRight:
        <Button
          icon={{ name: 'share', size: 27, color: 'white' }}
          buttonStyle={{ backgroundColor: 'transparent' }}
          onPress={() => Share.share({ message: makeSolicitudURL(navigation.state.params) })}
        />
   });

  componentDidMount() {
    this.props.fetchFlujo(this.props.token, this.props.solicitud.id)
    this.props.requestValoracion(this.props.solicitud.id, this.props.miUsuario.mail)
    this.props.requestReporte(this.props.solicitud.id, this.props.miUsuario.mail)
  }

  render() {
    const props = this.props
    const spinner = <DefaultIndicator />

    const flujos = map((flujo) => (
      <Card key={flujo.id}>
        <HTML html={flujo.comentario} />
        <Divider />
        <View style={css.cardFooter} >
          <Text style={css.fechaSolicitud}>
            {moment(flujo.fechaCambio).locale('es').fromNow()}
          </Text>
        </View>
      </Card>))

    const title = ({ titulo, id }) => (
      <View style={css.cardFooter} >
        <Text style={css.fechaSolicitud}>
          {id}
        </Text>
        <Text style={css.nombreUsuario} >
          {titulo}
        </Text>
      </View>
    )

    return (
      <View style={[css.pane, css.view]}>
        <ScrollView style={css.pane} contentContainerStyle={css.contentContainer} >
          <Card >
            {title(props.solicitud)}
            <Divider />
            <HTML html={props.solicitud.descripcionModificada} />
            <Divider />
            <View style={css.cardFooter} >
              <Text style={css.fechaSolicitud}>
                {moment(props.solicitud.fecha).locale('es').fromNow()}
              </Text>
              <Text style={css.nombreUsuario} >
                {props.usuario.nombre} {props.usuario.apellido}
              </Text>
            </View>
          </Card>
          {props.flujos.loading ? spinner : flujos(props.flujos.datos)}
        </ScrollView>
        <BotonValoracion
          mostrar={esFinal(props.solicitud)}
          reporte={props.reporte}
          valoracion={props.valoracion}
        />
      </View>
      )
    }
}

const mapStateToProps = (state) => ({
  solicitud: state.solicitudes.current,
  token: state.autenticacion.token,
  flujos: state.solicitudes.flujos,
  usuario: state.solicitudes.current.usuario,
  miUsuario: state.usuario.datos,
  valoracion: state.valoracion,
  repote: state.reporte
})

const mapDispatchToProps = dispatch => ({
  fetchFlujo: (token, solicitudId) => dispatch(fetchFlujo(token, solicitudId)),
  requestValoracion: (solicitud, usuario) => dispatch(requestValoracion(solicitud, usuario)),
  requestReporte: (solicitud, usuario) => dispatch(requestReporte(solicitud, usuario))
})

export default connect(mapStateToProps, mapDispatchToProps)(PaginaDetalle)