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