import { memo, useCallback, useMemo, useState } from "react"; import { useTranslation } from "react-i18next"; import { Text, View } from "react-native"; import { Split } from "lucide-react-native"; import { StyleSheet, withUnistyles } from "react-native-unistyles"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip"; import { ICON_SIZE, type Theme } from "@/styles/theme"; export type AssistantForkTarget = "tab" | "workspace"; interface AssistantForkMenuProps { onFork: (target: AssistantForkTarget) => Promise | void; testID?: string; } const ThemedSplit = withUnistyles(Split); const foregroundColorMapping = (theme: Theme) => ({ color: theme.colors.foreground }); const foregroundMutedColorMapping = (theme: Theme) => ({ color: theme.colors.foregroundMuted }); export const AssistantForkMenu = memo(function AssistantForkMenu({ onFork, testID = "assistant-fork-menu", }: AssistantForkMenuProps) { const { t } = useTranslation(); const [isOpen, setIsOpen] = useState(false); const [pendingTarget, setPendingTarget] = useState(null); const isLocked = pendingTarget !== null; const handleOpenChange = useCallback( (next: boolean) => { if (!next && pendingTarget !== null) return; setIsOpen(next); }, [pendingTarget], ); const handleSelect = useCallback( (target: AssistantForkTarget) => async () => { if (isLocked) return; setPendingTarget(target); try { await onFork(target); } finally { setPendingTarget(null); setIsOpen(false); } }, [isLocked, onFork], ); const triggerStyle = useCallback( () => [styles.trigger, isLocked ? styles.triggerDisabled : null], [isLocked], ); const tooltipContent = useMemo( () => ( {t("message.actions.forkMenu")} ), [t], ); const forkIcon = useMemo( () => , [], ); return ( {({ hovered, open }) => ( )} {tooltipContent} {t("message.actions.forkInNewTab")} {t("message.actions.forkInNewWorkspace")} ); }); const styles = StyleSheet.create((theme) => ({ trigger: { padding: theme.spacing[1], alignItems: "center", justifyContent: "center", backgroundColor: "transparent", }, triggerDisabled: { opacity: theme.opacity[50], }, triggerSlot: { alignSelf: "center", }, tooltipText: { color: theme.colors.foreground, fontSize: theme.fontSize.xs, }, }));