All files / libs/lti/components/src/lib/tracing LtiTracing.tsx

0% Statements 0/123
0% Branches 0/1
0% Functions 0/1
0% Lines 0/123

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>
  );
});