export function getMenuPropsForClosestItem()

in packages/ketcher-react/src/script/ui/views/components/ContextMenu/ContextMenuTrigger.utils.ts [42:157]


export function getMenuPropsForClosestItem(
  editor: Editor,
  closestItem: ClosestItemWithMap,
): ContextMenuProps | null {
  const struct = editor.struct();

  switch (closestItem.map) {
    case 'bonds': {
      const functionalGroup = FunctionalGroup.findFunctionalGroupByBond(
        struct,
        struct.functionalGroups,
        closestItem.id,
        true,
      );

      const noFunctionalGroup =
        functionalGroup === null ||
        functionalGroup?.relatedSGroup.isSuperatomWithoutLabel;
      const isMonomer =
        functionalGroup?.relatedSGroup instanceof MonomerMicromolecule;

      if (noFunctionalGroup) {
        return {
          id: CONTEXT_MENU_ID.FOR_BONDS,
          bondIds: [closestItem.id],
        };
      } else if (isMonomer) {
        return {
          id: CONTEXT_MENU_ID.FOR_MACROMOLECULE,
          functionalGroups: [functionalGroup],
        };
      } else {
        return {
          id: CONTEXT_MENU_ID.FOR_FUNCTIONAL_GROUPS,
          functionalGroups: [functionalGroup],
        };
      }
    }

    case 'atoms': {
      const functionalGroup = FunctionalGroup.findFunctionalGroupByAtom(
        struct.functionalGroups,
        closestItem.id,
        true,
      );

      const noFunctionalGroup =
        functionalGroup === null ||
        functionalGroup?.relatedSGroup.isSuperatomWithoutLabel;
      const isMonomer =
        functionalGroup?.relatedSGroup instanceof MonomerMicromolecule;

      if (noFunctionalGroup) {
        return {
          id: CONTEXT_MENU_ID.FOR_ATOMS,
          atomIds: [closestItem.id],
        };
      } else if (isMonomer) {
        return {
          id: CONTEXT_MENU_ID.FOR_MACROMOLECULE,
          functionalGroups: [functionalGroup],
        };
      } else {
        return {
          id: CONTEXT_MENU_ID.FOR_FUNCTIONAL_GROUPS,
          functionalGroups: [functionalGroup],
        };
      }
    }

    case 'sgroups':
    case 'functionalGroups': {
      const sGroup = struct.sgroups.get(closestItem.id);

      const functionalGroup = FunctionalGroup.findFunctionalGroupBySGroup(
        struct.functionalGroups,
        sGroup,
      );

      return functionalGroup
        ? {
            id:
              sGroup instanceof MonomerMicromolecule
                ? CONTEXT_MENU_ID.FOR_MACROMOLECULE
                : CONTEXT_MENU_ID.FOR_FUNCTIONAL_GROUPS,
            functionalGroups: [functionalGroup],
          }
        : null;
    }

    case 'rgroupAttachmentPoints': {
      const atomId = struct.rgroupAttachmentPoints.get(closestItem.id)?.atomId;

      return {
        id: CONTEXT_MENU_ID.FOR_R_GROUP_ATTACHMENT_POINT,
        rgroupAttachmentPoints: [closestItem.id],
        atomIds: typeof atomId === 'number' ? [atomId] : undefined,
      };
    }

    case MULTITAIL_ARROW_KEY: {
      const closestItemTyped = closestItem as unknown as ReturnType<
        ReMultitailArrow['calculateDistanceToPoint']
      >;
      const tailId = closestItemTyped?.ref?.tailId;
      return {
        id: CONTEXT_MENU_ID.FOR_MULTITAIL_ARROW,
        itemId: closestItem.id,
        tailId: typeof tailId === 'number' ? tailId : null,
      };
    }

    default:
      return null;
  }
}