1
0
Fork 0
mirror of https://github.com/betagouv/mon-entreprise synced 2025-02-09 01:45:03 +00:00
mon-entreprise/source/components/Simu.js
Johan Girod 1d69feafd6 💚 fix flow
Suppression des décorateurs.

Problème :
Les décorateurs que l'on utilisait correspondait à une ancienne
version de la proposal tc39, encore en stage 1 (voir 0). La
proposition a complètement évolué, pour ne plus du tout avoir
la même forme que précédement.

Au lieu de garder la version 'legacy', on choisit de se séparer
des décorateur, étant donné que le nouveau use case n'a plus rien
à voir, et que l'ancienne version peut être gérée de manière
quasi équivalente avec des fonctions et des compose
2018-11-15 11:06:35 +01:00

214 lines
6.2 KiB
JavaScript

import { startConversation } from 'Actions/actions'
import AnswerList from 'Components/AnswerList'
import { ScrollToTop } from 'Components/utils/Scroll'
import withColours from 'Components/utils/withColours'
import withLanguage from 'Components/utils/withLanguage'
import { compose } from 'ramda'
import React, { Component } from 'react'
import { Trans, withI18n } from 'react-i18next'
import { connect } from 'react-redux'
import { Redirect, withRouter } from 'react-router'
import { Link } from 'react-router-dom'
import {
blockingInputControlsSelector,
nextStepsSelector,
noUserInputSelector,
validInputEnteredSelector
} from 'Selectors/analyseSelectors'
import * as Animate from 'Ui/animate'
import sitePaths from '../sites/mycompanyinfrance.fr/sitePaths'
import { normalizeBasePath } from '../utils'
import Conversation from './conversation/Conversation'
import Distribution from './Distribution'
import PageFeedback from './Feedback/PageFeedback'
import PaySlip from './PaySlip'
import QuickLink from './QuickLink'
import ResultView from './ResultView'
import './Simu.css'
import TargetSelection from './TargetSelection'
export default compose(
withRouter,
withColours,
withI18n(), // Triggers rerender when the language changes
connect(
state => ({
blockingInputControls: blockingInputControlsSelector(state),
conversationStarted: state.conversationStarted,
validInputEntered: validInputEnteredSelector(state),
arePreviousAnswers: state.conversationSteps.foldedSteps.length !== 0,
nextSteps: state.conversationStarted && nextStepsSelector(state),
userInput: noUserInputSelector(state)
}),
{
startConversation
}
),
withLanguage
)(
class Simulation extends Component {
state = {
displayPreviousAnswers: false
}
render() {
let {
colours,
conversationStarted,
arePreviousAnswers,
nextSteps,
startConversation,
blockingInputControls,
match,
validInputEntered,
location
} = this.props
const displayConversation = conversationStarted && !blockingInputControls
const simulationCompleted =
!blockingInputControls && conversationStarted && !nextSteps.length
const displayPreviousAnswers =
arePreviousAnswers && this.state.displayPreviousAnswers
const simulationHomePath = normalizeBasePath(match.path).replace(
/\/simulation\/$/,
''
)
return (
<>
<div id="simu">
<QuickLink />
{location.pathname.endsWith('/simulation') && (
<>
{!conversationStarted && <Redirect to={simulationHomePath} />}
<Link to={simulationHomePath} style={{ position: 'absolute' }}>
<i
className="fa fa-arrow-left"
aria-hidden="true"
style={{ marginRight: '0.5rem' }}
/>
<Trans>Retour</Trans>
</Link>
<div
className="change-answer-link"
style={{
visibility: arePreviousAnswers ? 'visible' : 'hidden'
}}>
<button
className="ui__ link-button"
onClick={() =>
this.setState({ displayPreviousAnswers: true })
}>
<Trans>Modifier mes réponses</Trans>
</button>
</div>
{displayPreviousAnswers && (
<AnswerList
onClose={() =>
this.setState({ displayPreviousAnswers: false })
}
/>
)}
{simulationCompleted && (
<>
<h1>
<Trans i18nKey="simulation-end.title">
Plus de questions !
</Trans>
</h1>
<p>
<Trans i18nKey="simulation-end.text">
Vous avez atteint l'estimation la plus précise. Vous
pouvez maintenant concrétiser votre projet d'embauche.
</Trans>
</p>
{this.props.displayHiringProcedures && (
<div style={{ textAlign: 'center' }}>
<Link
className="ui__ button"
to={sitePaths().démarcheEmbauche}>
<Trans i18nKey="simulation-end.cta">
Connaître les démarches
</Trans>
</Link>
</div>
)}
<br />
</>
)}
{displayConversation && (
<>
<ScrollToTop />
<Conversation
textColourOnWhite={colours.textColourOnWhite}
/>
</>
)}
</>
)}
<TargetSelection colours={colours} />
{location.pathname.endsWith('/simulation') && (
<>
{conversationStarted && (
<Animate.fromBottom>
<ResultView />
<div style={{ textAlign: 'center' }} />
</Animate.fromBottom>
)}
</>
)}
{validInputEntered && (
<PageFeedback
customMessage={
<Trans i18nKey="feedback.simulator">
Ce simulateur vous a plu ?
</Trans>
}
customEventName="rate simulator"
/>
)}
</div>
{!location.pathname.endsWith('/simulation') && validInputEntered && (
<Animate.fromBottom>
<div style={{ textAlign: 'center' }}>
{arePreviousAnswers && conversationStarted && (
<button className="ui__ button" onClick={startConversation}>
<Trans>Continuer la simulation</Trans>
</button>
)}
</div>
<h2>
<Trans>A quoi servent mes cotisations ?</Trans>
</h2>
<Distribution />
{!(arePreviousAnswers && conversationStarted) && (
<>
<h2>
<Trans>Simulation personnalisée</Trans>
</h2>
<p>
<Trans i18nKey="custom-simulation">
Il s'agit pour l'instant d'une
<strong> première estimation</strong> sur la base d'un
contrat générique. La législation française prévoit une
multitude de cas particuliers et de règles spécifiques qui
modifient considérablement les montant de l'embauche.
</Trans>
</p>
<p style={{ textAlign: 'center' }}>
<button className="ui__ button" onClick={startConversation}>
<Trans>Faire une simulation personnalisée</Trans>
</button>
</p>
</>
)}
<h2>
<Trans>Fiche de paie</Trans>
</h2>
<PaySlip />
</Animate.fromBottom>
)}
</>
)
}
}
)