All files / libs/payout-definition/plans/components/src/lib/token-visibility TokenVisibilityIconButton.tsx

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

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                                                                                                                                                       
import { css } from '@emotion/react';
import { IconEye, IconEyeClosed } from '@tabler/icons-react';
import { memo, type MouseEvent } from 'react';
import { useIntl } from 'react-intl';
import { match } from 'ts-pattern';

import { IconButton, type IconButtonSize } from '@allshares/studio-design-system';
import { TokenType } from '@amalia/amalia-lang/tokens/types';
import { HidableElementVisibility } from '@amalia/payout-definition/plans/types';

const DisplayStatusToIcon = {
  [HidableElementVisibility.AVAILABLE]: <IconEyeClosed />,
  [HidableElementVisibility.ON_DISPLAY]: <IconEye />,
};

type TokenVisibilityIconButtonProps = {
  readonly 'data-testid'?: string;
  readonly displayStatus: HidableElementVisibility;
  readonly isIconAlwaysDisplayed?: boolean;
  readonly onUpdateDisplayStatus: (event: MouseEvent) => Promise<void> | void;
  readonly tokenType?: TokenType;
  readonly iconSize?: `${IconButtonSize}`;
  readonly isForecastView: boolean;
};

const hiddenStyle = css`
  visibility: hidden;
`;

export const TokenVisibilityIconButton = memo(function TokenVisibilityIconButton({
  'data-testid': dataTestId,
  displayStatus,
  isIconAlwaysDisplayed = false,
  onUpdateDisplayStatus,
  tokenType,
  iconSize = 'small',
  isForecastView,
}: TokenVisibilityIconButtonProps) {
  const { formatMessage } = useIntl();

  const statementOrForecast = isForecastView
    ? formatMessage({ defaultMessage: 'forecast' })
    : formatMessage({ defaultMessage: 'statement' });

  const label = match({ tokenType, displayStatus })
    .with({ tokenType: TokenType.FILTER, displayStatus: HidableElementVisibility.AVAILABLE }, () =>
      formatMessage(
        { defaultMessage: 'Shown only on designer{br}Click to show on {statementOrForecast}' },
        { statementOrForecast },
      ),
    )
    .with({ tokenType: TokenType.FILTER, displayStatus: HidableElementVisibility.ON_DISPLAY }, () =>
      formatMessage(
        { defaultMessage: 'Shown on {statementOrForecast}{br}Click to show only in designer' },
        { statementOrForecast },
      ),
    )
    .with({ displayStatus: HidableElementVisibility.AVAILABLE }, () =>
      formatMessage({ defaultMessage: 'Hidden on {statementOrForecast}{br}Click to show it' }, { statementOrForecast }),
    )
    .otherwise(() =>
      formatMessage({ defaultMessage: 'Shown on {statementOrForecast}{br}Click to hide it' }, { statementOrForecast }),
    );

  return (
    <IconButton
      css={displayStatus === HidableElementVisibility.ON_DISPLAY && !isIconAlwaysDisplayed && hiddenStyle}
      data-testid={dataTestId}
      icon={DisplayStatusToIcon[displayStatus]}
      label={label}
      size={iconSize}
      onClick={onUpdateDisplayStatus}
    />
  );
});