import { useState } from "react"; import { Alert, Pressable, Text, View, type ViewProps } from "react-native"; import { mobileTokens } from "../lib/appearance"; import { useI18n } from "../lib/i18n"; type AskAction = { id: string; label: string }; const KNOWN_ASK_ACTION_LABELS: Record = { allow: "Allow once", always: "Always allow", deny: "Deny", }; export function AskActions({ actions, disabled, onAnswer, accessibilityActions, onAccessibilityAction, }: { actions: AskAction[]; disabled?: boolean; onAnswer: (answer: string) => Promise; accessibilityActions?: ViewProps["accessibilityActions"]; onAccessibilityAction?: ViewProps["onAccessibilityAction"]; }) { const { t } = useI18n(); const tokens = mobileTokens(); const [pendingAction, setPendingAction] = useState(null); const submitting = pendingAction !== null; async function submit(answer: string) { if (disabled || submitting) return; setPendingAction(answer); try { await onAnswer(answer); } catch (error) { Alert.alert( t("Could not submit answer"), error instanceof Error ? error.message : t("Please try again."), ); } finally { setPendingAction(null); } } return ( {actions.map((action) => { const emphasized = action.id === "allow" || action.id === "always"; return ( void submit(action.id)} style={{ alignSelf: "stretch", borderRadius: 12, paddingHorizontal: 14, paddingVertical: 12, backgroundColor: emphasized ? tokens.muted : "transparent", borderWidth: 1, borderColor: tokens.border, opacity: disabled || submitting ? 0.5 : 1, }} > {pendingAction === action.id ? t("Sending…") : Object.hasOwn(KNOWN_ASK_ACTION_LABELS, action.id) ? t(KNOWN_ASK_ACTION_LABELS[action.id]!) : action.label} ); })} ); }