export function FileItemContextMenu()

in apps/chat/src/components/Files/FileItemContextMenu.tsx [41:148]


export function FileItemContextMenu({
  file,
  className,
  onDelete,
  onOpenChange,
  onUnshare,
  onUnpublish,
  onSave,
}: ContextMenuProps) {
  const { t } = useTranslation(Translation.SideBar);

  const isSharingConversationEnabled = useAppSelector((state) =>
    SettingsSelectors.isSharingEnabled(state, FeatureType.Chat),
  );
  const isPublishingConversationEnabled = useAppSelector((state) =>
    SettingsSelectors.selectIsPublishingEnabled(state, FeatureType.Chat),
  );
  const selectFileContentSelector = useMemo(
    () => CodeEditorSelectors.selectFileContent(file.id),
    [file.id],
  );
  const isCodeEditorFile = !!useAppSelector(selectFileContentSelector);

  const menuItems: DisplayMenuItemProps[] = useMemo(
    () => [
      {
        name: t('Save'),
        dataQa: 'save',
        additionalNameNode: isCodeEditorFile ? (
          <span className="pl-2 text-secondary">
            {navigator.userAgent.toLowerCase().includes('mac')
              ? 'Cmd+S'
              : 'Ctrl+S'}
          </span>
        ) : null,
        display: !!onSave,
        Icon: IconDeviceFloppy,
        onClick: () => onSave?.(file.id),
      },
      {
        name: t('Download'),
        display:
          file.status !== UploadStatus.LOADING &&
          file.status !== UploadStatus.FAILED,
        dataQa: 'download',
        Icon: IconDownload,
        onClick: (e: MouseEvent) => {
          stopBubbling(e);
          onOpenChange?.(false);
        },
        customTriggerData: file,
        CustomTriggerRenderer: DownloadRenderer,
      },
      {
        name: t('Unshare'),
        dataQa: 'unshare',
        display: isSharingConversationEnabled && !!onUnshare && !!file.isShared,
        Icon: IconUserX,
        onClick: onUnshare,
      },
      {
        name: t('Unpublish'),
        dataQa: 'unpublish',
        display:
          isPublishingConversationEnabled &&
          !!file.isPublished &&
          !!onUnpublish,
        Icon: UnpublishIcon,
        onClick: onUnpublish,
      },
      {
        name: t('Delete'),
        dataQa: 'delete',
        display:
          file.id.startsWith(
            getRootId({
              featureType: FeatureType.File,
            }),
          ) || !!file.sharedWithMe,
        Icon: IconTrashX,
        onClick: onDelete,
      },
    ],
    [
      t,
      isCodeEditorFile,
      onSave,
      file,
      isSharingConversationEnabled,
      onUnshare,
      isPublishingConversationEnabled,
      onUnpublish,
      onDelete,
      onOpenChange,
    ],
  );

  return (
    <ContextMenu
      onOpenChange={onOpenChange}
      menuItems={menuItems}
      TriggerIcon={IconDots}
      triggerIconSize={18}
      className={className}
      featureType={FeatureType.File}
    />
  );
}