All files / libs/payout-definition/plans/views/hub/rule-designer/src/lib/hooks use-data-source-object-options.tsx

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

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                                                                                                                                                                                                                         
import { useMemo } from 'react';
import { FormattedMessage } from 'react-intl';

import { Group, type SelectOptionValue } from '@allshares/studio-design-system';
import { getDataConnectorName } from '@amalia/core/types';
import { getVendorLogo } from '@amalia/data-capture/connectors/assets';
import { useDataConnectors } from '@amalia/data-capture/connectors/state';
import { findDataConnectorObjectOfCustomObjectDefinition } from '@amalia/data-capture/record-models/components';
import { type CustomObjectDefinition } from '@amalia/data-capture/record-models/types';

import { useDesignerLibrary } from './use-designer-library';

const toDataSourceObjectOption = <TValue extends SelectOptionValue>(
  objectDefinition: Pick<CustomObjectDefinition, 'machineName' | 'name' | 'type'>,
  value: TValue,
) => {
  const Logo = getVendorLogo(objectDefinition.type);
  return {
    value,
    label: objectDefinition.name,
    icon: <Logo />,
    valueLabel: (
      <Group
        align="center"
        gap={6}
      >
        <Logo width={16} />
        {objectDefinition.name}
      </Group>
    ),
  };
};

const useObjectDefinitionsWithDataConnector = () => {
  const { tokens } = useDesignerLibrary();
  const { data: dataConnectors } = useDataConnectors();

  return useMemo(
    () =>
      tokens.OBJECT_DEFINITIONS.map((objectDefinition) => {
        const dataConnectorObject = findDataConnectorObjectOfCustomObjectDefinition(objectDefinition, dataConnectors);
        return {
          objectDefinition,
          dataConnector: dataConnectorObject?.dataConnector,
          dataConnectorObject: dataConnectorObject?.dataConnectorObject,
        };
      }),
    [tokens.OBJECT_DEFINITIONS, dataConnectors],
  );
};

export const useDataSourceObjectOptionsGrouped = () => {
  const { data: dataConnectors } = useDataConnectors();
  const objectDefinitionsWithDataConnector = useObjectDefinitionsWithDataConnector();

  return useMemo(
    () => [
      ...(dataConnectors ?? []).map((dataConnector) => ({
        label: getDataConnectorName(dataConnector),
        initialIsOpen: false,
        options: objectDefinitionsWithDataConnector
          .filter((obj) => obj.dataConnector?.id === dataConnector.id && !obj.dataConnectorObject?.isArchived)
          .map(({ objectDefinition }) => toDataSourceObjectOption(objectDefinition, objectDefinition.id)),
      })),
      {
        label: <FormattedMessage defaultMessage="Archived data objects" />,
        initialIsOpen: false,
        options: objectDefinitionsWithDataConnector
          .filter((obj) => obj.dataConnectorObject?.isArchived)
          .map(({ objectDefinition }) => toDataSourceObjectOption(objectDefinition, objectDefinition.id)),
      },
    ],
    [dataConnectors, objectDefinitionsWithDataConnector],
  );
};

export const useDataSourceObjectOptionsWithVirtualGrouped = () => {
  const { tokens } = useDesignerLibrary();
  const { data: dataConnectors } = useDataConnectors();
  const objectDefinitionsWithDataConnector = useObjectDefinitionsWithDataConnector();

  return useMemo(
    () => [
      ...(dataConnectors ?? []).map((dataConnector) => ({
        label: getDataConnectorName(dataConnector),
        initialIsOpen: false,
        options: objectDefinitionsWithDataConnector
          .filter((obj) => obj.dataConnector?.id === dataConnector.id && !obj.dataConnectorObject?.isArchived)
          .map(({ objectDefinition }) => toDataSourceObjectOption(objectDefinition, objectDefinition.machineName)),
      })),
      {
        label: 'Amalia',
        initialIsOpen: false,
        options: tokens.VIRTUAL_OBJECT_DEFINITIONS.map((objectDefinition) =>
          toDataSourceObjectOption(objectDefinition, objectDefinition.machineName),
        ),
      },
      {
        label: <FormattedMessage defaultMessage="Archived data objects" />,
        initialIsOpen: false,
        options: objectDefinitionsWithDataConnector
          .filter((obj) => obj.dataConnectorObject?.isArchived)
          .map(({ objectDefinition }) => toDataSourceObjectOption(objectDefinition, objectDefinition.machineName)),
      },
    ],
    [dataConnectors, objectDefinitionsWithDataConnector, tokens.VIRTUAL_OBJECT_DEFINITIONS],
  );
};