Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 | import { css } from '@emotion/react'; import { Fragment, memo, useMemo, useState } from 'react'; import { FormattedMessage, FormattedNumber } from 'react-intl'; import { Modal, Stack, Typography } from '@allshares/studio-design-system'; import { getEarnedRatioForKpi } from '@amalia/lti/shared'; import { type LtiPlanKpi } from '@amalia/lti/types'; import { TracingChar, TracingFormulaContainer, TracingLayerLayout, TracingNode, } from '@amalia/payout-calculation/statements/tracing/components'; import { LtiTracingActiveKpiLine } from './LtiTracingActiveKpiLine'; export interface LtiTracingProps { readonly isOpen: boolean; readonly onClose: () => void; readonly kpis: LtiPlanKpi[]; readonly sharesCount: number; readonly kpiValues: Record<string, number> | null; readonly simulated: boolean; } export const LtiTracing = memo(function LtiTracing({ isOpen, onClose, kpis, sharesCount, kpiValues, simulated, }: LtiTracingProps) { const [activeKpiId, setActiveKpiId] = useState<LtiPlanKpi['id'] | null>(null); const kpisWithValue = useMemo( () => kpis.map((kpi) => { const outcome = getEarnedRatioForKpi(kpi, kpiValues?.[kpi.id] ?? 0); return { kpi, outcome, value: outcome * kpi.weight * sharesCount, }; }), [kpiValues, kpis, sharesCount], ); const totalEarned = useMemo(() => kpisWithValue.reduce((acc, curr) => acc + curr.value, 0), [kpisWithValue]); const activeKpi = kpisWithValue.find((kpi) => kpi.kpi.id === activeKpiId); return ( <Modal initialFocus={-1} isOpen={isOpen} size="xlarge" css={css` height: initial !important; max-height: 620px; `} onClose={onClose} > <Stack justify="center" css={css` padding-right: 24px; padding-left: 32px; height: 48px; flex-shrink: 0; `} > <Typography variant="bodyBaseBold"> {simulated ? ( <FormattedMessage defaultMessage="Tracing on simulated earned shares" /> ) : ( <FormattedMessage defaultMessage="Tracing on earned shares" /> )} </Typography> </Stack> <TracingLayerLayout> <TracingFormulaContainer displayMode="MODAL"> <TracingNode value={<FormattedNumber value={totalEarned} />} label={ simulated ? ( <FormattedMessage defaultMessage="Simulated earned shares" /> ) : ( <FormattedMessage defaultMessage="Earned shares" /> ) } /> <TracingChar char="=" /> {kpisWithValue.map(({ kpi, value }, index, kpis) => ( <Fragment key={kpi.id}> <TracingNode isActive={kpi.id === activeKpiId} value={<FormattedNumber value={value} />} label={ <FormattedMessage defaultMessage="Shares from {kpi}" values={{ kpi: kpi.name }} /> } onClick={() => setActiveKpiId(kpi.id)} /> {index === kpis.length - 1 ? null : <TracingChar char="+" />} </Fragment> ))} </TracingFormulaContainer> </TracingLayerLayout> {!!activeKpi && ( <LtiTracingActiveKpiLine grantedShares={sharesCount} kpi={activeKpi.kpi} outcome={activeKpi.outcome} /> )} </Modal> ); }); |