Skip to content

Commit

Permalink
Ajout des règles dans le state Redux
Browse files Browse the repository at this point in the history
Déplace la logique de changement de période d'un component vers un reducer
  • Loading branch information
mquandalle committed Sep 17, 2019
1 parent 8c9a401 commit 6eb665b
Show file tree
Hide file tree
Showing 6 changed files with 41 additions and 45 deletions.
15 changes: 3 additions & 12 deletions source/components/PeriodSwitch.js
@@ -1,16 +1,11 @@
import { findRuleByDottedName } from 'Engine/rules'
import React, { useCallback, useEffect } from 'react'
import { Trans } from 'react-i18next'
import { useDispatch, useSelector } from 'react-redux'
import {
flatRulesSelector,
situationSelector
} from 'Selectors/analyseSelectors'
import { situationSelector } from 'Selectors/analyseSelectors'
import './PeriodSwitch.css'

export default function PeriodSwitch() {
const dispatch = useDispatch()
const rules = useSelector(flatRulesSelector)
const situation = useSelector(situationSelector)
const initialPeriod = useSelector(
state => state.simulation?.config?.situation?.période
Expand All @@ -21,13 +16,9 @@ export default function PeriodSwitch() {
}, [currentPeriod, initialPeriod, updatePeriod])
const updatePeriod = useCallback(
toPeriod => {
const needConversion = Object.keys(situation).filter(dottedName => {
const rule = findRuleByDottedName(rules, dottedName)
return rule?.période === 'flexible'
})
dispatch({ type: 'UPDATE_PERIOD', toPeriod, needConversion })
dispatch({ type: 'UPDATE_PERIOD', toPeriod })
},
[dispatch, rules, situation]
[dispatch]
)
let periods = ['mois', 'année']
if (initialPeriod === 'année') {
Expand Down
40 changes: 25 additions & 15 deletions source/reducers/rootReducer.js
Expand Up @@ -17,6 +17,7 @@ import { combineReducers } from 'redux'
import i18n from '../i18n'
import inFranceAppReducer from './inFranceAppReducer'
import storageReducer from './storageReducer'
import { findRuleByDottedName } from 'Engine/rules'
import type { Action } from 'Types/ActionsTypes'

function explainedVariable(state = null, { type, variableName = null }) {
Expand Down Expand Up @@ -106,7 +107,7 @@ function updateSituation(situation, { fieldName, value, objectifs }) {
return { ...removePreviousTarget(situation), [fieldName]: value }
}

function updatePeriod(situation, { toPeriod, needConversion }) {
function updatePeriod(situation, { toPeriod, rules }) {
const currentPeriod = situation['période']
if (currentPeriod === toPeriod) {
return situation
Expand All @@ -115,6 +116,11 @@ function updatePeriod(situation, { toPeriod, needConversion }) {
throw new Error('Oups, changement de période invalide')
}

const needConversion = Object.keys(situation).filter(dottedName => {
const rule = findRuleByDottedName(rules, dottedName)
return rule?.période === 'flexible'
})

const updatedSituation = Object.entries(situation)
.filter(([fieldName]) => needConversion.includes(fieldName))
.map(([fieldName, value]) => [
Expand All @@ -129,7 +135,7 @@ function updatePeriod(situation, { toPeriod, needConversion }) {
}
}

function simulation(state = null, action) {
function simulation(state = null, action, rules) {
if (action.type === 'SET_SIMULATION') {
const { config, url } = action
return { config, url, hiddenControls: [], situation: {} }
Expand All @@ -156,13 +162,15 @@ function simulation(state = null, action) {
...state,
situation: updatePeriod(state.situation, {
toPeriod: action.toPeriod,
needConversion: action.needConversion
rules
})
}
}
return state
}

const rules = (state = null) => state

const addAnswerToSituation = (dottedName, value, state) => {
const dottedPath = dottedName.split(' . ')
return compose(
Expand Down Expand Up @@ -198,16 +206,18 @@ const existingCompanyReducer = (state, action) => {
export default reduceReducers(
existingCompanyReducer,
storageReducer,
combineReducers({
sessionId: defaultTo(Math.floor(Math.random() * 1000000000000) + ''),
conversationSteps,
lang,
simulation,
explainedVariable,
previousSimulation: defaultTo(null),
currentExample,
situationBranch,
activeTargetInput,
inFranceApp: inFranceAppReducer
})
(state, action) =>
combineReducers({
sessionId: defaultTo(Math.floor(Math.random() * 1000000000000) + ''),
conversationSteps,
lang,
rules,
simulation: simulation(state?.simulation, action, rules),
explainedVariable,
previousSimulation: defaultTo(null),
currentExample,
situationBranch,
activeTargetInput,
inFranceApp: inFranceAppReducer
})(state, action)
)
20 changes: 5 additions & 15 deletions source/selectors/analyseSelectors.js
Expand Up @@ -5,9 +5,7 @@ import {
import {
collectDefaults,
disambiguateExampleSituation,
findRuleByDottedName,
rules as baseRulesEn,
rulesFr as baseRulesFr
findRuleByDottedName
} from 'Engine/rules'
import { analyse, analyseMany, parseAll } from 'Engine/traverse'
import {
Expand Down Expand Up @@ -38,18 +36,10 @@ import { mapOrApply } from '../utils'
// create a "selector creator" that uses deep equal instead of ===
const createDeepEqualSelector = createSelectorCreator(defaultMemoize, equals)

/*
*
* We must here compute parsedRules, flatRules, analyse which contains both targets and cache objects
*
*
* */

export let flatRulesSelector = createSelector(
state => state.lang,
(state, props) => props && props.rules,
(lang, rules) => rules || (lang === 'en' ? baseRulesEn : baseRulesFr)
)
// We must here compute parsedRules, flatRules, analyse which contains both targets and cache objects
export let flatRulesSelector = (state, props) => {
return props?.rules || state?.rules
}

export let parsedRulesSelector = createSelector(
[flatRulesSelector],
Expand Down
7 changes: 5 additions & 2 deletions source/sites/mon-entreprise.fr/App.js
Expand Up @@ -38,6 +38,7 @@ import Landing from './pages/Landing/Landing.js'
import SocialSecurity from './pages/SocialSecurity'
import ÉconomieCollaborative from './pages/ÉconomieCollaborative'
import { constructLocalizedSitePath } from './sitePaths'
import { rules as baseRulesEn, rulesFr as baseRulesFr } from 'Engine/rules'

if (process.env.NODE_ENV === 'production') {
Raven.config(
Expand All @@ -60,6 +61,7 @@ function InFranceRoute({ basename, language }) {
setToSessionStorage('lang', language)
}, [language])
const paths = constructLocalizedSitePath(language)
const rules = language === 'en' ? baseRulesEn : baseRulesFr
return (
<Provider
basename={basename}
Expand All @@ -68,12 +70,13 @@ function InFranceRoute({ basename, language }) {
sitePaths={paths}
reduxMiddlewares={middlewares}
onStoreCreated={store => {
persistEverything()(store)
persistEverything({ except: ['rules'] })(store)
persistSimulation(store)
}}
initialStore={{
...retrievePersistedState(),
previousSimulation: retrievePersistedSimulation()
previousSimulation: retrievePersistedSimulation(),
rules
}}>
<RouterSwitch />
</Provider>
Expand Down
3 changes: 2 additions & 1 deletion test/ficheDePaieSelector.test.js
Expand Up @@ -3,14 +3,15 @@
import { expect } from 'chai'
// $FlowFixMe
import salariéConfig from 'Components/simulationConfigs/salarié.yaml'
import { getRuleFromAnalysis } from 'Engine/rules'
import { getRuleFromAnalysis, rules } from 'Engine/rules'
import { analysisWithDefaultsSelector } from 'Selectors/analyseSelectors'
import {
analysisToCotisationsSelector,
COTISATION_BRANCHE_ORDER
} from 'Selectors/ficheDePaieSelectors'

let state = {
rules,
simulation: {
config: salariéConfig,
situation: {
Expand Down
1 change: 1 addition & 0 deletions test/real-rules.test.js
Expand Up @@ -10,6 +10,7 @@ let runExamples = (examples, rule) =>
examples.map(ex => {
let runExample = exampleAnalysisSelector(
{
rules,
currentExample: {
situation: ex.situation,
dottedName: rule.dottedName
Expand Down

0 comments on commit 6eb665b

Please sign in to comment.