import { setActiveTarget, updateSituation } from 'Actions/actions'; import InputSuggestions from 'Components/conversation/InputSuggestions'; import PeriodSwitch from 'Components/PeriodSwitch'; import RuleLink from 'Components/RuleLink'; import { ThemeColorsContext } from 'Components/utils/colors'; import { SitePathsContext } from 'Components/utils/withSitePaths'; import { formatCurrency } from 'Engine/format'; import { encodeRuleName } from 'Engine/rules'; import { isEmpty, isNil } from 'ramda'; import React, { useContext, useEffect, useState } from 'react'; import emoji from 'react-easy-emoji'; import { Trans, useTranslation } from "react-i18next"; import { useDispatch, useSelector } from 'react-redux'; import { Link } from 'react-router-dom'; import { RootState } from 'Reducers/rootReducer'; import { analysisWithDefaultsSelector, situationSelector, useTarget } from 'Selectors/analyseSelectors'; import { Rule } from 'Types/rule'; import Animate from 'Ui/animate'; import AnimatedTargetValue from 'Ui/AnimatedTargetValue'; import CurrencyInput from './CurrencyInput/CurrencyInput'; import './TargetSelection.css'; export default function TargetSelection() { const [initialRender, setInitialRender] = useState(true) const analysis = useSelector(analysisWithDefaultsSelector) const objectifs = useSelector( (state: RootState) => state.simulation?.config.objectifs || [] ) const secondaryObjectives = useSelector( (state: RootState) => state.simulation?.config['objectifs secondaires'] || [] ) const situation = useSelector(situationSelector) const dispatch = useDispatch() const colors = useContext(ThemeColorsContext) const targets = analysis?.targets.filter( t => !secondaryObjectives.includes(t.dottedName) && t.dottedName !== 'contrat salarié . aides employeur' ) || [] useEffect(() => { // Initialize defaultValue for target that can't be computed // TODO: this logic shouldn't be here targets .filter( target => (!target.formule || isEmpty(target.formule)) && (!isNil(target.defaultValue) || !isNil(target.explanation?.defaultValue)) && !situation[target.dottedName] ) .forEach(target => { dispatch( updateSituation( target.dottedName, !isNil(target.defaultValue) ? target.defaultValue : target.explanation?.defaultValue ) ) }) setInitialRender(false) // eslint-disable-next-line react-hooks/exhaustive-deps }, []) return (
{target.summary}
) } type TargetInputOrValueProps = { target: Rule isActiveInput: boolean isSmallTarget: boolean } let TargetInputOrValue = ({ target, isActiveInput, isSmallTarget }: TargetInputOrValueProps) => { const { language } = useTranslation().i18n const colors = useContext(ThemeColorsContext) const dispatch = useDispatch() const situationValue = useSelector(situationSelector)[target.dottedName] const targetWithValue = useTarget(target.dottedName) const inversionFail = useSelector(analysisWithDefaultsSelector)?.cache._meta .inversionFail const value = targetWithValue?.nodeValue != null && !inversionFail ? Math.round(targetWithValue.nodeValue) : undefined const blurValue = inversionFail && !isActiveInput return ( {target.question ? ( <> {!isActiveInput &&