import { useCallback } from "react"; import { View, Text, ActivityIndicator, Pressable } from "react-native"; import { StyleSheet, useUnistyles } from "react-native-unistyles"; import { ChevronDown, MoreVertical } from "lucide-react-native"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; import type { GitAction, GitActions } from "@/components/git-actions-policy"; interface GitActionsSplitButtonProps { gitActions: GitActions; } export function GitActionsSplitButton({ gitActions }: GitActionsSplitButtonProps) { const { theme } = useUnistyles(); const getActionDisplayLabel = useCallback((action: GitAction): string => { if (action.status === "pending") return action.pendingLabel; if (action.status === "success") return action.successLabel; return action.label; }, []); return ( {gitActions.primary ? ( [ styles.splitButtonPrimary, (hovered || pressed) && styles.splitButtonPrimaryHovered, gitActions.primary!.disabled && styles.splitButtonPrimaryDisabled, ]} onPress={gitActions.primary.handler} disabled={gitActions.primary.disabled} accessibilityRole="button" accessibilityLabel={gitActions.primary.label} > {gitActions.primary.status === "pending" ? ( ) : ( {gitActions.primary.icon} {getActionDisplayLabel(gitActions.primary)} )} {gitActions.secondary.length > 0 ? ( [ styles.splitButtonCaret, (hovered || pressed || open) && styles.splitButtonCaretHovered, ]} accessibilityRole="button" accessibilityLabel="More options" > {gitActions.secondary.map((action, index) => { const needsSeparator = action.id === "merge-from-base" || action.id === "push"; return ( {needsSeparator && index > 0 ? : null} {action.label} ); })} ) : null} ) : null} {gitActions.menu.length > 0 ? ( {gitActions.menu.map((action) => ( {action.label} ))} ) : null} ); } const styles = StyleSheet.create((theme) => ({ row: { flexDirection: "row", alignItems: "center", gap: theme.spacing[1], flexShrink: 0, }, splitButton: { flexDirection: "row", alignItems: "stretch", borderRadius: theme.borderRadius.md, borderWidth: theme.borderWidth[1], borderColor: theme.colors.borderAccent, overflow: "hidden", }, splitButtonPrimary: { paddingHorizontal: theme.spacing[3], paddingVertical: theme.spacing[1], justifyContent: "center", position: "relative", }, splitButtonPrimaryHovered: { backgroundColor: theme.colors.surface2, }, splitButtonPrimaryDisabled: { opacity: 0.6, }, splitButtonText: { fontSize: theme.fontSize.sm, lineHeight: theme.fontSize.sm * 1.5, color: theme.colors.foreground, fontWeight: theme.fontWeight.normal, }, splitButtonContent: { flexDirection: "row", alignItems: "center", justifyContent: "center", gap: theme.spacing[2], }, splitButtonSpinnerOnly: { transform: [{ scale: 0.8 }], }, splitButtonCaret: { width: 28, alignItems: "center", justifyContent: "center", borderLeftWidth: theme.borderWidth[1], borderLeftColor: theme.colors.borderAccent, }, splitButtonCaretHovered: { backgroundColor: theme.colors.surface2, }, iconButton: { width: 32, height: 32, alignItems: "center", justifyContent: "center", borderRadius: theme.borderRadius.md, }, overflowMenuButton: { marginRight: -theme.spacing[2], }, }));