import { useMemo } from "react"; import { useTranslation } from "react-i18next"; import { type PressableStateCallbackType } from "react-native"; import { StyleSheet, withUnistyles } from "react-native-unistyles"; import { Archive, CircleCheck, Copy, MoreVertical, Pencil, Pin, PinOff } from "lucide-react-native"; import { isNative, isWeb } from "@/constants/platform"; import type { Theme } from "@/styles/theme"; import type { ShortcutKey } from "@/utils/format-shortcut"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; import { Shortcut } from "@/components/ui/shortcut"; import { OpenInFileManagerMenuItem } from "@/workspace/open-in-file-manager/menu-item"; const foregroundColorMapping = (theme: Theme) => ({ color: theme.colors.foreground }); const foregroundMutedColorMapping = (theme: Theme) => ({ color: theme.colors.foregroundMuted, }); const ThemedMoreVertical = withUnistyles(MoreVertical); const ThemedCopy = withUnistyles(Copy); const ThemedArchive = withUnistyles(Archive); const ThemedPencil = withUnistyles(Pencil); const ThemedCircleCheck = withUnistyles(CircleCheck); const ThemedPin = withUnistyles(Pin); const ThemedPinOff = withUnistyles(PinOff); const copyLeadingIcon = ; const renameLeadingIcon = ; const markAsReadLeadingIcon = ( ); const archiveLeadingIcon = ; const pinLeadingIcon = ; const unpinLeadingIcon = ; function renderTriggerIcon({ hovered }: { hovered?: boolean }) { return ( ); } interface SidebarWorkspaceMenuProps { workspaceKey: string; onCopyPath?: () => void; onCopyBranchName?: () => void; onRename?: () => void; onMarkAsRead?: () => void; onArchive: () => void; archiveLabel?: string; archiveStatus?: "idle" | "pending" | "success"; archivePendingLabel?: string; archiveShortcutKeys?: ShortcutKey[][] | null; isPinned?: boolean; onTogglePin?: () => void; openInFileManagerPath?: string | null; } export function SidebarWorkspaceMenu({ workspaceKey, onCopyPath, onCopyBranchName, onRename, onMarkAsRead, onArchive, archiveLabel, archiveStatus, archivePendingLabel, archiveShortcutKeys, isPinned, onTogglePin, openInFileManagerPath, }: SidebarWorkspaceMenuProps) { const { t } = useTranslation(); const archiveTrailing = useMemo( () => (archiveShortcutKeys && !isNative ? : null), [archiveShortcutKeys], ); return ( {renderTriggerIcon} {onCopyPath ? ( {t("sidebar.workspace.actions.copyPath")} ) : null} {onCopyBranchName ? ( {t("sidebar.workspace.actions.copyBranchName")} ) : null} {onRename ? ( {t("sidebar.workspace.actions.rename")} ) : null} {onMarkAsRead ? ( Mark as read ) : null} {onTogglePin ? ( {isPinned ? t("sidebar.workspace.actions.unpin") : t("sidebar.workspace.actions.pin")} ) : null} {archiveLabel ?? t("sidebar.workspace.actions.archive")} ); } function triggerStyle({ hovered = false }: PressableStateCallbackType & { hovered?: boolean }) { return [styles.trigger, hovered && styles.triggerHovered]; } const styles = StyleSheet.create((theme) => ({ trigger: { padding: 2, borderRadius: 4, marginLeft: 2, }, triggerHovered: { backgroundColor: theme.colors.surface2, }, }));