@teamvortexsoftware/vortex-react-native 1.0.0 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/InviteFormCore-D4HkMMo0.d.mts +721 -0
- package/dist/InviteFormCore-D9oUCbu7.d.ts +721 -0
- package/dist/VortexClient.js +192 -0
- package/dist/VortexClient.js.map +1 -0
- package/dist/VortexDeferredLinks.js +127 -0
- package/dist/VortexDeferredLinks.js.map +1 -0
- package/dist/clientInfo.js +45 -0
- package/dist/clientInfo.js.map +1 -0
- package/dist/components/ContactsPickerModal.js +182 -0
- package/dist/components/ContactsPickerModal.js.map +1 -0
- package/dist/components/InviteFormCore.js +2141 -0
- package/dist/components/InviteFormCore.js.map +1 -0
- package/dist/components/InviteFormMobile.js +463 -0
- package/dist/components/InviteFormMobile.js.map +1 -0
- package/dist/components/InviteFormWeb.js +295 -0
- package/dist/components/InviteFormWeb.js.map +1 -0
- package/dist/components/PlacedItemToolbar.js +147 -0
- package/dist/components/PlacedItemToolbar.js.map +1 -0
- package/dist/components/ShareButtons.js +181 -0
- package/dist/components/ShareButtons.js.map +1 -0
- package/dist/components/VrtxContactsImport.js +234 -0
- package/dist/components/VrtxContactsImport.js.map +1 -0
- package/dist/components/VrtxEmailInvitations.js +341 -0
- package/dist/components/VrtxEmailInvitations.js.map +1 -0
- package/dist/components/VrtxFindFriends.js +400 -0
- package/dist/components/VrtxFindFriends.js.map +1 -0
- package/dist/components/VrtxHeading.js +58 -0
- package/dist/components/VrtxHeading.js.map +1 -0
- package/dist/components/VrtxIncomingInvitations.js +657 -0
- package/dist/components/VrtxIncomingInvitations.js.map +1 -0
- package/dist/components/VrtxInvitationSuggestions.js +506 -0
- package/dist/components/VrtxInvitationSuggestions.js.map +1 -0
- package/dist/components/VrtxInviteContacts.js +512 -0
- package/dist/components/VrtxInviteContacts.js.map +1 -0
- package/dist/components/VrtxOutgoingInvitations.js +572 -0
- package/dist/components/VrtxOutgoingInvitations.js.map +1 -0
- package/dist/components/VrtxSearchBox.js +487 -0
- package/dist/components/VrtxSearchBox.js.map +1 -0
- package/dist/components/VrtxSelect.js +27 -0
- package/dist/components/VrtxSelect.js.map +1 -0
- package/dist/components/VrtxShareOptions.js +435 -0
- package/dist/components/VrtxShareOptions.js.map +1 -0
- package/dist/components/VrtxSubmit.js +132 -0
- package/dist/components/VrtxSubmit.js.map +1 -0
- package/dist/components/VrtxText.js +146 -0
- package/dist/components/VrtxText.js.map +1 -0
- package/dist/constants/mockData.d.mts +7 -0
- package/dist/constants/mockData.d.ts +7 -0
- package/dist/constants/mockData.js +48 -0
- package/dist/constants/mockData.js.map +1 -0
- package/dist/constants/mockData.mjs +22 -0
- package/dist/constants/mockData.mjs.map +1 -0
- package/dist/context/VortexModulesContext.js +135 -0
- package/dist/context/VortexModulesContext.js.map +1 -0
- package/dist/hooks/useInvitationFormLogic.d.mts +2 -0
- package/dist/hooks/useInvitationFormLogic.d.ts +2 -0
- package/dist/hooks/useInvitationFormLogic.js +300 -0
- package/dist/hooks/useInvitationFormLogic.js.map +1 -0
- package/dist/hooks/useInvitationFormLogic.mjs +276 -0
- package/dist/hooks/useInvitationFormLogic.mjs.map +1 -0
- package/dist/hooks/usePrefetchWidgetConfiguration.js +117 -0
- package/dist/hooks/usePrefetchWidgetConfiguration.js.map +1 -0
- package/dist/hooks/useThemeStyles.js +41 -0
- package/dist/hooks/useThemeStyles.js.map +1 -0
- package/dist/hooks/useVortexInvite.js +732 -0
- package/dist/hooks/useVortexInvite.js.map +1 -0
- package/dist/index-web.d.mts +93 -0
- package/dist/index-web.d.ts +93 -0
- package/dist/index-web.js +7397 -0
- package/dist/index-web.js.map +1 -0
- package/dist/index-web.mjs +7445 -0
- package/dist/index-web.mjs.map +1 -0
- package/dist/index.d.mts +656 -0
- package/dist/index.d.ts +656 -0
- package/dist/index.js +10206 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +10244 -0
- package/dist/index.mjs.map +1 -0
- package/dist/types/VortexClient.d.ts +106 -0
- package/dist/types/VortexClient.d.ts.map +1 -0
- package/dist/types/VortexDeferredLinks.d.ts +73 -0
- package/dist/types/VortexDeferredLinks.d.ts.map +1 -0
- package/dist/types/clientInfo.d.ts +5 -0
- package/dist/types/clientInfo.d.ts.map +1 -0
- package/dist/types/components/ContactsPickerModal.d.ts +18 -0
- package/dist/types/components/ContactsPickerModal.d.ts.map +1 -0
- package/dist/types/components/InviteFormCore.d.ts +166 -0
- package/dist/types/components/InviteFormCore.d.ts.map +1 -0
- package/dist/types/components/InviteFormMobile.d.ts +42 -0
- package/dist/types/components/InviteFormMobile.d.ts.map +1 -0
- package/dist/types/components/InviteFormWeb.d.ts +87 -0
- package/dist/types/components/InviteFormWeb.d.ts.map +1 -0
- package/dist/types/components/PlacedItemToolbar.d.ts +16 -0
- package/dist/types/components/PlacedItemToolbar.d.ts.map +1 -0
- package/dist/types/components/ShareButtons.d.ts +29 -0
- package/dist/types/components/ShareButtons.d.ts.map +1 -0
- package/dist/types/components/VrtxContactsImport.d.ts +14 -0
- package/dist/types/components/VrtxContactsImport.d.ts.map +1 -0
- package/dist/types/components/VrtxEmailInvitations.d.ts +31 -0
- package/dist/types/components/VrtxEmailInvitations.d.ts.map +1 -0
- package/dist/types/components/VrtxFindFriends.d.ts +25 -0
- package/dist/types/components/VrtxFindFriends.d.ts.map +1 -0
- package/dist/types/components/VrtxHeading.d.ts +6 -0
- package/dist/types/components/VrtxHeading.d.ts.map +1 -0
- package/dist/types/components/VrtxIncomingInvitations.d.ts +27 -0
- package/dist/types/components/VrtxIncomingInvitations.d.ts.map +1 -0
- package/dist/types/components/VrtxInvitationSuggestions.d.ts +25 -0
- package/dist/types/components/VrtxInvitationSuggestions.d.ts.map +1 -0
- package/dist/types/components/VrtxInviteContacts.d.ts +24 -0
- package/dist/types/components/VrtxInviteContacts.d.ts.map +1 -0
- package/dist/types/components/VrtxOutgoingInvitations.d.ts +27 -0
- package/dist/types/components/VrtxOutgoingInvitations.d.ts.map +1 -0
- package/dist/types/components/VrtxSearchBox.d.ts +28 -0
- package/dist/types/components/VrtxSearchBox.d.ts.map +1 -0
- package/dist/types/components/VrtxSelect.d.ts +6 -0
- package/dist/types/components/VrtxSelect.d.ts.map +1 -0
- package/dist/types/components/VrtxShareOptions.d.ts +41 -0
- package/dist/types/components/VrtxShareOptions.d.ts.map +1 -0
- package/dist/types/components/VrtxSubmit.d.ts +18 -0
- package/dist/types/components/VrtxSubmit.d.ts.map +1 -0
- package/dist/types/components/VrtxText.d.ts +8 -0
- package/dist/types/components/VrtxText.d.ts.map +1 -0
- package/dist/types/constants/mockData.d.ts +4 -0
- package/dist/types/constants/mockData.d.ts.map +1 -0
- package/dist/types/context/VortexModulesContext.d.ts +238 -0
- package/dist/types/context/VortexModulesContext.d.ts.map +1 -0
- package/dist/types/findFriends.js +10 -0
- package/dist/types/findFriends.js.map +1 -0
- package/dist/types/hooks/useInvitationFormLogic.d.ts +55 -0
- package/dist/types/hooks/useInvitationFormLogic.d.ts.map +1 -0
- package/dist/types/hooks/usePrefetchWidgetConfiguration.d.ts +39 -0
- package/dist/types/hooks/usePrefetchWidgetConfiguration.d.ts.map +1 -0
- package/dist/types/hooks/useThemeStyles.d.ts +35 -0
- package/dist/types/hooks/useThemeStyles.d.ts.map +1 -0
- package/dist/types/hooks/useVortexInvite.d.ts +86 -0
- package/dist/types/hooks/useVortexInvite.d.ts.map +1 -0
- package/dist/types/index-web.d.ts +23 -0
- package/dist/types/index-web.d.ts.map +1 -0
- package/dist/types/index.d.ts +23 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/invitations.js +13 -0
- package/dist/types/invitations.js.map +1 -0
- package/dist/types/inviteContacts.js +14 -0
- package/dist/types/inviteContacts.js.map +1 -0
- package/dist/types/platformOperations.js +3 -0
- package/dist/types/platformOperations.js.map +1 -0
- package/dist/types/searchBox.js +11 -0
- package/dist/types/searchBox.js.map +1 -0
- package/dist/types/types/findFriends.d.ts +101 -0
- package/dist/types/types/findFriends.d.ts.map +1 -0
- package/dist/types/types/invitations.d.ts +301 -0
- package/dist/types/types/invitations.d.ts.map +1 -0
- package/dist/types/types/inviteContacts.d.ts +86 -0
- package/dist/types/types/inviteContacts.d.ts.map +1 -0
- package/dist/types/types/platformOperations.d.ts +185 -0
- package/dist/types/types/platformOperations.d.ts.map +1 -0
- package/dist/types/types/searchBox.d.ts +69 -0
- package/dist/types/types/searchBox.d.ts.map +1 -0
- package/dist/types/types/unfurlConfig.d.ts +34 -0
- package/dist/types/types/unfurlConfig.d.ts.map +1 -0
- package/dist/types/unfurlConfig.js +21 -0
- package/dist/types/unfurlConfig.js.map +1 -0
- package/dist/types/utils/analytics.d.ts +54 -0
- package/dist/types/utils/analytics.d.ts.map +1 -0
- package/dist/types/utils/configCache.d.ts +34 -0
- package/dist/types/utils/configCache.d.ts.map +1 -0
- package/dist/types/utils/contactUtils.d.ts +9 -0
- package/dist/types/utils/contactUtils.d.ts.map +1 -0
- package/dist/types/utils/featureWarnings.d.ts +56 -0
- package/dist/types/utils/featureWarnings.d.ts.map +1 -0
- package/dist/types/utils/formUtils.d.ts +93 -0
- package/dist/types/utils/formUtils.d.ts.map +1 -0
- package/dist/types/utils/gradientUtils.d.ts +67 -0
- package/dist/types/utils/gradientUtils.d.ts.map +1 -0
- package/dist/types/utils/invitationEvents.d.ts +21 -0
- package/dist/types/utils/invitationEvents.d.ts.map +1 -0
- package/dist/types/utils/moduleLoaders.d.ts +115 -0
- package/dist/types/utils/moduleLoaders.d.ts.map +1 -0
- package/dist/types/utils/moduleLoaders.web.d.ts +73 -0
- package/dist/types/utils/moduleLoaders.web.d.ts.map +1 -0
- package/dist/types/utils/nameUtils.d.ts +15 -0
- package/dist/types/utils/nameUtils.d.ts.map +1 -0
- package/dist/types/utils/themeUtils.d.ts +38 -0
- package/dist/types/utils/themeUtils.d.ts.map +1 -0
- package/dist/types/vortexInvite.d.ts +165 -0
- package/dist/types/vortexInvite.d.ts.map +1 -0
- package/dist/useInvitationFormLogic-Ct73M19B.d.mts +242 -0
- package/dist/useInvitationFormLogic-Ct73M19B.d.ts +242 -0
- package/dist/utils/analytics.js +92 -0
- package/dist/utils/analytics.js.map +1 -0
- package/dist/utils/configCache.js +68 -0
- package/dist/utils/configCache.js.map +1 -0
- package/dist/utils/contactUtils.d.mts +12 -0
- package/dist/utils/contactUtils.d.ts +12 -0
- package/dist/utils/contactUtils.js +37 -0
- package/dist/utils/contactUtils.js.map +1 -0
- package/dist/utils/contactUtils.mjs +12 -0
- package/dist/utils/contactUtils.mjs.map +1 -0
- package/dist/utils/featureWarnings.js +214 -0
- package/dist/utils/featureWarnings.js.map +1 -0
- package/dist/utils/formUtils.js +284 -0
- package/dist/utils/formUtils.js.map +1 -0
- package/dist/utils/gradientUtils.js +120 -0
- package/dist/utils/gradientUtils.js.map +1 -0
- package/dist/utils/invitationEvents.js +45 -0
- package/dist/utils/invitationEvents.js.map +1 -0
- package/dist/utils/moduleLoaders.js +275 -0
- package/dist/utils/moduleLoaders.js.map +1 -0
- package/dist/utils/moduleLoaders.web.js +72 -0
- package/dist/utils/moduleLoaders.web.js.map +1 -0
- package/dist/utils/nameUtils.js +51 -0
- package/dist/utils/nameUtils.js.map +1 -0
- package/dist/utils/themeUtils.js +141 -0
- package/dist/utils/themeUtils.js.map +1 -0
- package/dist/vortexInvite.js +83 -0
- package/dist/vortexInvite.js.map +1 -0
- package/package.json +21 -56
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index-web.tsx","../src/components/InviteFormWeb.tsx","../src/components/InviteFormCore.tsx","../src/hooks/useInvitationFormLogic.ts","../src/utils/contactUtils.ts","../src/components/VrtxShareOptions.tsx","../src/context/VortexModulesContext.tsx","../src/components/VrtxContactsImport.tsx","../src/components/VrtxEmailInvitations.tsx","../src/components/VrtxFindFriends.tsx","../../analytics-client/src/core.ts","../../analytics-client/src/eventNames.ts","../src/utils/invitationEvents.ts","../src/components/VrtxIncomingInvitations.tsx","../src/VortexClient.ts","../src/components/VrtxOutgoingInvitations.tsx","../src/components/VrtxInvitationSuggestions.tsx","../src/components/VrtxInviteContacts.tsx","../src/components/VrtxHeading.tsx","../src/components/VrtxText.tsx","../src/components/VrtxSelect.tsx","../src/components/VrtxSubmit.tsx","../src/components/VrtxSearchBox.tsx","../src/components/PlacedItemToolbar.tsx","../src/constants/mockData.ts","../src/utils/gradientUtils.ts","../src/utils/moduleLoaders.web.ts"],"sourcesContent":["/**\n * Web-compatible preview entry point\n * \n * This entry point only exports components and utilities that are safe to use\n * in web environments (Next.js, etc.) without importing any React Native native\n * dependencies like expo-clipboard, expo-sharing, react-native-vector-icons, etc.\n * \n * Use this import in web applications:\n * import { InviteFormWeb } from '@teamvortexsoftware/vortex-react-native/preview';\n * \n * NOTE: InviteFormCore is NOT exported here because it imports native components\n * (VrtxSubmit, VrtxShareOptions, VrtxContactsImport) which pull in moduleLoaders.ts\n * containing native require() statements. Web consumers should use InviteFormWeb\n * which internally uses web-safe component versions.\n */\n\nexport { InviteFormWeb, InviteFormWeb as InvitationFormPreview, type InvitationFormPreviewProps, type ComponentInfo } from './components/InviteFormWeb';\n// Re-export types only from InviteFormCore (types don't cause bundler issues)\nexport type { InvitationFormCoreProps, IconRendererProps, IconName } from './components/InviteFormCore';\nexport { InviteFormCore } from './components/InviteFormCore';\nexport { useInvitationFormLogic, type ViewType, type Contact } from './hooks/useInvitationFormLogic';\nexport { type PlatformOperations } from './types/platformOperations';\nexport { MOCK_CONTACTS, MOCK_GOOGLE_CONTACTS } from './constants/mockData';\nexport { filterContacts } from './utils/contactUtils';\n","import React, { useMemo } from 'react';\nimport { StyleSheet, View, Text } from 'react-native';\nimport { InviteFormCore, type IconRendererProps } from './InviteFormCore';\nimport { PlatformOperations } from '../types/platformOperations';\nimport { FindFriendsConfig, FindFriendsContact } from '../types/findFriends';\nimport { IncomingInvitationsConfig, OutgoingInvitationsConfig, InvitationSuggestionsConfig, InvitationItem } from '../types/invitations';\nimport { InviteContactsConfig, InviteContactsContact } from '../types/inviteContacts';\nimport { SearchBoxConfig } from '../types/searchBox';\nimport { MOCK_CONTACTS } from '../constants/mockData';\nimport { VortexModulesProvider, type ModuleLoaders } from '../context/VortexModulesContext';\n// Import web-safe loaders that don't contain native require() statements\nimport * as webLoaders from '../utils/moduleLoaders.web';\n\n/**\n * InviteFormWeb - Web-compatible version of InviteFormMobile\n *\n * This component is designed for web preview environments where native dependencies\n * like react-native-vector-icons are not available. It accepts a custom icon renderer\n * that should use FontAwesome5-compatible icon libraries to match the mobile experience.\n *\n * The mobile InviteFormMobile uses FontAwesome5 icons. To ensure consistency between\n * preview and mobile, use FontAwesome5 equivalents in your web icon library.\n *\n * @example\n * // Using with React Icons (FontAwesome5)\n * import { FaTimes, FaArrowLeft, FaLink, FaShareAlt, FaAddressBook, FaEnvelope, FaGoogle } from 'react-icons/fa';\n *\n * const iconComponents = {\n * 'close': FaTimes,\n * 'arrow-back': FaArrowLeft,\n * 'link': FaLink,\n * 'share': FaShareAlt,\n * 'import-contacts': FaAddressBook,\n * 'email': FaEnvelope,\n * 'google': FaGoogle,\n * };\n *\n * const renderIcon = ({ name, size, color }) => {\n * const IconComponent = iconComponents[name];\n * if (!IconComponent) return null;\n * return <IconComponent style={{ fontSize: size, color }} />;\n * };\n *\n * <InviteFormWeb renderIcon={renderIcon} />\n */\n\nexport interface ComponentInfo {\n id: string;\n type: string; // 'button', 'text', 'input', etc.\n element: HTMLElement | null;\n styles: React.CSSProperties;\n content?: string;\n}\n\nexport interface InvitationFormPreviewProps {\n /**\n * Function to render icons - allows web-compatible icon libraries to be used\n * Must handle all icon names and should use FontAwesome5 equivalents for consistency:\n * 'close' (times), 'arrow-back' (arrow-left), 'link', 'share' (share-alt),\n * 'import-contacts' (address-book), 'email' (envelope), 'google'\n */\n renderIcon: (props: IconRendererProps) => React.ReactNode;\n\n /**\n * Optional font family override\n */\n fontFamily?: string;\n\n /**\n * Widget configuration containing component settings\n */\n widgetConfiguration?: any;\n\n /**\n * Whether edit mode is enabled (for hover highlighting)\n */\n isEditMode?: boolean;\n\n /**\n * Whether a drag is currently active (to show drop zones)\n */\n isDragging?: boolean;\n\n /**\n * Callback when a component is selected in edit mode\n */\n onComponentSelect?: (componentInfo: ComponentInfo) => void;\n\n /**\n * Callback when a palette item is dropped onto a component\n */\n onDrop?: (componentInfo: ComponentInfo, droppedItem: any) => void;\n\n /**\n * Callbacks for setting/clearing drop targets (for Redux integration)\n */\n onSetDropTarget?: (target: { elementId: string; elementType: string; position: string; rowId?: string; insertionIndex?: number }) => void;\n onClearDropTarget?: () => void;\n}\n\nexport function InviteFormWeb({\n renderIcon,\n fontFamily = '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", sans-serif',\n widgetConfiguration,\n isEditMode = false,\n isDragging = false,\n onComponentSelect,\n onDrop,\n onSetDropTarget,\n onClearDropTarget,\n}: InvitationFormPreviewProps) {\n // Web QR code renderer - always points to vortexsoftware.com for preview\n const renderQRCode = ({ value, size }: { value: string; size: number }) => {\n try {\n // Dynamic import to avoid hard dependency\n const QRCodeWeb = require('react-qr-code').default;\n return (\n <View style={{ padding: 10, backgroundColor: '#fff' }}>\n <QRCodeWeb\n value=\"https://vortexsoftware.com\"\n size={size}\n style={{ height: \"auto\", maxWidth: \"100%\", width: \"100%\" }}\n />\n </View>\n );\n } catch (error) {\n console.warn('[Vortex Preview] react-qr-code not available:', error);\n return (\n <View style={{ padding: 20, alignItems: 'center' }}>\n <Text style={{ fontSize: 14, color: '#666', textAlign: 'center' }}>\n QR Code preview not available\n </Text>\n </View>\n );\n }\n };\n\n // Web-compatible platform operations - NO native dependencies\n // Memoized to prevent re-fetching contacts on every render (e.g., hover events in edit mode)\n const platformOperations: PlatformOperations = useMemo(() => ({\n copyToClipboard: async () => {\n // Mock invitation link for preview\n const mockInvitationLink = 'https://app.vortexsoftware.com/invite/preview-abc123';\n if (typeof navigator !== 'undefined' && navigator.clipboard?.writeText) {\n await navigator.clipboard.writeText(mockInvitationLink);\n console.log('[Preview] Copied invitation link to clipboard:', mockInvitationLink);\n } else {\n console.warn('[Preview] Clipboard not available, would copy:', mockInvitationLink);\n }\n },\n share: async () => {\n // Mock invitation link and message for preview\n const mockInvitationLink = 'https://app.vortexsoftware.com/invite/preview-abc123';\n const mockMessage = `You're invited to join our team! ${mockInvitationLink}`;\n\n if (typeof navigator !== 'undefined' && (navigator as any).share) {\n await (navigator as any).share({\n title: 'Join our team',\n text: mockMessage,\n url: mockInvitationLink,\n });\n } else {\n console.log('[Preview] Share not available, would share:', {\n title: 'Join our team',\n text: mockMessage,\n url: mockInvitationLink,\n });\n }\n },\n close: () => {\n console.log('Close (preview mode - no-op)');\n },\n triggerHaptic: async (style: 'light' | 'medium' | 'heavy') => {\n // No-op for web preview - haptics don't make sense on web\n console.debug(`[Preview] Haptic feedback (${style}) - no-op on web`);\n },\n fetchContacts: async () => {\n // Always return mock data for consistent preview behavior\n return MOCK_CONTACTS;\n },\n invite: async (email: string, contactName?: string) => {\n // Simulate API delay for realistic preview behavior\n await new Promise((resolve) => setTimeout(resolve, 500));\n console.log('[Preview] Would send invite to:', email, contactName ? `(${contactName})` : '');\n },\n fetchGoogleContacts: async () => {\n // Simulate API delay for realistic preview behavior\n await new Promise((resolve) => setTimeout(resolve, 800));\n // Return mock Google contacts for consistent preview behavior\n return [\n { id: 'google-1', name: 'Alice Johnson', email: 'alice.johnson@gmail.com' },\n { id: 'google-2', name: 'Bob Smith', email: 'bob.smith@gmail.com' },\n { id: 'google-3', name: 'Carol Davis', email: 'carol.davis@gmail.com' },\n ];\n },\n shareViaEmail: async () => {\n console.log('[Preview] Would open email composer');\n },\n shareViaSms: async () => {\n console.log('[Preview] Would open SMS composer');\n },\n shareViaTwitter: async () => {\n console.log('[Preview] Would share via X/Twitter');\n },\n shareViaInstagram: async () => {\n console.log('[Preview] Would share via Instagram');\n },\n shareViaWhatsApp: async () => {\n console.log('[Preview] Would share via WhatsApp');\n },\n shareViaLine: async () => {\n console.log('[Preview] Would share via Line');\n },\n shareViaFacebookMessenger: async () => {\n console.log('[Preview] Would share via Facebook Messenger');\n },\n shareViaTelegram: async () => {\n console.log('[Preview] Would share via Telegram');\n },\n shareViaDiscord: async () => {\n console.log('[Preview] Would share via Discord');\n },\n showQrCode: async () => {\n console.log('[Preview] Navigating to QR Code view');\n // Navigation handled by InviteFormCore\n },\n }), []);\n\n // Container styles for web preview (no absolute positioning, flex layout)\n const containerStyle = StyleSheet.create({\n container: {\n flex: 1,\n backgroundColor: '#fff',\n paddingTop: 8,\n },\n }).container;\n\n // Mock contacts for preview\n const mockContacts: FindFriendsContact[] = useMemo(\n () => [\n {\n userId: 'user-2',\n name: 'Bob Smith',\n subtitle: '@bobsmith',\n },\n {\n userId: 'user-4',\n name: 'David Wilson',\n subtitle: '@dwilson',\n },\n ],\n []\n );\n\n // Mock Find Friends configuration for preview\n const mockFindFriendsConfig: FindFriendsConfig = useMemo(() => ({\n contacts: mockContacts,\n onConnect: (contact) => {\n console.log('[Preview] Would connect with:', contact.name, contact.userId);\n return true; // Allow invitation to be created\n },\n connectButtonText: 'Connect',\n emptyStateMessage: 'No contacts found',\n }), [mockContacts]);\n\n // Mock incoming invitations for preview\n const mockIncomingInvitations: InvitationItem[] = useMemo(() => [\n { id: 'incoming-1', name: 'Sarah Connor', subtitle: '@sarahconnor', avatarUrl: undefined },\n ], []);\n\n // Mock Incoming Invitations configuration for preview\n const mockIncomingInvitationsConfig: IncomingInvitationsConfig = useMemo(() => ({\n invitations: mockIncomingInvitations,\n onAccept: (invitation) => {\n console.log('[Preview] Would accept invitation from:', invitation.name);\n },\n onDelete: (invitation) => {\n console.log('[Preview] Would delete invitation from:', invitation.name);\n },\n acceptButtonText: 'Accept',\n deleteButtonText: 'Delete',\n emptyStateMessage: 'No incoming invitations',\n }), [mockIncomingInvitations]);\n\n // Mock outgoing invitations for preview\n const mockOutgoingInvitations: InvitationItem[] = useMemo(() => [\n { id: 'outgoing-1', name: 'Mike Johnson', subtitle: '@mikejohnson', avatarUrl: undefined },\n ], []);\n\n // Mock Outgoing Invitations configuration for preview\n const mockOutgoingInvitationsConfig: OutgoingInvitationsConfig = useMemo(() => ({\n onCancel: (invitation) => {\n console.log('[Preview] Would cancel invitation to:', invitation.name);\n },\n _mockInvitations: mockOutgoingInvitations,\n }), [mockOutgoingInvitations]);\n\n // Mock invitation suggestions for preview\n const mockInvitationSuggestions: InvitationItem[] = useMemo(() => [\n { id: 'suggestion-1', name: 'Alex Turner', subtitle: '@alexturner', avatarUrl: undefined },\n ], []);\n\n // Mock Invitation Suggestions configuration for preview\n const mockInvitationSuggestionsConfig: InvitationSuggestionsConfig = useMemo(() => ({\n suggestions: mockInvitationSuggestions,\n onInvite: (suggestion) => {\n console.log('[Preview] Would invite:', suggestion.name);\n },\n onDismiss: (suggestion) => {\n console.log('[Preview] Would dismiss suggestion:', suggestion.name);\n },\n inviteButtonText: 'Invite',\n emptyStateMessage: 'No suggestions',\n }), [mockInvitationSuggestions]);\n\n // Mock contacts for Invite Contacts preview\n const mockInviteContacts: InviteContactsContact[] = useMemo(() => [\n { id: 'contact-1', name: 'Alice Johnson', phoneNumber: '+1 (555) 123-4567' },\n { id: 'contact-2', name: 'Bob Smith', phoneNumber: '+1 (555) 234-5678' },\n { id: 'contact-3', name: 'Carol Davis', phoneNumber: '+1 (555) 345-6789' },\n ], []);\n\n // Mock Invite Contacts configuration for preview\n const mockInviteContactsConfig: InviteContactsConfig = useMemo(() => ({\n contacts: mockInviteContacts,\n onInvite: (contact, shortLink) => {\n console.log('[Preview] Would invite via SMS:', contact.name, contact.phoneNumber, 'with link:', shortLink);\n },\n onInvitationCreated: (contact, shortLink) => {\n console.log('[Preview] Invitation created for:', contact.name, 'link:', shortLink);\n },\n inviteYourContactsText: 'Invite your contacts',\n inviteButtonText: 'Invite',\n emptyStateMessage: 'No contacts to invite',\n }), [mockInviteContacts]);\n\n // Hard-coded contacts for search box partial text matching\n const searchBoxContacts: FindFriendsContact[] = useMemo(() => [\n { userId: 'search-1', name: 'Bob Smith', subtitle: '@bobsmith' },\n { userId: 'search-2', name: 'David Wilson', subtitle: '@dwilson' },\n { userId: 'search-3', name: 'Alice Johnson', subtitle: '@alicej' },\n { userId: 'search-4', name: 'Sarah Connor', subtitle: '@sarahconnor' },\n { userId: 'search-5', name: 'Mike Davis', subtitle: '@mikedavis' },\n ], []);\n\n // Mock Search Box configuration for preview\n const mockSearchBoxConfig: SearchBoxConfig = useMemo(() => ({\n onSearch: async (query) => {\n console.log('[Preview] Searching for:', query);\n const q = query.toLowerCase();\n return searchBoxContacts.filter(\n (c) =>\n c.name.toLowerCase().includes(q) ||\n (c.subtitle && c.subtitle.toLowerCase().includes(q))\n );\n },\n onConnect: (contact) => {\n console.log('[Preview] Would connect with:', contact.name, contact.userId);\n return true;\n },\n connectButtonText: 'Connect',\n noResultsMessage: 'No results found',\n }), []);\n\n // Create modules config with web-safe loaders\n const modulesConfig = useMemo(\n () => ({\n // No module names needed for web - we use CSS gradients directly\n loaders: {\n loadGradientComponent: webLoaders.loadGradientComponent,\n parseCSSLinearGradient: webLoaders.parseCSSLinearGradient,\n angleToGradientPoints: webLoaders.angleToGradientPoints,\n parseGradientFirstColor: webLoaders.parseGradientFirstColor,\n } as ModuleLoaders,\n }),\n []\n );\n\n return (\n <VortexModulesProvider config={modulesConfig}>\n <InviteFormCore\n renderIcon={renderIcon}\n renderQRCode={renderQRCode}\n platformOperations={platformOperations}\n fontFamily={fontFamily}\n containerStyle={containerStyle}\n widgetConfiguration={widgetConfiguration}\n isEditMode={isEditMode}\n isDragging={isDragging}\n onComponentSelect={onComponentSelect}\n onDrop={onDrop}\n onSetDropTarget={onSetDropTarget}\n onClearDropTarget={onClearDropTarget}\n findFriendsConfig={mockFindFriendsConfig}\n incomingInvitationsConfig={mockIncomingInvitationsConfig}\n outgoingInvitationsConfig={mockOutgoingInvitationsConfig}\n invitationSuggestionsConfig={mockInvitationSuggestionsConfig}\n inviteContactsConfig={mockInviteContactsConfig}\n searchBoxConfig={mockSearchBoxConfig}\n apiUrl=\"https://client-api.vortexsoftware.com\"\n jwt=\"preview-mock-jwt\"\n />\n </VortexModulesProvider>\n );\n}\n","import React, { ReactNode, useState, useEffect, useCallback } from 'react';\nimport {\n View,\n Text,\n StyleSheet,\n TextInput,\n TouchableOpacity,\n ScrollView,\n ActivityIndicator,\n Linking,\n Platform,\n ViewStyle,\n Image,\n} from 'react-native';\nimport { useInvitationFormLogic } from '../hooks/useInvitationFormLogic';\nimport { PlatformOperations } from '../types/platformOperations';\nimport { FindFriendsConfig } from '../types/findFriends';\nimport {\n IncomingInvitationsConfig,\n OutgoingInvitationsConfig,\n InvitationSuggestionsConfig,\n} from '../types/invitations';\nimport { InviteContactsConfig } from '../types/inviteContacts';\nimport { SearchBoxConfig } from '../types/searchBox';\nimport { MOCK_GOOGLE_CONTACTS } from '../constants/mockData';\nimport { filterContacts } from '../utils/contactUtils';\nimport type { Contact } from '../hooks/useInvitationFormLogic';\nimport { VrtxShareOptions } from './VrtxShareOptions';\nimport { VrtxContactsImport } from './VrtxContactsImport';\nimport { VrtxEmailInvitations } from './VrtxEmailInvitations';\nimport { VrtxFindFriends } from './VrtxFindFriends';\nimport { VrtxIncomingInvitations } from './VrtxIncomingInvitations';\nimport { VrtxOutgoingInvitations } from './VrtxOutgoingInvitations';\nimport { VrtxInvitationSuggestions } from './VrtxInvitationSuggestions';\nimport { VrtxInviteContacts } from './VrtxInviteContacts';\nimport { VrtxHeading } from './VrtxHeading';\nimport { VrtxText } from './VrtxText';\nimport { VrtxSelect } from './VrtxSelect';\nimport { VrtxSubmit } from './VrtxSubmit';\nimport { VrtxSearchBox } from './VrtxSearchBox';\nimport { usePlacedItemToolbar } from './PlacedItemToolbar';\n\nconst isWeb = Platform.OS === 'web';\n\n// Parse CSS linear-gradient to extract first color for fallback\nfunction parseGradientFirstColor(gradientString: string): string | null {\n if (!gradientString || !gradientString.includes('linear-gradient')) {\n return null;\n }\n\n const stopsRegex = /(rgba?\\([^)]+\\)|#[0-9a-fA-F]{3,8}|[a-z]+)\\s+(\\d+)%/i;\n const match = stopsRegex.exec(gradientString);\n\n if (match) {\n return match[1].trim();\n }\n\n return null;\n}\n\n// Button wrapper component that handles gradients on web, solid color fallback on native\ninterface ButtonWrapperProps {\n children: React.ReactNode;\n style: ViewStyle | ViewStyle[];\n gradientString: string | null;\n onPress?: () => void;\n disabled?: boolean;\n wrapperStyle?: ViewStyle | ViewStyle[];\n}\n\nconst ButtonWrapper: React.FC<ButtonWrapperProps> = ({\n children,\n style,\n gradientString,\n onPress,\n disabled,\n wrapperStyle,\n}) => {\n const styleArray = Array.isArray(style) ? style : [style];\n\n // On web, use CSS gradients directly\n if (gradientString && isWeb) {\n return (\n <TouchableOpacity\n style={[wrapperStyle, ...styleArray, { background: gradientString } as any]}\n onPress={onPress}\n disabled={disabled}\n activeOpacity={0.7}\n >\n {children}\n </TouchableOpacity>\n );\n }\n\n // On native, use first color from gradient as solid background\n const fallbackColor = gradientString ? parseGradientFirstColor(gradientString) : null;\n const finalStyle = fallbackColor\n ? [wrapperStyle, ...styleArray, { backgroundColor: fallbackColor }]\n : [wrapperStyle, ...styleArray];\n\n return (\n <TouchableOpacity style={finalStyle} onPress={onPress} disabled={disabled} activeOpacity={0.7}>\n {children}\n </TouchableOpacity>\n );\n};\n\nexport type IconName =\n | 'close'\n | 'arrow-back'\n | 'link'\n | 'share'\n | 'import-contacts'\n | 'email'\n | 'google'\n | 'x-twitter'\n | 'instagram'\n | 'sms'\n | 'whatsapp'\n | 'line'\n | 'qr-code'\n | 'telegram'\n | 'discord'\n | 'facebook-messenger'\n | 'search';\n\nexport interface IconRendererProps {\n name: IconName;\n size: number;\n color: string;\n opacity?: number;\n}\n\nexport interface ComponentInfo {\n id: string;\n type: string; // 'button', 'text', 'input', etc.\n element: HTMLElement | null;\n styles: React.CSSProperties;\n content?: string;\n droppedItem?: any; // Data about the dropped item, if applicable\n}\n\nexport interface InvitationFormCoreProps {\n /**\n * Function to render icons - allows different icon libraries to be used\n */\n renderIcon: (props: IconRendererProps) => ReactNode;\n\n /**\n * Function to render QR code - allows platform-specific QR libraries to be used\n * - Native: uses react-native-qrcode-svg\n * - Web: uses react-qr-code\n */\n renderQRCode?: (props: { value: string; size: number }) => ReactNode;\n\n /**\n * Platform-specific operations (clipboard, share, close)\n */\n platformOperations: PlatformOperations;\n\n /**\n * Font family to use for text\n */\n fontFamily?: string;\n\n /**\n * Container style overrides\n */\n containerStyle?: Record<string, any>;\n\n /**\n * Widget configuration containing component settings\n */\n widgetConfiguration?: any;\n\n /**\n * Whether edit mode is enabled (for hover highlighting and drag-drop)\n */\n isEditMode?: boolean;\n\n /**\n * Callback when a component is selected in edit mode\n */\n onComponentSelect?: (componentInfo: ComponentInfo) => void;\n\n /**\n * Callback when a palette item is dropped onto a component\n */\n onDrop?: (componentInfo: ComponentInfo, droppedItem: any) => void;\n\n /**\n * Callbacks for setting/clearing drop targets (for Redux integration)\n */\n onSetDropTarget?: (target: {\n elementId: string;\n elementType: string;\n position: string;\n rowId?: string;\n insertionIndex?: number;\n }) => void;\n onClearDropTarget?: () => void;\n\n /**\n * Function to fetch the shareable invitation link for QR code\n */\n getShareableInviteLink?: () => Promise<string | undefined>;\n\n /**\n * Whether a drag is currently active (to show drop zones)\n */\n isDragging?: boolean;\n\n /**\n * Callback when a component is deleted in edit mode\n */\n onComponentDelete?: (componentId: string, componentType: string) => void;\n\n // Analytics callbacks (optional - no-op for preview mode)\n /**\n * Track share link click events\n */\n onShareLinkClick?: (clickName: string) => void;\n\n /**\n * Track email field focus events\n */\n onEmailFieldFocus?: () => void;\n\n /**\n * Track email field blur events\n */\n onEmailFieldBlur?: () => void;\n\n /**\n * Track email validation events\n */\n onEmailValidation?: (email: string, isValid: boolean) => void;\n\n /**\n * Track email invitations submitted events\n */\n onEmailInvitationsSubmitted?: (formData: Record<string, any>) => void;\n\n /**\n * Track email validation error events\n */\n onEmailValidationError?: (formData: Record<string, any>) => void;\n\n /**\n * Track email submit error events\n */\n onEmailSubmitError?: (error: string) => void;\n\n /**\n * Configuration for the Find Friends feature.\n * When provided, enables the Find Friends component to display\n * contacts with Connect buttons.\n */\n findFriendsConfig?: FindFriendsConfig;\n\n /**\n * Function to create an invitation with internal ID target type.\n * Called when user taps Connect and the onConnect callback returns true.\n */\n createUserIdInvitation?: (userId: string, name?: string, avatarUrl?: string, metadata?: Record<string, unknown>) => Promise<void>;\n\n /**\n * Configuration for the Incoming Invitations feature.\n * When provided, enables the Incoming Invitations component to display\n * invitations the user has received with Accept/Delete buttons.\n */\n incomingInvitationsConfig?: IncomingInvitationsConfig;\n\n /**\n * Configuration for the Outgoing Invitations feature.\n * When provided, enables the Outgoing Invitations component to display\n * invitations the user has sent with a Cancel button.\n */\n outgoingInvitationsConfig?: OutgoingInvitationsConfig;\n\n /**\n * Configuration for the Invitation Suggestions feature.\n * When provided, enables the Invitation Suggestions component to display\n * \"People you may know\" with Invite and Dismiss buttons.\n */\n invitationSuggestionsConfig?: InvitationSuggestionsConfig;\n\n /**\n * Configuration for the Invite Contacts feature.\n * When provided, enables the Invite Contacts component to display\n * a list of contacts that can be invited via SMS.\n */\n inviteContactsConfig?: InviteContactsConfig;\n\n /**\n * Configuration for the Search Box feature.\n * When provided, enables the Search Box component with a search input,\n * search button, and results list with Connect buttons.\n */\n searchBoxConfig?: SearchBoxConfig;\n\n /**\n * API URL for server operations (e.g., fetching outgoing invitations)\n */\n apiUrl: string;\n\n /**\n * JWT token for authentication\n */\n jwt: string;\n\n}\n\nexport function InviteFormCore({\n renderIcon,\n renderQRCode,\n platformOperations,\n fontFamily = '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", sans-serif',\n containerStyle = {},\n widgetConfiguration,\n isEditMode = false,\n isDragging = false,\n onComponentSelect,\n onDrop,\n onSetDropTarget,\n onClearDropTarget,\n onComponentDelete,\n getShareableInviteLink,\n // Analytics callbacks (optional - no-op for preview mode)\n onShareLinkClick,\n onEmailFieldFocus,\n onEmailFieldBlur,\n onEmailValidation,\n onEmailInvitationsSubmitted,\n onEmailValidationError,\n onEmailSubmitError,\n // Find Friends configuration\n findFriendsConfig,\n createUserIdInvitation,\n // Incoming/Outgoing Invitations configuration\n incomingInvitationsConfig,\n outgoingInvitationsConfig,\n // Invitation Suggestions configuration\n invitationSuggestionsConfig,\n // Invite Contacts configuration\n inviteContactsConfig,\n // Search Box configuration\n searchBoxConfig,\n // API configuration\n apiUrl,\n jwt,\n}: InvitationFormCoreProps) {\n // Get the form structure from widget configuration\n const getFormStructure = () => {\n try {\n const formData = widgetConfiguration?.configuration?.props?.['vortex.components.form']?.value;\n if (formData && typeof formData === 'object' && formData.root) {\n return formData.root;\n }\n } catch (err) {\n console.error('[InviteFormCore] Failed to parse form structure:', err);\n }\n return null;\n };\n\n const formStructure = getFormStructure();\n\n if (!formStructure) {\n console.error(\n '[InviteFormCore] No form structure found in widget configuration. ' +\n 'The widget may not have a form configured, or the configuration format is unexpected. ' +\n 'Expected path: configuration.props[\"vortex.components.form\"].value.root'\n );\n }\n\n // Extract form title from widget configuration (mobile-specific key takes priority)\n const resolvedTitle =\n formStructure?.settings?.customizations?.['mobile.formTitle']?.textContent ||\n formStructure?.settings?.customizations?.formTitle?.textContent ||\n null;\n\n // Extract title theme styles from root theme options\n const resolvedTitleStyle = (() => {\n const themeOptions = formStructure?.theme?.options;\n if (!Array.isArray(themeOptions)) return undefined;\n const getVal = (key: string) => themeOptions.find((o: any) => o.key === key)?.value || undefined;\n const color = getVal('--vrtx-form-title-color');\n const fontSize = getVal('--vrtx-form-title-font-size');\n const fontWeight = getVal('--vrtx-form-title-font-weight');\n const fontFamily = getVal('--vrtx-form-title-font-family');\n if (!color && !fontSize && !fontWeight && !fontFamily) return undefined;\n return {\n ...(color && { color }),\n ...(fontSize && { fontSize: parseFloat(fontSize) || undefined }),\n ...(fontWeight && { fontWeight }),\n ...(fontFamily && { fontFamily }),\n };\n })();\n\n // Helper function to find email invitations block in form structure\n const findEmailInvitationsBlock = (): any => {\n if (!formStructure) return null;\n\n const searchChildren = (children: any[]): any => {\n if (!Array.isArray(children)) return null;\n\n for (const child of children) {\n if (\n child.type === 'block' &&\n child.subtype === 'vrtx-email-invitations' &&\n child.hidden !== true\n ) {\n return child;\n }\n if (child.children) {\n const found = searchChildren(child.children);\n if (found) return found;\n }\n }\n return null;\n };\n\n if (formStructure.children) {\n return searchChildren(formStructure.children);\n }\n return null;\n };\n\n const emailInvitationsBlock = findEmailInvitationsBlock();\n\n // Helper function to find submit button block in form structure\n const findSubmitButtonBlock = (): any => {\n if (!formStructure) return null;\n\n const searchChildren = (children: any[]): any => {\n if (!Array.isArray(children)) return null;\n\n for (const child of children) {\n if (child.type === 'block' && child.subtype === 'vrtx-submit') {\n return child;\n }\n if (child.children) {\n const found = searchChildren(child.children);\n if (found) return found;\n }\n }\n return null;\n };\n\n if (formStructure.children) {\n return searchChildren(formStructure.children);\n }\n return null;\n };\n\n const submitButtonBlock = findSubmitButtonBlock();\n\n // Helper function to find contacts-import block in form structure\n const findContactsImportBlock = (): any => {\n if (!formStructure) return null;\n\n const searchChildren = (children: any[]): any => {\n if (!Array.isArray(children)) return null;\n\n for (const child of children) {\n if (child.type === 'block' && child.subtype === 'vrtx-contacts-import') {\n return child;\n }\n if (child.children) {\n const found = searchChildren(child.children);\n if (found) return found;\n }\n }\n return null;\n };\n\n if (formStructure.children) {\n return searchChildren(formStructure.children);\n }\n return null;\n };\n\n const contactsImportBlock = findContactsImportBlock();\n\n // Helper to get customization text from contacts-import block\n const getContactsCustomization = (key: string, defaultValue: string): string => {\n const textContent = contactsImportBlock?.settings?.customizations?.[key]?.textContent;\n if (textContent === null || textContent === undefined) {\n return defaultValue;\n }\n return textContent;\n };\n\n // Extract styles from email invitations block for \"Add by Email\" button\n const emailInvitationsStyle = emailInvitationsBlock?.style || {};\n\n // Extract gradient string and fallback color\n // On native, 'background' is a CSS property that doesn't work — convert solid colors to 'backgroundColor'\n const rawEmailBackground = emailInvitationsStyle.background || null;\n const isEmailGradient = rawEmailBackground?.includes('gradient');\n const emailInvitationsGradientString = isEmailGradient ? rawEmailBackground : null;\n const emailInvitationsFallbackColor = isEmailGradient\n ? parseGradientFirstColor(rawEmailBackground)\n : rawEmailBackground || emailInvitationsStyle.backgroundColor;\n\n const emailInvitationsTextColor = emailInvitationsStyle.color || '#333';\n\n // Helper function to check if native Contacts import is enabled\n const isNativeContactsEnabled = () => {\n if (!widgetConfiguration?.configuration?.props?.['vortex.components']?.value) {\n return false;\n }\n\n const components = widgetConfiguration.configuration.props['vortex.components'].value;\n return (\n Array.isArray(components) &&\n components.includes('vortex.components.importcontacts.providers.importcontacts')\n );\n };\n\n // Helper function to check if Google Contacts import is enabled\n const isGoogleContactsEnabled = () => {\n if (!widgetConfiguration?.configuration?.props?.['vortex.components']?.value) {\n return false;\n }\n\n const components = widgetConfiguration.configuration.props['vortex.components'].value;\n return (\n Array.isArray(components) &&\n components.includes('vortex.components.importcontacts.providers.google')\n );\n };\n\n // Helper function to check if Copy Link is enabled\n const isCopyLinkEnabled = () => {\n if (!widgetConfiguration?.configuration?.props?.['vortex.components.share.options']?.value) {\n return false;\n }\n\n const shareOptions =\n widgetConfiguration.configuration.props['vortex.components.share.options'].value;\n return Array.isArray(shareOptions) && shareOptions.includes('copyLink');\n };\n\n // Helper function to check if Share (native share sheet) is enabled\n const isShareEnabled = () => {\n if (!widgetConfiguration?.configuration?.props?.['vortex.components.share.options']?.value) {\n return false;\n }\n\n const shareOptions =\n widgetConfiguration.configuration.props['vortex.components.share.options'].value;\n return Array.isArray(shareOptions) && shareOptions.includes('nativeShareSheet');\n };\n\n // Helper function to check if Email Invitations is enabled\n // Check if the form structure contains a vrtx-email-invitations block\n const isEmailInvitationsEnabled = () => {\n if (!widgetConfiguration?.configuration?.props?.['vortex.components']?.value) {\n return false;\n }\n\n const components = widgetConfiguration.configuration.props['vortex.components'].value;\n return Array.isArray(components) && components.includes('vortex.components.emailinvitations');\n };\n\n // Helper function to check if Email share is enabled\n const isEmailShareEnabled = () => {\n if (!widgetConfiguration?.configuration?.props?.['vortex.components.share.options']?.value) {\n return false;\n }\n const shareOptions =\n widgetConfiguration.configuration.props['vortex.components.share.options'].value;\n return Array.isArray(shareOptions) && shareOptions.includes('email');\n };\n\n // Helper function to check if SMS is enabled\n const isSmsEnabled = () => {\n if (!widgetConfiguration?.configuration?.props?.['vortex.components.share.options']?.value) {\n return false;\n }\n const shareOptions =\n widgetConfiguration.configuration.props['vortex.components.share.options'].value;\n return Array.isArray(shareOptions) && shareOptions.includes('sms');\n };\n\n // Helper function to check if X/Twitter DMs is enabled\n const isTwitterDmsEnabled = () => {\n if (!widgetConfiguration?.configuration?.props?.['vortex.components.share.options']?.value) {\n return false;\n }\n const shareOptions =\n widgetConfiguration.configuration.props['vortex.components.share.options'].value;\n return Array.isArray(shareOptions) && shareOptions.includes('twitterDms');\n };\n\n // Helper function to check if Instagram DMs is enabled\n const isInstagramDmsEnabled = () => {\n if (!widgetConfiguration?.configuration?.props?.['vortex.components.share.options']?.value) {\n return false;\n }\n const shareOptions =\n widgetConfiguration.configuration.props['vortex.components.share.options'].value;\n return Array.isArray(shareOptions) && shareOptions.includes('instagramDms');\n };\n\n // Helper function to check if WhatsApp is enabled\n const isWhatsAppEnabled = () => {\n if (!widgetConfiguration?.configuration?.props?.['vortex.components.share.options']?.value) {\n return false;\n }\n const shareOptions =\n widgetConfiguration.configuration.props['vortex.components.share.options'].value;\n return Array.isArray(shareOptions) && shareOptions.includes('whatsApp');\n };\n\n // Helper function to check if Line is enabled\n const isLineEnabled = () => {\n if (!widgetConfiguration?.configuration?.props?.['vortex.components.share.options']?.value) {\n return false;\n }\n const shareOptions =\n widgetConfiguration.configuration.props['vortex.components.share.options'].value;\n return Array.isArray(shareOptions) && shareOptions.includes('line');\n };\n\n // Helper function to check if Line LIFF is enabled\n const isLineLiffEnabled = () => {\n if (!widgetConfiguration?.configuration?.props?.['vortex.components.share.options']?.value) {\n return false;\n }\n const shareOptions =\n widgetConfiguration.configuration.props['vortex.components.share.options'].value;\n return Array.isArray(shareOptions) && shareOptions.includes('lineLiff');\n };\n\n // Helper function to check if QR Code is enabled\n const isQrCodeEnabled = () => {\n if (!widgetConfiguration?.configuration?.props?.['vortex.components.share.options']?.value) {\n return false;\n }\n const shareOptions =\n widgetConfiguration.configuration.props['vortex.components.share.options'].value;\n return Array.isArray(shareOptions) && shareOptions.includes('qrCode');\n };\n\n // Helper function to check if Facebook Messenger is enabled\n const isFacebookMessengerEnabled = () => {\n if (!widgetConfiguration?.configuration?.props?.['vortex.components.share.options']?.value) {\n return false;\n }\n const shareOptions =\n widgetConfiguration.configuration.props['vortex.components.share.options'].value;\n return Array.isArray(shareOptions) && shareOptions.includes('facebookMessenger');\n };\n\n // Helper function to check if Telegram is enabled\n const isTelegramEnabled = () => {\n if (!widgetConfiguration?.configuration?.props?.['vortex.components.share.options']?.value) {\n return false;\n }\n const shareOptions =\n widgetConfiguration.configuration.props['vortex.components.share.options'].value;\n return Array.isArray(shareOptions) && shareOptions.includes('telegram');\n };\n\n // Helper function to check if Discord is enabled\n const isDiscordEnabled = () => {\n if (!widgetConfiguration?.configuration?.props?.['vortex.components.share.options']?.value) {\n return false;\n }\n const shareOptions =\n widgetConfiguration.configuration.props['vortex.components.share.options'].value;\n return Array.isArray(shareOptions) && shareOptions.includes('discord');\n };\n\n // Helper function to get share options order from configuration\n const getShareOptionsOrder = (): string[] => {\n const shareOptions =\n widgetConfiguration?.configuration?.props?.['vortex.components.share.options']?.value;\n return Array.isArray(shareOptions) ? shareOptions : [];\n };\n\n // State for fetched contacts\n const [contacts, setContacts] = useState<Contact[]>([]);\n const [loadingContacts, setLoadingContacts] = useState(false);\n const [contactsFetchAttempted, setContactsFetchAttempted] = useState(false);\n const [contactsError, setContactsError] = useState<Error | null>(null);\n\n // State for fetched Google contacts\n const [googleContacts, setGoogleContacts] = useState<Contact[]>([]);\n const [loadingGoogleContacts, setLoadingGoogleContacts] = useState(false);\n const [googleContactsFetchAttempted, setGoogleContactsFetchAttempted] = useState(false);\n const [googleContactsError, setGoogleContactsError] = useState<Error | null>(null);\n\n // State for hover tracking in edit mode\n const [hoveredComponentId, setHoveredComponentId] = useState<string | null>(null);\n const [selectedComponentId, setSelectedComponentId] = useState<string | null>(null);\n\n const logic = useInvitationFormLogic(\n platformOperations,\n contacts,\n googleContacts,\n getShareableInviteLink\n );\n\n // Destructure for easier access\n const {\n view,\n emailInput,\n emails,\n copySuccess,\n shareSuccess,\n sendSuccess,\n searchQuery,\n invitedContactIds,\n invitedGoogleContactIds,\n googleSearchQuery,\n setEmailInput,\n setSearchQuery,\n setGoogleSearchQuery,\n loadingContactIds,\n loadingGoogleContactIds,\n loadingEmailInvite,\n loadingCopy,\n loadingShare,\n loadingInvitationLink,\n lastInvalidEmail,\n handleClose,\n handleSendInvitation,\n handleCopyLink,\n handleShare,\n handleEmailSubmit,\n handleRemoveEmail,\n handleSelectFromGoogle,\n handleSelectFromContacts,\n handleAddByEmail,\n handleShowQrCode,\n handleBackToMain,\n handleInviteContact,\n handleInviteGoogleContact,\n } = logic;\n\n // Fetch contacts on-demand when the contacts view is opened\n useEffect(() => {\n // Reset fetch attempt when view changes away from contacts\n if (view !== 'contacts' && contactsFetchAttempted) {\n setContactsFetchAttempted(false);\n setContactsError(null);\n }\n\n if (view === 'contacts' && !contactsFetchAttempted && !loadingContacts) {\n setLoadingContacts(true);\n setContactsFetchAttempted(true);\n setContactsError(null); // Clear previous errors\n platformOperations\n .fetchContacts()\n .then((fetchedContacts) => {\n setContacts(fetchedContacts);\n setContactsError(null);\n })\n .catch((err) => {\n console.error('[Vortex] Failed to fetch contacts:', err);\n setContactsError(err instanceof Error ? err : new Error(String(err)));\n setContacts([]); // Clear contacts on error\n })\n .finally(() => setLoadingContacts(false));\n }\n }, [view, contactsFetchAttempted, loadingContacts]);\n\n // Fetch Google contacts on-demand when the googleContacts view is opened\n useEffect(() => {\n // Reset fetch attempt when view changes away from googleContacts\n if (view !== 'googleContacts' && googleContactsFetchAttempted) {\n setGoogleContactsFetchAttempted(false);\n setGoogleContactsError(null);\n }\n\n if (view === 'googleContacts' && !googleContactsFetchAttempted && !loadingGoogleContacts) {\n setLoadingGoogleContacts(true);\n setGoogleContactsFetchAttempted(true);\n setGoogleContactsError(null); // Clear previous errors\n platformOperations\n .fetchGoogleContacts()\n .then((fetchedContacts) => {\n setGoogleContacts(fetchedContacts);\n setGoogleContactsError(null);\n })\n .catch((err) => {\n console.error('[Vortex] Failed to fetch Google contacts:', err);\n setGoogleContactsError(err instanceof Error ? err : new Error(String(err)));\n setGoogleContacts([]); // Clear contacts on error\n })\n .finally(() => setLoadingGoogleContacts(false));\n }\n }, [view, googleContactsFetchAttempted, loadingGoogleContacts]);\n\n // Filter contacts using shared utility\n const filteredContacts = filterContacts(contacts, searchQuery);\n const filteredGoogleContacts = filterContacts(googleContacts, googleSearchQuery);\n\n // Wrapper functions with haptic feedback and analytics tracking\n const handleCopyLinkWithHaptics = async () => {\n await platformOperations.triggerHaptic?.('light');\n onShareLinkClick?.('copyLink');\n await handleCopyLink();\n };\n\n const handleShareWithHaptics = async () => {\n await platformOperations.triggerHaptic?.('light');\n onShareLinkClick?.('shareViaNativeShare');\n await handleShare();\n };\n\n const handleSelectFromContactsWithHaptics = async () => {\n await platformOperations.triggerHaptic?.('light');\n handleSelectFromContacts();\n };\n\n const handleSelectFromGoogleWithHaptics = async () => {\n await platformOperations.triggerHaptic?.('light');\n handleSelectFromGoogle();\n };\n\n const handleAddByEmailWithHaptics = async () => {\n await platformOperations.triggerHaptic?.('light');\n handleAddByEmail();\n };\n\n const handleInviteContactWithHaptics = async (contactId: string) => {\n await platformOperations.triggerHaptic?.('light');\n await handleInviteContact(contactId);\n };\n\n const handleInviteGoogleContactWithHaptics = async (contactId: string) => {\n await platformOperations.triggerHaptic?.('light');\n await handleInviteGoogleContact(contactId);\n };\n\n const handleSendInvitationWithHaptics = async () => {\n await platformOperations.triggerHaptic?.('light');\n await handleSendInvitation();\n };\n\n const handleRetryContacts = async () => {\n await platformOperations.triggerHaptic?.('light');\n // Clear the error and reset fetch attempt to trigger a new fetch\n setContactsError(null);\n setContactsFetchAttempted(false);\n };\n\n const handleOpenSettings = async () => {\n await platformOperations.triggerHaptic?.('light');\n try {\n await Linking.openSettings();\n } catch (err) {\n console.warn('[Vortex] Failed to open settings:', err);\n }\n };\n\n const handleEmailShare = async () => {\n await platformOperations.triggerHaptic?.('light');\n onShareLinkClick?.('shareViaEmail');\n await platformOperations.shareViaEmail?.();\n };\n\n const handleSmsShare = async () => {\n await platformOperations.triggerHaptic?.('light');\n onShareLinkClick?.('shareViaSMS');\n await platformOperations.shareViaSms?.();\n };\n\n const handleTwitterShare = async () => {\n await platformOperations.triggerHaptic?.('light');\n onShareLinkClick?.('shareViaTwitter');\n await platformOperations.shareViaTwitter?.();\n };\n\n const handleInstagramShare = async () => {\n await platformOperations.triggerHaptic?.('light');\n onShareLinkClick?.('shareViaInstagram');\n await platformOperations.shareViaInstagram?.();\n };\n\n const handleWhatsAppShare = async () => {\n await platformOperations.triggerHaptic?.('light');\n onShareLinkClick?.('shareViaWhatsApp');\n await platformOperations.shareViaWhatsApp?.();\n };\n\n const handleLineShare = async () => {\n await platformOperations.triggerHaptic?.('light');\n onShareLinkClick?.('shareViaLine');\n await platformOperations.shareViaLine?.();\n };\n\n const handleLineLiffShare = async () => {\n await platformOperations.triggerHaptic?.('light');\n onShareLinkClick?.('shareViaLineLiff');\n await platformOperations.shareViaLineLiff?.();\n };\n\n const handleFacebookMessengerShare = async () => {\n await platformOperations.triggerHaptic?.('light');\n onShareLinkClick?.('shareViaFacebookMessenger');\n await platformOperations.shareViaFacebookMessenger?.();\n };\n\n const handleTelegramShare = async () => {\n await platformOperations.triggerHaptic?.('light');\n onShareLinkClick?.('shareViaTelegram');\n await platformOperations.shareViaTelegram?.();\n };\n\n const handleDiscordShare = async () => {\n await platformOperations.triggerHaptic?.('light');\n onShareLinkClick?.('shareViaDiscord');\n await platformOperations.shareViaDiscord?.();\n };\n\n const handleQrCode = async () => {\n await platformOperations.triggerHaptic?.('light');\n onShareLinkClick?.('shareViaQrCode');\n handleShowQrCode();\n };\n\n // Block renderer functions - render individual components based on block type\n const renderShareOptionsBlock = (block: any) => {\n return (\n <VrtxShareOptions\n block={block}\n renderIcon={renderIcon}\n isCopyLinkEnabled={isCopyLinkEnabled}\n isShareEnabled={isShareEnabled}\n isEmailShareEnabled={isEmailShareEnabled}\n isSmsEnabled={isSmsEnabled}\n isTwitterDmsEnabled={isTwitterDmsEnabled}\n isInstagramDmsEnabled={isInstagramDmsEnabled}\n isWhatsAppEnabled={isWhatsAppEnabled}\n isLineEnabled={isLineEnabled}\n isLineLiffEnabled={isLineLiffEnabled}\n isQrCodeEnabled={isQrCodeEnabled}\n isFacebookMessengerEnabled={isFacebookMessengerEnabled}\n isTelegramEnabled={isTelegramEnabled}\n isDiscordEnabled={isDiscordEnabled}\n handleCopyLink={handleCopyLink}\n handleShare={handleShare}\n handleEmailShare={handleEmailShare}\n handleSmsShare={handleSmsShare}\n handleTwitterShare={handleTwitterShare}\n handleInstagramShare={handleInstagramShare}\n handleWhatsAppShare={handleWhatsAppShare}\n handleLineShare={handleLineShare}\n handleLineLiffShare={handleLineLiffShare}\n handleQrCode={handleQrCode}\n handleFacebookMessengerShare={handleFacebookMessengerShare}\n handleTelegramShare={handleTelegramShare}\n handleDiscordShare={handleDiscordShare}\n triggerHaptic={platformOperations.triggerHaptic}\n loadingCopy={loadingCopy}\n loadingShare={loadingShare}\n copySuccess={copySuccess}\n shareSuccess={shareSuccess}\n isEditMode={isEditMode}\n shareOptionsOrder={getShareOptionsOrder()}\n />\n );\n };\n\n const renderContactsImportBlock = (block: any) => {\n return (\n <VrtxContactsImport\n block={block}\n renderIcon={renderIcon}\n isNativeContactsEnabled={isNativeContactsEnabled}\n isGoogleContactsEnabled={isGoogleContactsEnabled}\n handleSelectFromContacts={handleSelectFromContacts}\n handleSelectFromGoogle={handleSelectFromGoogle}\n triggerHaptic={platformOperations.triggerHaptic}\n isEditMode={isEditMode}\n />\n );\n };\n\n const renderEmailInvitationsBlock = (block: any) => {\n // Don't pass submitButtonBlock - we'll render it separately\n return (\n <VrtxEmailInvitations\n block={block}\n view={view}\n emails={emails}\n emailInput={emailInput}\n setEmailInput={setEmailInput}\n handleEmailSubmit={handleEmailSubmit}\n handleRemoveEmail={handleRemoveEmail}\n submitButtonBlock={undefined}\n handleSendInvitation={handleSendInvitation}\n triggerHaptic={platformOperations.triggerHaptic}\n loadingEmailInvite={loadingEmailInvite}\n sendSuccess={sendSuccess}\n lastInvalidEmail={lastInvalidEmail}\n EditableWrapper={EditableWrapper}\n onEmailFieldFocus={onEmailFieldFocus}\n onEmailFieldBlur={onEmailFieldBlur}\n handleAddByEmail={handleAddByEmail}\n renderIcon={renderIcon}\n isEditMode={isEditMode}\n />\n );\n };\n\n const renderHeadingBlock = (block: any) => {\n return <VrtxHeading block={block} />;\n };\n\n // Stable text update handler that doesn't depend on block\n const handleTextUpdate = useCallback((blockId: string, updates: any) => {\n // Dispatch a custom event that PageBuilderMobile can listen to\n const updateEvent = new CustomEvent('vortex-update-text', {\n detail: {\n blockId,\n textContent: updates.textContent,\n },\n bubbles: true,\n });\n\n // Dispatch from document if we're on web\n if (isWeb && document) {\n document.dispatchEvent(updateEvent);\n }\n }, []); // Empty deps - this handler never needs to change\n\n const renderTextBlock = (block: any) => {\n return <VrtxText block={block} isEditMode={isEditMode} onUpdate={handleTextUpdate} />;\n };\n\n const renderSelectBlock = (block: any) => {\n return <VrtxSelect block={block} />;\n };\n\n const renderSubmitBlock = (block: any) => {\n return (\n <VrtxSubmit\n block={block}\n view={view}\n handleSendInvitation={handleSendInvitation}\n triggerHaptic={platformOperations.triggerHaptic}\n loadingEmailInvite={loadingEmailInvite}\n sendSuccess={sendSuccess}\n emailCount={emails.length}\n emailBlockCustomizations={emailInvitationsBlock?.settings?.customizations}\n emailBlockStyle={emailInvitationsBlock?.style}\n />\n );\n };\n\n const renderFindFriendsBlock = (block: any) => {\n // Extract theme colors from widget configuration\n const themeOptions =\n widgetConfiguration?.configuration?.props?.['vortex.theme']?.value?.options;\n const getThemeValue = (key: string): string | undefined => {\n const option = themeOptions?.find((opt: any) => opt.key === key);\n return option?.value || undefined;\n };\n\n const extractBorderColor = (borderValue: string | undefined): string | undefined => {\n if (!borderValue) return undefined;\n const parts = borderValue.trim().split(/\\s+/);\n if (parts.length === 3) return parts[2];\n return undefined;\n };\n\n const theme = {\n primaryBackground:\n getThemeValue('--vrtx-submit-primary-background') ||\n getThemeValue('--vrtx-button-primary-background') ||\n getThemeValue('--color-primary-background'),\n primaryForeground:\n getThemeValue('--vrtx-submit-primary-color') || getThemeValue('--color-primary-foreground'),\n secondaryBackground:\n getThemeValue('--vrtx-submit-secondary-background') ||\n getThemeValue('--vrtx-button-secondary-background') ||\n getThemeValue('--color-secondary-background'),\n secondaryForeground:\n getThemeValue('--vrtx-submit-secondary-color') ||\n getThemeValue('--vrtx-button-secondary-color') ||\n getThemeValue('--color-secondary-foreground'),\n foreground: getThemeValue('--vrtx-root-color') || getThemeValue('--color-foreground'),\n border:\n extractBorderColor(getThemeValue('--vrtx-root-border')) ||\n extractBorderColor(getThemeValue('--vrtx-input-border')) ||\n getThemeValue('--color-border'),\n };\n\n return (\n <VrtxFindFriends\n block={block}\n findFriendsConfig={findFriendsConfig}\n createUserIdInvitation={createUserIdInvitation}\n triggerHaptic={platformOperations.triggerHaptic}\n theme={theme}\n />\n );\n };\n\n const renderIncomingInvitationsBlock = (block: any) => {\n // Extract theme colors from widget configuration\n const themeOptions =\n widgetConfiguration?.configuration?.props?.['vortex.theme']?.value?.options;\n const getThemeValue = (key: string): string | undefined => {\n const option = themeOptions?.find((opt: any) => opt.key === key);\n return option?.value || undefined;\n };\n\n const extractBorderColor = (borderValue: string | undefined): string | undefined => {\n if (!borderValue) return undefined;\n const parts = borderValue.trim().split(/\\s+/);\n if (parts.length === 3) return parts[2];\n return undefined;\n };\n\n const theme = {\n primaryBackground:\n getThemeValue('--vrtx-submit-primary-background') ||\n getThemeValue('--vrtx-button-primary-background') ||\n getThemeValue('--color-primary-background'),\n primaryForeground:\n getThemeValue('--vrtx-submit-primary-color') || getThemeValue('--color-primary-foreground'),\n secondaryBackground:\n getThemeValue('--vrtx-submit-secondary-background') ||\n getThemeValue('--vrtx-button-secondary-background') ||\n getThemeValue('--color-secondary-background'),\n secondaryForeground:\n getThemeValue('--vrtx-submit-secondary-color') ||\n getThemeValue('--vrtx-button-secondary-color') ||\n getThemeValue('--color-secondary-foreground'),\n foreground: getThemeValue('--vrtx-root-color') || getThemeValue('--color-foreground'),\n border:\n extractBorderColor(getThemeValue('--vrtx-root-border')) ||\n extractBorderColor(getThemeValue('--vrtx-input-border')) ||\n getThemeValue('--color-border'),\n };\n\n return (\n <VrtxIncomingInvitations\n block={block}\n incomingInvitationsConfig={incomingInvitationsConfig}\n apiUrl={apiUrl}\n jwt={jwt}\n triggerHaptic={platformOperations.triggerHaptic}\n theme={theme}\n />\n );\n };\n\n const renderOutgoingInvitationsBlock = (block: any) => {\n // Extract theme colors from widget configuration\n const themeOptions =\n widgetConfiguration?.configuration?.props?.['vortex.theme']?.value?.options;\n const getThemeValue = (key: string): string | undefined => {\n const option = themeOptions?.find((opt: any) => opt.key === key);\n return option?.value || undefined;\n };\n\n const extractBorderColor = (borderValue: string | undefined): string | undefined => {\n if (!borderValue) return undefined;\n const parts = borderValue.trim().split(/\\s+/);\n if (parts.length === 3) return parts[2];\n return undefined;\n };\n\n const theme = {\n primaryBackground:\n getThemeValue('--vrtx-submit-primary-background') ||\n getThemeValue('--vrtx-button-primary-background') ||\n getThemeValue('--color-primary-background'),\n primaryForeground:\n getThemeValue('--vrtx-submit-primary-color') || getThemeValue('--color-primary-foreground'),\n secondaryBackground:\n getThemeValue('--vrtx-submit-secondary-background') ||\n getThemeValue('--vrtx-button-secondary-background') ||\n getThemeValue('--color-secondary-background'),\n secondaryForeground:\n getThemeValue('--vrtx-submit-secondary-color') ||\n getThemeValue('--vrtx-button-secondary-color') ||\n getThemeValue('--color-secondary-foreground'),\n foreground: getThemeValue('--vrtx-root-color') || getThemeValue('--color-foreground'),\n border:\n extractBorderColor(getThemeValue('--vrtx-root-border')) ||\n extractBorderColor(getThemeValue('--vrtx-input-border')) ||\n getThemeValue('--color-border'),\n };\n\n return (\n <VrtxOutgoingInvitations\n block={block}\n outgoingInvitationsConfig={outgoingInvitationsConfig}\n apiUrl={apiUrl}\n jwt={jwt}\n triggerHaptic={platformOperations.triggerHaptic}\n theme={theme}\n />\n );\n };\n\n const renderSearchBoxBlock = (block: any) => {\n // Extract theme colors from widget configuration\n const themeOptions = widgetConfiguration?.configuration?.props?.['vortex.theme']?.value?.options;\n const getThemeValue = (key: string): string | undefined => {\n const option = themeOptions?.find((opt: any) => opt.key === key);\n return option?.value || undefined;\n };\n\n const theme = {\n primaryBackground: getThemeValue('--color-primary-background'),\n primaryForeground: getThemeValue('--color-primary-foreground'),\n secondaryBackground: getThemeValue('--color-secondary-background'),\n secondaryForeground: getThemeValue('--color-secondary-foreground'),\n foreground: getThemeValue('--color-foreground'),\n border: getThemeValue('--color-border'),\n };\n\n return (\n <VrtxSearchBox\n block={block}\n searchBoxConfig={searchBoxConfig}\n createUserIdInvitation={createUserIdInvitation}\n triggerHaptic={platformOperations.triggerHaptic}\n renderIcon={renderIcon}\n theme={theme}\n />\n );\n };\n\n const renderInvitationSuggestionsBlock = (block: any) => {\n // Extract theme colors from widget configuration\n const themeOptions =\n widgetConfiguration?.configuration?.props?.['vortex.theme']?.value?.options;\n const getThemeValue = (key: string): string | undefined => {\n const option = themeOptions?.find((opt: any) => opt.key === key);\n return option?.value || undefined;\n };\n\n const extractBorderColor = (borderValue: string | undefined): string | undefined => {\n if (!borderValue) return undefined;\n const parts = borderValue.trim().split(/\\s+/);\n if (parts.length === 3) return parts[2];\n return undefined;\n };\n\n const theme = {\n primaryBackground:\n getThemeValue('--vrtx-submit-primary-background') ||\n getThemeValue('--vrtx-button-primary-background') ||\n getThemeValue('--color-primary-background'),\n primaryForeground:\n getThemeValue('--vrtx-submit-primary-color') || getThemeValue('--color-primary-foreground'),\n secondaryBackground:\n getThemeValue('--vrtx-submit-secondary-background') ||\n getThemeValue('--vrtx-button-secondary-background') ||\n getThemeValue('--color-secondary-background'),\n secondaryForeground:\n getThemeValue('--vrtx-submit-secondary-color') ||\n getThemeValue('--vrtx-button-secondary-color') ||\n getThemeValue('--color-secondary-foreground'),\n foreground: getThemeValue('--vrtx-root-color') || getThemeValue('--color-foreground'),\n border:\n extractBorderColor(getThemeValue('--vrtx-root-border')) ||\n extractBorderColor(getThemeValue('--vrtx-input-border')) ||\n getThemeValue('--color-border'),\n };\n\n return (\n <VrtxInvitationSuggestions\n block={block}\n invitationSuggestionsConfig={invitationSuggestionsConfig}\n createUserIdInvitation={createUserIdInvitation}\n triggerHaptic={platformOperations.triggerHaptic}\n theme={theme}\n />\n );\n };\n\n const renderInviteContactsBlock = (block: any) => {\n // Extract theme colors from widget configuration\n const themeOptions =\n widgetConfiguration?.configuration?.props?.['vortex.theme']?.value?.options;\n const getThemeValue = (key: string): string | undefined => {\n const option = themeOptions?.find((opt: any) => opt.key === key);\n return option?.value || undefined;\n };\n\n const extractBorderColor = (borderValue: string | undefined): string | undefined => {\n if (!borderValue) return undefined;\n const parts = borderValue.trim().split(/\\s+/);\n if (parts.length === 3) return parts[2];\n return undefined;\n };\n\n const theme = {\n primaryBackground:\n getThemeValue('--vrtx-submit-primary-background') ||\n getThemeValue('--vrtx-button-primary-background') ||\n getThemeValue('--color-primary-background'),\n primaryForeground:\n getThemeValue('--vrtx-submit-primary-color') || getThemeValue('--color-primary-foreground'),\n secondaryBackground:\n getThemeValue('--vrtx-submit-secondary-background') ||\n getThemeValue('--vrtx-button-secondary-background') ||\n getThemeValue('--color-secondary-background'),\n secondaryForeground:\n getThemeValue('--vrtx-submit-secondary-color') ||\n getThemeValue('--vrtx-button-secondary-color') ||\n getThemeValue('--color-secondary-foreground'),\n foreground: getThemeValue('--vrtx-root-color') || getThemeValue('--color-foreground'),\n border:\n extractBorderColor(getThemeValue('--vrtx-root-border')) ||\n extractBorderColor(getThemeValue('--vrtx-input-border')) ||\n getThemeValue('--color-border'),\n };\n\n // Get SMS message template from block settings\n const smsMessageTemplate = block?.settings?.customizations?.smsMessage?.textContent;\n\n // Create SMS invitation function that calls the API\n const createSmsInvitation = async (\n phoneNumber: string,\n contactName?: string\n ): Promise<string | null> => {\n try {\n if (platformOperations.createSmsInvitation) {\n return await platformOperations.createSmsInvitation(phoneNumber, contactName);\n }\n console.warn('[VrtxInviteContacts] No createSmsInvitation function provided');\n return null;\n } catch (err) {\n console.error('[VrtxInviteContacts] Failed to create SMS invitation:', err);\n return null;\n }\n };\n\n return (\n <VrtxInviteContacts\n block={block}\n inviteContactsConfig={inviteContactsConfig}\n createSmsInvitation={createSmsInvitation}\n triggerHaptic={platformOperations.triggerHaptic}\n theme={theme}\n smsMessageTemplate={smsMessageTemplate}\n />\n );\n };\n\n const renderBlock = (block: any) => {\n if (!block) return null;\n\n // Skip rendering if block is hidden\n if (block.hidden === true) {\n return null;\n }\n\n const content = (() => {\n switch (block.subtype) {\n case 'vrtx-share-options':\n return renderShareOptionsBlock(block);\n case 'vrtx-contacts-import':\n return renderContactsImportBlock(block);\n case 'vrtx-email-invitations':\n return renderEmailInvitationsBlock(block);\n case 'vrtx-find-friends':\n return renderFindFriendsBlock(block);\n case 'vrtx-incoming-invitations':\n return renderIncomingInvitationsBlock(block);\n case 'vrtx-outgoing-invitations':\n return renderOutgoingInvitationsBlock(block);\n case 'vrtx-invitation-suggestions':\n return renderInvitationSuggestionsBlock(block);\n case 'vrtx-invite-contacts':\n return renderInviteContactsBlock(block);\n case 'vrtx-search-box':\n return renderSearchBoxBlock(block);\n case 'vrtx-heading':\n return renderHeadingBlock(block);\n case 'vrtx-text':\n return renderTextBlock(block);\n case 'vrtx-select':\n return null; //renderSelectBlock(block);\n case 'vrtx-submit':\n return renderSubmitBlock(block);\n default:\n console.warn(`here [InvitationFormCore] Unknown block type: ${block.subtype}`);\n return null;\n }\n })();\n\n if (!content) return null;\n\n // Wrap in EditableWrapper for edit mode\n return (\n <EditableWrapper\n key={block.id}\n componentId={block.id}\n componentType={block.type}\n node={block}\n >\n {content}\n </EditableWrapper>\n );\n };\n\n const renderColumn = (column: any, filterGroup?: string, excludeGroups?: string[]) => {\n if (!column || !column.children) return null;\n\n // If filtering by include group, check if this column has any matching blocks\n if (filterGroup) {\n const hasMatchingBlocks = column.children.some((child: any) => {\n if (child.type === 'block') {\n const blockGroup = child.meta?.source?.group?.name;\n return blockGroup === filterGroup;\n }\n return false;\n });\n\n // Skip rendering this column if it has no matching blocks\n if (!hasMatchingBlocks) {\n return null;\n }\n }\n\n // If excluding groups, check if this column has any blocks NOT in excluded groups\n if (excludeGroups && excludeGroups.length > 0) {\n const hasNonExcludedBlocks = column.children.some((child: any) => {\n if (child.type === 'block') {\n const blockGroup = child.meta?.source?.group?.name;\n return !excludeGroups.includes(blockGroup);\n }\n return false;\n });\n\n // Skip rendering this column if all its blocks are excluded\n if (!hasNonExcludedBlocks) {\n return null;\n }\n }\n\n return (\n <EditableWrapper\n key={column.id}\n componentId={column.id}\n componentType={column.type}\n node={column}\n >\n <View style={{ flex: 1 }}>\n {column.children.map((child: any) => {\n if (child.type === 'block') {\n // Skip submit button blocks - they're rendered after email invitations\n if (child.subtype === 'vrtx-submit') {\n return null;\n }\n\n // If filterGroup is provided, only render blocks from that group\n if (filterGroup) {\n const blockGroup = child.meta?.source?.group?.name;\n if (blockGroup !== filterGroup) {\n return null;\n }\n }\n\n // If excludeGroups is provided, skip blocks from those groups\n if (excludeGroups && excludeGroups.length > 0) {\n const blockGroup = child.meta?.source?.group?.name;\n if (excludeGroups.includes(blockGroup)) {\n return null;\n }\n }\n\n // Special handling for email invitations block - render submit button separately\n if (child.subtype === 'vrtx-email-invitations' && submitButtonBlock) {\n return (\n <React.Fragment key={child.id}>\n {renderBlock(child)}\n {renderBlock(submitButtonBlock)}\n </React.Fragment>\n );\n }\n\n return renderBlock(child);\n }\n return null;\n })}\n </View>\n </EditableWrapper>\n );\n };\n\n const renderRow = (\n row: any,\n index: number,\n totalRows: number,\n filterGroup?: string,\n excludeGroups?: string[]\n ) => {\n if (!row) return null;\n\n // Check if row has any visible content (columns with blocks)\n const hasVisibleContent = row.children?.some((child: any) => {\n if (child.type === 'column' && child.children) {\n return child.children.some((blockChild: any) => blockChild.type === 'block');\n }\n return false;\n });\n\n // In non-edit mode, skip rows without children entirely\n if (!row.children && !isEditMode) return null;\n\n // If filtering by include group, check if this row has any columns with matching blocks\n if (filterGroup) {\n const hasMatchingContent = row.children?.some((child: any) => {\n if (child.type === 'column' && child.children) {\n return child.children.some((blockChild: any) => {\n if (blockChild.type === 'block') {\n const blockGroup = blockChild.meta?.source?.group?.name;\n return blockGroup === filterGroup;\n }\n return false;\n });\n }\n return false;\n });\n\n // Skip rendering this row if it has no matching content\n if (!hasMatchingContent) {\n return null;\n }\n }\n\n // If excluding groups, check if this row has any columns with non-excluded blocks\n if (excludeGroups && excludeGroups.length > 0) {\n const hasNonExcludedContent = row.children?.some((child: any) => {\n if (child.type === 'column' && child.children) {\n return child.children.some((blockChild: any) => {\n if (blockChild.type === 'block') {\n const blockGroup = blockChild.meta?.source?.group?.name;\n return !excludeGroups.includes(blockGroup);\n }\n return false;\n });\n }\n return false;\n });\n\n // Skip rendering this row if all its blocks are excluded\n // BUT in edit mode, allow empty rows through so they can be selected\n if (!hasNonExcludedContent && !(isEditMode && !hasVisibleContent)) {\n return null;\n }\n }\n\n // Determine if this is an empty row (no visible content)\n const isEmptyRow = !hasVisibleContent;\n\n return (\n <React.Fragment key={row.id}>\n {/* Drop zone before this row */}\n {isEditMode && isDragging && (\n <View\n // @ts-ignore\n data-drop-zone=\"between-rows\"\n data-insertion-index={index}\n style={{\n height: 40,\n // borderWidth: 2,\n // borderColor: '#4CAF50',\n // borderStyle: 'dashed',\n // borderRadius: 4,\n // backgroundColor: 'rgba(76, 175, 80, 0.1)',\n marginVertical: 8,\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n <Text style={{ color: '#4CAF50', fontSize: 12, fontWeight: '600' }}>\n {/* Drop here to insert at position {index} */}\n </Text>\n </View>\n )}\n\n {/* The actual row */}\n <EditableWrapper componentId={row.id} componentType={row.type} node={row}>\n <View\n style={[\n styles.section,\n // In edit mode, empty rows get a minimum height so they can be selected\n isEditMode && isEmptyRow && styles.emptyRowEditMode,\n ]}\n >\n {row.children?.map((child: any) => {\n if (child.type === 'column') {\n return renderColumn(child, filterGroup, excludeGroups);\n }\n return null;\n })}\n </View>\n </EditableWrapper>\n\n {/* Drop zone after last row */}\n {isEditMode && isDragging && index === totalRows - 1 && (\n <View\n // @ts-ignore\n data-drop-zone=\"between-rows\"\n data-insertion-index={totalRows}\n style={{\n height: 40,\n borderWidth: 2,\n borderColor: '#4CAF50',\n borderStyle: 'dashed',\n borderRadius: 4,\n backgroundColor: 'rgba(76, 175, 80, 0.1)',\n marginVertical: 8,\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n <Text style={{ color: '#4CAF50', fontSize: 12, fontWeight: '600' }}>\n Drop here to insert at position {totalRows}\n </Text>\n </View>\n )}\n </React.Fragment>\n );\n };\n\n // Helper function to get component label\n const getComponentLabel = (type: string): string => {\n const labelMap: Record<string, string> = {\n 'vrtx-share-options': 'Share Options',\n 'vrtx-contacts-import': 'Contacts Import',\n 'vrtx-email-invitations': 'Email Invitations',\n 'vrtx-find-friends': 'Find Friends',\n 'vrtx-incoming-invitations': 'Incoming Invitations',\n 'vrtx-outgoing-invitations': 'Outgoing Invitations',\n 'vrtx-invitation-suggestions': 'Invitation Suggestions',\n 'vrtx-heading': 'Heading',\n 'vrtx-text': 'Text',\n 'vrtx-select': 'Select',\n 'vrtx-submit': 'Submit',\n 'vrtx-form-label': 'Label',\n 'vrtx-row': 'Row',\n row: 'Row',\n column: 'Column',\n block: 'Block',\n };\n return labelMap[type] || type;\n };\n\n // EditableWrapper component for hover highlighting and drag-drop in edit mode\n // IMPORTANT: Memoized via useMemo to maintain stable component identity across re-renders.\n // Without this, every parent state change (e.g., typing in email input) would create a new\n // component type, causing React to unmount/remount all children — which blurs TextInputs.\n const EditableWrapper = React.useMemo(() => {\n const Wrapper = ({\n children,\n componentId,\n componentType,\n node,\n flex,\n }: {\n children: React.ReactNode;\n componentId: string;\n componentType: string;\n node?: any; // The actual node object from vortex.components.form\n flex?: boolean;\n }) => {\n const wrapperRef = React.useRef<HTMLDivElement>(null);\n const labelRef = React.useRef<HTMLDivElement | null>(null);\n const leftMarginRef = React.useRef<HTMLDivElement | null>(null);\n const rightMarginRef = React.useRef<HTMLDivElement | null>(null);\n const outlineRef = React.useRef<HTMLDivElement | null>(null);\n\n // For rows on web, allow margin-based hover/selection\n const isRow = componentType === 'row';\n const isColumn = componentType === 'column';\n const isBlock = !isRow && !isColumn;\n\n // State for row margin hover\n const [isRowMarginHovered, setIsRowMarginHovered] = React.useState(false);\n\n // Determine hover and selection states\n const isHovered = isBlock\n ? hoveredComponentId === componentId\n : isRow && isWeb\n ? isRowMarginHovered\n : false;\n const isSelected = isBlock\n ? selectedComponentId === componentId\n : isRow && isWeb\n ? selectedComponentId === componentId\n : false;\n const showLabel = isEditMode && (isHovered || isSelected);\n\n // Create margin detection boxes for rows on web\n React.useEffect(() => {\n if (!isWeb || !isRow || !isEditMode) {\n // Clean up margin detectors if they exist\n if (leftMarginRef.current && leftMarginRef.current.parentNode) {\n leftMarginRef.current.parentNode.removeChild(leftMarginRef.current);\n leftMarginRef.current = null;\n }\n if (rightMarginRef.current && rightMarginRef.current.parentNode) {\n rightMarginRef.current.parentNode.removeChild(rightMarginRef.current);\n rightMarginRef.current = null;\n }\n if (outlineRef.current && outlineRef.current.parentNode) {\n outlineRef.current.parentNode.removeChild(outlineRef.current);\n outlineRef.current = null;\n }\n return;\n }\n\n if (!wrapperRef.current) return;\n\n // Find the outermost container with padding - this creates the margin areas\n // Walk up the DOM tree until we find a container that's significantly wider than the row\n let scrollContainer: HTMLElement | null = wrapperRef.current.parentElement;\n const rowWidth = wrapperRef.current.getBoundingClientRect().width;\n\n let attempts = 0;\n while (scrollContainer && attempts < 15) {\n const containerWidth = scrollContainer.getBoundingClientRect().width;\n // If this container is significantly wider than the row (has margins/padding)\n if (containerWidth > rowWidth + 20) {\n break;\n }\n scrollContainer = scrollContainer.parentElement;\n attempts++;\n }\n\n // Fallback: use the widest ancestor we can find\n if (!scrollContainer || scrollContainer.getBoundingClientRect().width <= rowWidth) {\n scrollContainer = wrapperRef.current.parentElement;\n while (scrollContainer?.parentElement) {\n const parent = scrollContainer.parentElement;\n if (\n parent.getBoundingClientRect().width > scrollContainer.getBoundingClientRect().width\n ) {\n scrollContainer = parent;\n } else {\n break;\n }\n }\n }\n\n if (!scrollContainer) return;\n\n // Create margin detectors and outline if they don't exist\n if (!leftMarginRef.current) {\n leftMarginRef.current = document.createElement('div');\n document.body.appendChild(leftMarginRef.current);\n }\n if (!rightMarginRef.current) {\n rightMarginRef.current = document.createElement('div');\n document.body.appendChild(rightMarginRef.current);\n }\n if (!outlineRef.current) {\n outlineRef.current = document.createElement('div');\n document.body.appendChild(outlineRef.current);\n }\n\n const updateMarginDetectors = () => {\n if (!wrapperRef.current || !scrollContainer) return;\n\n const rowRect = wrapperRef.current.getBoundingClientRect();\n const containerRect = scrollContainer.getBoundingClientRect();\n\n // Update outline box (full width)\n if (outlineRef.current) {\n Object.assign(outlineRef.current.style, {\n position: 'fixed',\n top: `${rowRect.top}px`,\n left: `${containerRect.left}px`,\n width: `${containerRect.width}px`,\n height: `${rowRect.height}px`,\n outline:\n isRowMarginHovered || isSelected\n ? `3px solid ${isSelected ? '#1166c2' : '#72b3f3'}`\n : 'none',\n outlineOffset: '0px',\n borderRadius: '8px',\n pointerEvents: 'none',\n zIndex: '1199',\n });\n }\n\n // Update left margin detector\n if (leftMarginRef.current) {\n const leftWidth = rowRect.left - containerRect.left;\n Object.assign(leftMarginRef.current.style, {\n position: 'fixed',\n top: `${rowRect.top}px`,\n left: `${containerRect.left}px`,\n width: `${leftWidth}px`,\n height: `${rowRect.height}px`,\n cursor: 'pointer',\n pointerEvents: 'auto',\n zIndex: '1199',\n });\n }\n\n // Update right margin detector\n if (rightMarginRef.current) {\n const rightWidth = containerRect.right - rowRect.right;\n Object.assign(rightMarginRef.current.style, {\n position: 'fixed',\n top: `${rowRect.top}px`,\n left: `${rowRect.right}px`,\n width: `${rightWidth}px`,\n height: `${rowRect.height}px`,\n cursor: 'pointer',\n pointerEvents: 'auto',\n zIndex: '1199',\n });\n }\n };\n\n // Set up event handlers for margin detectors\n const handleMarginEnter = () => {\n setIsRowMarginHovered(true);\n };\n\n const handleMarginLeave = () => {\n setIsRowMarginHovered(false);\n };\n\n const handleMarginClick = (e: MouseEvent) => {\n e.stopPropagation();\n setSelectedComponentId(componentId);\n if (onComponentSelect) {\n onComponentSelect({\n id: componentId,\n type: componentType,\n element: node || null,\n styles: {},\n });\n }\n };\n\n leftMarginRef.current.addEventListener('mouseenter', handleMarginEnter);\n leftMarginRef.current.addEventListener('mouseleave', handleMarginLeave);\n leftMarginRef.current.addEventListener('click', handleMarginClick);\n\n rightMarginRef.current.addEventListener('mouseenter', handleMarginEnter);\n rightMarginRef.current.addEventListener('mouseleave', handleMarginLeave);\n rightMarginRef.current.addEventListener('click', handleMarginClick);\n\n updateMarginDetectors();\n\n window.addEventListener('scroll', updateMarginDetectors, true);\n window.addEventListener('resize', updateMarginDetectors);\n\n return () => {\n window.removeEventListener('scroll', updateMarginDetectors, true);\n window.removeEventListener('resize', updateMarginDetectors);\n\n if (leftMarginRef.current) {\n leftMarginRef.current.removeEventListener('mouseenter', handleMarginEnter);\n leftMarginRef.current.removeEventListener('mouseleave', handleMarginLeave);\n leftMarginRef.current.removeEventListener('click', handleMarginClick);\n if (leftMarginRef.current.parentNode) {\n leftMarginRef.current.parentNode.removeChild(leftMarginRef.current);\n }\n leftMarginRef.current = null;\n }\n if (rightMarginRef.current) {\n rightMarginRef.current.removeEventListener('mouseenter', handleMarginEnter);\n rightMarginRef.current.removeEventListener('mouseleave', handleMarginLeave);\n rightMarginRef.current.removeEventListener('click', handleMarginClick);\n if (rightMarginRef.current.parentNode) {\n rightMarginRef.current.parentNode.removeChild(rightMarginRef.current);\n }\n rightMarginRef.current = null;\n }\n if (outlineRef.current && outlineRef.current.parentNode) {\n outlineRef.current.parentNode.removeChild(outlineRef.current);\n outlineRef.current = null;\n }\n };\n }, [\n isWeb,\n isRow,\n isEditMode,\n isRowMarginHovered,\n isSelected,\n componentId,\n componentType,\n node,\n onComponentSelect,\n ]);\n\n // Create and manage a portal-like label element\n React.useEffect(() => {\n if (!isWeb || !showLabel) {\n // Clean up label if it exists\n if (labelRef.current && labelRef.current.parentNode) {\n labelRef.current.parentNode.removeChild(labelRef.current);\n labelRef.current = null;\n }\n return;\n }\n\n if (!wrapperRef.current) return;\n\n // Find the container using the same logic as margin detectors\n let scrollContainer: HTMLElement | null = null;\n if (isRow) {\n // For rows, find the outermost container with padding\n scrollContainer = wrapperRef.current.parentElement;\n const rowWidth = wrapperRef.current.getBoundingClientRect().width;\n let attempts = 0;\n while (scrollContainer && attempts < 15) {\n const containerWidth = scrollContainer.getBoundingClientRect().width;\n if (containerWidth > rowWidth + 20) {\n break;\n }\n scrollContainer = scrollContainer.parentElement;\n attempts++;\n }\n if (!scrollContainer || scrollContainer.getBoundingClientRect().width <= rowWidth) {\n scrollContainer = wrapperRef.current.parentElement;\n while (scrollContainer?.parentElement) {\n const parent = scrollContainer.parentElement;\n if (\n parent.getBoundingClientRect().width > scrollContainer.getBoundingClientRect().width\n ) {\n scrollContainer = parent;\n } else {\n break;\n }\n }\n }\n }\n\n // Create label element if it doesn't exist\n if (!labelRef.current) {\n labelRef.current = document.createElement('div');\n document.body.appendChild(labelRef.current);\n }\n\n const updateLabelPosition = () => {\n if (!wrapperRef.current || !labelRef.current) return;\n\n const rect = wrapperRef.current.getBoundingClientRect();\n const label = labelRef.current;\n\n // For rows on web, position at extreme left of container\n let leftPos = rect.left + 5;\n if (isRow && scrollContainer) {\n const containerRect = scrollContainer.getBoundingClientRect();\n leftPos = containerRect.left;\n }\n\n // Update styles\n Object.assign(label.style, {\n position: 'fixed',\n left: `${leftPos}px`,\n top: `${rect.top - 25}px`,\n height: '25px',\n display: 'flex',\n alignItems: 'center',\n backgroundColor: isSelected ? '#1166c2' : '#72b3f3',\n color: 'white',\n padding: '0 12px',\n fontSize: '11px',\n fontWeight: '600',\n borderRadius: '2px 2px 0 0',\n whiteSpace: 'nowrap',\n zIndex: '1200',\n pointerEvents: 'none',\n userSelect: 'none',\n boxShadow: '0 1px 3px 0 rgba(0, 0, 0, 0.3)',\n });\n\n label.textContent = getComponentLabel(node?.subtype || componentType);\n };\n\n updateLabelPosition();\n\n window.addEventListener('scroll', updateLabelPosition, true);\n window.addEventListener('resize', updateLabelPosition);\n\n return () => {\n window.removeEventListener('scroll', updateLabelPosition, true);\n window.removeEventListener('resize', updateLabelPosition);\n if (labelRef.current && labelRef.current.parentNode) {\n labelRef.current.parentNode.removeChild(labelRef.current);\n labelRef.current = null;\n }\n };\n }, [showLabel, isSelected, node, componentType, isWeb, isRow, isEditMode]);\n\n // Use the toolbar hook to manage the delete button\n usePlacedItemToolbar({\n wrapperRef,\n isSelected,\n componentId,\n componentType,\n isRow,\n nodeSubtype: node?.subtype,\n });\n\n if (!isEditMode) return <>{children}</>;\n\n // Helper function to check if element is inside a contentEditable element\n const isInsideContentEditable = (target: any): boolean => {\n if (!target) return false;\n let el = target;\n let depth = 0;\n while (el && depth < 20) {\n if (el.getAttribute?.('data-slate-editor') === 'true') {\n return true;\n }\n if (el.contentEditable === 'true' || el.getAttribute?.('contenteditable') === 'true') {\n return true;\n }\n el = el.parentElement;\n depth++;\n }\n return false;\n };\n\n const handleClick = (e: any) => {\n // Don't handle clicks on columns - let them pass through to child blocks\n // Rows are allowed so empty rows can be selected and deleted\n if (isColumn) {\n return;\n }\n\n const target = e?.target || e?.nativeEvent?.target;\n\n // Check if the click is inside a contentEditable element\n if (isInsideContentEditable(target)) {\n // If the component is already selected, allow the click to proceed for text editing\n if (isSelected) {\n console.log(\n '[EditableWrapper] Allowing click inside contentEditable element (already selected)'\n );\n e?.stopPropagation?.();\n return;\n }\n // If not selected, we'll select it first (don't return early)\n console.log('[EditableWrapper] Selecting component with contentEditable element');\n }\n\n if (target) {\n let el = target;\n let depth = 0;\n while (el && depth < 20) {\n // Check for circle button attribute\n if (el.getAttribute?.('data-circle-button') === 'true') {\n console.log('[EditableWrapper] Ignoring circle button click - found data attribute');\n return;\n }\n el = el.parentElement;\n depth++;\n }\n }\n\n // Ignore clicks from circle button (legacy flag check)\n if (e?._circleButtonClick || e?.nativeEvent?._circleButtonClick) {\n console.log('[EditableWrapper] Ignoring circle button click - found flag');\n return;\n }\n\n // Only handle once - prevent double firing from both capture and bubble\n if (e?._editable_handled) return;\n if (e) e._editable_handled = true;\n\n e?.stopPropagation?.();\n console.log(\n '[EditableWrapper] Clicked:',\n componentId,\n componentType,\n 'onComponentSelect exists:',\n !!onComponentSelect\n );\n setSelectedComponentId(componentId);\n if (onComponentSelect) {\n console.log('[EditableWrapper] Calling onComponentSelect with:', {\n id: componentId,\n type: componentType,\n element: node || null,\n });\n onComponentSelect({\n id: componentId,\n type: componentType,\n element: node || null,\n styles: {},\n });\n } else {\n console.warn('[EditableWrapper] onComponentSelect is not defined!');\n }\n };\n\n return (\n <div\n ref={wrapperRef}\n data-component-id={componentId}\n data-component-type={componentType}\n style={{\n position: 'relative',\n ...(flex && { flex: 1 }),\n }}\n onMouseEnter={\n isColumn\n ? undefined\n : isColumn\n ? undefined\n : (e) => {\n if (!isInsideContentEditable(e.target)) {\n setHoveredComponentId(componentId);\n }\n }\n }\n onMouseLeave={\n isColumn\n ? undefined\n : isColumn\n ? undefined\n : (e) => {\n if (!isInsideContentEditable(e.target)) {\n setHoveredComponentId(null);\n }\n }\n }\n onClick={handleClick}\n >\n {children}\n {/* Selection border - only for blocks, not rows (rows use full-width outline) */}\n {showLabel && !isRow && (\n <>\n <div\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n border: `3px solid ${isSelected ? '#1166c2' : '#72b3f3'}`,\n borderRadius: '8px',\n pointerEvents: 'none',\n zIndex: 1,\n }}\n />\n </>\n )}\n </div>\n );\n };\n return Wrapper;\n }, [isEditMode, hoveredComponentId, selectedComponentId, onComponentSelect, onComponentDelete]);\n\n const styles = createStyles(fontFamily);\n\n const handleHeaderButtonPress = () => {\n if (view === 'main') {\n handleClose();\n } else {\n handleBackToMain();\n }\n };\n\n // Deselect when clicking on empty space (web only)\n React.useEffect(() => {\n if (!isEditMode || !isWeb) return;\n\n const handleDocumentClick = (e: MouseEvent) => {\n let el = e.target as HTMLElement | null;\n while (el) {\n // If the click is inside an editable element, do nothing\n if (el.getAttribute) {\n if (\n el.getAttribute('data-component-id') ||\n el.getAttribute('data-circle-button') === 'true'\n ) {\n return;\n }\n }\n el = el.parentElement;\n }\n // Click was on empty space, deselect\n setSelectedComponentId(null);\n };\n\n document.addEventListener('click', handleDocumentClick, true);\n return () => {\n document.removeEventListener('click', handleDocumentClick, true);\n };\n }, [isEditMode]);\n\n // Handle component deletion (web only)\n React.useEffect(() => {\n if (!isWeb || !isEditMode) return;\n\n const handleDeleteEvent = (e: Event) => {\n const customEvent = e as CustomEvent;\n const { id, type } = customEvent.detail;\n\n if (onComponentDelete) {\n onComponentDelete(id, type);\n }\n\n // Also deselect the component\n setSelectedComponentId(null);\n };\n\n document.addEventListener('vortex-delete-component', handleDeleteEvent, true);\n\n return () => {\n document.removeEventListener('vortex-delete-component', handleDeleteEvent, true);\n };\n }, [isEditMode, onComponentDelete]);\n\n // Extract root form styles from formStructure\n // Transform CSS properties to React Native equivalents (e.g., 'background' -> 'backgroundColor')\n const rawRootStyle = formStructure?.style || {};\n const rootFormStyle: Record<string, any> = {};\n for (const [key, value] of Object.entries(rawRootStyle)) {\n if (key === 'background' && typeof value === 'string' && !value.includes('gradient')) {\n // Convert CSS 'background' to RN 'backgroundColor' for solid colors\n rootFormStyle.backgroundColor = value;\n } else if (key !== 'background') {\n // Pass through other properties (skip gradients which need special handling)\n rootFormStyle[key] = value;\n }\n }\n\n return (\n <View style={{ ...styles.container, ...containerStyle, ...rootFormStyle }}>\n {/* Header with Close or Back button */}\n <View style={{ ...styles.header, ...rootFormStyle }}>\n <View\n style={[styles.headerButton, { minWidth: 44, minHeight: 44, justifyContent: 'center' }]}\n onStartShouldSetResponder={() => {\n return true;\n }}\n onResponderGrant={() => {\n // Handle responder grant\n }}\n onResponderRelease={() => {\n handleHeaderButtonPress();\n }}\n >\n {renderIcon({\n name: view === 'main' ? 'close' : 'arrow-back',\n size: 24,\n color: resolvedTitleStyle?.color || '#666',\n opacity: 0.75,\n })}\n </View>\n {resolvedTitle && (\n <Text\n style={[\n styles.headerTitle,\n resolvedTitleStyle && {\n ...(resolvedTitleStyle.color && { color: resolvedTitleStyle.color }),\n ...(resolvedTitleStyle.fontSize && { fontSize: resolvedTitleStyle.fontSize }),\n ...(resolvedTitleStyle.fontWeight && { fontWeight: resolvedTitleStyle.fontWeight as any }),\n ...(resolvedTitleStyle.fontFamily && { fontFamily: resolvedTitleStyle.fontFamily }),\n },\n ]}\n >\n {resolvedTitle}\n </Text>\n )}\n {/* Empty spacer to balance the header when title is present */}\n {resolvedTitle && <View style={[styles.headerButton, { minWidth: 44, minHeight: 44 }]} />}\n </View>\n\n <ScrollView\n style={{ ...styles.scrollContent, ...rootFormStyle }}\n contentContainerStyle={rootFormStyle}\n showsVerticalScrollIndicator={false}\n >\n {view === 'main' && formStructure && (\n <>\n {/* <EditableWrapper componentId=\"title-text\" componentType=\"text\">\n <Text style={styles.title}>Invite people to join your team</Text>\n </EditableWrapper> */}\n\n {/* Dynamic rendering from formStructure */}\n {formStructure.children?.map((child: any, index: number) => {\n if (child.type === 'row') {\n return renderRow(child, index, formStructure.children.length);\n }\n return null;\n })}\n </>\n )}\n\n {view === 'main' && !formStructure && (\n <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center', padding: 20 }}>\n <Text style={{ fontSize: 50, marginBottom: 16 }}>⚠️</Text>\n <Text style={{ fontSize: 18, fontWeight: 'bold', color: '#d9534f', marginBottom: 8, fontFamily }}>\n Configuration Error\n </Text>\n <Text style={{ fontSize: 14, color: '#666', textAlign: 'center', fontFamily }}>\n Unable to load form structure from widget configuration. Please check your widget configuration and try again.\n </Text>\n </View>\n )}\n\n {view === 'email' && formStructure && (\n <>\n <View style={styles.section}>\n {/* Dynamic rendering from formStructure - only email-related blocks */}\n {formStructure.children?.map((child: any, index: number) => {\n if (child.type === 'row') {\n // Render all rows, but filter blocks inside to only show grp-email-invitations\n return renderRow(\n child,\n index,\n formStructure.children.length,\n 'grp-email-invitations'\n );\n }\n return null;\n })}\n </View>\n </>\n )}\n\n {view === 'email' && !formStructure && (\n <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center', padding: 20 }}>\n <Text style={{ fontSize: 50, marginBottom: 16 }}>⚠️</Text>\n <Text style={{ fontSize: 18, fontWeight: 'bold', color: '#d9534f', marginBottom: 8, fontFamily }}>\n Configuration Error\n </Text>\n <Text style={{ fontSize: 14, color: '#666', textAlign: 'center', fontFamily }}>\n Unable to load form structure from widget configuration. Please check your widget configuration and try again.\n </Text>\n </View>\n )}\n\n {view === 'contacts' && (\n <>\n <Text style={styles.title}>{getContactsCustomization('importContacts.title', 'Add from Contacts')}</Text>\n\n <View style={styles.section}>\n <TextInput\n style={styles.input}\n placeholder={getContactsCustomization('importContacts.searchPlaceholder', 'Search contacts...')}\n placeholderTextColor=\"#999\"\n value={searchQuery}\n onChangeText={setSearchQuery}\n autoCapitalize=\"none\"\n autoCorrect={false}\n returnKeyType=\"search\"\n />\n\n {loadingContacts ? (\n <View style={styles.loadingContainer}>\n <ActivityIndicator size=\"large\" color=\"#6291d5\" />\n <Text style={styles.loadingText}>{getContactsCustomization('importContacts.loadingText', 'Loading contacts...')}</Text>\n </View>\n ) : contactsError ? (\n <View style={styles.errorContainer}>\n <Text style={styles.errorTitle}>{getContactsCustomization('importContacts.errorTitle', 'Unable to Access Contacts')}</Text>\n <Text style={styles.errorMessage}>{contactsError.message}</Text>\n {contactsError.message.includes('Settings') && (\n <>\n <Text style={styles.errorHint}>\n To grant access: Open Settings → Privacy & Security → Contacts → Enable for\n this app\n </Text>\n <View style={styles.errorActions}>\n <TouchableOpacity\n style={[styles.button, styles.secondaryButton, styles.halfButton]}\n onPress={handleOpenSettings}\n >\n <Text style={styles.secondaryButtonText}>{getContactsCustomization('importContacts.openSettingsButton', 'Open Settings')}</Text>\n </TouchableOpacity>\n <TouchableOpacity\n style={[styles.button, styles.secondaryButton, styles.halfButton]}\n onPress={handleRetryContacts}\n >\n <Text style={styles.secondaryButtonText}>{getContactsCustomization('importContacts.retryButton', 'Retry')}</Text>\n </TouchableOpacity>\n </View>\n </>\n )}\n {!contactsError.message.includes('Settings') && (\n <TouchableOpacity\n style={[styles.button, styles.secondaryButton, { marginTop: 16 }]}\n onPress={handleRetryContacts}\n >\n <Text style={styles.secondaryButtonText}>{getContactsCustomization('importContacts.tryAgainButton', 'Try Again')}</Text>\n </TouchableOpacity>\n )}\n <Text style={styles.errorDetails}>\n {contactsError.message || 'Unknown error occurred'}\n </Text>\n </View>\n ) : (\n <View style={styles.contactsList}>\n {filteredContacts.length === 0 ? (\n <Text style={styles.emptyText}>\n {searchQuery\n ? getContactsCustomization('importContacts.emptySearchState', 'No contacts match your search')\n : getContactsCustomization('importContacts.emptyState', 'No contacts with email addresses found')}\n </Text>\n ) : (\n filteredContacts.map((contact) => {\n const isInvited = invitedContactIds.has(contact.id);\n const isLoading = loadingContactIds.has(contact.id);\n const initials = contact.name\n .split(' ')\n .map((part) => part[0])\n .join('')\n .toUpperCase()\n .slice(0, 2);\n return (\n <View key={contact.id} style={styles.contactItem}>\n {contact.imageUri ? (\n <Image source={{ uri: contact.imageUri }} style={styles.contactAvatar} />\n ) : (\n <View style={styles.contactAvatarPlaceholder}>\n <Text style={styles.contactAvatarInitials}>{initials}</Text>\n </View>\n )}\n <View style={styles.contactInfo}>\n <Text style={styles.contactName}>{contact.name}</Text>\n <Text style={styles.contactEmail}>{contact.email}</Text>\n </View>\n {isInvited ? (\n <Text style={styles.invitedText}>{getContactsCustomization('importContacts.invitedStatus', '✓ Invited!')}</Text>\n ) : (\n <TouchableOpacity\n style={styles.inviteButton}\n onPress={() => handleInviteContactWithHaptics(contact.id)}\n disabled={isLoading}\n >\n {isLoading ? (\n <ActivityIndicator size=\"small\" color=\"#333\" />\n ) : (\n <Text style={styles.inviteButtonText}>{getContactsCustomization('importContacts.inviteButton', 'Invite')}</Text>\n )}\n </TouchableOpacity>\n )}\n </View>\n );\n })\n )}\n </View>\n )}\n </View>\n </>\n )}\n\n {view === 'googleContacts' && (\n <>\n <Text style={styles.title}>{getContactsCustomization('google.title', 'Add from Google Contacts')}</Text>\n\n <View style={styles.section}>\n <TextInput\n style={styles.input}\n placeholder={getContactsCustomization('google.searchPlaceholder', 'Search contacts...')}\n placeholderTextColor=\"#999\"\n value={googleSearchQuery}\n onChangeText={setGoogleSearchQuery}\n autoCapitalize=\"none\"\n autoCorrect={false}\n returnKeyType=\"search\"\n />\n\n {loadingGoogleContacts ? (\n <View style={styles.loadingContainer}>\n <ActivityIndicator size=\"large\" color=\"#6291d5\" />\n <Text style={styles.loadingText}>{getContactsCustomization('google.loadingText', 'Loading Google contacts...')}</Text>\n </View>\n ) : googleContactsError ? (\n <View style={styles.errorContainer}>\n <Text style={styles.errorTitle}>{getContactsCustomization('google.errorTitle', 'Unable to Access Google Contacts')}</Text>\n <Text style={styles.errorMessage}>{googleContactsError.message}</Text>\n <TouchableOpacity\n style={[styles.button, styles.secondaryButton, { marginTop: 16 }]}\n onPress={handleRetryContacts}\n >\n <Text style={styles.secondaryButtonText}>{getContactsCustomization('google.tryAgainButton', 'Try Again')}</Text>\n </TouchableOpacity>\n <Text style={styles.errorDetails}>\n {googleContactsError.message || 'Unknown error occurred'}\n </Text>\n </View>\n ) : (\n <View style={styles.contactsList}>\n {filteredGoogleContacts.length === 0 ? (\n <Text style={styles.emptyText}>\n {googleSearchQuery\n ? getContactsCustomization('google.emptySearchState', 'No contacts match your search')\n : getContactsCustomization('google.emptyState', 'No Google contacts with email addresses found')}\n </Text>\n ) : (\n filteredGoogleContacts.map((contact) => {\n const isInvited = invitedGoogleContactIds.has(contact.id);\n const isLoading = loadingGoogleContactIds.has(contact.id);\n const initials = contact.name\n .split(' ')\n .map((part) => part[0])\n .join('')\n .toUpperCase()\n .slice(0, 2);\n return (\n <View key={contact.id} style={styles.contactItem}>\n {contact.imageUri ? (\n <Image source={{ uri: contact.imageUri }} style={styles.contactAvatar} />\n ) : (\n <View style={styles.contactAvatarPlaceholder}>\n <Text style={styles.contactAvatarInitials}>{initials}</Text>\n </View>\n )}\n <View style={styles.contactInfo}>\n <Text style={styles.contactName}>{contact.name}</Text>\n <Text style={styles.contactEmail}>{contact.email}</Text>\n </View>\n {isInvited ? (\n <Text style={styles.invitedText}>{getContactsCustomization('google.invitedStatus', '✓ Invited!')}</Text>\n ) : (\n <TouchableOpacity\n style={styles.inviteButton}\n onPress={() => handleInviteGoogleContactWithHaptics(contact.id)}\n disabled={isLoading}\n >\n {isLoading ? (\n <ActivityIndicator size=\"small\" color=\"#333\" />\n ) : (\n <Text style={styles.inviteButtonText}>{getContactsCustomization('google.inviteButton', 'Invite')}</Text>\n )}\n </TouchableOpacity>\n )}\n </View>\n );\n })\n )}\n </View>\n )}\n </View>\n </>\n )}\n\n {view === 'qrcode' && (\n <View style={styles.section}>\n <View style={styles.qrCodeViewContainer}>\n {Platform.OS === 'web' ? (\n // In web preview mode, show placeholder QR code immediately for demo\n renderQRCode ? (\n renderQRCode({\n value: logic.invitationLink,\n size: 250,\n })\n ) : (\n <Text style={styles.errorMessage}>QR Code rendering not available</Text>\n )\n ) : loadingInvitationLink ||\n logic.invitationLink === 'https://app.vortexsoftware.com/invite/abc123' ? (\n // In native mode, show loading while fetching real link\n <View style={styles.loadingContainer}>\n <ActivityIndicator size=\"large\" color=\"#6291d5\" />\n <Text style={styles.loadingText}>Generating QR Code...</Text>\n </View>\n ) : renderQRCode ? (\n renderQRCode({\n value: logic.invitationLink,\n size: 250,\n })\n ) : (\n <Text style={styles.errorMessage}>QR Code rendering not available</Text>\n )}\n </View>\n </View>\n )}\n </ScrollView>\n </View>\n );\n}\n\nconst createStyles = (fontFamily: string) =>\n StyleSheet.create({\n container: {\n flex: 1,\n paddingTop: 8,\n backgroundColor: '#fff',\n },\n handle: {\n width: 40,\n height: 4,\n backgroundColor: '#ddd',\n borderRadius: 2,\n alignSelf: 'center',\n marginBottom: 2,\n },\n header: {\n flexDirection: 'row',\n justifyContent: 'space-between',\n alignItems: 'center',\n paddingHorizontal: 16,\n paddingVertical: 4,\n zIndex: 10,\n backgroundColor: '#fff',\n },\n headerButton: {\n padding: 4,\n },\n headerTitle: {\n fontFamily,\n fontSize: 17,\n fontWeight: '600',\n color: '#1a1a1a',\n textAlign: 'center',\n flex: 1,\n },\n sendButton: {\n paddingHorizontal: 8,\n paddingVertical: 8,\n },\n sendButtonText: {\n fontFamily,\n color: '#2196F3',\n fontSize: 16,\n fontWeight: '600',\n },\n scrollContent: {\n flex: 1,\n paddingHorizontal: 20,\n // backgroundColor: 'none',\n },\n title: {\n fontFamily,\n fontSize: 18,\n fontWeight: '700',\n color: '#1a1a1a',\n marginTop: 16,\n marginBottom: 20,\n textAlign: 'center',\n },\n subtitle: {\n fontFamily,\n fontSize: 13,\n color: '#666',\n marginBottom: 20,\n lineHeight: 18,\n },\n // Sections\n section: {\n marginBottom: 10,\n },\n emptyRowEditMode: {\n minHeight: 40,\n backgroundColor: 'rgba(200, 200, 200, 0.2)',\n borderWidth: 1,\n borderColor: 'rgba(150, 150, 150, 0.3)',\n borderStyle: 'dashed',\n borderRadius: 4,\n },\n sectionTitle: {\n fontFamily,\n fontSize: 16,\n fontWeight: '700',\n color: '#1a1a1a',\n marginBottom: 12,\n },\n // Email chips\n emailChipsContainer: {\n flexDirection: 'row',\n flexWrap: 'wrap',\n gap: 8,\n marginBottom: 12,\n },\n emailChip: {\n flexDirection: 'row',\n alignItems: 'center',\n backgroundColor: '#e3f2fd',\n borderRadius: 16,\n paddingVertical: 6,\n paddingLeft: 12,\n paddingRight: 8,\n borderWidth: 1,\n borderColor: '#90caf9',\n },\n emailChipText: {\n fontFamily,\n fontSize: 13,\n color: '#1565c0',\n marginRight: 6,\n },\n emailChipRemove: {\n fontFamily,\n fontSize: 20,\n color: '#1565c0',\n fontWeight: '600',\n lineHeight: 20,\n },\n // Input\n input: {\n fontFamily,\n borderWidth: 1,\n borderColor: '#ddd',\n borderRadius: 8,\n paddingHorizontal: 14,\n paddingVertical: 10,\n fontSize: 15,\n color: '#1a1a1a',\n backgroundColor: '#fafafa',\n marginBottom: 12,\n },\n // Buttons\n button: {\n borderRadius: 8,\n paddingVertical: 12,\n paddingHorizontal: 16,\n alignItems: 'center',\n justifyContent: 'center',\n flexDirection: 'row',\n },\n secondaryButton: {\n backgroundColor: '#f5f5f5',\n borderWidth: 1,\n borderColor: '#e0e0e0',\n },\n secondaryButtonText: {\n fontFamily,\n color: '#333',\n fontSize: 14,\n fontWeight: '600',\n },\n tertiaryButton: {\n backgroundColor: '#f5f5f5',\n borderWidth: 1,\n borderColor: '#e0e0e0',\n },\n tertiaryButtonText: {\n fontFamily,\n color: '#333',\n fontSize: 11,\n fontWeight: '600',\n },\n actionButtons: {\n flexDirection: 'row',\n gap: 10,\n },\n halfButton: {\n flex: 1,\n },\n shareButtonsContainer: {\n flexDirection: 'column',\n gap: 10,\n },\n contactButtonsContainer: {\n flexDirection: 'column',\n gap: 10,\n },\n fullButton: {\n width: '100%',\n },\n buttonIconContainer: {\n marginRight: 8,\n },\n // Contacts list\n contactsList: {\n gap: 0,\n },\n contactItem: {\n flexDirection: 'row',\n alignItems: 'center',\n paddingVertical: 12,\n },\n contactAvatar: {\n width: 44,\n height: 44,\n borderRadius: 22,\n },\n contactAvatarPlaceholder: {\n width: 44,\n height: 44,\n borderRadius: 22,\n backgroundColor: '#6291d5',\n alignItems: 'center',\n justifyContent: 'center',\n },\n contactAvatarInitials: {\n fontSize: 16,\n fontWeight: '600',\n color: '#ffffff',\n },\n contactInfo: {\n flex: 1,\n marginLeft: 12,\n marginRight: 12,\n },\n contactName: {\n fontFamily,\n fontSize: 15,\n fontWeight: '600',\n color: '#1a1a1a',\n marginBottom: 4,\n },\n contactEmail: {\n fontFamily,\n fontSize: 13,\n color: '#666',\n },\n inviteButton: {\n paddingVertical: 8,\n paddingHorizontal: 16,\n backgroundColor: '#f5f5f5',\n borderWidth: 1,\n borderColor: '#e0e0e0',\n borderRadius: 6,\n minWidth: 80,\n alignItems: 'center',\n },\n inviteButtonText: {\n fontFamily,\n fontSize: 13,\n fontWeight: '600',\n color: '#333',\n },\n invitedText: {\n fontFamily,\n fontSize: 13,\n fontWeight: '600',\n color: '#666',\n },\n successMessageContainer: {\n paddingVertical: 12,\n alignItems: 'center',\n },\n // Loading state\n loadingContainer: {\n paddingVertical: 40,\n alignItems: 'center',\n justifyContent: 'center',\n },\n loadingText: {\n fontFamily,\n fontSize: 14,\n color: '#666',\n marginTop: 12,\n },\n emptyText: {\n fontFamily,\n fontSize: 14,\n color: '#999',\n textAlign: 'center',\n paddingVertical: 20,\n },\n // Error state\n errorContainer: {\n paddingVertical: 40,\n paddingHorizontal: 20,\n alignItems: 'center',\n justifyContent: 'center',\n },\n errorTitle: {\n fontFamily,\n fontSize: 16,\n fontWeight: '600',\n color: '#d9534f',\n marginBottom: 12,\n textAlign: 'center',\n },\n errorMessage: {\n fontFamily,\n fontSize: 14,\n color: '#666',\n marginBottom: 16,\n textAlign: 'center',\n lineHeight: 20,\n },\n errorHint: {\n fontFamily,\n fontSize: 13,\n color: '#666',\n marginTop: 12,\n marginBottom: 8,\n textAlign: 'center',\n lineHeight: 18,\n backgroundColor: '#f0f8ff',\n padding: 12,\n borderRadius: 6,\n borderWidth: 1,\n borderColor: '#b3d9ff',\n },\n errorActions: {\n flexDirection: 'row',\n gap: 10,\n marginTop: 16,\n marginBottom: 8,\n width: '100%',\n },\n errorDetails: {\n fontFamily,\n fontSize: 12,\n color: '#999',\n textAlign: 'center',\n fontStyle: 'italic',\n },\n // QR Code view\n qrCodeViewContainer: {\n alignItems: 'center',\n justifyContent: 'center',\n padding: 20,\n backgroundColor: '#fff',\n borderRadius: 10,\n marginVertical: 10,\n },\n // Edit mode circle button\n editModeCircleButton: {\n position: 'absolute',\n right: 8,\n top: '50%',\n transform: [{ translateY: -15 }],\n width: 30,\n height: 30,\n borderRadius: 15,\n backgroundColor: '#2196F3',\n justifyContent: 'center',\n alignItems: 'center',\n shadowColor: '#000',\n shadowOffset: { width: 0, height: 2 },\n shadowOpacity: 0.25,\n shadowRadius: 3.84,\n elevation: 5,\n },\n editModeCircleButtonText: {\n color: '#fff',\n fontSize: 16,\n fontWeight: 'bold',\n },\n });\n","import { useState, useEffect, useRef } from 'react';\nimport { Platform } from 'react-native';\nimport { PlatformOperations } from '../types/platformOperations';\n\nexport type ViewType = 'main' | 'email' | 'contacts' | 'googleContacts' | 'qrcode';\n\nexport interface Contact {\n id: string;\n name: string;\n email: string;\n imageUri?: string;\n}\n\nexport function useInvitationFormLogic(\n platformOps: PlatformOperations,\n contacts?: Contact[],\n googleContacts?: Contact[],\n getShareableInviteLink?: () => Promise<string | undefined>\n) {\n const [view, setView] = useState<ViewType>('main');\n const [emailInput, setEmailInput] = useState('');\n const [emails, setEmails] = useState<string[]>([]);\n const [role, setRole] = useState<'member' | 'admin'>('member');\n const [copySuccess, setCopySuccess] = useState(false);\n const [shareSuccess, setShareSuccess] = useState(false);\n const [sendSuccess, setSendSuccess] = useState(false);\n const [searchQuery, setSearchQuery] = useState('');\n const [invitedContactIds, setInvitedContactIds] = useState<Set<string>>(new Set());\n const [invitedGoogleContactIds, setInvitedGoogleContactIds] = useState<Set<string>>(new Set());\n const [googleSearchQuery, setGoogleSearchQuery] = useState('');\n const [loadingContactIds, setLoadingContactIds] = useState<Set<string>>(new Set());\n const [loadingGoogleContactIds, setLoadingGoogleContactIds] = useState<Set<string>>(new Set());\n const [loadingEmailInvite, setLoadingEmailInvite] = useState(false);\n const [loadingCopy, setLoadingCopy] = useState(false);\n const [loadingShare, setLoadingShare] = useState(false);\n const [invitationLink, setInvitationLink] = useState<string>('https://app.vortexsoftware.com/invite/abc123');\n const [loadingInvitationLink, setLoadingInvitationLink] = useState(false);\n const fetchedRef = useRef(false);\n\n // Fetch the actual invitation link when QR code view is shown\n // In web/preview mode, skip fetching and use the placeholder for demo purposes\n useEffect(() => {\n // If we're in web mode, don't fetch - just show the placeholder immediately\n if (Platform.OS === 'web') {\n console.log('[Vortex] Web preview mode: using placeholder QR code for demo');\n return;\n }\n\n if (view === 'qrcode' && getShareableInviteLink && !fetchedRef.current) {\n fetchedRef.current = true;\n setLoadingInvitationLink(true);\n getShareableInviteLink()\n .then((link) => {\n if (link) {\n setInvitationLink(link);\n console.log('[Vortex] QR code invitation link fetched:', link);\n } else {\n console.warn('[Vortex] No invitation link available for QR code');\n }\n })\n .catch((error) => {\n console.error('[Vortex] Failed to fetch invitation link for QR code:', error);\n fetchedRef.current = false; // Allow retry on error\n })\n .finally(() => {\n setLoadingInvitationLink(false);\n });\n }\n \n // Reset when leaving QR code view\n if (view !== 'qrcode') {\n fetchedRef.current = false;\n }\n }, [view, getShareableInviteLink]);\n\n const handleClose = () => {\n platformOps.close();\n };\n\n const handleSendInvitation = async () => {\n // First, process any pending email in the input field\n const trimmedEmail = emailInput.trim();\n let emailsToSend = [...emails];\n \n if (trimmedEmail && isValidEmail(trimmedEmail)) {\n // Add the pending email to the list\n emailsToSend = [...emails, trimmedEmail];\n setEmails(emailsToSend);\n }\n\n // If pending text exists but is invalid, show feedback instead of silently ignoring\n if (trimmedEmail && !isValidEmail(trimmedEmail)) {\n setLastInvalidEmail(trimmedEmail);\n setTimeout(() => setLastInvalidEmail(null), 1500);\n }\n\n // If there are no emails to send, don't proceed\n if (emailsToSend.length === 0) {\n return;\n }\n\n // De-duplicate before sending (user may have entered the same email twice)\n const uniqueEmails = [...new Set(emailsToSend)];\n\n setLoadingEmailInvite(true);\n try {\n // Send invites for all unique emails\n await Promise.all(uniqueEmails.map((email) => platformOps.invite(email)));\n\n console.log('[Vortex] Successfully sent invitations to:', emailsToSend);\n setSendSuccess(true);\n setEmails([]);\n setEmailInput('');\n setTimeout(() => setSendSuccess(false), 2000);\n } catch (error) {\n console.error('[Vortex] Failed to send invitations:', error);\n // Could add error state here if needed\n } finally {\n setLoadingEmailInvite(false);\n }\n };\n\n const handleCopyLink = async () => {\n setLoadingCopy(true);\n try {\n await platformOps.copyToClipboard();\n setCopySuccess(true);\n setTimeout(() => setCopySuccess(false), 2000);\n } catch (err) {\n console.error('Failed to copy:', err);\n // On error, loading state is cleared but success is not set\n } finally {\n setLoadingCopy(false);\n }\n };\n\n const handleShare = async () => {\n setLoadingShare(true);\n try {\n await platformOps.share();\n setShareSuccess(true);\n setTimeout(() => setShareSuccess(false), 2000);\n } catch (err) {\n console.error('Failed to share:', err);\n // On error, loading state is cleared but success is not set\n } finally {\n setLoadingShare(false);\n }\n };\n\n const isValidEmail = (email: string): boolean => {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n return emailRegex.test(email.trim());\n };\n\n // Track the last invalid email attempt so the UI can show feedback\n const [lastInvalidEmail, setLastInvalidEmail] = useState<string | null>(null);\n\n const handleEmailSubmit = (overrideEmail?: string) => {\n const trimmedEmail = (overrideEmail ?? emailInput).trim();\n if (!trimmedEmail) return;\n\n if (isValidEmail(trimmedEmail)) {\n // Allow duplicate emails — they will be de-duplicated before sending\n setEmails([...emails, trimmedEmail]);\n setEmailInput('');\n setLastInvalidEmail(null);\n } else {\n // Signal invalid email so the UI can show brief feedback (red border flash)\n setLastInvalidEmail(trimmedEmail);\n // Auto-clear the invalid state after a short delay\n setTimeout(() => setLastInvalidEmail(null), 1500);\n }\n };\n\n const handleRemoveEmail = (emailToRemove: string) => {\n setEmails(emails.filter((email) => email !== emailToRemove));\n };\n\n const handleSelectFromGoogle = () => {\n setView('googleContacts');\n };\n\n const handleSelectFromContacts = () => {\n setView('contacts');\n };\n\n const handleAddByEmail = () => {\n setView('email');\n };\n\n const handleShowQrCode = () => {\n setView('qrcode');\n };\n\n const handleBackToMain = () => {\n console.log('[Vortex] handleBackToMain called, returning to main view');\n console.log('[Vortex] Current view before setView:', view);\n setView('main');\n console.log('[Vortex] setView(\"main\") called');\n setSearchQuery('');\n setGoogleSearchQuery('');\n };\n\n const handleInviteContact = async (contactId: string) => {\n const contact = contacts?.find((c) => c.id === contactId);\n if (!contact) {\n console.error('[Vortex] Contact not found:', contactId);\n return;\n }\n\n // Add to loading set\n setLoadingContactIds((prev) => {\n const newSet = new Set(prev);\n newSet.add(contactId);\n return newSet;\n });\n\n try {\n await platformOps.invite(contact.email, contact.name);\n\n setInvitedContactIds((prev) => {\n const newSet = new Set(prev);\n newSet.add(contactId);\n return newSet;\n });\n } catch (error) {\n console.error('[Vortex] Failed to invite contact:', error);\n // On error, we don't add to invited set, just remove from loading\n } finally {\n // Remove from loading set\n setLoadingContactIds((prev) => {\n const newSet = new Set(prev);\n newSet.delete(contactId);\n return newSet;\n });\n }\n };\n\n const handleInviteGoogleContact = async (contactId: string) => {\n const contact = googleContacts?.find((c) => c.id === contactId);\n if (!contact) {\n console.error('[Vortex] Google contact not found:', contactId);\n return;\n }\n\n // Add to loading set\n setLoadingGoogleContactIds((prev) => {\n const newSet = new Set(prev);\n newSet.add(contactId);\n return newSet;\n });\n\n try {\n await platformOps.invite(contact.email, contact.name);\n\n setInvitedGoogleContactIds((prev) => {\n const newSet = new Set(prev);\n newSet.add(contactId);\n return newSet;\n });\n } catch (error) {\n console.error('[Vortex] Failed to invite Google contact:', error);\n // On error, we don't add to invited set, just remove from loading\n } finally {\n // Remove from loading set\n setLoadingGoogleContactIds((prev) => {\n const newSet = new Set(prev);\n newSet.delete(contactId);\n return newSet;\n });\n }\n };\n\n return {\n // State\n view,\n emailInput,\n emails,\n role,\n copySuccess,\n shareSuccess,\n sendSuccess,\n searchQuery,\n invitedContactIds,\n invitedGoogleContactIds,\n googleSearchQuery,\n invitationLink,\n loadingContactIds,\n loadingGoogleContactIds,\n loadingEmailInvite,\n loadingCopy,\n loadingShare,\n loadingInvitationLink,\n lastInvalidEmail,\n // Setters\n setView,\n setEmailInput,\n setEmails,\n setRole,\n setCopySuccess,\n setShareSuccess,\n setSendSuccess,\n setSearchQuery,\n setInvitedContactIds,\n setInvitedGoogleContactIds,\n setGoogleSearchQuery,\n // Handlers\n handleClose,\n handleSendInvitation,\n handleCopyLink,\n handleShare,\n isValidEmail,\n handleEmailSubmit,\n handleRemoveEmail,\n handleSelectFromGoogle,\n handleSelectFromContacts,\n handleAddByEmail,\n handleShowQrCode,\n handleBackToMain,\n handleInviteContact,\n handleInviteGoogleContact,\n };\n}\n","import type { Contact } from '../hooks/useInvitationFormLogic';\n\n/**\n * Filters contacts based on a search query\n * @param contacts Array of contacts to filter\n * @param searchQuery Query string to filter by\n * @returns Filtered array of contacts\n */\nexport function filterContacts(contacts: Contact[], searchQuery: string): Contact[] {\n const query = searchQuery.toLowerCase().trim();\n if (!query) return contacts;\n \n return contacts.filter(contact =>\n contact.name.toLowerCase().includes(query) ||\n contact.email.toLowerCase().includes(query)\n );\n}\n","import React from 'react';\nimport {\n View,\n Text,\n TouchableOpacity,\n ActivityIndicator,\n StyleSheet,\n ViewStyle,\n Platform,\n} from 'react-native';\nimport { IconRendererProps, IconName } from './InviteFormCore';\nimport { useVortexModules } from '../context/VortexModulesContext';\n\nconst isWeb = Platform.OS === 'web';\n\nexport interface VrtxShareOptionsProps {\n block: any;\n renderIcon: (props: IconRendererProps) => React.ReactNode;\n isCopyLinkEnabled: () => boolean;\n isShareEnabled: () => boolean;\n isEmailShareEnabled: () => boolean;\n isSmsEnabled: () => boolean;\n isTwitterDmsEnabled: () => boolean;\n isInstagramDmsEnabled: () => boolean;\n isWhatsAppEnabled: () => boolean;\n isLineEnabled: () => boolean;\n isLineLiffEnabled: () => boolean;\n isQrCodeEnabled: () => boolean;\n isFacebookMessengerEnabled: () => boolean;\n isTelegramEnabled: () => boolean;\n isDiscordEnabled: () => boolean;\n handleCopyLink: () => Promise<void>;\n handleShare: () => Promise<void>;\n handleEmailShare: () => Promise<void>;\n handleSmsShare: () => Promise<void>;\n handleTwitterShare: () => Promise<void>;\n handleInstagramShare: () => Promise<void>;\n handleWhatsAppShare: () => Promise<void>;\n handleLineShare: () => Promise<void>;\n handleLineLiffShare: () => Promise<void>;\n handleQrCode: () => Promise<void>;\n handleFacebookMessengerShare: () => Promise<void>;\n handleTelegramShare: () => Promise<void>;\n handleDiscordShare: () => Promise<void>;\n triggerHaptic?: (style: 'light' | 'medium' | 'heavy') => Promise<void>;\n loadingCopy: boolean;\n loadingShare: boolean;\n copySuccess: boolean;\n shareSuccess: boolean;\n isEditMode?: boolean;\n shareOptionsOrder?: string[];\n}\n\n// Button wrapper component that handles gradients on web, native gradient libraries, or solid color fallback\ninterface ButtonWrapperProps {\n children: React.ReactNode;\n style: ViewStyle | ViewStyle[];\n gradientString: string | null;\n onPress?: () => void;\n disabled?: boolean;\n wrapperStyle?: ViewStyle | ViewStyle[];\n}\n\nconst ButtonWrapper: React.FC<ButtonWrapperProps> = ({\n children,\n style,\n gradientString,\n onPress,\n disabled,\n wrapperStyle,\n}) => {\n // Get the gradient module and loaders from context\n const { gradientModule, loaders } = useVortexModules();\n const styleArray = Array.isArray(style) ? style : [style];\n const combinedStyle = wrapperStyle ? [wrapperStyle, ...styleArray] : styleArray;\n\n // On web, use CSS gradients directly\n if (gradientString && isWeb) {\n return (\n <TouchableOpacity\n style={[...combinedStyle, { background: gradientString } as any]}\n onPress={onPress}\n disabled={disabled}\n activeOpacity={0.7}\n >\n {children}\n </TouchableOpacity>\n );\n }\n\n // On native, try to use gradient library if specified\n if (gradientString && gradientModule && loaders) {\n const GradientComponent = loaders.loadGradientComponent(gradientModule);\n const parsed = loaders.parseCSSLinearGradient(gradientString);\n\n if (GradientComponent && parsed) {\n const points = loaders.angleToGradientPoints(parsed.angle);\n\n return (\n <TouchableOpacity\n onPress={onPress}\n disabled={disabled}\n activeOpacity={0.7}\n style={wrapperStyle}\n >\n <GradientComponent\n colors={parsed.colors}\n locations={parsed.locations}\n start={points.start}\n end={points.end}\n style={styleArray}\n >\n {children}\n </GradientComponent>\n </TouchableOpacity>\n );\n }\n }\n\n // Fallback: solid color from first gradient stop\n const fallbackColor = gradientString && loaders ? loaders.parseGradientFirstColor(gradientString) : null;\n const finalStyle = fallbackColor\n ? [...combinedStyle, { backgroundColor: fallbackColor }]\n : combinedStyle;\n\n return (\n <TouchableOpacity\n style={finalStyle}\n onPress={onPress}\n disabled={disabled}\n activeOpacity={0.7}\n >\n {children}\n </TouchableOpacity>\n );\n};\n\nexport function VrtxShareOptions({\n block,\n renderIcon,\n isCopyLinkEnabled,\n isShareEnabled,\n isEmailShareEnabled,\n isSmsEnabled,\n isTwitterDmsEnabled,\n isInstagramDmsEnabled,\n isWhatsAppEnabled,\n isLineEnabled,\n isLineLiffEnabled,\n isQrCodeEnabled,\n isFacebookMessengerEnabled,\n isTelegramEnabled,\n isDiscordEnabled,\n handleCopyLink,\n handleShare,\n handleEmailShare,\n handleSmsShare,\n handleTwitterShare,\n handleInstagramShare,\n handleWhatsAppShare,\n handleLineShare,\n handleLineLiffShare,\n handleQrCode,\n handleFacebookMessengerShare,\n handleTelegramShare,\n handleDiscordShare,\n triggerHaptic,\n loadingCopy,\n loadingShare,\n copySuccess,\n shareSuccess,\n isEditMode = false,\n shareOptionsOrder = [],\n}: VrtxShareOptionsProps) {\n // Get loaders from context\n const { loaders } = useVortexModules();\n const handleCopyLinkWithHaptics = async () => {\n await triggerHaptic?.('light');\n await handleCopyLink();\n };\n\n const handleShareWithHaptics = async () => {\n await triggerHaptic?.('light');\n await handleShare();\n };\n\n const handleEmailShareWithHaptics = async () => {\n await triggerHaptic?.('light');\n await handleEmailShare();\n };\n\n const handleSmsShareWithHaptics = async () => {\n await triggerHaptic?.('light');\n await handleSmsShare();\n };\n\n const handleTwitterShareWithHaptics = async () => {\n await triggerHaptic?.('light');\n await handleTwitterShare();\n };\n\n const handleInstagramShareWithHaptics = async () => {\n await triggerHaptic?.('light');\n await handleInstagramShare();\n };\n\n const handleWhatsAppShareWithHaptics = async () => {\n await triggerHaptic?.('light');\n await handleWhatsAppShare();\n };\n\n const handleLineShareWithHaptics = async () => {\n await triggerHaptic?.('light');\n await handleLineShare();\n };\n\n const handleLineLiffShareWithHaptics = async () => {\n await triggerHaptic?.('light');\n await handleLineLiffShare();\n };\n\n const handleQrCodeWithHaptics = async () => {\n await triggerHaptic?.('light');\n await handleQrCode();\n };\n\n const handleFacebookMessengerShareWithHaptics = async () => {\n await triggerHaptic?.('light');\n await handleFacebookMessengerShare();\n };\n\n const handleTelegramShareWithHaptics = async () => {\n await triggerHaptic?.('light');\n await handleTelegramShare();\n };\n\n const handleDiscordShareWithHaptics = async () => {\n await triggerHaptic?.('light');\n await handleDiscordShare();\n };\n\n const showCopyLink = isCopyLinkEnabled();\n const showShare = isShareEnabled();\n const showEmail = isEmailShareEnabled();\n const showSms = isSmsEnabled();\n const showTwitter = isTwitterDmsEnabled();\n const showInstagram = isInstagramDmsEnabled();\n const showWhatsApp = isWhatsAppEnabled();\n const showLine = isLineEnabled();\n const showLineLiff = isLineLiffEnabled();\n const showQrCode = isQrCodeEnabled();\n const showFacebookMessenger = isFacebookMessengerEnabled();\n const showTelegram = isTelegramEnabled();\n const showDiscord = isDiscordEnabled();\n\n if (\n !showCopyLink &&\n !showShare &&\n !showEmail &&\n !showSms &&\n !showTwitter &&\n !showInstagram &&\n !showWhatsApp &&\n !showLine &&\n !showLineLiff &&\n !showQrCode &&\n !showFacebookMessenger &&\n !showTelegram &&\n !showDiscord\n )\n return null;\n\n // Convert theme options to inline styles\n const themeToStyle = (theme: any): Record<string, any> => {\n if (!theme?.options || !Array.isArray(theme.options)) return {};\n\n const style: Record<string, any> = {};\n\n theme.options.forEach((option: any) => {\n if (!option.value) return;\n\n const { key, value } = option;\n\n // Map CSS custom properties to React Native style properties\n // Example: --vrtx-icon-button-background -> background\n // Example: --vrtx-icon-button-color -> color\n\n // Handle padding and margin with shorthand expansion\n if (key === '--vrtx-icon-button-padding' && value) {\n const parts = value.trim().split(/\\s+/);\n if (parts.length === 1) {\n style.paddingTop = style.paddingRight = style.paddingBottom = style.paddingLeft = value;\n } else if (parts.length === 2) {\n style.paddingTop = style.paddingBottom = parts[0];\n style.paddingRight = style.paddingLeft = parts[1];\n } else if (parts.length === 3) {\n style.paddingTop = parts[0];\n style.paddingRight = style.paddingLeft = parts[1];\n style.paddingBottom = parts[2];\n } else if (parts.length === 4) {\n style.paddingTop = parts[0];\n style.paddingRight = parts[1];\n style.paddingBottom = parts[2];\n style.paddingLeft = parts[3];\n }\n return;\n }\n\n if (key === '--vrtx-icon-button-margin' && value) {\n const parts = value.trim().split(/\\s+/);\n if (parts.length === 1) {\n style.marginTop = style.marginRight = style.marginBottom = style.marginLeft = value;\n } else if (parts.length === 2) {\n style.marginTop = style.marginBottom = parts[0];\n style.marginRight = style.marginLeft = parts[1];\n } else if (parts.length === 3) {\n style.marginTop = parts[0];\n style.marginRight = style.marginLeft = parts[1];\n style.marginBottom = parts[2];\n } else if (parts.length === 4) {\n style.marginTop = parts[0];\n style.marginRight = parts[1];\n style.marginBottom = parts[2];\n style.marginLeft = parts[3];\n }\n return;\n }\n\n const propertyMap: Record<string, string> = {\n '--vrtx-icon-button-color': 'color',\n '--vrtx-icon-button-background': 'background',\n '--vrtx-icon-button-background-color': 'backgroundColor',\n '--vrtx-icon-button-text-align': 'textAlign',\n '--vrtx-icon-button-font-family': 'fontFamily',\n '--vrtx-icon-button-font-size': 'fontSize',\n '--vrtx-icon-button-font-weight': 'fontWeight',\n '--vrtx-icon-button-text-decoration': 'textDecoration',\n '--vrtx-icon-button-text-transform': 'textTransform',\n '--vrtx-icon-button-border': 'border',\n '--vrtx-icon-button-border-radius': 'borderRadius',\n '--vrtx-icon-button-display': 'display',\n };\n\n const styleProperty = propertyMap[key];\n if (styleProperty) {\n style[styleProperty] = value;\n }\n });\n\n return style;\n };\n\n // Extract styles from both block.style and block.theme\n const blockStyle = block?.style || {};\n const themeStyle = themeToStyle(block?.theme);\n\n // Merge styles (theme styles take precedence)\n const mergedStyle = { ...blockStyle, ...themeStyle };\n\n // Extract gradient string and fallback color\n // On native, 'background' is a CSS property that doesn't work — convert solid colors to 'backgroundColor'\n const rawBackground = mergedStyle.background || null;\n const isGradient = rawBackground?.includes('gradient');\n const gradientString = isGradient ? rawBackground : null;\n const fallbackColor = isGradient\n ? loaders?.parseGradientFirstColor(rawBackground)\n : rawBackground || mergedStyle.backgroundColor;\n\n // Extract icon color (use text color from merged style, fallback to #333)\n const iconColor = mergedStyle.color || '#333';\n\n // Create text style that removes background\n const textStyle = { ...mergedStyle, backgroundColor: 'transparent', background: 'transparent' };\n\n // Map textAlign to flexbox justifyContent for button content alignment\n const getJustifyContent = (align: string | undefined): 'flex-start' | 'center' | 'flex-end' => {\n switch (align) {\n case 'left':\n case 'start':\n return 'flex-start';\n case 'right':\n case 'end':\n return 'flex-end';\n default:\n return 'center';\n }\n };\n const buttonJustifyContent = getJustifyContent(mergedStyle.textAlign);\n\n // Extract label from block attributes\n const label = block?.attributes?.label;\n\n // Extract customizations from block settings\n const customizations = block?.settings?.customizations || {};\n\n // Helper function to get button text from customizations with flat key resolution\n const getButtonText = (optionKey: string, defaultLabel: string): string => {\n if (!customizations) {\n return defaultLabel;\n }\n\n // Priority order (most specific to least specific):\n\n // 1. Flat key format with host (e.g., 'mobile.copyLink') - PREFERRED for new saves\n const flatKey = `mobile.${optionKey}`;\n if (customizations[flatKey]?.textContent !== undefined) {\n const textContent = customizations[flatKey]?.textContent;\n return textContent === null || textContent === undefined ? defaultLabel : textContent;\n }\n\n // 2. Legacy format: textContent directly on customization key (e.g., 'copyLink')\n // This is for data already in production without host prefix\n const legacyCustomization = customizations[optionKey];\n if (legacyCustomization?.textContent !== undefined) {\n const textContent = legacyCustomization.textContent;\n return textContent === null || textContent === undefined ? defaultLabel : textContent;\n }\n\n // 3. Nested object format (customizations.mobile.copyLink) - old legacy format\n if (customizations.mobile) {\n const textContent = customizations.mobile?.[optionKey]?.textContent;\n if (textContent !== undefined) {\n return textContent === null ? defaultLabel : textContent;\n }\n }\n\n return defaultLabel;\n };\n\n // Map of option keys to their button configurations\n const buttonConfigs: Record<string, {\n show: boolean;\n icon: IconName;\n label: string;\n onPress: () => void;\n isLoading?: boolean;\n successLabel?: string;\n showSuccess?: boolean;\n }> = {\n copyLink: {\n show: showCopyLink,\n icon: 'link',\n label: getButtonText('copyLink', 'Copy Link'),\n onPress: handleCopyLinkWithHaptics,\n isLoading: loadingCopy,\n successLabel: '✓ Copied!',\n showSuccess: copySuccess,\n },\n nativeShareSheet: {\n show: showShare,\n icon: 'share',\n label: getButtonText('nativeShareSheet', 'Share Link'),\n onPress: handleShareWithHaptics,\n isLoading: loadingShare,\n successLabel: '✓ Shared!',\n showSuccess: shareSuccess,\n },\n email: {\n show: showEmail,\n icon: 'email',\n label: getButtonText('email', 'Share via Email'),\n onPress: handleEmailShareWithHaptics,\n },\n sms: {\n show: showSms,\n icon: 'sms',\n label: getButtonText('sms', 'Share via SMS'),\n onPress: handleSmsShareWithHaptics,\n },\n twitterDms: {\n show: showTwitter,\n icon: 'x-twitter',\n label: getButtonText('twitterDms', 'Share via X'),\n onPress: handleTwitterShareWithHaptics,\n },\n instagramDms: {\n show: showInstagram,\n icon: 'instagram',\n label: getButtonText('instagramDms', 'Share via Instagram'),\n onPress: handleInstagramShareWithHaptics,\n },\n whatsApp: {\n show: showWhatsApp,\n icon: 'whatsapp',\n label: getButtonText('whatsApp', 'Share via WhatsApp'),\n onPress: handleWhatsAppShareWithHaptics,\n },\n line: {\n show: showLine,\n icon: 'line',\n label: getButtonText('line', 'Share via LINE'),\n onPress: handleLineShareWithHaptics,\n },\n lineLiff: {\n show: showLineLiff,\n icon: 'line',\n label: getButtonText('lineLiff', 'Share via LINE (LIFF)'),\n onPress: handleLineLiffShareWithHaptics,\n },\n qrCode: {\n show: showQrCode,\n icon: 'qr-code',\n label: getButtonText('qrCode', 'Show QR Code'),\n onPress: handleQrCodeWithHaptics,\n },\n facebookMessenger: {\n show: showFacebookMessenger,\n icon: 'facebook-messenger',\n label: getButtonText('facebookMessenger', 'Share via Messenger'),\n onPress: handleFacebookMessengerShareWithHaptics,\n },\n telegram: {\n show: showTelegram,\n icon: 'telegram',\n label: getButtonText('telegram', 'Share via Telegram'),\n onPress: handleTelegramShareWithHaptics,\n },\n discord: {\n show: showDiscord,\n icon: 'discord',\n label: getButtonText('discord', 'Share via Discord'),\n onPress: handleDiscordShareWithHaptics,\n },\n };\n\n // Render a single share button\n const renderShareButton = (option: string) => {\n const config = buttonConfigs[option];\n if (!config || !config.show) return null;\n\n const displayLabel = config.showSuccess && config.successLabel ? config.successLabel : config.label;\n\n return (\n <ButtonWrapper\n key={option}\n wrapperStyle={[styles.button, styles.fullButton]}\n style={[styles.tertiaryButton, mergedStyle, fallbackColor ? { backgroundColor: fallbackColor } : undefined]}\n gradientString={gradientString}\n onPress={isEditMode ? undefined : config.onPress}\n disabled={config.isLoading || isEditMode}\n >\n {config.isLoading ? (\n <View style={styles.buttonContent}>\n <ActivityIndicator size=\"small\" color=\"#333\" />\n </View>\n ) : (\n <View style={[styles.buttonContent, { justifyContent: buttonJustifyContent }]}>\n <View style={styles.buttonIconContainer}>\n {renderIcon({ name: config.icon, size: 18, color: iconColor })}\n </View>\n <Text style={[styles.tertiaryButtonText, textStyle]}>{displayLabel}</Text>\n </View>\n )}\n </ButtonWrapper>\n );\n };\n\n // Determine the order to render buttons\n // If shareOptionsOrder is provided and non-empty, use it; otherwise fall back to default order\n const defaultOrder = ['copyLink', 'nativeShareSheet', 'email', 'sms', 'twitterDms', 'instagramDms', 'whatsApp', 'facebookMessenger', 'telegram', 'discord', 'line', 'lineLiff', 'qrCode'];\n const orderToUse = shareOptionsOrder.length > 0 ? shareOptionsOrder : defaultOrder;\n\n return (\n <View key={block.id} style={styles.contactButtonsContainer}>\n {/* Section label from block attributes */}\n {label && (\n <Text style={styles.sectionLabel}>{label}</Text>\n )}\n {orderToUse.map(renderShareButton)}\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n contactButtonsContainer: {\n gap: 12,\n marginBottom: 16,\n },\n sectionLabel: {\n fontSize: 14,\n fontWeight: '500',\n color: '#666',\n marginBottom: 4,\n },\n button: {\n borderRadius: 8,\n overflow: 'hidden', // Important for gradient clipping\n },\n tertiaryButton: {\n backgroundColor: '#f5f5f5',\n paddingVertical: 12,\n paddingHorizontal: 16,\n borderRadius: 8,\n },\n fullButton: {\n width: '100%',\n },\n buttonContent: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 8,\n },\n buttonIconContainer: {\n width: 24,\n height: 18,\n alignItems: 'center',\n justifyContent: 'center',\n overflow: 'visible',\n },\n tertiaryButtonText: {\n color: '#333',\n fontSize: 16,\n fontWeight: '500',\n },\n});\n","/**\n * VortexModulesContext\n *\n * Internal context for passing optional module configuration AND loader functions\n * from entry points (VortexInvite/InviteFormWeb) down to child components\n * without prop drilling.\n *\n * This is completely internal to the SDK - end users only need to pass props\n * to <VortexInvite> and everything works automatically.\n *\n * The key insight is that entry points inject the appropriate loader functions:\n * - Native entry (index.tsx/InviteFormMobile) injects loaders from moduleLoaders.ts\n * - Web entry (preview.tsx/InviteFormWeb) injects loaders from moduleLoaders.web.ts\n *\n * This way, components don't import loaders directly, avoiding Metro/webpack bundler issues.\n *\n * Example usage (internal):\n * ```tsx\n * // In a child component\n * const { modules, loaders } = useVortexModules();\n * const GradientComponent = loaders.loadGradientComponent(modules?.gradient);\n * ```\n */\n\nimport React, { createContext, useContext, useMemo, ReactNode, ComponentType } from 'react';\n\n/**\n * Supported gradient library module names.\n * Users specify which library they have installed.\n */\nexport type GradientModuleName = 'expo-linear-gradient' | 'react-native-linear-gradient';\n\n/**\n * Supported haptics library module names.\n */\nexport type HapticsModuleName = 'expo-haptics';\n\n/**\n * Supported QR code library module names.\n */\nexport type QRCodeModuleName = 'react-native-qrcode-svg' | 'react-qr-code';\n\n/**\n * Supported clipboard library module names.\n */\nexport type ClipboardModuleName = 'expo-clipboard' | '@react-native-clipboard/clipboard';\n\n/**\n * Supported sharing library module names.\n */\nexport type SharingModuleName = 'expo-sharing';\n\n/**\n * Unified modules configuration object.\n * Users specify which optional native libraries they have installed via a single prop.\n *\n * @example\n * ```tsx\n * <VortexInvite\n * componentId=\"abc123\"\n * modules={{\n * gradient: 'expo-linear-gradient',\n * haptics: 'expo-haptics',\n * qrCode: 'react-native-qrcode-svg',\n * }}\n * />\n * ```\n */\nexport interface VortexModules {\n /**\n * Gradient library for button backgrounds.\n * For Expo: 'expo-linear-gradient'\n * For bare RN: 'react-native-linear-gradient'\n */\n gradient?: GradientModuleName;\n\n /**\n * Haptics library for touch feedback.\n * Currently only 'expo-haptics' is supported.\n */\n haptics?: HapticsModuleName;\n\n /**\n * QR code library for QR code display.\n * For native: 'react-native-qrcode-svg'\n * For web: 'react-qr-code'\n */\n qrCode?: QRCodeModuleName;\n\n /**\n * Clipboard library for copy functionality.\n * For Expo: 'expo-clipboard'\n * For bare RN: '@react-native-clipboard/clipboard'\n */\n clipboard?: ClipboardModuleName;\n\n /**\n * Sharing library for native share sheet.\n * Currently only 'expo-sharing' is supported.\n */\n sharing?: SharingModuleName;\n}\n\n/**\n * Props for gradient components (compatible with both expo and react-native-linear-gradient)\n */\nexport interface GradientProps {\n colors: string[];\n locations?: number[];\n start?: { x: number; y: number };\n end?: { x: number; y: number };\n style?: any;\n children?: React.ReactNode;\n}\n\n/**\n * Parsed gradient data structure\n */\nexport interface ParsedGradient {\n type: 'linear';\n angle: number;\n colors: string[];\n locations: number[];\n}\n\n/**\n * Gradient points for LinearGradient component\n */\nexport interface GradientPoints {\n start: { x: number; y: number };\n end: { x: number; y: number };\n}\n\n/**\n * Haptic feedback style\n */\nexport type HapticStyle = 'light' | 'medium' | 'heavy';\n\n/**\n * Module loader functions interface.\n * These are injected by entry points (native vs web) to avoid direct imports\n * that would cause bundler issues.\n */\nexport interface ModuleLoaders {\n /**\n * Loads the gradient component based on the specified module name.\n */\n loadGradientComponent: (moduleName: GradientModuleName | undefined) => ComponentType<GradientProps> | null;\n\n /**\n * Parses a CSS linear-gradient string into a structured format.\n */\n parseCSSLinearGradient: (css: string) => ParsedGradient | null;\n\n /**\n * Converts a CSS gradient angle to start/end points for LinearGradient component.\n */\n angleToGradientPoints: (angle: number) => GradientPoints;\n\n /**\n * Extracts the first color from a CSS gradient string.\n */\n parseGradientFirstColor: (gradientString: string) => string | null;\n}\n\n/**\n * Internal configuration for the modules context.\n * This combines the user-facing modules config with internal loader functions.\n */\nexport interface VortexModulesConfig {\n /**\n * Unified modules configuration object.\n * Users specify which optional native libraries they have installed.\n */\n modules?: VortexModules;\n\n /**\n * Module loader functions injected by entry points.\n * This allows native and web entry points to provide different implementations.\n * @internal\n */\n loaders?: ModuleLoaders;\n}\n\n// Default stub loaders that return null (used when no loaders are provided)\nconst defaultLoaders: ModuleLoaders = {\n loadGradientComponent: () => null,\n parseCSSLinearGradient: () => null,\n angleToGradientPoints: (angle: number) => ({\n start: { x: 0, y: 0 },\n end: { x: 1, y: 1 },\n }),\n parseGradientFirstColor: () => null,\n};\n\n// Default empty config\nconst defaultConfig: VortexModulesConfig = {\n loaders: defaultLoaders,\n};\n\n// Create the context with default empty config\nconst VortexModulesContext = createContext<VortexModulesConfig>(defaultConfig);\n\n/**\n * Hook to access the module configuration from any child component.\n *\n * @returns The current module configuration including loaders\n *\n * @example\n * ```tsx\n * function MyButton() {\n * const { modules, loaders } = useVortexModules();\n * const GradientComponent = loaders?.loadGradientComponent(modules?.gradient);\n * // Use GradientComponent if available\n * }\n * ```\n */\nexport function useVortexModules(): VortexModulesConfig & { \n // Computed properties for easy access\n gradientModule?: GradientModuleName;\n hapticsModule?: HapticsModuleName;\n qrCodeModule?: QRCodeModuleName;\n clipboardModule?: ClipboardModuleName;\n sharingModule?: SharingModuleName;\n} {\n const config = useContext(VortexModulesContext);\n \n return {\n ...config,\n loaders: config.loaders || defaultLoaders,\n // Provide computed accessors for easy access to individual module names\n gradientModule: config.modules?.gradient,\n hapticsModule: config.modules?.haptics,\n qrCodeModule: config.modules?.qrCode,\n clipboardModule: config.modules?.clipboard,\n sharingModule: config.modules?.sharing,\n };\n}\n\n/**\n * Props for the VortexModulesProvider component.\n */\nexport interface VortexModulesProviderProps {\n /**\n * Module configuration to provide to children.\n */\n config: VortexModulesConfig;\n\n /**\n * Child components that will have access to the module configuration.\n */\n children: ReactNode;\n}\n\n/**\n * Provider component that makes module configuration available to all children.\n *\n * This is used internally by VortexInvite and InviteFormWeb.\n * End users don't need to use this directly.\n *\n * @example\n * ```tsx\n * // Internal usage in VortexInvite (native)\n * import * as nativeLoaders from '../utils/moduleLoaders';\n * \n * <VortexModulesProvider config={{ \n * modules: { gradient: 'expo-linear-gradient', haptics: 'expo-haptics' },\n * loaders: nativeLoaders \n * }}>\n * <InviteFormCore {...props} />\n * </VortexModulesProvider>\n * \n * // Internal usage in InviteFormWeb (web)\n * import * as webLoaders from '../utils/moduleLoaders.web';\n * \n * <VortexModulesProvider config={{ loaders: webLoaders }}>\n * <InviteFormCore {...props} />\n * </VortexModulesProvider>\n * ```\n */\nexport function VortexModulesProvider({ config, children }: VortexModulesProviderProps) {\n // Memoize the config to prevent unnecessary re-renders\n // Using the entire config object as dependency to ensure all properties are tracked\n const memoizedConfig = useMemo(\n () => ({\n ...config,\n loaders: config.loaders || defaultLoaders,\n }),\n [config]\n );\n\n return (\n <VortexModulesContext.Provider value={memoizedConfig}>\n {children}\n </VortexModulesContext.Provider>\n );\n}\n\n// Export the context for testing purposes\nexport { VortexModulesContext };\n","import React from 'react';\nimport { View, Text, TouchableOpacity, StyleSheet, ViewStyle, Platform } from 'react-native';\nimport { IconRendererProps } from './InviteFormCore';\nimport { useVortexModules } from '../context/VortexModulesContext';\n\nconst isWeb = Platform.OS === 'web';\n\n// Button wrapper component that handles gradients on web, native gradient libraries, or solid color fallback\ninterface ButtonWrapperProps {\n children: React.ReactNode;\n style: ViewStyle | ViewStyle[];\n gradientString: string | null;\n onPress?: () => void;\n disabled?: boolean;\n}\n\nconst ButtonWrapper: React.FC<ButtonWrapperProps> = ({\n children,\n style,\n gradientString,\n onPress,\n disabled,\n}) => {\n // Get the gradient module and loaders from context\n const { gradientModule, loaders } = useVortexModules();\n const styleArray = Array.isArray(style) ? style : [style];\n\n // On web, use CSS gradients directly\n if (gradientString && isWeb) {\n return (\n <TouchableOpacity\n style={[...styleArray, { background: gradientString } as any]}\n onPress={onPress}\n disabled={disabled}\n activeOpacity={0.7}\n >\n {children}\n </TouchableOpacity>\n );\n }\n\n // On native, try to use gradient library if specified\n if (gradientString && gradientModule && loaders) {\n const GradientComponent = loaders.loadGradientComponent(gradientModule);\n const parsed = loaders.parseCSSLinearGradient(gradientString);\n\n if (GradientComponent && parsed) {\n const points = loaders.angleToGradientPoints(parsed.angle);\n\n return (\n <TouchableOpacity\n onPress={onPress}\n disabled={disabled}\n activeOpacity={0.7}\n >\n <GradientComponent\n colors={parsed.colors}\n locations={parsed.locations}\n start={points.start}\n end={points.end}\n style={styleArray}\n >\n {children}\n </GradientComponent>\n </TouchableOpacity>\n );\n }\n }\n\n // Fallback: solid color from first gradient stop\n const fallbackColor = gradientString && loaders ? loaders.parseGradientFirstColor(gradientString) : null;\n const finalStyle = fallbackColor ? [...styleArray, { backgroundColor: fallbackColor }] : styleArray;\n\n return (\n <TouchableOpacity\n style={finalStyle}\n onPress={onPress}\n disabled={disabled}\n activeOpacity={0.7}\n >\n {children}\n </TouchableOpacity>\n );\n};\n\nexport interface VrtxContactsImportProps {\n block: any;\n renderIcon: (props: IconRendererProps) => React.ReactNode;\n isNativeContactsEnabled: () => boolean;\n isGoogleContactsEnabled: () => boolean;\n handleSelectFromContacts: () => void;\n handleSelectFromGoogle: () => void;\n triggerHaptic?: (style: 'light' | 'medium' | 'heavy') => Promise<void>;\n isEditMode?: boolean;\n}\n\nexport function VrtxContactsImport({\n block,\n renderIcon,\n isNativeContactsEnabled,\n isGoogleContactsEnabled,\n handleSelectFromContacts,\n handleSelectFromGoogle,\n triggerHaptic,\n isEditMode = false,\n}: VrtxContactsImportProps) {\n // Get loaders from context\n const { loaders } = useVortexModules();\n\n // Helper to get customization label - null/undefined uses default, empty string shows nothing\n const getCustomLabel = (key: string, defaultLabel: string): string => {\n const textContent = block?.settings?.customizations?.[key]?.textContent;\n // If textContent is null or undefined, use default. Empty string is valid (shows no label).\n if (textContent === null || textContent === undefined) {\n return defaultLabel;\n }\n return textContent;\n };\n\n const handleSelectFromContactsWithHaptics = async () => {\n await triggerHaptic?.('light');\n handleSelectFromContacts();\n };\n\n const handleSelectFromGoogleWithHaptics = async () => {\n await triggerHaptic?.('light');\n handleSelectFromGoogle();\n };\n\n // Convert theme options to inline styles\n const themeToStyle = (theme: any): Record<string, any> => {\n if (!theme?.options || !Array.isArray(theme.options)) return {};\n\n const style: Record<string, any> = {};\n\n theme.options.forEach((option: any) => {\n if (!option.value) return;\n\n const { key, value } = option;\n\n // Handle padding and margin with shorthand expansion\n if (key === '--vrtx-icon-button-padding' && value) {\n const parts = value.trim().split(/\\s+/);\n if (parts.length === 1) {\n style.paddingTop = style.paddingRight = style.paddingBottom = style.paddingLeft = value;\n } else if (parts.length === 2) {\n style.paddingTop = style.paddingBottom = parts[0];\n style.paddingRight = style.paddingLeft = parts[1];\n } else if (parts.length === 3) {\n style.paddingTop = parts[0];\n style.paddingRight = style.paddingLeft = parts[1];\n style.paddingBottom = parts[2];\n } else if (parts.length === 4) {\n style.paddingTop = parts[0];\n style.paddingRight = parts[1];\n style.paddingBottom = parts[2];\n style.paddingLeft = parts[3];\n }\n return;\n }\n\n if (key === '--vrtx-icon-button-margin' && value) {\n const parts = value.trim().split(/\\s+/);\n if (parts.length === 1) {\n style.marginTop = style.marginRight = style.marginBottom = style.marginLeft = value;\n } else if (parts.length === 2) {\n style.marginTop = style.marginBottom = parts[0];\n style.marginRight = style.marginLeft = parts[1];\n } else if (parts.length === 3) {\n style.marginTop = parts[0];\n style.marginRight = style.marginLeft = parts[1];\n style.marginBottom = parts[2];\n } else if (parts.length === 4) {\n style.marginTop = parts[0];\n style.marginRight = parts[1];\n style.marginBottom = parts[2];\n style.marginLeft = parts[3];\n }\n return;\n }\n\n // Map CSS custom properties to React Native style properties\n const propertyMap: Record<string, string> = {\n '--vrtx-icon-button-color': 'color',\n '--vrtx-icon-button-background': 'background',\n '--vrtx-icon-button-background-color': 'backgroundColor',\n '--vrtx-icon-button-border-radius': 'borderRadius',\n '--vrtx-icon-button-font-size': 'fontSize',\n '--vrtx-icon-button-font-weight': 'fontWeight',\n };\n\n const styleProperty = propertyMap[key];\n if (styleProperty) {\n style[styleProperty] = value;\n }\n });\n\n return style;\n };\n\n // Extract styles from the vrtx-contacts-import block itself (this block has the theme)\n const blockStyle = block?.style || {};\n const blockThemeStyle = themeToStyle(block?.theme);\n\n // Merge styles (theme styles take precedence over block.style)\n const mergedBlockStyle = { ...blockStyle, ...blockThemeStyle };\n\n // Extract gradient string and fallback color\n // On native, 'background' is a CSS property that doesn't work — convert solid colors to 'backgroundColor'\n const rawBlockBackground = mergedBlockStyle.background || null;\n const isBlockGradient = rawBlockBackground?.includes('gradient');\n const blockGradientString = isBlockGradient ? rawBlockBackground : null;\n const blockFallbackColor = isBlockGradient\n ? loaders?.parseGradientFirstColor(rawBlockBackground)\n : rawBlockBackground || mergedBlockStyle.backgroundColor;\n\n const blockTextColor = mergedBlockStyle.color || '#333';\n\n // Create a clean style object without background/backgroundColor (we'll handle those separately)\n const cleanBlockStyle = { ...mergedBlockStyle };\n delete cleanBlockStyle.background;\n delete cleanBlockStyle.backgroundColor;\n\n // Extract label from block attributes\n const label = block?.attributes?.label;\n\n return (\n <View key={block.id} style={styles.contactButtonsContainer}>\n {/* Section label from block attributes */}\n {label && (\n <Text style={styles.sectionLabel}>{label}</Text>\n )}\n {isNativeContactsEnabled() && (\n <ButtonWrapper\n style={[\n styles.button,\n styles.fullButton,\n styles.tertiaryButton,\n cleanBlockStyle,\n blockFallbackColor ? { backgroundColor: blockFallbackColor } : undefined,\n ]}\n gradientString={blockGradientString}\n onPress={handleSelectFromContactsWithHaptics}\n >\n <View style={styles.buttonIconContainer}>\n {renderIcon({ name: 'import-contacts', size: 18, color: blockTextColor })}\n </View>\n <Text style={[styles.tertiaryButtonText, { color: blockTextColor }]}>\n {getCustomLabel('importContacts', 'Add from Contacts')}\n </Text>\n </ButtonWrapper>\n )}\n\n {isGoogleContactsEnabled() && (\n <ButtonWrapper\n style={[\n styles.button,\n styles.fullButton,\n styles.tertiaryButton,\n cleanBlockStyle,\n blockFallbackColor ? { backgroundColor: blockFallbackColor } : undefined,\n ]}\n gradientString={blockGradientString}\n onPress={handleSelectFromGoogleWithHaptics}\n >\n <View style={styles.buttonIconContainer}>\n {renderIcon({ name: 'google', size: 18, color: blockTextColor })}\n </View>\n <Text style={[styles.tertiaryButtonText, { color: blockTextColor }]}>\n {getCustomLabel('google', 'Add from Google Contacts')}\n </Text>\n </ButtonWrapper>\n )}\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n contactButtonsContainer: {\n gap: 12,\n },\n sectionLabel: {\n fontSize: 14,\n fontWeight: '500',\n color: '#666',\n marginBottom: 4,\n },\n button: {\n paddingVertical: 12,\n paddingHorizontal: 16,\n borderRadius: 8,\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 8,\n },\n tertiaryButton: {\n backgroundColor: '#f5f5f5',\n },\n fullButton: {\n width: '100%',\n },\n buttonIconContainer: {\n width: 18,\n height: 18,\n alignItems: 'center',\n justifyContent: 'center',\n overflow: 'visible',\n },\n tertiaryButtonText: {\n color: '#333',\n fontSize: 16,\n fontWeight: '500',\n },\n});\n","import React from 'react';\nimport {\n View,\n Text,\n TextInput,\n TouchableOpacity,\n ActivityIndicator,\n StyleSheet,\n ViewStyle,\n Platform,\n} from 'react-native';\nimport type { ViewType } from '../hooks/useInvitationFormLogic';\n\nconst isWeb = Platform.OS === 'web';\n\n// Parse CSS linear-gradient to extract first color for fallback\nfunction parseGradientFirstColor(gradientString: string): string | null {\n if (!gradientString || !gradientString.includes('linear-gradient')) {\n return null;\n }\n\n const stopsRegex = /(rgba?\\([^)]+\\)|#[0-9a-fA-F]{3,8}|[a-z]+)\\s+(\\d+)%/i;\n const match = stopsRegex.exec(gradientString);\n\n if (match) {\n return match[1].trim();\n }\n\n return null;\n}\n\nexport interface VrtxEmailInvitationsProps {\n block: any;\n view: ViewType;\n emails: string[];\n emailInput: string;\n setEmailInput: (value: string) => void;\n handleEmailSubmit: (overrideEmail?: string) => void;\n handleRemoveEmail: (email: string) => void;\n submitButtonBlock?: any;\n handleSendInvitation?: () => Promise<void>;\n triggerHaptic?: (style: 'light' | 'medium' | 'heavy') => Promise<void>;\n loadingEmailInvite?: boolean;\n sendSuccess?: boolean;\n /** When set, the input briefly shows a red border to indicate invalid email */\n lastInvalidEmail?: string | null;\n EditableWrapper?: React.ComponentType<{\n children: React.ReactNode;\n componentId: string;\n componentType: string;\n node?: any;\n }>;\n // Analytics callbacks (optional)\n onEmailFieldFocus?: () => void;\n onEmailFieldBlur?: () => void;\n // Handler to navigate to email view\n handleAddByEmail?: () => void;\n renderIcon?: (props: any) => React.ReactNode;\n isEditMode?: boolean;\n}\n\n// Button wrapper component that handles gradients on web, solid color fallback on native\ninterface ButtonWrapperProps {\n children: React.ReactNode;\n style: ViewStyle | ViewStyle[];\n gradientString: string | null;\n onPress?: () => void;\n disabled?: boolean;\n}\n\nconst ButtonWrapper: React.FC<ButtonWrapperProps> = ({\n children,\n style,\n gradientString,\n onPress,\n disabled,\n}) => {\n const styleArray = Array.isArray(style) ? style : [style];\n\n // On web, use CSS gradients directly\n if (gradientString && isWeb) {\n return (\n <TouchableOpacity\n style={[...styleArray, { background: gradientString } as any]}\n onPress={onPress}\n disabled={disabled}\n activeOpacity={0.7}\n >\n {children}\n </TouchableOpacity>\n );\n }\n\n // On native, use first color from gradient as solid background\n const fallbackColor = gradientString ? parseGradientFirstColor(gradientString) : null;\n const finalStyle = fallbackColor ? [...styleArray, { backgroundColor: fallbackColor }] : styleArray;\n\n return (\n <TouchableOpacity\n style={finalStyle}\n onPress={onPress}\n disabled={disabled}\n activeOpacity={0.7}\n >\n {children}\n </TouchableOpacity>\n );\n};\n\n// Chip wrapper component that handles gradients on web, solid color fallback on native\ninterface ChipWrapperProps {\n children: React.ReactNode;\n style: ViewStyle | ViewStyle[];\n gradientString: string | null;\n}\n\nconst ChipWrapper: React.FC<ChipWrapperProps> = ({ children, style, gradientString }) => {\n const styleArray = Array.isArray(style) ? style : [style];\n\n // On web, use CSS gradients directly\n if (gradientString && isWeb) {\n return <View style={[...styleArray, { background: gradientString } as any]}>{children}</View>;\n }\n\n // On native, use first color from gradient as solid background\n const fallbackColor = gradientString ? parseGradientFirstColor(gradientString) : null;\n const finalStyle = fallbackColor ? [...styleArray, { backgroundColor: fallbackColor }] : styleArray;\n\n return <View style={finalStyle}>{children}</View>;\n};\n\nexport function VrtxEmailInvitations({\n block,\n view,\n emails,\n emailInput,\n setEmailInput,\n handleEmailSubmit,\n handleRemoveEmail,\n submitButtonBlock,\n handleSendInvitation,\n triggerHaptic,\n loadingEmailInvite = false,\n sendSuccess = false,\n lastInvalidEmail = null,\n EditableWrapper,\n onEmailFieldFocus,\n onEmailFieldBlur,\n handleAddByEmail,\n renderIcon,\n isEditMode = false,\n}: VrtxEmailInvitationsProps) {\n const inputRef = React.useRef<any>(null);\n\n // Smart email input handler: detect delimiter characters (space, comma, semicolon)\n // and automatically convert valid emails into pills — best-practice multi-email UX.\n // Also handles paste of multiple emails separated by delimiters.\n const handleChangeText = React.useCallback((text: string) => {\n // Check if pasted text contains multiple emails (e.g. \"a@b.com, c@d.com\")\n const delimiterRegex = /[,;\\s]+/;\n if (delimiterRegex.test(text) && text.trim().includes('@')) {\n const parts = text.split(delimiterRegex).filter(Boolean);\n // If multiple parts, try to pill-ify all complete ones\n if (parts.length > 1) {\n for (const part of parts) {\n handleEmailSubmit(part.trim());\n }\n setEmailInput('');\n return;\n }\n }\n\n // Check if the last character typed is a delimiter\n const lastChar = text.slice(-1);\n const delimiters = [' ', ',', ';'];\n\n if (delimiters.includes(lastChar)) {\n const candidate = text.slice(0, -1).trim();\n if (candidate) {\n handleEmailSubmit(candidate);\n triggerHaptic?.('light');\n return;\n }\n // If nothing before the delimiter, ignore it\n return;\n }\n\n setEmailInput(text);\n }, [setEmailInput, handleEmailSubmit, triggerHaptic]);\n\n // Convert any pending text to a pill on blur\n const handleBlur = React.useCallback(() => {\n if (emailInput.trim()) {\n handleEmailSubmit(emailInput.trim());\n }\n onEmailFieldBlur?.();\n }, [emailInput, handleEmailSubmit, onEmailFieldBlur]);\n // Extract styles from block.style\n const blockStyle = block?.style || {};\n\n // Merge styles\n const mergedStyle = { ...blockStyle };\n\n // Extract gradient string and fallback color\n // On native, 'background' is a CSS property that doesn't work — convert solid colors to 'backgroundColor'\n const rawBackground = mergedStyle.background || null;\n const isGradient = rawBackground?.includes('gradient');\n const gradientString = isGradient ? rawBackground : null;\n const fallbackColor = isGradient\n ? parseGradientFirstColor(rawBackground)\n : rawBackground || mergedStyle.backgroundColor;\n\n // Extract text color\n const textColor = mergedStyle.color || '#333';\n\n // Create text style\n const textStyle = { ...mergedStyle, color: textColor };\n\n // Extract submit button styles and content if provided\n const submitButtonStyle = submitButtonBlock?.style || {};\n const submitButtonGradientString = submitButtonStyle.background || null;\n const submitButtonFallbackColor = submitButtonGradientString\n ? parseGradientFirstColor(submitButtonGradientString)\n : submitButtonStyle.backgroundColor;\n const submitButtonTextColor = submitButtonStyle.color || '#fff';\n\n const submitButtonText =\n submitButtonBlock?.textContent || submitButtonBlock?.attributes?.label || 'Invite';\n\n const handleSendInvitationWithHaptics = async () => {\n if (handleSendInvitation) {\n await triggerHaptic?.('light');\n await handleSendInvitation();\n }\n };\n\n const handleAddByEmailWithHaptics = async () => {\n if (handleAddByEmail) {\n await triggerHaptic?.('light');\n handleAddByEmail();\n }\n };\n\n // On main view, render as a button\n if (view === 'main') {\n return (\n <View\n key={block.id}\n style={{\n position: 'relative',\n }}\n >\n <ButtonWrapper\n style={[\n styles.button,\n styles.fullButton,\n {\n borderWidth: 1,\n borderColor: '#e0e0e0',\n },\n mergedStyle,\n fallbackColor ? { backgroundColor: fallbackColor } : undefined,\n ]}\n gradientString={gradientString}\n onPress={isEditMode ? undefined : handleAddByEmailWithHaptics}\n disabled={isEditMode}\n >\n {renderIcon && (\n <View style={styles.buttonIconContainer}>\n {renderIcon({ name: 'email', size: 18, color: textColor })}\n </View>\n )}\n <Text style={[styles.buttonText, { color: textColor }]}>\n {block.settings?.customizations?.['mobile.addByEmailButton']?.textContent || block.attributes?.label || 'Add by Email'}\n </Text>\n </ButtonWrapper>\n {/* Circle button for edit mode to preview the email form */}\n {isEditMode && (\n <TouchableOpacity\n {...({\n 'data-circle-button': 'true',\n onMouseDown: async (e: React.MouseEvent) => {\n console.log('[VrtxEmailInvitations] Circle button onMouseDown - switching to email view');\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (e as any)._circleButtonClick = true;\n if (e.nativeEvent) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (e.nativeEvent as any)._circleButtonClick = true;\n }\n e.stopPropagation();\n e.preventDefault();\n await triggerHaptic?.('light');\n if (handleAddByEmail) {\n console.log('[VrtxEmailInvitations] Calling handleAddByEmail');\n handleAddByEmail();\n }\n },\n onClick: (e: React.MouseEvent) => {\n console.log('[VrtxEmailInvitations] Circle button onClick - preventing default');\n e.stopPropagation();\n e.preventDefault();\n },\n onClickCapture: (e: React.MouseEvent) => {\n console.log('[VrtxEmailInvitations] Circle button onClickCapture - preventing default');\n e.stopPropagation();\n e.preventDefault();\n },\n } as any)}\n style={{\n position: 'absolute',\n right: 8,\n bottom: '8%',\n transform: [{ translateY: -12 }],\n width: 24,\n height: 24,\n borderRadius: 12,\n backgroundColor: '#606971ff',\n justifyContent: 'center',\n alignItems: 'center',\n shadowColor: '#2196F3',\n shadowOffset: { width: 0, height: 0 },\n shadowOpacity: 0.8,\n shadowRadius: 8,\n elevation: 99999,\n zIndex: 99999,\n ...(isWeb && {\n boxShadow: '0 0 12px 3px rgba(118, 122, 125, 0.6)',\n }),\n }}\n activeOpacity={0.7}\n onPress={async (e: any) => {\n console.log('[VrtxEmailInvitations] Circle button pressed - switching to email view');\n // Mark the event so EditableWrapper ignores it\n if (e) {\n e._circleButtonClick = true;\n if (e.nativeEvent) {\n e.nativeEvent._circleButtonClick = true;\n }\n }\n await triggerHaptic?.('light');\n if (handleAddByEmail) {\n handleAddByEmail();\n }\n }}\n >\n <Text style={{ color: '#fff', fontSize: 14, fontWeight: 'bold' }}></Text>\n </TouchableOpacity>\n )}\n {/* Invisible spacer to ensure outline includes the circle button */}\n {isEditMode && (\n <View\n style={{\n position: 'absolute',\n right: 0,\n top: 0,\n bottom: 0,\n width: 40,\n pointerEvents: 'none',\n }}\n />\n )}\n </View>\n );\n }\n\n // On email view, render the full form\n if (view !== 'email') {\n return null;\n }\n\n return (\n <View key={block.id}>\n {emails.length > 0 && (\n <View style={styles.emailChipsContainer}>\n {emails.map((email, index) => (\n <ChipWrapper\n key={index}\n style={[styles.emailChip, mergedStyle, fallbackColor ? { backgroundColor: fallbackColor } : undefined]}\n gradientString={gradientString}\n >\n <Text style={[styles.emailChipText, textStyle]}>{email}</Text>\n <TouchableOpacity\n onPress={() => handleRemoveEmail(email)}\n hitSlop={{ top: 10, bottom: 10, left: 10, right: 10 }}\n style={{ padding: 4 }}\n >\n <Text style={[styles.emailChipRemove, { color: textColor }]}>×</Text>\n </TouchableOpacity>\n </ChipWrapper>\n ))}\n </View>\n )}\n\n <TextInput\n ref={inputRef}\n style={[styles.input, lastInvalidEmail ? styles.inputInvalid : undefined]}\n placeholder={emails.length > 0 ? (block.settings?.customizations?.['mobile.addAnotherPlaceholder']?.textContent || 'Add another email') : (block.settings?.customizations?.['mobile.placeholder']?.textContent || 'Enter email addresses')}\n placeholderTextColor=\"#999\"\n value={emailInput}\n onChangeText={handleChangeText}\n onSubmitEditing={() => {\n handleEmailSubmit();\n // Keep keyboard open for entering more emails\n inputRef.current?.focus();\n }}\n onFocus={onEmailFieldFocus}\n onBlur={handleBlur}\n keyboardType=\"email-address\"\n autoCapitalize=\"none\"\n autoCorrect={false}\n returnKeyType=\"done\"\n blurOnSubmit={false}\n autoFocus={true}\n />\n\n {/* Hint text below input */}\n {(() => {\n const hintText = block.settings?.customizations?.['mobile.hint']?.textContent || 'Separate emails with spaces or commas';\n return hintText ? (\n <Text style={styles.hintText}>{hintText}</Text>\n ) : null;\n })()}\n\n {/* Submit button is now rendered separately in InviteFormCore */}\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n emailChipsContainer: {\n flexDirection: 'row',\n flexWrap: 'wrap',\n gap: 8,\n marginBottom: 12,\n },\n emailChip: {\n flexDirection: 'row',\n alignItems: 'center',\n backgroundColor: '#f0f0f0',\n borderRadius: 16,\n paddingHorizontal: 12,\n paddingVertical: 6,\n gap: 6,\n },\n emailChipText: {\n fontSize: 14,\n color: '#333',\n },\n emailChipRemove: {\n fontSize: 20,\n color: '#666',\n fontWeight: '300',\n },\n input: {\n borderWidth: 1,\n borderColor: '#ddd',\n borderRadius: 8,\n padding: 12,\n fontSize: 16,\n backgroundColor: '#fff',\n marginBottom: 4,\n },\n inputInvalid: {\n borderColor: '#d9534f',\n borderWidth: 1.5,\n },\n hintText: {\n fontSize: 12,\n color: '#999',\n marginBottom: 12,\n marginLeft: 4,\n },\n submitButtonContainer: {\n marginTop: 16,\n },\n successMessageContainer: {\n padding: 16,\n backgroundColor: '#e8f5e9',\n borderRadius: 8,\n alignItems: 'center',\n },\n invitedText: {\n color: '#2e7d32',\n fontSize: 16,\n fontWeight: '600',\n },\n button: {\n paddingVertical: 12,\n paddingHorizontal: 16,\n borderRadius: 8,\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 8,\n backgroundColor: '#f5f5f5',\n },\n submitButton: {\n backgroundColor: '#007AFF',\n },\n fullButton: {\n width: '100%',\n },\n submitButtonText: {\n color: '#fff',\n fontSize: 16,\n fontWeight: '600',\n },\n buttonContainer: {\n marginBottom: 16,\n },\n buttonIconContainer: {\n width: 18,\n height: 18,\n alignItems: 'center',\n justifyContent: 'center',\n overflow: 'visible',\n },\n buttonText: {\n color: '#333',\n fontSize: 16,\n fontWeight: '500',\n },\n});\n","import React, { useState, useCallback } from 'react';\nimport {\n View,\n Text,\n StyleSheet,\n TouchableOpacity,\n ActivityIndicator,\n Image,\n Platform,\n ViewStyle,\n} from 'react-native';\nimport { EventNames } from '@teamvortexsoftware/analytics-client';\nimport { FindFriendsConfig, FindFriendsContact } from '../types/findFriends';\nimport type { SimpleAnalyticsEvent } from '../utils/analytics';\nimport { useVortexModules } from '../context/VortexModulesContext';\nimport { emitInvitationEvent } from '../utils/invitationEvents';\n\nconst isWeb = Platform.OS === 'web';\n\n// Parse CSS linear-gradient to extract first color for fallback on native\nfunction parseGradientFirstColor(gradientString: string): string | null {\n if (!gradientString || !gradientString.includes('linear-gradient')) {\n return null;\n }\n\n const stopsRegex = /(rgba?\\([^)]+\\)|#[0-9a-fA-F]{3,8}|[a-z]+)\\s+(\\d+)%/i;\n const match = stopsRegex.exec(gradientString);\n\n if (match) {\n return match[1].trim();\n }\n\n return null;\n}\n\n// Button wrapper component that handles gradients on web, native gradient libraries, or solid color fallback\ninterface ButtonWrapperProps {\n children: React.ReactNode;\n style: ViewStyle | ViewStyle[];\n gradientString: string | null;\n onPress?: () => void;\n disabled?: boolean;\n}\n\nfunction ButtonWrapper({\n children,\n style,\n gradientString,\n onPress,\n disabled,\n}: ButtonWrapperProps) {\n const { gradientModule, loaders } = useVortexModules();\n const styleArray = Array.isArray(style) ? style : [style];\n\n // On web, use CSS gradients directly\n if (gradientString && isWeb) {\n return (\n <TouchableOpacity\n style={[...styleArray, { background: gradientString } as any]}\n onPress={onPress}\n disabled={disabled}\n activeOpacity={0.7}\n >\n {children}\n </TouchableOpacity>\n );\n }\n\n // On native, try to use gradient library if specified\n if (gradientString && gradientModule && loaders) {\n const GradientComponent = loaders.loadGradientComponent(gradientModule);\n const parsed = loaders.parseCSSLinearGradient(gradientString);\n\n if (GradientComponent && parsed) {\n const points = loaders.angleToGradientPoints(parsed.angle);\n\n return (\n <TouchableOpacity\n onPress={onPress}\n disabled={disabled}\n activeOpacity={0.7}\n >\n <GradientComponent\n colors={parsed.colors}\n locations={parsed.locations}\n start={points.start}\n end={points.end}\n style={styleArray}\n >\n {children}\n </GradientComponent>\n </TouchableOpacity>\n );\n }\n }\n\n // Fallback: solid color from first gradient stop\n const fallbackColor = gradientString && loaders ? loaders.parseGradientFirstColor(gradientString) : null;\n const finalStyle = fallbackColor ? [...styleArray, { backgroundColor: fallbackColor }] : styleArray;\n\n return (\n <TouchableOpacity\n style={finalStyle}\n onPress={onPress}\n disabled={disabled}\n activeOpacity={0.7}\n >\n {children}\n </TouchableOpacity>\n );\n}\n\n\nexport interface VrtxFindFriendsProps {\n block: any;\n /** Find Friends configuration with contacts and callbacks */\n findFriendsConfig?: FindFriendsConfig;\n /** Function to create an invitation with internal ID target type */\n createUserIdInvitation?: (userId: string, name?: string, avatarUrl?: string, metadata?: Record<string, unknown>) => Promise<void>;\n /** Trigger haptic feedback */\n triggerHaptic?: (style: 'light' | 'medium' | 'heavy') => Promise<void>;\n /** Callback to emit analytics events */\n onAnalyticsEvent?: (event: SimpleAnalyticsEvent) => void;\n /** Theme colors from widget configuration */\n theme?: {\n primaryBackground?: string;\n primaryForeground?: string;\n secondaryBackground?: string;\n secondaryForeground?: string;\n foreground?: string;\n border?: string;\n };\n}\n\nexport function VrtxFindFriends({\n block,\n findFriendsConfig,\n createUserIdInvitation,\n triggerHaptic,\n onAnalyticsEvent,\n theme,\n}: VrtxFindFriendsProps) {\n const [actionInProgress, setActionInProgress] = useState<string | null>(null);\n // Track contacts that have been successfully invited (to hide them from the list)\n const [invitedContactIds, setInvitedContactIds] = useState<Set<string>>(new Set());\n\n // Get title from block title attribute (configured in Styles tab)\n const title = block?.attributes?.title || '';\n\n // Extract customization from block settings (editor) or config props, with defaults\n const blockCustomizations = block?.settings?.customizations;\n const connectButtonText =\n blockCustomizations?.connectButton?.textContent ??\n findFriendsConfig?.connectButtonText ??\n 'Connect';\n const emptyStateMessage =\n blockCustomizations?.emptyStateMessage?.textContent ??\n findFriendsConfig?.emptyStateMessage ??\n 'No contacts found';\n\n // Helper to get theme option value from block.theme.options\n const getBlockThemeValue = (key: string): string | undefined => {\n const options = block?.theme?.options;\n if (!options || !Array.isArray(options)) return undefined;\n const option = options.find((opt: any) => opt.key === key);\n return option?.value || undefined;\n };\n\n // Theme colors with defaults\n const colors = {\n primaryBackground: theme?.primaryBackground ?? '#6291d5',\n primaryForeground: theme?.primaryForeground ?? '#ffffff',\n secondaryBackground: theme?.secondaryBackground ?? '#ffffff',\n secondaryForeground: theme?.secondaryForeground ?? '#353e5c',\n foreground: theme?.foreground ?? '#334153',\n border: theme?.border ?? '#cccccc',\n };\n\n // Button styles from block.theme.options (microTheme)\n const connectButtonStyles = {\n background:\n getBlockThemeValue('--vrtx-find-friends-connect-button-background') ||\n colors.primaryBackground,\n color:\n getBlockThemeValue('--vrtx-find-friends-connect-button-color') ||\n colors.primaryForeground,\n borderRadius: getBlockThemeValue('--vrtx-find-friends-connect-button-border-radius'),\n border: getBlockThemeValue('--vrtx-find-friends-connect-button-border'),\n padding: getBlockThemeValue('--vrtx-find-friends-connect-button-padding'),\n fontSize: getBlockThemeValue('--vrtx-find-friends-connect-button-font-size'),\n fontWeight: getBlockThemeValue('--vrtx-find-friends-connect-button-font-weight'),\n };\n\n // Avatar/initials styles from block.theme.options (microTheme)\n const avatarStyles = {\n background:\n getBlockThemeValue('--vrtx-find-friends-avatar-background') || colors.primaryBackground,\n color: getBlockThemeValue('--vrtx-find-friends-avatar-color') || colors.primaryForeground,\n };\n\n // Contact name styles from block.theme.options (microTheme)\n const contactNameStyles = {\n color: getBlockThemeValue('--vrtx-find-friends-contact-name-color') || colors.foreground,\n fontFamily: getBlockThemeValue('--vrtx-find-friends-contact-name-font-family'),\n fontSize: getBlockThemeValue('--vrtx-find-friends-contact-name-font-size'),\n fontWeight: getBlockThemeValue('--vrtx-find-friends-contact-name-font-weight'),\n };\n\n // Contact subtitle styles from block.theme.options (microTheme)\n const contactSubtitleStyles = {\n color:\n getBlockThemeValue('--vrtx-find-friends-contact-subtitle-color') ||\n colors.secondaryForeground,\n fontFamily: getBlockThemeValue('--vrtx-find-friends-contact-subtitle-font-family'),\n fontSize: getBlockThemeValue('--vrtx-find-friends-contact-subtitle-font-size'),\n };\n\n // Title styles from block.theme.options (microTheme)\n const titleStyles = {\n color: getBlockThemeValue('--vrtx-find-friends-title-color') || colors.foreground,\n fontFamily: getBlockThemeValue('--vrtx-find-friends-title-font-family'),\n fontSize: getBlockThemeValue('--vrtx-find-friends-title-font-size'),\n fontWeight: getBlockThemeValue('--vrtx-find-friends-title-font-weight'),\n };\n\n // Handle Connect button press\n const handleConnect = useCallback(\n async (contact: FindFriendsContact) => {\n if (!findFriendsConfig?.onConnect) return;\n\n setActionInProgress(contact.userId);\n await triggerHaptic?.('light');\n\n // Track find friends invite click (matches iOS SDK)\n onAnalyticsEvent?.({\n name: EventNames.FIND_FRIENDS_INVITE_CLICKED,\n payload: {\n contactId: contact.userId,\n contactName: contact.name,\n },\n });\n\n try {\n // Call customer's callback to determine if we should create the invitation\n const shouldCreateInvitation = await findFriendsConfig.onConnect(contact);\n\n if (shouldCreateInvitation && createUserIdInvitation) {\n // Create invitation via Vortex backend (pass full contact info like iOS SDK)\n await createUserIdInvitation(contact.userId, contact.name, contact.avatarUrl, contact.metadata);\n \n // Mark contact as invited (removes from list)\n setInvitedContactIds((prev) => new Set(prev).add(contact.userId));\n \n // Notify other components (e.g., VrtxOutgoingInvitations) to refresh\n emitInvitationEvent('invitationCreated');\n \n findFriendsConfig.onInvitationCreated?.(contact);\n }\n } catch (err) {\n console.error('[VrtxFindFriends] Connect failed:', err);\n findFriendsConfig.onInvitationError?.(\n contact,\n err instanceof Error ? err : new Error(String(err))\n );\n } finally {\n setActionInProgress(null);\n }\n },\n [findFriendsConfig, createUserIdInvitation, triggerHaptic, onAnalyticsEvent]\n );\n\n // Render avatar or initials\n const renderAvatar = (contact: FindFriendsContact) => {\n if (contact.avatarUrl) {\n return <Image source={{ uri: contact.avatarUrl }} style={styles.avatar} />;\n }\n\n // Generate initials from name\n const initials = contact.name\n .split(' ')\n .map((part) => part[0])\n .join('')\n .toUpperCase()\n .slice(0, 2);\n\n // Handle avatar background with gradient support\n const avatarBackground = avatarStyles.background;\n const isAvatarGradient = avatarBackground?.includes('linear-gradient');\n const avatarBgStyle: any = {};\n\n if (isWeb && avatarBackground) {\n avatarBgStyle.background = avatarBackground;\n } else if (isAvatarGradient && avatarBackground) {\n const fallbackColor = parseGradientFirstColor(avatarBackground);\n avatarBgStyle.backgroundColor = fallbackColor || colors.primaryBackground;\n } else {\n avatarBgStyle.backgroundColor = avatarBackground || colors.primaryBackground;\n }\n\n return (\n <View style={[styles.avatarPlaceholder, avatarBgStyle]}>\n <Text style={[styles.avatarInitials, { color: avatarStyles.color }]}>{initials}</Text>\n </View>\n );\n };\n\n // Helper to parse CSS padding string to React Native padding object\n const parsePadding = (paddingStr: string | undefined) => {\n if (!paddingStr) return {};\n const parts = paddingStr.trim().split(/\\s+/);\n if (parts.length === 1) {\n const val = parseInt(parts[0], 10);\n return isNaN(val) ? {} : { paddingVertical: val, paddingHorizontal: val };\n }\n if (parts.length === 2) {\n const vertical = parseInt(parts[0], 10);\n const horizontal = parseInt(parts[1], 10);\n return {\n ...(isNaN(vertical) ? {} : { paddingVertical: vertical }),\n ...(isNaN(horizontal) ? {} : { paddingHorizontal: horizontal }),\n };\n }\n return {};\n };\n\n // Helper to parse border string (e.g., \"1px solid #ccc\")\n const parseBorder = (borderStr: string | undefined) => {\n if (!borderStr) return {};\n const match = borderStr.match(/^(\\d+)px\\s+(\\w+)\\s+(.+)$/);\n if (match) {\n return {\n borderWidth: parseInt(match[1], 10),\n borderColor: match[3],\n };\n }\n return {};\n };\n\n // Render a single contact item\n const renderContactItem = ({ item }: { item: FindFriendsContact }) => {\n const isLoading = actionInProgress === item.userId;\n\n // Build dynamic button style (without background - handled by ButtonWrapper)\n const dynamicButtonStyle: any = {\n ...(connectButtonStyles.borderRadius\n ? { borderRadius: parseInt(connectButtonStyles.borderRadius, 10) }\n : {}),\n ...parsePadding(connectButtonStyles.padding),\n ...parseBorder(connectButtonStyles.border),\n backgroundColor: colors.primaryBackground, // fallback\n };\n\n // Build dynamic text style\n const dynamicTextStyle: any = {\n color: connectButtonStyles.color,\n ...(connectButtonStyles.fontSize\n ? { fontSize: parseInt(connectButtonStyles.fontSize, 10) }\n : {}),\n ...(connectButtonStyles.fontWeight ? { fontWeight: connectButtonStyles.fontWeight } : {}),\n };\n\n // Build dynamic contact name style\n const dynamicNameStyle: any = {\n color: contactNameStyles.color,\n ...(contactNameStyles.fontFamily ? { fontFamily: contactNameStyles.fontFamily } : {}),\n ...(contactNameStyles.fontSize\n ? { fontSize: parseInt(contactNameStyles.fontSize, 10) }\n : {}),\n ...(contactNameStyles.fontWeight ? { fontWeight: contactNameStyles.fontWeight } : {}),\n };\n\n // Build dynamic contact subtitle style\n const dynamicSubtitleStyle: any = {\n color: contactSubtitleStyles.color,\n ...(contactSubtitleStyles.fontFamily\n ? { fontFamily: contactSubtitleStyles.fontFamily }\n : {}),\n ...(contactSubtitleStyles.fontSize\n ? { fontSize: parseInt(contactSubtitleStyles.fontSize, 10) }\n : {}),\n };\n\n return (\n <View style={styles.contactItem}>\n {renderAvatar(item)}\n <View style={styles.contactInfo}>\n <Text style={[styles.contactName, dynamicNameStyle]} numberOfLines={1}>\n {item.name}\n </Text>\n {item.subtitle && (\n <Text style={[styles.contactSubtitle, dynamicSubtitleStyle]} numberOfLines={1}>\n {item.subtitle}\n </Text>\n )}\n </View>\n <ButtonWrapper\n style={[styles.actionButton, dynamicButtonStyle]}\n gradientString={connectButtonStyles.background?.includes('gradient') ? connectButtonStyles.background : null}\n onPress={() => handleConnect(item)}\n disabled={isLoading}\n >\n {isLoading ? (\n <ActivityIndicator size=\"small\" color={connectButtonStyles.color} />\n ) : (\n <Text style={[styles.actionButtonText, dynamicTextStyle]}>{connectButtonText}</Text>\n )}\n </ButtonWrapper>\n </View>\n );\n };\n\n // Build dynamic title style\n const dynamicTitleStyle: any = {\n color: titleStyles.color,\n ...(titleStyles.fontFamily ? { fontFamily: titleStyles.fontFamily } : {}),\n ...(titleStyles.fontSize ? { fontSize: parseInt(titleStyles.fontSize, 10) } : {}),\n ...(titleStyles.fontWeight ? { fontWeight: titleStyles.fontWeight } : {}),\n };\n\n // Show placeholder if no config provided\n if (!findFriendsConfig) {\n return (\n <View style={styles.container}>\n {title ? (\n <Text style={[styles.title, dynamicTitleStyle]}>{title}</Text>\n ) : null}\n <Text style={[styles.placeholderText, { color: colors.secondaryForeground }]}>\n Find Friends component - provide findFriendsConfig to enable\n </Text>\n </View>\n );\n }\n\n const allContacts = findFriendsConfig.contacts || [];\n \n // Filter out contacts that have already been invited\n const contacts = allContacts.filter((c) => !invitedContactIds.has(c.userId));\n\n // Empty state - no contacts to show (either none provided or all invited)\n if (contacts.length === 0) {\n return (\n <View style={styles.container}>\n {title ? (\n <Text style={[styles.title, dynamicTitleStyle]}>{title}</Text>\n ) : null}\n <Text style={[styles.emptyText, { color: colors.secondaryForeground }]}>\n {emptyStateMessage}\n </Text>\n </View>\n );\n }\n\n // Main view: Contacts list with title\n // Note: Using View + map instead of FlatList to avoid \"VirtualizedLists should never be nested\" warning\n // when this component is rendered inside a ScrollView (which InviteFormCore uses)\n return (\n <View style={styles.listContainer}>\n {title ? (\n <Text style={[styles.title, dynamicTitleStyle]}>{title}</Text>\n ) : null}\n <View style={styles.listContent}>\n {contacts.map((item) => (\n <View key={item.userId}>\n {renderContactItem({ item })}\n </View>\n ))}\n </View>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n container: {\n padding: 16,\n alignItems: 'center',\n justifyContent: 'center',\n minHeight: 120,\n },\n listContainer: {\n flex: 1,\n },\n title: {\n fontSize: 18,\n fontWeight: '600',\n marginBottom: 16,\n },\n placeholderText: {\n fontSize: 14,\n textAlign: 'center',\n },\n emptyText: {\n fontSize: 14,\n textAlign: 'center',\n },\n listContent: {\n paddingBottom: 16,\n },\n contactItem: {\n flexDirection: 'row',\n alignItems: 'center',\n paddingVertical: 12,\n },\n avatar: {\n width: 44,\n height: 44,\n borderRadius: 22,\n },\n avatarPlaceholder: {\n width: 44,\n height: 44,\n borderRadius: 22,\n alignItems: 'center',\n justifyContent: 'center',\n },\n avatarInitials: {\n fontSize: 16,\n fontWeight: '600',\n },\n contactInfo: {\n flex: 1,\n marginLeft: 12,\n marginRight: 12,\n },\n contactName: {\n fontSize: 16,\n fontWeight: '500',\n },\n contactSubtitle: {\n fontSize: 13,\n marginTop: 2,\n },\n actionButton: {\n paddingHorizontal: 16,\n paddingVertical: 8,\n borderRadius: 8,\n minWidth: 80,\n alignItems: 'center',\n justifyContent: 'center',\n },\n actionButtonText: {\n fontSize: 14,\n fontWeight: '600',\n },\n});\n","import type { EventName } from './eventNames';\n\nexport interface AnalyticsEvent {\n name: EventName;\n widgetConfigurationId: string;\n deploymentId: string;\n environmentId?: string; // Optional - backend can derive from JWT\n platform: string;\n segmentation?: Record<string, any>;\n payload?: Record<string, any>;\n groups?: Array<{\n type: string;\n id?: string;\n groupId?: string;\n name: string;\n }>;\n}\n\nexport interface IAnalyticsClient {\n track(event: AnalyticsEvent): Promise<void>;\n}\n\nexport class AnalyticsClient implements IAnalyticsClient {\n constructor(\n private endpoint: string,\n private jwt: string,\n private sessionId: string,\n private clientName?: string,\n private clientVersion?: string\n ) {}\n\n async track(event: AnalyticsEvent): Promise<void> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.jwt}`,\n 'x-session-id': this.sessionId,\n };\n\n // Add client library identification headers\n if (this.clientName) {\n headers['x-vortex-client-name'] = this.clientName;\n }\n if (this.clientVersion) {\n headers['x-vortex-client-version'] = this.clientVersion;\n }\n\n await fetch(`${this.endpoint}/api/v1/events`, {\n method: 'POST',\n headers,\n body: JSON.stringify(event),\n });\n }\n}\n\nexport class AnalyticsClientNoop implements IAnalyticsClient {\n constructor(\n private endpoint: string,\n private jwt: string,\n private sessionId: string,\n private clientName?: string,\n private clientVersion?: string\n ) {\n console.log('AnalyticsClientNoop initialized', { endpoint, hasJwt: !!jwt, sessionId, clientName, clientVersion });\n }\n\n async track(event: AnalyticsEvent): Promise<void> {\n console.log('AnalyticsClientNoop:AnalyticsEvent:', event);\n }\n}\n","/**\n * Centralized analytics event names for Vortex.\n * All event tracking should use these constants to ensure consistency.\n */\nexport const EventNames = {\n // Invite form events\n INVITE_FORM_RENDER_SUCCEEDED: 'invite_formRender_succeeded',\n INVITE_FORM_RENDER_FAILED: 'invite_formRender_failed',\n\n // Email field events\n EMAIL_FIELD_FOCUSSED: 'email_field_focussed',\n EMAIL_FIELD_BLURRED: 'email_field_blurred',\n EMAIL_SUBMISSION_VALIDATED: 'email_submission_validated',\n EMAIL_FIELD_SUBMISSION_SUCCEEDED: 'email_fieldSubmission_succeeded',\n EMAIL_FIELD_SUBMISSION_FAILED: 'email_fieldSubmission_failed',\n\n // Sharing events\n SHARING_DESTINATION_BUTTON_CLICKED: 'sharingDestination_button_clicked',\n\n // Invitation lifecycle events (backend)\n INVITATION_EMAIL_SEND_SUCCEEDED: 'invitation_emailSend_succeeded',\n INVITATION_EMAIL_SEND_FAILED: 'invitation_emailSend_failed',\n INVITATION_LINK_CLICKED: 'invitation_link_clicked',\n INVITATION_ACCEPTED: 'invitation_accepted',\n INVITATION_LINK_UNFURLED: 'invitation_link_unfurled',\n\n // Reminder/Nudge events (backend)\n REMINDER_EMAIL_SEND_SUCCEEDED: 'reminder_emailSend_succeeded',\n NUDGE_EMAIL_SEND_SUCCEEDED: 'nudge_emailSend_succeeded',\n\n // Email tracking events (backend)\n EMAIL_OPENED: 'email_opened',\n EMAIL_DELIVERED: 'email_delivered',\n ACCEPTANCE_EMAIL_SEND_SUCCEEDED: 'acceptance_emailSend_succeeded',\n ACCEPTANCE_EMAIL_SEND_FAILED: 'acceptance_emailSend_failed',\n EMAIL_BOUNCED: 'email_bounced',\n EMAIL_REPORTED: 'email_reported',\n\n // Events requested by Mixerbox [DEV-1147]\n INBOUND_INVITATION_ACCEPT_CLICKED: 'inboundInvitationAccept_button_clicked',\n INBOUND_INVITATION_DELETE_CLICKED: 'inboundInvitationDelete_button_clicked',\n OUTBOUND_INVITATION_DELETE_CLICKED: 'outboundInvitationDelete_button_clicked',\n PYMK_INVITE_CLICKED: 'pymkInvite_button_clicked',\n PYMK_DELETE_CLICKED: 'pymkDelete_button_clicked',\n FIND_FRIENDS_INVITE_CLICKED: 'findFriendsInvite_button_clicked',\n\n // PYMK invitation lifecycle events\n PYMK_INVITATION_INITIATED: 'pymk_invitation_initiated',\n PYMK_INVITATION_SUCCEEDED: 'pymk_invitation_succeeded',\n PYMK_INVITATION_FAILED: 'pymk_invitation_failed',\n\n // Autojoin events\n AUTOJOIN_ENABLED: 'autojoin_enabled',\n AUTOJOIN_CONFIGURED: 'autojoin_configured',\n AUTOJOIN_DISABLED: 'autojoin_disabled',\n\n // Deferred deep linking events\n INVITATION_FINGERPRINT_MATCHED: 'invitation_fingerprint_matched',\n\n // Widget lifecycle events (client-side)\n WIDGET_CONFIGURATION_LOADED: 'widget_configuration_loaded',\n\n // API events\n GET_INVITATION: 'get_invitation',\n API_CALL: 'api_call',\n} as const;\n\nexport type EventName = (typeof EventNames)[keyof typeof EventNames];\n","/**\n * Simple event emitter for invitation-related events.\n * Used to notify components (like VrtxOutgoingInvitations) when invitations are created\n * so they can refresh their data.\n */\n\ntype InvitationEventType = 'invitationCreated' | 'invitationRevoked' | 'invitationAccepted' | 'invitationDeleted';\n\ntype InvitationEventListener = () => void;\n\nconst listeners: Map<InvitationEventType, Set<InvitationEventListener>> = new Map();\n\n/**\n * Subscribe to an invitation event.\n * @param event The event type to listen for\n * @param listener The callback to invoke when the event is emitted\n * @returns A function to unsubscribe\n */\nexport function subscribeToInvitationEvent(\n event: InvitationEventType,\n listener: InvitationEventListener\n): () => void {\n if (!listeners.has(event)) {\n listeners.set(event, new Set());\n }\n listeners.get(event)!.add(listener);\n\n // Return unsubscribe function\n return () => {\n listeners.get(event)?.delete(listener);\n };\n}\n\n/**\n * Emit an invitation event to notify all subscribers.\n * @param event The event type to emit\n */\nexport function emitInvitationEvent(event: InvitationEventType): void {\n const eventListeners = listeners.get(event);\n if (eventListeners) {\n eventListeners.forEach((listener) => {\n try {\n listener();\n } catch (err) {\n console.warn(`[InvitationEvents] Error in listener for ${event}:`, err);\n }\n });\n }\n}\n","import React, { useState, useCallback, useRef, useEffect } from 'react';\nimport {\n View,\n Text,\n StyleSheet,\n TouchableOpacity,\n ActivityIndicator,\n Image,\n Platform,\n Alert,\n Animated,\n ViewStyle,\n} from 'react-native';\nimport { IncomingInvitationsConfig, IncomingInvitationItem } from '../types/invitations';\nimport type { IncomingInvitation } from '../VortexClient';\nimport { EventNames } from '@teamvortexsoftware/analytics-client';\nimport type { SimpleAnalyticsEvent } from '../utils/analytics';\nimport { VortexClient } from '../VortexClient';\nimport { useVortexModules } from '../context/VortexModulesContext';\n\nconst isWeb = Platform.OS === 'web';\n\n// Parse CSS linear-gradient to extract first color for fallback on native\nfunction parseGradientFirstColor(gradientString: string): string | null {\n if (!gradientString || !gradientString.includes('linear-gradient')) {\n return null;\n }\n\n const stopsRegex = /(rgba?\\([^)]+\\)|#[0-9a-fA-F]{3,8}|[a-z]+)\\s+(\\d+)%/i;\n const match = stopsRegex.exec(gradientString);\n\n if (match) {\n return match[1].trim();\n }\n\n return null;\n}\n\n// Button wrapper component that handles gradients on web, native gradient libraries, or solid color fallback\ninterface ButtonWrapperProps {\n children: React.ReactNode;\n style: ViewStyle | ViewStyle[];\n gradientString: string | null;\n onPress?: () => void;\n disabled?: boolean;\n}\n\nfunction ButtonWrapper({\n children,\n style,\n gradientString,\n onPress,\n disabled,\n}: ButtonWrapperProps) {\n const { gradientModule, loaders } = useVortexModules();\n const styleArray = Array.isArray(style) ? style : [style];\n\n // On web, use CSS gradients directly\n if (gradientString && isWeb) {\n return (\n <TouchableOpacity\n style={[...styleArray, { background: gradientString } as any]}\n onPress={onPress}\n disabled={disabled}\n activeOpacity={0.7}\n >\n {children}\n </TouchableOpacity>\n );\n }\n\n // On native, try to use gradient library if specified\n if (gradientString && gradientModule && loaders) {\n const GradientComponent = loaders.loadGradientComponent(gradientModule);\n const parsed = loaders.parseCSSLinearGradient(gradientString);\n\n if (GradientComponent && parsed) {\n const points = loaders.angleToGradientPoints(parsed.angle);\n\n return (\n <TouchableOpacity\n onPress={onPress}\n disabled={disabled}\n activeOpacity={0.7}\n >\n <GradientComponent\n colors={parsed.colors}\n locations={parsed.locations}\n start={points.start}\n end={points.end}\n style={styleArray}\n >\n {children}\n </GradientComponent>\n </TouchableOpacity>\n );\n }\n }\n\n // Fallback: solid color from first gradient stop\n const fallbackColor = gradientString && loaders ? loaders.parseGradientFirstColor(gradientString) : null;\n const finalStyle = fallbackColor ? [...styleArray, { backgroundColor: fallbackColor }] : styleArray;\n\n return (\n <TouchableOpacity\n style={finalStyle}\n onPress={onPress}\n disabled={disabled}\n activeOpacity={0.7}\n >\n {children}\n </TouchableOpacity>\n );\n}\n\nexport interface VrtxIncomingInvitationsProps {\n block: any;\n /** Incoming Invitations configuration with callbacks */\n incomingInvitationsConfig?: IncomingInvitationsConfig;\n /** API URL for making invitation API calls (required for automatic API integration) */\n apiUrl?: string;\n /** JWT token for authentication (required for automatic API integration) */\n jwt?: string;\n /** Trigger haptic feedback */\n triggerHaptic?: (style: 'light' | 'medium' | 'heavy') => Promise<void>;\n /** Theme colors from widget configuration */\n theme?: {\n primaryBackground?: string;\n primaryForeground?: string;\n secondaryBackground?: string;\n secondaryForeground?: string;\n foreground?: string;\n border?: string;\n };\n /** Callback to emit analytics events */\n onAnalyticsEvent?: (event: SimpleAnalyticsEvent) => void;\n}\n\n// Animated item wrapper for fade-out effect\nfunction AnimatedInvitationItem({\n item,\n renderContent,\n onRemove,\n}: {\n item: IncomingInvitationItem;\n renderContent: (item: IncomingInvitationItem) => React.ReactNode;\n onRemove: (id: string) => void;\n}) {\n const fadeAnim = useRef(new Animated.Value(1)).current;\n const heightAnim = useRef(new Animated.Value(1)).current;\n\n const animateOut = useCallback(() => {\n Animated.parallel([\n Animated.timing(fadeAnim, {\n toValue: 0,\n duration: 200,\n useNativeDriver: true,\n }),\n Animated.timing(heightAnim, {\n toValue: 0,\n duration: 200,\n useNativeDriver: true,\n }),\n ]).start(() => {\n onRemove(item.id);\n });\n }, [fadeAnim, heightAnim, item.id, onRemove]);\n\n return (\n <Animated.View\n style={{\n opacity: fadeAnim,\n transform: [{ scaleY: heightAnim }],\n }}\n >\n {renderContent({ ...item, metadata: { ...item.metadata, animateOut } })}\n </Animated.View>\n );\n}\n\nexport function VrtxIncomingInvitations({\n block,\n incomingInvitationsConfig,\n apiUrl,\n jwt,\n triggerHaptic,\n theme,\n onAnalyticsEvent,\n}: VrtxIncomingInvitationsProps) {\n // Local state for managing the displayed invitations (for animate-out)\n const [displayedInvitations, setDisplayedInvitations] = useState<IncomingInvitationItem[]>(\n incomingInvitationsConfig?.invitations || []\n );\n const [actionInProgress, setActionInProgress] = useState<string | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n\n // Fetch invitations from API in the background.\n // Note: This component may remount multiple times due to parent re-renders\n // (EditableWrapper is defined inside InviteFormCore's render body).\n // To avoid flashing a loading spinner on each remount, we show config\n // invitations immediately and only show loading if there are none.\n useEffect(() => {\n if (!apiUrl || !jwt) return;\n\n let cancelled = false;\n const hasConfigInvitations = (incomingInvitationsConfig?.invitations?.length ?? 0) > 0;\n\n // Only show loading spinner if we have NO config invitations to display\n if (!hasConfigInvitations) {\n setIsLoading(true);\n }\n\n const loadInvitations = async () => {\n try {\n const client = new VortexClient({ jwt, baseURL: apiUrl });\n const apiInvitations = await client.getIncomingInvitations();\n\n // Filter out already accepted invitations (client-side filter)\n const pendingInvitations = apiInvitations.filter((inv: IncomingInvitation) => {\n const status = inv.status?.toLowerCase() ?? '';\n return status !== 'accepted' && status !== 'accepted_elsewhere';\n });\n\n // Map API invitations to InvitationItem format\n const mappedInvitations: IncomingInvitationItem[] = pendingInvitations.map((inv: IncomingInvitation) => ({\n id: inv.id,\n name: inv.creatorName || inv.senderIdentifier || 'Unknown',\n userId: inv.foreignCreatorId || undefined,\n avatarUrl: inv.creatorAvatarUrl || inv.avatarUrl,\n isVortexInvitation: true,\n metadata: inv.metadata || undefined,\n }));\n\n if (!cancelled) {\n // Merge config invitations with API invitations, deduplicating by userId.\n const configInvitations = incomingInvitationsConfig?.invitations || [];\n const apiUserIds = new Set(\n mappedInvitations\n .filter((inv) => inv.userId)\n .map((inv) => inv.userId)\n );\n const dedupedConfig = configInvitations.filter(\n (inv) => !inv.userId || !apiUserIds.has(inv.userId)\n );\n setDisplayedInvitations([...dedupedConfig, ...mappedInvitations]);\n }\n } catch (error) {\n // Silently fail - just show config invitations\n if (__DEV__) {\n console.warn('[VrtxIncomingInvitations] Failed to fetch incoming invitations:', error);\n }\n } finally {\n if (!cancelled) {\n setIsLoading(false);\n }\n }\n };\n\n loadInvitations();\n return () => { cancelled = true; };\n }, [apiUrl, jwt, incomingInvitationsConfig?.invitations]);\n\n // Extract customization from block settings or config props, with defaults\n const blockCustomizations = block?.settings?.customizations;\n const acceptButtonText =\n blockCustomizations?.acceptButton?.textContent ??\n incomingInvitationsConfig?.acceptButtonText ??\n 'Accept';\n const deleteButtonText =\n blockCustomizations?.deleteButton?.textContent ??\n incomingInvitationsConfig?.deleteButtonText ??\n 'Delete';\n const emptyStateMessage =\n blockCustomizations?.emptyStateMessage?.textContent ??\n incomingInvitationsConfig?.emptyStateMessage ??\n 'No incoming invitations';\n\n // Confirmation dialog texts\n const acceptConfirmTitle = incomingInvitationsConfig?.acceptConfirmTitle ?? 'Accept Invitation';\n const acceptConfirmMessage =\n incomingInvitationsConfig?.acceptConfirmMessage ?? 'Accept invitation from {name}?';\n const deleteConfirmTitle = incomingInvitationsConfig?.deleteConfirmTitle ?? 'Delete Invitation';\n const deleteConfirmMessage =\n incomingInvitationsConfig?.deleteConfirmMessage ?? 'Delete invitation from {name}?';\n const confirmButtonText = incomingInvitationsConfig?.confirmButtonText ?? 'Confirm';\n const cancelButtonText = incomingInvitationsConfig?.cancelButtonText ?? 'Cancel';\n\n // Helper to get theme option value from block.theme.options\n const getBlockThemeValue = (key: string): string | undefined => {\n const options = block?.theme?.options;\n if (!options || !Array.isArray(options)) return undefined;\n const option = options.find((opt: any) => opt.key === key);\n return option?.value || undefined;\n };\n\n // Theme colors with defaults\n const colors = {\n primaryBackground: theme?.primaryBackground ?? '#6291d5',\n primaryForeground: theme?.primaryForeground ?? '#ffffff',\n secondaryBackground: theme?.secondaryBackground ?? '#ffffff',\n secondaryForeground: theme?.secondaryForeground ?? '#353e5c',\n foreground: theme?.foreground ?? '#334153',\n border: theme?.border ?? '#cccccc',\n };\n\n // Button styles from block.theme.options (microTheme)\n const acceptButtonStyles = {\n background:\n getBlockThemeValue('--vrtx-incoming-invitations-accept-button-background') ||\n colors.primaryBackground,\n color:\n getBlockThemeValue('--vrtx-incoming-invitations-accept-button-color') ||\n colors.primaryForeground,\n borderRadius: getBlockThemeValue('--vrtx-incoming-invitations-accept-button-border-radius'),\n border: getBlockThemeValue('--vrtx-incoming-invitations-accept-button-border'),\n padding: getBlockThemeValue('--vrtx-incoming-invitations-accept-button-padding'),\n fontSize: getBlockThemeValue('--vrtx-incoming-invitations-accept-button-font-size'),\n fontWeight: getBlockThemeValue('--vrtx-incoming-invitations-accept-button-font-weight'),\n };\n\n const deleteButtonStyles = {\n background:\n getBlockThemeValue('--vrtx-incoming-invitations-delete-button-background') ||\n colors.secondaryBackground,\n color:\n getBlockThemeValue('--vrtx-incoming-invitations-delete-button-color') ||\n colors.secondaryForeground,\n borderRadius: getBlockThemeValue('--vrtx-incoming-invitations-delete-button-border-radius'),\n border: getBlockThemeValue('--vrtx-incoming-invitations-delete-button-border'),\n padding: getBlockThemeValue('--vrtx-incoming-invitations-delete-button-padding'),\n fontSize: getBlockThemeValue('--vrtx-incoming-invitations-delete-button-font-size'),\n fontWeight: getBlockThemeValue('--vrtx-incoming-invitations-delete-button-font-weight'),\n };\n\n // Avatar/initials styles from block.theme.options (microTheme)\n const avatarStyles = {\n background:\n getBlockThemeValue('--vrtx-incoming-invitations-avatar-background') ||\n colors.primaryBackground,\n color:\n getBlockThemeValue('--vrtx-incoming-invitations-avatar-color') || colors.primaryForeground,\n };\n\n // Contact name styles from block.theme.options (microTheme)\n const nameStyles = {\n color: getBlockThemeValue('--vrtx-incoming-invitations-name-color') || colors.foreground,\n fontFamily: getBlockThemeValue('--vrtx-incoming-invitations-name-font-family'),\n fontSize: getBlockThemeValue('--vrtx-incoming-invitations-name-font-size'),\n fontWeight: getBlockThemeValue('--vrtx-incoming-invitations-name-font-weight'),\n };\n\n // Subtitle styles from block.theme.options (microTheme)\n const subtitleStyles = {\n color:\n getBlockThemeValue('--vrtx-incoming-invitations-subtitle-color') ||\n colors.secondaryForeground,\n fontFamily: getBlockThemeValue('--vrtx-incoming-invitations-subtitle-font-family'),\n fontSize: getBlockThemeValue('--vrtx-incoming-invitations-subtitle-font-size'),\n };\n\n // Title styles from block.theme.options (microTheme)\n const titleStyles = {\n color: getBlockThemeValue('--vrtx-incoming-invitations-title-color') || colors.foreground,\n fontFamily: getBlockThemeValue('--vrtx-incoming-invitations-title-font-family'),\n fontSize: getBlockThemeValue('--vrtx-incoming-invitations-title-font-size'),\n fontWeight: getBlockThemeValue('--vrtx-incoming-invitations-title-font-weight'),\n };\n\n // Remove invitation from displayed list (after animation)\n const handleRemoveFromDisplay = useCallback((id: string) => {\n setDisplayedInvitations((prev) => prev.filter((inv) => inv.id !== id));\n }, []);\n\n // Show confirmation dialog\n const showConfirmation = useCallback(\n (\n title: string,\n message: string,\n onConfirm: () => void\n ) => {\n if (isWeb) {\n // Web: use window.confirm\n const confirmed = window.confirm(message);\n if (confirmed) {\n onConfirm();\n }\n } else {\n // Native: use Alert\n Alert.alert(title, message, [\n {\n text: cancelButtonText,\n style: 'cancel',\n },\n {\n text: confirmButtonText,\n onPress: onConfirm,\n },\n ]);\n }\n },\n [confirmButtonText, cancelButtonText]\n );\n\n // Handle Accept button press\n const handleAccept = useCallback(\n async (invitation: IncomingInvitationItem, animateOut?: () => void) => {\n const message = acceptConfirmMessage.replace('{name}', invitation.name);\n\n showConfirmation(acceptConfirmTitle, message, async () => {\n setActionInProgress(invitation.id);\n await triggerHaptic?.('light');\n\n // Emit analytics event for accept button click\n onAnalyticsEvent?.({\n name: EventNames.INBOUND_INVITATION_ACCEPT_CLICKED,\n payload: { invitationId: invitation.id, inviterName: invitation.name },\n });\n\n try {\n // Call the callback if provided and check return value\n let shouldProceed = true;\n if (incomingInvitationsConfig?.onAccept) {\n const result = await incomingInvitationsConfig.onAccept(invitation);\n // If callback returns false explicitly, don't proceed\n if (result === false) {\n shouldProceed = false;\n }\n }\n\n if (!shouldProceed) {\n setActionInProgress(null);\n return;\n }\n\n // Only call Vortex API for Vortex invitations\n if (invitation.isVortexInvitation && apiUrl && jwt) {\n const client = new VortexClient({ jwt, baseURL: apiUrl });\n const result = await client.acceptIncomingInvitation(invitation.id);\n if (!result.success) {\n console.error('[VrtxIncomingInvitations] API accept failed:', result.message);\n throw new Error(result.message || 'Failed to accept invitation');\n }\n }\n\n // Animate out after successful action\n if (animateOut) {\n animateOut();\n } else {\n handleRemoveFromDisplay(invitation.id);\n }\n } catch (err) {\n console.error('[VrtxIncomingInvitations] Accept failed:', err);\n } finally {\n setActionInProgress(null);\n }\n });\n },\n [\n incomingInvitationsConfig,\n apiUrl,\n jwt,\n triggerHaptic,\n acceptConfirmTitle,\n acceptConfirmMessage,\n showConfirmation,\n handleRemoveFromDisplay,\n onAnalyticsEvent,\n ]\n );\n\n // Handle Delete button press\n const handleDelete = useCallback(\n async (invitation: IncomingInvitationItem, animateOut?: () => void) => {\n const message = deleteConfirmMessage.replace('{name}', invitation.name);\n\n showConfirmation(deleteConfirmTitle, message, async () => {\n setActionInProgress(invitation.id);\n await triggerHaptic?.('light');\n\n // Emit analytics event for delete button click\n onAnalyticsEvent?.({\n name: EventNames.INBOUND_INVITATION_DELETE_CLICKED,\n payload: { invitationId: invitation.id, inviterName: invitation.name },\n });\n\n try {\n // Call the callback if provided and check return value\n let shouldProceed = true;\n if (incomingInvitationsConfig?.onDelete) {\n const result = await incomingInvitationsConfig.onDelete(invitation);\n // If callback returns false explicitly, don't proceed\n if (result === false) {\n shouldProceed = false;\n }\n }\n\n if (!shouldProceed) {\n setActionInProgress(null);\n return;\n }\n\n // Only call Vortex API for Vortex invitations\n if (invitation.isVortexInvitation && apiUrl && jwt) {\n const client = new VortexClient({ jwt, baseURL: apiUrl });\n const result = await client.deleteIncomingInvitation(invitation.id);\n if (!result.success) {\n console.error('[VrtxIncomingInvitations] API delete failed:', result.message);\n throw new Error(result.message || 'Failed to delete invitation');\n }\n }\n\n // Animate out after successful action\n if (animateOut) {\n animateOut();\n } else {\n handleRemoveFromDisplay(invitation.id);\n }\n } catch (err) {\n console.error('[VrtxIncomingInvitations] Delete failed:', err);\n } finally {\n setActionInProgress(null);\n }\n });\n },\n [\n incomingInvitationsConfig,\n apiUrl,\n jwt,\n triggerHaptic,\n deleteConfirmTitle,\n deleteConfirmMessage,\n showConfirmation,\n handleRemoveFromDisplay,\n onAnalyticsEvent,\n ]\n );\n\n // Helper to parse CSS padding string to React Native padding object\n const parsePadding = (paddingStr: string | undefined) => {\n if (!paddingStr) return {};\n const parts = paddingStr.trim().split(/\\s+/);\n if (parts.length === 1) {\n const val = parseInt(parts[0], 10);\n return isNaN(val) ? {} : { paddingVertical: val, paddingHorizontal: val };\n }\n if (parts.length === 2) {\n const vertical = parseInt(parts[0], 10);\n const horizontal = parseInt(parts[1], 10);\n return {\n ...(isNaN(vertical) ? {} : { paddingVertical: vertical }),\n ...(isNaN(horizontal) ? {} : { paddingHorizontal: horizontal }),\n };\n }\n return {};\n };\n\n // Helper to parse border string (e.g., \"1px solid #ccc\")\n const parseBorder = (borderStr: string | undefined) => {\n if (!borderStr) return {};\n const match = borderStr.match(/^(\\d+)px\\s+(\\w+)\\s+(.+)$/);\n if (match) {\n return {\n borderWidth: parseInt(match[1], 10),\n borderColor: match[3],\n };\n }\n return {};\n };\n\n // Render avatar or initials\n const renderAvatar = (invitation: IncomingInvitationItem) => {\n if (invitation.avatarUrl) {\n return <Image source={{ uri: invitation.avatarUrl }} style={styles.avatar} />;\n }\n\n // Generate initials from name\n const initials = invitation.name\n .split(' ')\n .map((part: string) => part[0])\n .join('')\n .toUpperCase()\n .slice(0, 2);\n\n // Handle avatar background with gradient support\n const avatarBackground = avatarStyles.background;\n const isAvatarGradient = avatarBackground?.includes('linear-gradient');\n const avatarBgStyle: any = {};\n\n if (isWeb && avatarBackground) {\n avatarBgStyle.background = avatarBackground;\n } else if (isAvatarGradient && avatarBackground) {\n const fallbackColor = parseGradientFirstColor(avatarBackground);\n avatarBgStyle.backgroundColor = fallbackColor || colors.primaryBackground;\n } else {\n avatarBgStyle.backgroundColor = avatarBackground || colors.primaryBackground;\n }\n\n return (\n <View style={[styles.avatarPlaceholder, avatarBgStyle]}>\n <Text style={[styles.avatarInitials, { color: avatarStyles.color }]}>{initials}</Text>\n </View>\n );\n };\n\n // Build button style with gradient support\n const buildButtonStyle = (buttonStyles: any, fallbackBg: string) => {\n const backgroundValue = buttonStyles.background;\n const isGradient = backgroundValue?.includes('linear-gradient');\n\n const dynamicButtonStyle: any = {\n ...(buttonStyles.borderRadius\n ? { borderRadius: parseInt(buttonStyles.borderRadius, 10) }\n : {}),\n ...parsePadding(buttonStyles.padding),\n ...parseBorder(buttonStyles.border),\n };\n\n if (isWeb && backgroundValue) {\n dynamicButtonStyle.background = backgroundValue;\n } else if (isGradient && backgroundValue) {\n const fallbackColor = parseGradientFirstColor(backgroundValue);\n dynamicButtonStyle.backgroundColor = fallbackColor || fallbackBg;\n } else {\n dynamicButtonStyle.backgroundColor = backgroundValue || fallbackBg;\n }\n\n return dynamicButtonStyle;\n };\n\n // Render a single invitation item\n const renderInvitationContent = (item: IncomingInvitationItem) => {\n const isLoading = actionInProgress === item.id;\n const animateOut = item.metadata?.animateOut as (() => void) | undefined;\n\n // Build dynamic button styles\n const deleteButtonDynamicStyle = buildButtonStyle(deleteButtonStyles, colors.secondaryBackground);\n const acceptButtonDynamicStyle = buildButtonStyle(acceptButtonStyles, colors.primaryBackground);\n\n // Build dynamic text styles\n const deleteTextStyle: any = {\n color: deleteButtonStyles.color,\n ...(deleteButtonStyles.fontSize ? { fontSize: parseInt(deleteButtonStyles.fontSize, 10) } : {}),\n ...(deleteButtonStyles.fontWeight ? { fontWeight: deleteButtonStyles.fontWeight } : {}),\n };\n\n const acceptTextStyle: any = {\n color: acceptButtonStyles.color,\n ...(acceptButtonStyles.fontSize ? { fontSize: parseInt(acceptButtonStyles.fontSize, 10) } : {}),\n ...(acceptButtonStyles.fontWeight ? { fontWeight: acceptButtonStyles.fontWeight } : {}),\n };\n\n // Build dynamic name style\n const dynamicNameStyle: any = {\n color: nameStyles.color,\n ...(nameStyles.fontFamily ? { fontFamily: nameStyles.fontFamily } : {}),\n ...(nameStyles.fontSize ? { fontSize: parseInt(nameStyles.fontSize, 10) } : {}),\n ...(nameStyles.fontWeight ? { fontWeight: nameStyles.fontWeight } : {}),\n };\n\n // Build dynamic subtitle style\n const dynamicSubtitleStyle: any = {\n color: subtitleStyles.color,\n ...(subtitleStyles.fontFamily ? { fontFamily: subtitleStyles.fontFamily } : {}),\n ...(subtitleStyles.fontSize ? { fontSize: parseInt(subtitleStyles.fontSize, 10) } : {}),\n };\n\n return (\n <View style={styles.invitationItem}>\n {renderAvatar(item)}\n <View style={styles.invitationInfo}>\n <Text style={[styles.invitationName, dynamicNameStyle]} numberOfLines={1}>\n {item.name}\n </Text>\n {(() => {\n const displaySubtitle = incomingInvitationsConfig?.getSubtitle?.(item);\n return displaySubtitle ? (\n <Text style={[styles.invitationSubtitle, dynamicSubtitleStyle]} numberOfLines={1}>\n {displaySubtitle}\n </Text>\n ) : null;\n })()}\n </View>\n <View style={styles.buttonContainer}>\n {/* Delete button (left) */}\n <ButtonWrapper\n style={[styles.actionButton, deleteButtonDynamicStyle, styles.deleteButton]}\n gradientString={deleteButtonStyles.background?.includes('gradient') ? deleteButtonStyles.background : null}\n onPress={() => handleDelete(item, animateOut)}\n disabled={isLoading}\n >\n {isLoading ? (\n <ActivityIndicator size=\"small\" color={deleteButtonStyles.color} />\n ) : (\n <Text style={[styles.actionButtonText, deleteTextStyle]}>{deleteButtonText}</Text>\n )}\n </ButtonWrapper>\n {/* Accept button (right) */}\n <ButtonWrapper\n style={[styles.actionButton, acceptButtonDynamicStyle]}\n gradientString={acceptButtonStyles.background?.includes('gradient') ? acceptButtonStyles.background : null}\n onPress={() => handleAccept(item, animateOut)}\n disabled={isLoading}\n >\n {isLoading ? (\n <ActivityIndicator size=\"small\" color={acceptButtonStyles.color} />\n ) : (\n <Text style={[styles.actionButtonText, acceptTextStyle]}>{acceptButtonText}</Text>\n )}\n </ButtonWrapper>\n </View>\n </View>\n );\n };\n\n // Render item with animation wrapper\n const renderItem = ({ item }: { item: IncomingInvitationItem }) => {\n return (\n <AnimatedInvitationItem\n item={item}\n renderContent={renderInvitationContent}\n onRemove={handleRemoveFromDisplay}\n />\n );\n };\n\n // Show placeholder if no config provided and no API credentials\n if (!incomingInvitationsConfig && !(apiUrl && jwt)) {\n const label = block?.attributes?.label || '';\n return (\n <View style={styles.container}>\n {label ? <Text style={[styles.label, { color: colors.foreground }]}>{label}</Text> : null}\n <Text style={[styles.placeholderText, { color: colors.secondaryForeground }]}>\n Incoming Invitations component - provide incomingInvitationsConfig or apiUrl+jwt to enable\n </Text>\n </View>\n );\n }\n\n // Loading state — only shown when there are no config invitations to display\n if (isLoading) {\n return (\n <View style={styles.container}>\n <ActivityIndicator size=\"large\" color={colors.primaryBackground} />\n </View>\n );\n }\n\n // Empty state - render nothing (0 height) when no invitations, like iOS\n if (displayedInvitations.length === 0) {\n return null;\n }\n\n // Get title from block attributes (configured in editor as \"Title\")\n const title = block?.attributes?.title;\n\n // Build dynamic title style\n const dynamicTitleStyle: any = {\n color: titleStyles.color,\n ...(titleStyles.fontFamily ? { fontFamily: titleStyles.fontFamily } : {}),\n ...(titleStyles.fontSize ? { fontSize: parseInt(titleStyles.fontSize, 10) } : {}),\n ...(titleStyles.fontWeight ? { fontWeight: titleStyles.fontWeight } : {}),\n };\n\n // Main view: Invitations list\n // Note: Using View + map instead of FlatList to avoid \"VirtualizedLists should never be nested\" warning\n // when this component is rendered inside a ScrollView (which InviteFormCore uses)\n return (\n <View style={styles.listContainer}>\n {title && (\n <Text style={[styles.title, dynamicTitleStyle]}>{title}</Text>\n )}\n <View style={styles.listContent}>\n {displayedInvitations.map((item) => (\n <View key={item.id}>\n {renderItem({ item })}\n </View>\n ))}\n </View>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n container: {\n padding: 16,\n alignItems: 'center',\n justifyContent: 'center',\n minHeight: 120,\n },\n listContainer: {\n flex: 1,\n },\n title: {\n fontSize: 16,\n fontWeight: '600',\n marginBottom: 12,\n },\n label: {\n fontSize: 16,\n fontWeight: '500',\n marginBottom: 12,\n },\n placeholderText: {\n fontSize: 14,\n textAlign: 'center',\n },\n emptyText: {\n fontSize: 14,\n textAlign: 'center',\n },\n listContent: {\n paddingBottom: 16,\n },\n invitationItem: {\n flexDirection: 'row',\n alignItems: 'center',\n paddingVertical: 12,\n },\n avatar: {\n width: 44,\n height: 44,\n borderRadius: 22,\n },\n avatarPlaceholder: {\n width: 44,\n height: 44,\n borderRadius: 22,\n alignItems: 'center',\n justifyContent: 'center',\n },\n avatarInitials: {\n fontSize: 16,\n fontWeight: '600',\n },\n invitationInfo: {\n flex: 1,\n marginLeft: 12,\n marginRight: 12,\n },\n invitationName: {\n fontSize: 16,\n fontWeight: '500',\n },\n invitationSubtitle: {\n fontSize: 13,\n marginTop: 2,\n },\n buttonContainer: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 8,\n },\n actionButton: {\n paddingHorizontal: 12,\n paddingVertical: 8,\n borderRadius: 8,\n minWidth: 70,\n alignItems: 'center',\n justifyContent: 'center',\n },\n deleteButton: {\n marginRight: 8,\n },\n actionButtonText: {\n fontSize: 14,\n fontWeight: '600',\n },\n});\n","/**\n * VortexClient provides API methods for invitation management.\n * \n * @example\n * ```tsx\n * import { VortexClient } from '@teamvortexsoftware/vortex-react-native';\n * \n * const client = new VortexClient({\n * jwt: 'your-jwt-token',\n * baseURL: 'https://client-api.vortexsoftware.com', // optional\n * });\n * \n * // Revoke an outgoing invitation\n * await client.revokeInvitation('invitation-id');\n * \n * // Accept an incoming invitation\n * await client.acceptIncomingInvitation('invitation-id');\n * \n * // Delete an incoming invitation\n * await client.deleteIncomingInvitation('invitation-id');\n * ```\n */\n\nconst DEFAULT_BASE_URL = 'https://client-api.vortexsoftware.com';\n\nexport interface VortexClientOptions {\n /** JWT token for authentication */\n jwt: string;\n /** Optional base URL override (defaults to production) */\n baseURL?: string;\n}\n\nexport interface InvitationResponse {\n success: boolean;\n message?: string;\n data?: any;\n}\n\n/** Target of an invitation (e.g., email or SMS recipient) */\nexport interface InvitationTarget {\n targetType: string;\n targetValue: string;\n targetName?: string;\n targetAvatarUrl?: string;\n}\n\n/** Individual incoming invitation from the API */\nexport interface IncomingInvitation {\n id: string;\n targets?: InvitationTarget[];\n senderIdentifier?: string;\n senderIdentifierType?: string;\n avatarUrl?: string;\n status?: string;\n createdAt?: string;\n source?: string;\n deliveryType?: string;\n /** Name of the user who created this invitation */\n creatorName?: string | null;\n /** Avatar URL of the user who created this invitation */\n creatorAvatarUrl?: string | null;\n /** Internal ID of the user who created this invitation */\n foreignCreatorId?: string | null;\n /** Optional metadata attached to the invitation */\n metadata?: Record<string, unknown>;\n}\n\n/** Response from GET /api/v1/invitations endpoint */\nexport interface IncomingInvitationsResponse {\n data: {\n invitations: IncomingInvitation[];\n nextCursor?: string;\n hasMore?: boolean;\n count?: number;\n };\n}\n\nexport class VortexClient {\n private jwt: string;\n private baseURL: string;\n\n constructor(options: VortexClientOptions) {\n this.jwt = options.jwt;\n this.baseURL = options.baseURL || DEFAULT_BASE_URL;\n }\n\n /**\n * Updates the JWT token used for authentication.\n */\n setJwt(jwt: string): void {\n this.jwt = jwt;\n }\n\n /**\n * Revokes an outgoing invitation that the user has sent.\n * \n * @param invitationId - The ID of the invitation to revoke\n * @returns Promise resolving to the response\n */\n async revokeInvitation(invitationId: string): Promise<InvitationResponse> {\n try {\n const response = await fetch(`${this.baseURL}/api/v1/invitations/${invitationId}`, {\n method: 'DELETE',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${this.jwt}`,\n },\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n return {\n success: false,\n message: errorData.message || `Failed to revoke invitation: ${response.status}`,\n };\n }\n\n const data = await response.json().catch(() => ({}));\n return {\n success: true,\n data,\n };\n } catch (error) {\n console.warn('[VortexClient] Error revoking invitation:', error);\n return {\n success: false,\n message: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n }\n\n /**\n * Accepts an incoming invitation that the user has received.\n * \n * @param invitationId - The ID of the invitation to accept\n * @returns Promise resolving to the response\n */\n async acceptIncomingInvitation(invitationId: string): Promise<InvitationResponse> {\n try {\n const response = await fetch(`${this.baseURL}/api/v1/invitations/accept`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${this.jwt}`,\n },\n body: JSON.stringify({ invitationId }),\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n return {\n success: false,\n message: errorData.message || `Failed to accept invitation: ${response.status}`,\n };\n }\n\n const data = await response.json().catch(() => ({}));\n return {\n success: true,\n data,\n };\n } catch (error) {\n console.warn('[VortexClient] Error accepting invitation:', error);\n return {\n success: false,\n message: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n }\n\n /**\n * Fetches incoming (open) invitations for the current user.\n * \n * @returns Promise resolving to the list of incoming invitations\n */\n async getIncomingInvitations(): Promise<IncomingInvitation[]> {\n try {\n const response = await fetch(`${this.baseURL}/api/v1/invitations`, {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${this.jwt}`,\n },\n });\n\n if (!response.ok) {\n console.warn('[VortexClient] Failed to fetch incoming invitations:', response.status);\n return [];\n }\n\n const data: IncomingInvitationsResponse = await response.json();\n return data.data.invitations;\n } catch (error) {\n console.warn('[VortexClient] Error fetching incoming invitations:', error);\n return [];\n }\n }\n\n /**\n * Deletes/declines an incoming invitation that the user has received.\n * \n * @param invitationId - The ID of the invitation to delete\n * @returns Promise resolving to the response\n */\n async deleteIncomingInvitation(invitationId: string): Promise<InvitationResponse> {\n try {\n const response = await fetch(`${this.baseURL}/api/v1/invitations/incoming/${invitationId}`, {\n method: 'DELETE',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${this.jwt}`,\n },\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n return {\n success: false,\n message: errorData.message || `Failed to delete invitation: ${response.status}`,\n };\n }\n\n const data = await response.json().catch(() => ({}));\n return {\n success: true,\n data,\n };\n } catch (error) {\n console.warn('[VortexClient] Error deleting invitation:', error);\n return {\n success: false,\n message: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n }\n}\n","import React, { useState, useCallback, useRef, useEffect } from 'react';\nimport {\n View,\n Text,\n StyleSheet,\n TouchableOpacity,\n ActivityIndicator,\n Image,\n Platform,\n Alert,\n Animated,\n} from 'react-native';\nimport { OutgoingInvitationsConfig, OutgoingInvitationItem } from '../types/invitations';\nimport { EventNames } from '@teamvortexsoftware/analytics-client';\nimport type { SimpleAnalyticsEvent } from '../utils/analytics';\nimport { subscribeToInvitationEvent } from '../utils/invitationEvents';\n\nconst isWeb = Platform.OS === 'web';\n\n// Parse CSS linear-gradient to extract first color for fallback on native\nfunction parseGradientFirstColor(gradientString: string): string | null {\n if (!gradientString || !gradientString.includes('linear-gradient')) {\n return null;\n }\n\n const stopsRegex = /(rgba?\\([^)]+\\)|#[0-9a-fA-F]{3,8}|[a-z]+)\\s+(\\d+)%/i;\n const match = stopsRegex.exec(gradientString);\n\n if (match) {\n return match[1].trim();\n }\n\n return null;\n}\n\nexport interface VrtxOutgoingInvitationsProps {\n block: any;\n /** Outgoing Invitations configuration with optional onCancel callback */\n outgoingInvitationsConfig?: OutgoingInvitationsConfig;\n /** API URL for fetching invitations (required - passed from parent InviteFormCore) */\n apiUrl: string;\n /** JWT token for authentication (required - passed from parent InviteFormCore) */\n jwt: string;\n /** Trigger haptic feedback */\n triggerHaptic?: (style: 'light' | 'medium' | 'heavy') => Promise<void>;\n /** Theme colors from widget configuration */\n theme?: {\n primaryBackground?: string;\n primaryForeground?: string;\n secondaryBackground?: string;\n secondaryForeground?: string;\n foreground?: string;\n border?: string;\n };\n /** Callback to emit analytics events */\n onAnalyticsEvent?: (event: SimpleAnalyticsEvent) => void;\n}\n\n// Animated item wrapper for fade-out effect\nfunction AnimatedInvitationItem({\n item,\n renderContent,\n onRemove,\n}: {\n item: OutgoingInvitationItem;\n renderContent: (item: OutgoingInvitationItem) => React.ReactNode;\n onRemove: (id: string) => void;\n}) {\n const fadeAnim = useRef(new Animated.Value(1)).current;\n const heightAnim = useRef(new Animated.Value(1)).current;\n\n const animateOut = useCallback(() => {\n // Use sequential animations to avoid mixing useNativeDriver: true and false\n Animated.timing(fadeAnim, {\n toValue: 0,\n duration: 150,\n useNativeDriver: true,\n }).start(() => {\n onRemove(item.id);\n });\n }, [fadeAnim, item.id, onRemove]);\n\n return (\n <Animated.View\n style={{\n opacity: fadeAnim,\n }}\n >\n {renderContent({ ...item, metadata: { ...item.metadata, animateOut } })}\n </Animated.View>\n );\n}\n\nexport function VrtxOutgoingInvitations({\n block,\n outgoingInvitationsConfig,\n apiUrl,\n jwt,\n triggerHaptic,\n theme,\n onAnalyticsEvent,\n}: VrtxOutgoingInvitationsProps) {\n // Extract mock invitations from config (internal preview use only)\n const _mockInvitations = outgoingInvitationsConfig?._mockInvitations;\n // Local state for managing the displayed invitations (for animate-out)\n const [displayedInvitations, setDisplayedInvitations] = useState<OutgoingInvitationItem[]>([]);\n const [actionInProgress, setActionInProgress] = useState<string | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n // Use mock mode if _mockInvitations provided (preview), otherwise API mode\n const isMockMode = !!_mockInvitations;\n\n // Fetch invitations from API\n const fetchInvitations = useCallback(async () => {\n if (!apiUrl || !jwt) return;\n\n setIsLoading(true);\n setError(null);\n\n try {\n const response = await fetch(`${apiUrl}/api/v1/invitations/sent`, {\n method: 'GET',\n headers: {\n Authorization: `Bearer ${jwt}`,\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch invitations: ${response.status}`);\n }\n\n const data = await response.json();\n // Filter out shareable link invitations (targetType \"share\") - matches iOS SDK\n const filtered = (data.data?.invitations || []).filter((inv: any) => {\n const targetType = inv.targets?.[0]?.targetType;\n return targetType !== 'share';\n });\n const mappedInvitations: OutgoingInvitationItem[] = filtered.map((inv: any) => {\n // Extract target (invitee) info from the targets array - matches iOS SDK\n const target = inv.targets?.[0];\n const targetName = target?.targetName;\n const targetValue = target?.targetValue;\n \n // Use targetName as display name if available, otherwise fall back to targetValue\n const name = targetName ?? targetValue ?? inv.senderIdentifier ?? 'Unknown';\n return {\n id: inv.id,\n name,\n userId: targetValue,\n avatarUrl: target?.targetAvatarUrl,\n isVortexInvitation: true,\n metadata: inv,\n };\n });\n\n // Merge config invitations with API invitations, deduplicating by userId.\n const configInvitations = outgoingInvitationsConfig?.invitations || [];\n const apiUserIds = new Set(\n mappedInvitations\n .filter((inv) => inv.userId)\n .map((inv) => inv.userId)\n );\n const dedupedConfig = configInvitations.filter(\n (inv) => !inv.userId || !apiUserIds.has(inv.userId)\n );\n setDisplayedInvitations([...dedupedConfig, ...mappedInvitations]);\n } catch (err) {\n console.error('[VrtxOutgoingInvitations] Fetch failed:', err);\n setError(err instanceof Error ? err.message : 'Failed to load invitations');\n } finally {\n setIsLoading(false);\n }\n }, [apiUrl, jwt, outgoingInvitationsConfig?.invitations]);\n\n // Revoke invitation via API\n const revokeInvitation = useCallback(\n async (invitationId: string): Promise<boolean> => {\n if (!apiUrl || !jwt) return false;\n\n try {\n const response = await fetch(`${apiUrl}/api/v1/invitations/${invitationId}`, {\n method: 'DELETE',\n headers: {\n Authorization: `Bearer ${jwt}`,\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok && response.status !== 204) {\n throw new Error(`Failed to revoke invitation: ${response.status}`);\n }\n\n return true;\n } catch (err) {\n console.error('[VrtxOutgoingInvitations] Revoke failed:', err);\n return false;\n }\n },\n [apiUrl, jwt]\n );\n\n // Fetch invitations on mount - use mock data in preview mode, otherwise fetch from API\n useEffect(() => {\n if (isMockMode) {\n setDisplayedInvitations(_mockInvitations || []);\n } else {\n fetchInvitations();\n }\n }, [isMockMode, _mockInvitations, fetchInvitations]);\n\n // Subscribe to invitation events to refresh the list when new invitations are created\n useEffect(() => {\n if (isMockMode) return; // Don't subscribe in mock mode\n \n const unsubscribe = subscribeToInvitationEvent('invitationCreated', () => {\n console.log('[VrtxOutgoingInvitations] Invitation created event received, refreshing...');\n fetchInvitations();\n });\n \n return unsubscribe;\n }, [isMockMode, fetchInvitations]);\n\n // Extract customization from block settings (widget configuration), with defaults\n const blockCustomizations = block?.settings?.customizations;\n const cancelButtonText =\n blockCustomizations?.cancelButton?.textContent ?? 'Cancel';\n const emptyStateMessage =\n blockCustomizations?.emptyStateMessage?.textContent ?? 'No sent invitations';\n\n // Confirmation dialog texts from widget configuration\n const cancelConfirmTitle =\n blockCustomizations?.cancelConfirmTitle?.textContent ?? 'Cancel Invitation';\n const cancelConfirmMessage =\n blockCustomizations?.cancelConfirmMessage?.textContent ?? 'Cancel invitation to {name}?';\n const confirmButtonText =\n blockCustomizations?.confirmButtonText?.textContent ?? 'Confirm';\n const dismissButtonText =\n blockCustomizations?.dismissButtonText?.textContent ?? 'Keep';\n\n // Helper to get theme option value from block.theme.options\n const getBlockThemeValue = (key: string): string | undefined => {\n const options = block?.theme?.options;\n if (!options || !Array.isArray(options)) return undefined;\n const option = options.find((opt: any) => opt.key === key);\n return option?.value || undefined;\n };\n\n // Theme colors with defaults\n const colors = {\n primaryBackground: theme?.primaryBackground ?? '#6291d5',\n primaryForeground: theme?.primaryForeground ?? '#ffffff',\n secondaryBackground: theme?.secondaryBackground ?? '#ffffff',\n secondaryForeground: theme?.secondaryForeground ?? '#353e5c',\n foreground: theme?.foreground ?? '#334153',\n border: theme?.border ?? '#cccccc',\n };\n\n // Button styles from block.theme.options (microTheme)\n const cancelButtonStyles = {\n background:\n getBlockThemeValue('--vrtx-outgoing-invitations-cancel-button-background') ||\n colors.secondaryBackground,\n color:\n getBlockThemeValue('--vrtx-outgoing-invitations-cancel-button-color') ||\n colors.secondaryForeground,\n borderRadius: getBlockThemeValue('--vrtx-outgoing-invitations-cancel-button-border-radius'),\n border: getBlockThemeValue('--vrtx-outgoing-invitations-cancel-button-border'),\n padding: getBlockThemeValue('--vrtx-outgoing-invitations-cancel-button-padding'),\n fontSize: getBlockThemeValue('--vrtx-outgoing-invitations-cancel-button-font-size'),\n fontWeight: getBlockThemeValue('--vrtx-outgoing-invitations-cancel-button-font-weight'),\n };\n\n // Avatar/initials styles from block.theme.options (microTheme)\n const avatarStyles = {\n background:\n getBlockThemeValue('--vrtx-outgoing-invitations-avatar-background') ||\n colors.primaryBackground,\n color:\n getBlockThemeValue('--vrtx-outgoing-invitations-avatar-color') || colors.primaryForeground,\n };\n\n // Contact name styles from block.theme.options (microTheme)\n const nameStyles = {\n color: getBlockThemeValue('--vrtx-outgoing-invitations-name-color') || colors.foreground,\n fontFamily: getBlockThemeValue('--vrtx-outgoing-invitations-name-font-family'),\n fontSize: getBlockThemeValue('--vrtx-outgoing-invitations-name-font-size'),\n fontWeight: getBlockThemeValue('--vrtx-outgoing-invitations-name-font-weight'),\n };\n\n // Subtitle styles from block.theme.options (microTheme)\n const subtitleStyles = {\n color:\n getBlockThemeValue('--vrtx-outgoing-invitations-subtitle-color') ||\n colors.secondaryForeground,\n fontFamily: getBlockThemeValue('--vrtx-outgoing-invitations-subtitle-font-family'),\n fontSize: getBlockThemeValue('--vrtx-outgoing-invitations-subtitle-font-size'),\n };\n\n // Title styles from block.theme.options (microTheme)\n const titleStyles = {\n color: getBlockThemeValue('--vrtx-outgoing-invitations-title-color') || colors.foreground,\n fontFamily: getBlockThemeValue('--vrtx-outgoing-invitations-title-font-family'),\n fontSize: getBlockThemeValue('--vrtx-outgoing-invitations-title-font-size'),\n fontWeight: getBlockThemeValue('--vrtx-outgoing-invitations-title-font-weight'),\n };\n\n // Remove invitation from displayed list (after animation)\n const handleRemoveFromDisplay = useCallback((id: string) => {\n setDisplayedInvitations((prev) => prev.filter((inv) => inv.id !== id));\n }, []);\n\n // Show confirmation dialog\n const showConfirmation = useCallback(\n (title: string, message: string, onConfirm: () => void) => {\n if (isWeb) {\n // Web: use window.confirm\n const confirmed = window.confirm(message);\n if (confirmed) {\n onConfirm();\n }\n } else {\n // Native: use Alert\n Alert.alert(title, message, [\n {\n text: dismissButtonText,\n style: 'cancel',\n },\n {\n text: confirmButtonText,\n onPress: onConfirm,\n },\n ]);\n }\n },\n [confirmButtonText, dismissButtonText]\n );\n\n // Handle Cancel button press\n const handleCancel = useCallback(\n async (invitation: OutgoingInvitationItem, animateOut?: () => void) => {\n const message = cancelConfirmMessage.replace('{name}', invitation.name);\n\n showConfirmation(cancelConfirmTitle, message, async () => {\n setActionInProgress(invitation.id);\n await triggerHaptic?.('light');\n\n // Emit analytics event for delete button click\n onAnalyticsEvent?.({\n name: EventNames.OUTBOUND_INVITATION_DELETE_CLICKED,\n payload: { invitationId: invitation.id, inviteeName: invitation.name },\n });\n\n try {\n // Call the callback if provided and check return value\n let shouldProceed = true;\n if (outgoingInvitationsConfig?.onCancel) {\n const result = await outgoingInvitationsConfig.onCancel(invitation);\n // If callback returns false explicitly, don't proceed\n if (result === false) {\n shouldProceed = false;\n }\n }\n\n if (!shouldProceed) {\n setActionInProgress(null);\n return;\n }\n\n // In mock mode (web), skip API call AND don't remove the invitation (no-op)\n if (isMockMode) {\n // No-op in mock mode\n } else {\n // Real mode: call DELETE endpoint and remove on success\n const success = await revokeInvitation(invitation.id);\n\n if (success) {\n // Animate out after successful action\n if (animateOut) {\n animateOut();\n } else {\n handleRemoveFromDisplay(invitation.id);\n }\n }\n }\n } catch (err) {\n console.error('[VrtxOutgoingInvitations] Cancel failed:', err);\n } finally {\n setActionInProgress(null);\n }\n });\n },\n [\n outgoingInvitationsConfig,\n revokeInvitation,\n triggerHaptic,\n cancelConfirmTitle,\n cancelConfirmMessage,\n showConfirmation,\n handleRemoveFromDisplay,\n onAnalyticsEvent,\n ]\n );\n\n // Helper to parse CSS padding string to React Native padding object\n const parsePadding = (paddingStr: string | undefined) => {\n if (!paddingStr) return {};\n const parts = paddingStr.trim().split(/\\s+/);\n if (parts.length === 1) {\n const val = parseInt(parts[0], 10);\n return isNaN(val) ? {} : { paddingVertical: val, paddingHorizontal: val };\n }\n if (parts.length === 2) {\n const vertical = parseInt(parts[0], 10);\n const horizontal = parseInt(parts[1], 10);\n return {\n ...(isNaN(vertical) ? {} : { paddingVertical: vertical }),\n ...(isNaN(horizontal) ? {} : { paddingHorizontal: horizontal }),\n };\n }\n return {};\n };\n\n // Helper to parse border string (e.g., \"1px solid #ccc\")\n const parseBorder = (borderStr: string | undefined) => {\n if (!borderStr) return {};\n const match = borderStr.match(/^(\\d+)px\\s+(\\w+)\\s+(.+)$/);\n if (match) {\n return {\n borderWidth: parseInt(match[1], 10),\n borderColor: match[3],\n };\n }\n return {};\n };\n\n // Render avatar or initials\n const renderAvatar = (invitation: OutgoingInvitationItem) => {\n if (invitation.avatarUrl) {\n return <Image source={{ uri: invitation.avatarUrl }} style={styles.avatar} />;\n }\n\n // Generate initials from name\n const initials = invitation.name\n .split(' ')\n .map((part: string) => part[0])\n .join('')\n .toUpperCase()\n .slice(0, 2);\n\n // Handle avatar background with gradient support\n const avatarBackground = avatarStyles.background;\n const isAvatarGradient = avatarBackground?.includes('linear-gradient');\n const avatarBgStyle: any = {};\n\n if (isWeb && avatarBackground) {\n avatarBgStyle.background = avatarBackground;\n } else if (isAvatarGradient && avatarBackground) {\n const fallbackColor = parseGradientFirstColor(avatarBackground);\n avatarBgStyle.backgroundColor = fallbackColor || colors.primaryBackground;\n } else {\n avatarBgStyle.backgroundColor = avatarBackground || colors.primaryBackground;\n }\n\n return (\n <View style={[styles.avatarPlaceholder, avatarBgStyle]}>\n <Text style={[styles.avatarInitials, { color: avatarStyles.color }]}>{initials}</Text>\n </View>\n );\n };\n\n // Build button style with gradient support\n const buildButtonStyle = (buttonStyles: any, fallbackBg: string) => {\n const backgroundValue = buttonStyles.background;\n const isGradient = backgroundValue?.includes('linear-gradient');\n\n const dynamicButtonStyle: any = {\n ...(buttonStyles.borderRadius\n ? { borderRadius: parseInt(buttonStyles.borderRadius, 10) }\n : {}),\n ...parsePadding(buttonStyles.padding),\n ...parseBorder(buttonStyles.border),\n };\n\n if (isWeb && backgroundValue) {\n dynamicButtonStyle.background = backgroundValue;\n } else if (isGradient && backgroundValue) {\n const fallbackColor = parseGradientFirstColor(backgroundValue);\n dynamicButtonStyle.backgroundColor = fallbackColor || fallbackBg;\n } else {\n dynamicButtonStyle.backgroundColor = backgroundValue || fallbackBg;\n }\n\n return dynamicButtonStyle;\n };\n\n // Render a single invitation item\n const renderInvitationContent = (item: OutgoingInvitationItem) => {\n const isLoading = actionInProgress === item.id;\n const animateOut = item.metadata?.animateOut as (() => void) | undefined;\n\n // Build dynamic button style\n const cancelButtonDynamicStyle = buildButtonStyle(\n cancelButtonStyles,\n colors.secondaryBackground\n );\n\n // Build dynamic text style\n const cancelTextStyle: any = {\n color: cancelButtonStyles.color,\n ...(cancelButtonStyles.fontSize\n ? { fontSize: parseInt(cancelButtonStyles.fontSize, 10) }\n : {}),\n ...(cancelButtonStyles.fontWeight ? { fontWeight: cancelButtonStyles.fontWeight } : {}),\n };\n\n // Build dynamic name style\n const dynamicNameStyle: any = {\n color: nameStyles.color,\n ...(nameStyles.fontFamily ? { fontFamily: nameStyles.fontFamily } : {}),\n ...(nameStyles.fontSize ? { fontSize: parseInt(nameStyles.fontSize, 10) } : {}),\n ...(nameStyles.fontWeight ? { fontWeight: nameStyles.fontWeight } : {}),\n };\n\n // Build dynamic subtitle style\n const dynamicSubtitleStyle: any = {\n color: subtitleStyles.color,\n ...(subtitleStyles.fontFamily ? { fontFamily: subtitleStyles.fontFamily } : {}),\n ...(subtitleStyles.fontSize ? { fontSize: parseInt(subtitleStyles.fontSize, 10) } : {}),\n };\n\n return (\n <View style={styles.invitationItem}>\n {renderAvatar(item)}\n <View style={styles.invitationInfo}>\n <Text style={[styles.invitationName, dynamicNameStyle]} numberOfLines={1}>\n {item.name}\n </Text>\n {(() => {\n const displaySubtitle = outgoingInvitationsConfig?.getSubtitle?.(item);\n return displaySubtitle ? (\n <Text style={[styles.invitationSubtitle, dynamicSubtitleStyle]} numberOfLines={1}>\n {displaySubtitle}\n </Text>\n ) : null;\n })()}\n </View>\n {/* Cancel button */}\n <TouchableOpacity\n style={[styles.actionButton, cancelButtonDynamicStyle]}\n onPress={() => handleCancel(item, animateOut)}\n disabled={isLoading}\n activeOpacity={0.7}\n >\n {isLoading ? (\n <ActivityIndicator size=\"small\" color={cancelButtonStyles.color} />\n ) : (\n <Text style={[styles.actionButtonText, cancelTextStyle]}>{cancelButtonText}</Text>\n )}\n </TouchableOpacity>\n </View>\n );\n };\n\n // Render item with animation wrapper\n const renderItem = ({ item }: { item: OutgoingInvitationItem }) => {\n return (\n <AnimatedInvitationItem\n item={item}\n renderContent={renderInvitationContent}\n onRemove={handleRemoveFromDisplay}\n />\n );\n };\n\n\n // Loading state (API mode)\n if (isLoading) {\n return (\n <View style={styles.container}>\n <ActivityIndicator size=\"large\" color={colors.primaryBackground} />\n </View>\n );\n }\n\n // Error state (API mode)\n if (error) {\n return (\n <View style={styles.container}>\n <Text style={[styles.errorText, { color: '#dc2626' }]}>{error}</Text>\n </View>\n );\n }\n\n // Empty state - render nothing (no-op component with no height)\n if (displayedInvitations.length === 0) {\n return null;\n }\n\n // Get title from block attributes (configured in editor as \"Title\")\n const title = block?.attributes?.title;\n\n // Build dynamic title style\n const dynamicTitleStyle: any = {\n color: titleStyles.color,\n ...(titleStyles.fontFamily ? { fontFamily: titleStyles.fontFamily } : {}),\n ...(titleStyles.fontSize ? { fontSize: parseInt(titleStyles.fontSize, 10) } : {}),\n ...(titleStyles.fontWeight ? { fontWeight: titleStyles.fontWeight } : {}),\n };\n\n // Main view: Invitations list\n // Note: Using View + map instead of FlatList to avoid \"VirtualizedLists should never be nested\" warning\n // when this component is rendered inside a ScrollView (which InviteFormCore uses)\n return (\n <View style={styles.listContainer}>\n {title && (\n <Text style={[styles.title, dynamicTitleStyle]}>{title}</Text>\n )}\n <View style={styles.listContent}>\n {displayedInvitations.map((item) => (\n <View key={item.id}>\n {renderItem({ item })}\n </View>\n ))}\n </View>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n container: {\n padding: 16,\n alignItems: 'center',\n justifyContent: 'center',\n minHeight: 120,\n },\n listContainer: {\n flex: 1,\n },\n title: {\n fontSize: 16,\n fontWeight: '600',\n marginBottom: 12,\n },\n placeholderText: {\n fontSize: 14,\n textAlign: 'center',\n },\n emptyText: {\n fontSize: 14,\n textAlign: 'center',\n },\n errorText: {\n fontSize: 14,\n textAlign: 'center',\n },\n listContent: {\n paddingBottom: 16,\n },\n invitationItem: {\n flexDirection: 'row',\n alignItems: 'center',\n paddingVertical: 12,\n },\n avatar: {\n width: 44,\n height: 44,\n borderRadius: 22,\n },\n avatarPlaceholder: {\n width: 44,\n height: 44,\n borderRadius: 22,\n alignItems: 'center',\n justifyContent: 'center',\n },\n avatarInitials: {\n fontSize: 16,\n fontWeight: '600',\n },\n invitationInfo: {\n flex: 1,\n marginLeft: 12,\n marginRight: 12,\n },\n invitationName: {\n fontSize: 16,\n fontWeight: '500',\n },\n invitationSubtitle: {\n fontSize: 13,\n marginTop: 2,\n },\n actionButton: {\n paddingHorizontal: 16,\n paddingVertical: 8,\n borderRadius: 8,\n minWidth: 80,\n alignItems: 'center',\n justifyContent: 'center',\n },\n actionButtonText: {\n fontSize: 14,\n fontWeight: '600',\n },\n});\n","import React, { useState, useCallback, useRef, useEffect } from 'react';\nimport {\n View,\n Text,\n StyleSheet,\n TouchableOpacity,\n ActivityIndicator,\n Image,\n Platform,\n Animated,\n ViewStyle,\n} from 'react-native';\nimport { EventNames } from '@teamvortexsoftware/analytics-client';\nimport { InvitationSuggestionsConfig, InvitationItem } from '../types/invitations';\nimport type { SimpleAnalyticsEvent } from '../utils/analytics';\nimport { useVortexModules } from '../context/VortexModulesContext';\nimport { emitInvitationEvent } from '../utils/invitationEvents';\n\nconst isWeb = Platform.OS === 'web';\n\n// Parse CSS linear-gradient to extract first color for fallback on native\nfunction parseGradientFirstColor(gradientString: string): string | null {\n if (!gradientString || !gradientString.includes('linear-gradient')) {\n return null;\n }\n\n const stopsRegex = /(rgba?\\([^)]+\\)|#[0-9a-fA-F]{3,8}|[a-z]+)\\s+(\\d+)%/i;\n const match = stopsRegex.exec(gradientString);\n\n if (match) {\n return match[1].trim();\n }\n\n return null;\n}\n\n// Button wrapper component that handles gradients on web, native gradient libraries, or solid color fallback\ninterface ButtonWrapperProps {\n children: React.ReactNode;\n style: ViewStyle | ViewStyle[];\n gradientString: string | null;\n onPress?: () => void;\n disabled?: boolean;\n}\n\nfunction ButtonWrapper({\n children,\n style,\n gradientString,\n onPress,\n disabled,\n}: ButtonWrapperProps) {\n const { gradientModule, loaders } = useVortexModules();\n const styleArray = Array.isArray(style) ? style : [style];\n\n // On web, use CSS gradients directly\n if (gradientString && isWeb) {\n return (\n <TouchableOpacity\n style={[...styleArray, { background: gradientString } as any]}\n onPress={onPress}\n disabled={disabled}\n activeOpacity={0.7}\n >\n {children}\n </TouchableOpacity>\n );\n }\n\n // On native, try to use gradient library if specified\n if (gradientString && gradientModule && loaders) {\n const GradientComponent = loaders.loadGradientComponent(gradientModule);\n const parsed = loaders.parseCSSLinearGradient(gradientString);\n\n if (GradientComponent && parsed) {\n const points = loaders.angleToGradientPoints(parsed.angle);\n\n return (\n <TouchableOpacity\n onPress={onPress}\n disabled={disabled}\n activeOpacity={0.7}\n >\n <GradientComponent\n colors={parsed.colors}\n locations={parsed.locations}\n start={points.start}\n end={points.end}\n style={styleArray}\n >\n {children}\n </GradientComponent>\n </TouchableOpacity>\n );\n }\n }\n\n // Fallback: solid color from first gradient stop\n const fallbackColor = gradientString && loaders ? loaders.parseGradientFirstColor(gradientString) : null;\n const finalStyle = fallbackColor ? [...styleArray, { backgroundColor: fallbackColor }] : styleArray;\n\n return (\n <TouchableOpacity\n style={finalStyle}\n onPress={onPress}\n disabled={disabled}\n activeOpacity={0.7}\n >\n {children}\n </TouchableOpacity>\n );\n}\n\nexport interface VrtxInvitationSuggestionsProps {\n block: any;\n /** Invitation Suggestions configuration with callbacks */\n invitationSuggestionsConfig?: InvitationSuggestionsConfig;\n /** Create an invitation via the Vortex API */\n createUserIdInvitation?: (userId: string, name?: string, avatarUrl?: string, metadata?: Record<string, unknown>) => Promise<void>;\n /** Trigger haptic feedback */\n triggerHaptic?: (style: 'light' | 'medium' | 'heavy') => Promise<void>;\n /** Callback to emit analytics events */\n onAnalyticsEvent?: (event: SimpleAnalyticsEvent) => void;\n /** Theme colors from widget configuration */\n theme?: {\n primaryBackground?: string;\n primaryForeground?: string;\n secondaryBackground?: string;\n secondaryForeground?: string;\n foreground?: string;\n border?: string;\n };\n}\n\n// Animated item wrapper for fade-out effect\nfunction AnimatedSuggestionItem({\n item,\n renderContent,\n onRemove,\n}: {\n item: InvitationItem;\n renderContent: (item: InvitationItem) => React.ReactNode;\n onRemove: (id: string) => void;\n}) {\n const fadeAnim = useRef(new Animated.Value(1)).current;\n const heightAnim = useRef(new Animated.Value(1)).current;\n\n const animateOut = useCallback(() => {\n Animated.parallel([\n Animated.timing(fadeAnim, {\n toValue: 0,\n duration: 200,\n useNativeDriver: false,\n }),\n Animated.timing(heightAnim, {\n toValue: 0,\n duration: 200,\n useNativeDriver: false,\n }),\n ]).start(() => {\n onRemove(item.id);\n });\n }, [fadeAnim, heightAnim, item.id, onRemove]);\n\n return (\n <Animated.View\n style={{\n opacity: fadeAnim,\n transform: [{ scaleY: heightAnim }],\n }}\n >\n {renderContent({ ...item, metadata: { ...item.metadata, animateOut } })}\n </Animated.View>\n );\n}\n\nexport function VrtxInvitationSuggestions({\n block,\n invitationSuggestionsConfig,\n createUserIdInvitation,\n triggerHaptic,\n onAnalyticsEvent,\n theme,\n}: VrtxInvitationSuggestionsProps) {\n // Local state for managing the displayed suggestions (for animate-out)\n const [displayedSuggestions, setDisplayedSuggestions] = useState<InvitationItem[]>(\n invitationSuggestionsConfig?.suggestions || []\n );\n const [actionInProgress, setActionInProgress] = useState<string | null>(null);\n\n // Sync with props when suggestions change\n useEffect(() => {\n setDisplayedSuggestions(invitationSuggestionsConfig?.suggestions || []);\n }, [invitationSuggestionsConfig?.suggestions]);\n\n // Extract customization from block settings or config props, with defaults\n const blockCustomizations = block?.settings?.customizations;\n const inviteButtonText =\n blockCustomizations?.inviteButton?.textContent ??\n invitationSuggestionsConfig?.inviteButtonText ??\n 'Invite';\n const emptyStateMessage =\n blockCustomizations?.emptyStateMessage?.textContent ??\n invitationSuggestionsConfig?.emptyStateMessage ??\n 'No suggestions';\n\n // Helper to get theme option value from block.theme.options\n const getBlockThemeValue = (key: string): string | undefined => {\n const options = block?.theme?.options;\n if (!options || !Array.isArray(options)) return undefined;\n const option = options.find((opt: any) => opt.key === key);\n return option?.value || undefined;\n };\n\n // Theme colors with defaults\n const colors = {\n primaryBackground: theme?.primaryBackground ?? '#6291d5',\n primaryForeground: theme?.primaryForeground ?? '#ffffff',\n secondaryBackground: theme?.secondaryBackground ?? '#ffffff',\n secondaryForeground: theme?.secondaryForeground ?? '#353e5c',\n foreground: theme?.foreground ?? '#334153',\n border: theme?.border ?? '#cccccc',\n };\n\n // Button styles from block.theme.options (microTheme)\n const inviteButtonStyles = {\n background:\n getBlockThemeValue('--vrtx-invitation-suggestions-invite-button-background') ||\n colors.primaryBackground,\n color:\n getBlockThemeValue('--vrtx-invitation-suggestions-invite-button-color') ||\n colors.primaryForeground,\n borderRadius: getBlockThemeValue('--vrtx-invitation-suggestions-invite-button-border-radius'),\n border: getBlockThemeValue('--vrtx-invitation-suggestions-invite-button-border'),\n padding: getBlockThemeValue('--vrtx-invitation-suggestions-invite-button-padding'),\n fontSize: getBlockThemeValue('--vrtx-invitation-suggestions-invite-button-font-size'),\n fontWeight: getBlockThemeValue('--vrtx-invitation-suggestions-invite-button-font-weight'),\n };\n\n // Dismiss button styles from block.theme.options (microTheme)\n const dismissButtonStyles = {\n background:\n getBlockThemeValue('--vrtx-invitation-suggestions-dismiss-button-background') ||\n 'transparent',\n color:\n getBlockThemeValue('--vrtx-invitation-suggestions-dismiss-button-color') ||\n colors.secondaryForeground,\n };\n\n // Avatar/initials styles from block.theme.options (microTheme)\n const avatarStyles = {\n background:\n getBlockThemeValue('--vrtx-invitation-suggestions-avatar-background') ||\n colors.primaryBackground,\n color:\n getBlockThemeValue('--vrtx-invitation-suggestions-avatar-color') || colors.primaryForeground,\n };\n\n // Name styles from block.theme.options (microTheme)\n const nameStyles = {\n color: getBlockThemeValue('--vrtx-invitation-suggestions-name-color') || colors.foreground,\n fontFamily: getBlockThemeValue('--vrtx-invitation-suggestions-name-font-family'),\n fontSize: getBlockThemeValue('--vrtx-invitation-suggestions-name-font-size'),\n fontWeight: getBlockThemeValue('--vrtx-invitation-suggestions-name-font-weight'),\n };\n\n // Subtitle styles from block.theme.options (microTheme)\n const subtitleStyles = {\n color:\n getBlockThemeValue('--vrtx-invitation-suggestions-subtitle-color') ||\n colors.secondaryForeground,\n fontFamily: getBlockThemeValue('--vrtx-invitation-suggestions-subtitle-font-family'),\n fontSize: getBlockThemeValue('--vrtx-invitation-suggestions-subtitle-font-size'),\n };\n\n // Title styles from block.theme.options (microTheme)\n const titleStyles = {\n color: getBlockThemeValue('--vrtx-invitation-suggestions-title-color') || colors.foreground,\n fontFamily: getBlockThemeValue('--vrtx-invitation-suggestions-title-font-family'),\n fontSize: getBlockThemeValue('--vrtx-invitation-suggestions-title-font-size'),\n fontWeight: getBlockThemeValue('--vrtx-invitation-suggestions-title-font-weight'),\n };\n\n // Get title from block attributes (configured in Styles tab)\n const title = block?.attributes?.title || '';\n\n // Remove suggestion from displayed list (after animation)\n const handleRemoveFromDisplay = useCallback((id: string) => {\n setDisplayedSuggestions((prev) => prev.filter((s) => s.id !== id));\n }, []);\n\n // Handle Invite button press (no confirmation)\n const handleInvite = useCallback(\n async (suggestion: InvitationItem, animateOut?: () => void) => {\n if (!invitationSuggestionsConfig?.onInvite) return;\n\n setActionInProgress(suggestion.id);\n await triggerHaptic?.('light');\n\n // Emit analytics event for PYMK invite click\n onAnalyticsEvent?.({\n name: EventNames.PYMK_INVITE_CLICKED,\n segmentation: {\n suggestionId: suggestion.id,\n suggestionName: suggestion.name,\n },\n });\n\n try {\n // Call customer's callback\n await invitationSuggestionsConfig.onInvite(suggestion);\n\n // Create the invitation via the Vortex API so it appears in Outgoing Invitations\n if (createUserIdInvitation) {\n await createUserIdInvitation(suggestion.id, suggestion.name, suggestion.avatarUrl, suggestion.metadata);\n // Notify other components (e.g., VrtxOutgoingInvitations) to refresh\n emitInvitationEvent('invitationCreated');\n }\n\n // Animate out after successful action\n if (animateOut) {\n animateOut();\n } else {\n handleRemoveFromDisplay(suggestion.id);\n }\n } catch (err) {\n console.error('[VrtxInvitationSuggestions] Invite failed:', err);\n } finally {\n setActionInProgress(null);\n }\n },\n [invitationSuggestionsConfig, createUserIdInvitation, triggerHaptic, onAnalyticsEvent, handleRemoveFromDisplay]\n );\n\n // Handle Dismiss (X) button press (no confirmation)\n const handleDismiss = useCallback(\n async (suggestion: InvitationItem, animateOut?: () => void) => {\n if (!invitationSuggestionsConfig?.onDismiss) return;\n\n setActionInProgress(suggestion.id);\n await triggerHaptic?.('light');\n\n // Emit analytics event for PYMK dismiss click\n onAnalyticsEvent?.({\n name: EventNames.PYMK_DELETE_CLICKED,\n segmentation: {\n suggestionId: suggestion.id,\n suggestionName: suggestion.name,\n },\n });\n\n try {\n await invitationSuggestionsConfig.onDismiss(suggestion);\n // Animate out after successful action\n if (animateOut) {\n animateOut();\n } else {\n handleRemoveFromDisplay(suggestion.id);\n }\n } catch (err) {\n console.error('[VrtxInvitationSuggestions] Dismiss failed:', err);\n } finally {\n setActionInProgress(null);\n }\n },\n [invitationSuggestionsConfig, triggerHaptic, onAnalyticsEvent, handleRemoveFromDisplay]\n );\n\n // Helper to parse CSS padding string to React Native padding object\n const parsePadding = (paddingStr: string | undefined) => {\n if (!paddingStr) return {};\n const parts = paddingStr.trim().split(/\\s+/);\n if (parts.length === 1) {\n const val = parseInt(parts[0], 10);\n return isNaN(val) ? {} : { paddingVertical: val, paddingHorizontal: val };\n }\n if (parts.length === 2) {\n const vertical = parseInt(parts[0], 10);\n const horizontal = parseInt(parts[1], 10);\n return {\n ...(isNaN(vertical) ? {} : { paddingVertical: vertical }),\n ...(isNaN(horizontal) ? {} : { paddingHorizontal: horizontal }),\n };\n }\n return {};\n };\n\n // Helper to parse border string (e.g., \"1px solid #ccc\")\n const parseBorder = (borderStr: string | undefined) => {\n if (!borderStr) return {};\n const match = borderStr.match(/^(\\d+)px\\s+(\\w+)\\s+(.+)$/);\n if (match) {\n return {\n borderWidth: parseInt(match[1], 10),\n borderColor: match[3],\n };\n }\n return {};\n };\n\n // Render avatar or initials\n const renderAvatar = (suggestion: InvitationItem) => {\n if (suggestion.avatarUrl) {\n return <Image source={{ uri: suggestion.avatarUrl }} style={styles.avatar} />;\n }\n\n // Generate initials from name\n const initials = suggestion.name\n .split(' ')\n .map((part) => part[0])\n .join('')\n .toUpperCase()\n .slice(0, 2);\n\n // Handle avatar background with gradient support\n const avatarBackground = avatarStyles.background;\n const isAvatarGradient = avatarBackground?.includes('linear-gradient');\n const avatarBgStyle: any = {};\n\n if (isWeb && avatarBackground) {\n avatarBgStyle.background = avatarBackground;\n } else if (isAvatarGradient && avatarBackground) {\n const fallbackColor = parseGradientFirstColor(avatarBackground);\n avatarBgStyle.backgroundColor = fallbackColor || colors.primaryBackground;\n } else {\n avatarBgStyle.backgroundColor = avatarBackground || colors.primaryBackground;\n }\n\n return (\n <View style={[styles.avatarPlaceholder, avatarBgStyle]}>\n <Text style={[styles.avatarInitials, { color: avatarStyles.color }]}>{initials}</Text>\n </View>\n );\n };\n\n // Build button style with gradient support\n const buildButtonStyle = (buttonStyles: any, fallbackBg: string) => {\n const backgroundValue = buttonStyles.background;\n const isGradient = backgroundValue?.includes('linear-gradient');\n\n const dynamicButtonStyle: any = {\n ...(buttonStyles.borderRadius\n ? { borderRadius: parseInt(buttonStyles.borderRadius, 10) }\n : {}),\n ...parsePadding(buttonStyles.padding),\n ...parseBorder(buttonStyles.border),\n };\n\n if (isWeb && backgroundValue) {\n dynamicButtonStyle.background = backgroundValue;\n } else if (isGradient && backgroundValue) {\n const fallbackColor = parseGradientFirstColor(backgroundValue);\n dynamicButtonStyle.backgroundColor = fallbackColor || fallbackBg;\n } else {\n dynamicButtonStyle.backgroundColor = backgroundValue || fallbackBg;\n }\n\n return dynamicButtonStyle;\n };\n\n // Render a single suggestion item\n const renderSuggestionContent = (item: InvitationItem) => {\n const isLoading = actionInProgress === item.id;\n const animateOut = item.metadata?.animateOut as (() => void) | undefined;\n\n // Build dynamic button style\n const inviteButtonDynamicStyle = buildButtonStyle(inviteButtonStyles, colors.primaryBackground);\n\n // Build dynamic text style\n const inviteTextStyle: any = {\n color: inviteButtonStyles.color,\n ...(inviteButtonStyles.fontSize\n ? { fontSize: parseInt(inviteButtonStyles.fontSize, 10) }\n : {}),\n ...(inviteButtonStyles.fontWeight ? { fontWeight: inviteButtonStyles.fontWeight } : {}),\n };\n\n // Build dynamic name style\n const dynamicNameStyle: any = {\n color: nameStyles.color,\n ...(nameStyles.fontFamily ? { fontFamily: nameStyles.fontFamily } : {}),\n ...(nameStyles.fontSize ? { fontSize: parseInt(nameStyles.fontSize, 10) } : {}),\n ...(nameStyles.fontWeight ? { fontWeight: nameStyles.fontWeight } : {}),\n };\n\n // Build dynamic subtitle style\n const dynamicSubtitleStyle: any = {\n color: subtitleStyles.color,\n ...(subtitleStyles.fontFamily ? { fontFamily: subtitleStyles.fontFamily } : {}),\n ...(subtitleStyles.fontSize ? { fontSize: parseInt(subtitleStyles.fontSize, 10) } : {}),\n };\n\n return (\n <View style={styles.suggestionItem}>\n {renderAvatar(item)}\n <View style={styles.suggestionInfo}>\n <Text style={[styles.suggestionName, dynamicNameStyle]} numberOfLines={1}>\n {item.name}\n </Text>\n {item.subtitle && (\n <Text style={[styles.suggestionSubtitle, dynamicSubtitleStyle]} numberOfLines={1}>\n {item.subtitle}\n </Text>\n )}\n </View>\n {/* Invite button */}\n <ButtonWrapper\n style={[styles.actionButton, inviteButtonDynamicStyle]}\n gradientString={inviteButtonStyles.background?.includes('gradient') ? inviteButtonStyles.background : null}\n onPress={() => handleInvite(item, animateOut)}\n disabled={isLoading}\n >\n {isLoading ? (\n <ActivityIndicator size=\"small\" color={inviteButtonStyles.color} />\n ) : (\n <Text style={[styles.actionButtonText, inviteTextStyle]}>{inviteButtonText}</Text>\n )}\n </ButtonWrapper>\n {/* Dismiss (X) button */}\n <TouchableOpacity\n style={[styles.dismissButton, { backgroundColor: dismissButtonStyles.background }]}\n onPress={() => handleDismiss(item, animateOut)}\n disabled={isLoading}\n activeOpacity={0.7}\n >\n <Text style={[styles.dismissButtonText, { color: dismissButtonStyles.color }]}>✕</Text>\n </TouchableOpacity>\n </View>\n );\n };\n\n // Render item with animation wrapper\n const renderSuggestionItem = ({ item }: { item: InvitationItem }) => {\n return (\n <AnimatedSuggestionItem\n item={item}\n renderContent={renderSuggestionContent}\n onRemove={handleRemoveFromDisplay}\n />\n );\n };\n\n // Build dynamic title style\n const dynamicTitleStyle: any = {\n color: titleStyles.color,\n ...(titleStyles.fontFamily ? { fontFamily: titleStyles.fontFamily } : {}),\n ...(titleStyles.fontSize ? { fontSize: parseInt(titleStyles.fontSize, 10) } : {}),\n ...(titleStyles.fontWeight ? { fontWeight: titleStyles.fontWeight } : {}),\n };\n\n // Show placeholder if no config provided\n if (!invitationSuggestionsConfig) {\n return (\n <View style={styles.container}>\n {title ? <Text style={[styles.title, dynamicTitleStyle]}>{title}</Text> : null}\n <Text style={[styles.placeholderText, { color: colors.secondaryForeground }]}>\n Invitation Suggestions component - provide invitationSuggestionsConfig to enable\n </Text>\n </View>\n );\n }\n\n // Empty state\n if (displayedSuggestions.length === 0) {\n return (\n <View style={styles.container}>\n {title ? <Text style={[styles.title, dynamicTitleStyle]}>{title}</Text> : null}\n <Text style={[styles.emptyText, { color: colors.secondaryForeground }]}>\n {emptyStateMessage}\n </Text>\n </View>\n );\n }\n\n // Main list view\n // Note: Using View + map instead of FlatList to avoid \"VirtualizedLists should never be nested\" warning\n // when this component is rendered inside a ScrollView (which InviteFormCore uses)\n return (\n <View style={styles.listContainer}>\n {title ? <Text style={[styles.title, dynamicTitleStyle]}>{title}</Text> : null}\n <View style={styles.listContent}>\n {displayedSuggestions.map((item) => (\n <View key={item.id}>\n {renderSuggestionItem({ item })}\n </View>\n ))}\n </View>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n container: {\n padding: 16,\n alignItems: 'center',\n justifyContent: 'center',\n minHeight: 120,\n },\n listContainer: {\n flex: 1,\n },\n title: {\n fontSize: 18,\n fontWeight: '600',\n marginBottom: 16,\n },\n placeholderText: {\n fontSize: 14,\n textAlign: 'center',\n },\n emptyText: {\n fontSize: 14,\n textAlign: 'center',\n },\n listContent: {\n paddingBottom: 16,\n },\n suggestionItem: {\n flexDirection: 'row',\n alignItems: 'center',\n paddingVertical: 12,\n },\n avatar: {\n width: 44,\n height: 44,\n borderRadius: 22,\n },\n avatarPlaceholder: {\n width: 44,\n height: 44,\n borderRadius: 22,\n alignItems: 'center',\n justifyContent: 'center',\n },\n avatarInitials: {\n fontSize: 16,\n fontWeight: '600',\n },\n suggestionInfo: {\n flex: 1,\n marginLeft: 12,\n marginRight: 12,\n },\n suggestionName: {\n fontSize: 16,\n fontWeight: '500',\n },\n suggestionSubtitle: {\n fontSize: 13,\n marginTop: 2,\n },\n dismissButton: {\n width: 32,\n height: 32,\n borderRadius: 16,\n alignItems: 'center',\n justifyContent: 'center',\n marginLeft: 8,\n },\n dismissButtonText: {\n fontSize: 16,\n fontWeight: '500',\n },\n actionButton: {\n paddingHorizontal: 16,\n paddingVertical: 8,\n borderRadius: 8,\n minWidth: 70,\n alignItems: 'center',\n justifyContent: 'center',\n },\n actionButtonText: {\n fontSize: 14,\n fontWeight: '600',\n },\n});\n","import React, { useState, useCallback, useMemo } from 'react';\nimport {\n View,\n Text,\n StyleSheet,\n TouchableOpacity,\n ActivityIndicator,\n Image,\n TextInput,\n Platform,\n Linking,\n ViewStyle,\n} from 'react-native';\nimport { InviteContactsConfig, InviteContactsContact } from '../types/inviteContacts';\nimport { useVortexModules } from '../context/VortexModulesContext';\n\nconst isWeb = Platform.OS === 'web';\n\n// Parse CSS linear-gradient to extract first color for fallback on native\nfunction parseGradientFirstColor(gradientString: string): string | null {\n if (!gradientString || !gradientString.includes('linear-gradient')) {\n return null;\n }\n\n const stopsRegex = /(rgba?\\([^)]+\\)|#[0-9a-fA-F]{3,8}|[a-z]+)\\s+(\\d+)%/i;\n const match = stopsRegex.exec(gradientString);\n\n if (match) {\n return match[1].trim();\n }\n\n return null;\n}\n\n// Button wrapper component that handles gradients on web, native gradient libraries, or solid color fallback\ninterface ButtonWrapperProps {\n children: React.ReactNode;\n style: ViewStyle | ViewStyle[];\n gradientString: string | null;\n onPress?: () => void;\n disabled?: boolean;\n}\n\nfunction ButtonWrapper({\n children,\n style,\n gradientString,\n onPress,\n disabled,\n}: ButtonWrapperProps) {\n const { gradientModule, loaders } = useVortexModules();\n const styleArray = Array.isArray(style) ? style : [style];\n\n // On web, use CSS gradients directly\n if (gradientString && isWeb) {\n return (\n <TouchableOpacity\n style={[...styleArray, { background: gradientString } as any]}\n onPress={onPress}\n disabled={disabled}\n activeOpacity={0.7}\n >\n {children}\n </TouchableOpacity>\n );\n }\n\n // On native, try to use gradient library if specified\n if (gradientString && gradientModule && loaders) {\n const GradientComponent = loaders.loadGradientComponent(gradientModule);\n const parsed = loaders.parseCSSLinearGradient(gradientString);\n\n if (GradientComponent && parsed) {\n const points = loaders.angleToGradientPoints(parsed.angle);\n\n return (\n <TouchableOpacity\n onPress={onPress}\n disabled={disabled}\n activeOpacity={0.7}\n >\n <GradientComponent\n colors={parsed.colors}\n locations={parsed.locations}\n start={points.start}\n end={points.end}\n style={styleArray}\n >\n {children}\n </GradientComponent>\n </TouchableOpacity>\n );\n }\n }\n\n // Fallback: solid color from first gradient stop\n const fallbackColor = gradientString && loaders ? loaders.parseGradientFirstColor(gradientString) : null;\n const finalStyle = fallbackColor ? [...styleArray, { backgroundColor: fallbackColor }] : styleArray;\n\n return (\n <TouchableOpacity\n style={finalStyle}\n onPress={onPress}\n disabled={disabled}\n activeOpacity={0.7}\n >\n {children}\n </TouchableOpacity>\n );\n}\n\nexport interface VrtxInviteContactsProps {\n block: any;\n /** Invite Contacts configuration with contacts list */\n inviteContactsConfig?: InviteContactsConfig;\n /** Function to create SMS invitation and get short link */\n createSmsInvitation?: (phoneNumber: string, contactName?: string) => Promise<string | null>;\n /** Trigger haptic feedback */\n triggerHaptic?: (style: 'light' | 'medium' | 'heavy') => Promise<void>;\n /** Theme colors from widget configuration */\n theme?: {\n primaryBackground?: string;\n primaryForeground?: string;\n secondaryBackground?: string;\n secondaryForeground?: string;\n foreground?: string;\n border?: string;\n };\n /** SMS message template with {{link}} placeholder */\n smsMessageTemplate?: string;\n}\n\n// Helper function to sort contacts alphabetically by name\nfunction sortContacts(contacts: InviteContactsContact[]): InviteContactsContact[] {\n return [...contacts].sort((a, b) => a.name.localeCompare(b.name));\n}\n\nexport function VrtxInviteContacts({\n block,\n inviteContactsConfig,\n createSmsInvitation,\n triggerHaptic,\n theme,\n smsMessageTemplate,\n}: VrtxInviteContactsProps) {\n const [showContactsList, setShowContactsList] = useState(false);\n const [actionInProgress, setActionInProgress] = useState<string | null>(null);\n const [searchQuery, setSearchQuery] = useState('');\n const [invitedContacts, setInvitedContacts] = useState<Set<string>>(new Set());\n\n // Get contacts from config\n const contacts = useMemo(() => {\n if (!inviteContactsConfig?.contacts || inviteContactsConfig.contacts.length === 0) {\n return [];\n }\n return sortContacts(inviteContactsConfig.contacts);\n }, [inviteContactsConfig?.contacts]);\n\n // Filter contacts based on search query\n const filteredContacts = useMemo(() => {\n if (!searchQuery.trim()) {\n return contacts;\n }\n const query = searchQuery.toLowerCase().trim();\n return contacts.filter(\n (contact) =>\n contact.name.toLowerCase().includes(query) ||\n contact.phoneNumber.includes(query)\n );\n }, [contacts, searchQuery]);\n\n // Extract customization from block settings (editor) or config props, with defaults\n const blockCustomizations = block?.settings?.customizations;\n const inviteYourContactsText =\n blockCustomizations?.inviteYourContactsText?.textContent ??\n inviteContactsConfig?.inviteYourContactsText ??\n 'Invite your contacts';\n const inviteButtonText =\n blockCustomizations?.inviteButton?.textContent ??\n inviteContactsConfig?.inviteButtonText ??\n 'Invite';\n const emptyStateMessage =\n blockCustomizations?.emptyStateMessage?.textContent ??\n inviteContactsConfig?.emptyStateMessage ??\n 'No contacts to invite';\n const smsMessage =\n blockCustomizations?.smsMessage?.textContent ??\n smsMessageTemplate ??\n 'Check this out! {{link}}';\n\n // Helper to get theme option value from block.theme.options\n const getBlockThemeValue = (key: string): string | undefined => {\n const options = block?.theme?.options;\n if (!options || !Array.isArray(options)) return undefined;\n const option = options.find((opt: any) => opt.key === key);\n return option?.value || undefined;\n };\n\n // Theme colors with defaults\n const colors = {\n primaryBackground: theme?.primaryBackground ?? '#6291d5',\n primaryForeground: theme?.primaryForeground ?? '#ffffff',\n secondaryBackground: theme?.secondaryBackground ?? '#ffffff',\n secondaryForeground: theme?.secondaryForeground ?? '#353e5c',\n foreground: theme?.foreground ?? '#334153',\n border: theme?.border ?? '#cccccc',\n };\n\n // Button styles from block.theme.options (microTheme)\n const inviteButtonStyles = {\n background: getBlockThemeValue('--vrtx-invite-contacts-invite-button-background') || colors.primaryBackground,\n color: getBlockThemeValue('--vrtx-invite-contacts-invite-button-color') || colors.primaryForeground,\n borderRadius: getBlockThemeValue('--vrtx-invite-contacts-invite-button-border-radius'),\n border: getBlockThemeValue('--vrtx-invite-contacts-invite-button-border'),\n padding: getBlockThemeValue('--vrtx-invite-contacts-invite-button-padding'),\n fontSize: getBlockThemeValue('--vrtx-invite-contacts-invite-button-font-size'),\n fontWeight: getBlockThemeValue('--vrtx-invite-contacts-invite-button-font-weight'),\n };\n\n // Avatar/initials styles from block.theme.options (microTheme)\n const avatarStyles = {\n background: getBlockThemeValue('--vrtx-invite-contacts-avatar-background') || colors.primaryBackground,\n color: getBlockThemeValue('--vrtx-invite-contacts-avatar-color') || colors.primaryForeground,\n };\n\n // Contact name styles from block.theme.options (microTheme)\n const contactNameStyles = {\n color: getBlockThemeValue('--vrtx-invite-contacts-name-color') || colors.foreground,\n fontFamily: getBlockThemeValue('--vrtx-invite-contacts-name-font-family'),\n fontSize: getBlockThemeValue('--vrtx-invite-contacts-name-font-size'),\n fontWeight: getBlockThemeValue('--vrtx-invite-contacts-name-font-weight'),\n };\n\n // Contact phone/subtitle styles from block.theme.options (microTheme)\n const contactPhoneStyles = {\n color: getBlockThemeValue('--vrtx-invite-contacts-subtitle-color') || colors.secondaryForeground,\n fontFamily: getBlockThemeValue('--vrtx-invite-contacts-subtitle-font-family'),\n fontSize: getBlockThemeValue('--vrtx-invite-contacts-subtitle-font-size'),\n };\n\n // Title styles from block.theme.options (microTheme) - for \"Invite your contacts\" text\n const titleStyles = {\n color: getBlockThemeValue('--vrtx-invite-contacts-title-color') || colors.foreground,\n fontFamily: getBlockThemeValue('--vrtx-invite-contacts-title-font-family'),\n fontSize: getBlockThemeValue('--vrtx-invite-contacts-title-font-size'),\n fontWeight: getBlockThemeValue('--vrtx-invite-contacts-title-font-weight'),\n };\n\n // Handle navigation to contacts list\n const handleNavigateToContacts = useCallback(async () => {\n await triggerHaptic?.('light');\n setShowContactsList(true);\n inviteContactsConfig?.onNavigateToContacts?.();\n }, [triggerHaptic, inviteContactsConfig]);\n\n // Handle navigation back from contacts list\n const handleNavigateBack = useCallback(async () => {\n await triggerHaptic?.('light');\n setShowContactsList(false);\n setSearchQuery('');\n inviteContactsConfig?.onNavigateBack?.();\n }, [triggerHaptic, inviteContactsConfig]);\n\n // Handle Invite button press\n const handleInvite = useCallback(\n async (contact: InviteContactsContact) => {\n setActionInProgress(contact.id);\n await triggerHaptic?.('light');\n\n try {\n // Create SMS invitation and get short link\n let shortLink: string | null = null;\n if (createSmsInvitation) {\n shortLink = await createSmsInvitation(contact.phoneNumber, contact.name);\n }\n\n if (shortLink) {\n // Replace {{link}} placeholder with actual link\n const message = smsMessage.replace('{{link}}', shortLink);\n\n // Open SMS app with pre-filled message\n const smsUrl = Platform.select({\n ios: `sms:${contact.phoneNumber}&body=${encodeURIComponent(message)}`,\n android: `sms:${contact.phoneNumber}?body=${encodeURIComponent(message)}`,\n default: `sms:${contact.phoneNumber}?body=${encodeURIComponent(message)}`,\n });\n\n await Linking.openURL(smsUrl);\n\n // Mark contact as invited\n setInvitedContacts((prev) => new Set(prev).add(contact.id));\n\n // Call optional callback for custom handling\n await inviteContactsConfig?.onInvite?.(contact, shortLink);\n\n // Notify other components that an invitation was created (for refresh)\n inviteContactsConfig?.onInvitationCreated?.(contact, shortLink);\n } else {\n console.warn('[VrtxInviteContacts] Failed to create SMS invitation - no short link returned');\n }\n } catch (err) {\n console.error('[VrtxInviteContacts] Invite failed:', err);\n } finally {\n setActionInProgress(null);\n }\n },\n [createSmsInvitation, triggerHaptic, inviteContactsConfig, smsMessage]\n );\n\n // Render avatar or initials\n const renderAvatar = (contact: InviteContactsContact) => {\n if (contact.avatarUrl) {\n return <Image source={{ uri: contact.avatarUrl }} style={styles.avatar} />;\n }\n\n // Generate initials from name\n const initials = contact.name\n .split(' ')\n .map((part) => part[0])\n .join('')\n .toUpperCase()\n .slice(0, 2);\n\n // Handle avatar background with gradient support\n const avatarBackground = avatarStyles.background;\n const isAvatarGradient = avatarBackground?.includes('linear-gradient');\n const avatarBgStyle: any = {};\n\n if (isWeb && avatarBackground) {\n avatarBgStyle.background = avatarBackground;\n } else if (isAvatarGradient && avatarBackground) {\n const fallbackColor = parseGradientFirstColor(avatarBackground);\n avatarBgStyle.backgroundColor = fallbackColor || colors.primaryBackground;\n } else {\n avatarBgStyle.backgroundColor = avatarBackground || colors.primaryBackground;\n }\n\n return (\n <View style={[styles.avatarPlaceholder, avatarBgStyle]}>\n <Text style={[styles.avatarInitials, { color: avatarStyles.color }]}>{initials}</Text>\n </View>\n );\n };\n\n // Helper to parse CSS padding string to React Native padding object\n const parsePadding = (paddingStr: string | undefined) => {\n if (!paddingStr) return {};\n const parts = paddingStr.trim().split(/\\s+/);\n if (parts.length === 1) {\n const val = parseInt(parts[0], 10);\n return isNaN(val) ? {} : { paddingVertical: val, paddingHorizontal: val };\n }\n if (parts.length === 2) {\n const vertical = parseInt(parts[0], 10);\n const horizontal = parseInt(parts[1], 10);\n return {\n ...(isNaN(vertical) ? {} : { paddingVertical: vertical }),\n ...(isNaN(horizontal) ? {} : { paddingHorizontal: horizontal }),\n };\n }\n return {};\n };\n\n // Helper to parse border string (e.g., \"1px solid #ccc\")\n const parseBorder = (borderStr: string | undefined) => {\n if (!borderStr) return {};\n const match = borderStr.match(/^(\\d+)px\\s+(\\w+)\\s+(.+)$/);\n if (match) {\n return {\n borderWidth: parseInt(match[1], 10),\n borderColor: match[3],\n };\n }\n return {};\n };\n\n // Render a single contact item\n const renderContactItem = ({ item }: { item: InviteContactsContact }) => {\n const isLoading = actionInProgress === item.id;\n const isInvited = invitedContacts.has(item.id);\n\n // Build dynamic button style\n const backgroundValue = inviteButtonStyles.background;\n const isGradient = backgroundValue?.includes('linear-gradient');\n\n const dynamicButtonStyle: any = {\n ...(inviteButtonStyles.borderRadius ? { borderRadius: parseInt(inviteButtonStyles.borderRadius, 10) } : {}),\n ...parsePadding(inviteButtonStyles.padding),\n ...parseBorder(inviteButtonStyles.border),\n };\n\n if (isWeb && backgroundValue) {\n dynamicButtonStyle.background = backgroundValue;\n } else if (isGradient && backgroundValue) {\n const fallbackColor = parseGradientFirstColor(backgroundValue);\n dynamicButtonStyle.backgroundColor = fallbackColor || colors.primaryBackground;\n } else {\n dynamicButtonStyle.backgroundColor = backgroundValue || colors.primaryBackground;\n }\n\n // Build dynamic text style\n const dynamicTextStyle: any = {\n color: inviteButtonStyles.color,\n ...(inviteButtonStyles.fontSize ? { fontSize: parseInt(inviteButtonStyles.fontSize, 10) } : {}),\n ...(inviteButtonStyles.fontWeight ? { fontWeight: inviteButtonStyles.fontWeight } : {}),\n };\n\n // Build dynamic contact name style\n const dynamicNameStyle: any = {\n color: contactNameStyles.color,\n ...(contactNameStyles.fontFamily ? { fontFamily: contactNameStyles.fontFamily } : {}),\n ...(contactNameStyles.fontSize ? { fontSize: parseInt(contactNameStyles.fontSize, 10) } : {}),\n ...(contactNameStyles.fontWeight ? { fontWeight: contactNameStyles.fontWeight } : {}),\n };\n\n // Build dynamic contact phone style\n const dynamicPhoneStyle: any = {\n color: contactPhoneStyles.color,\n ...(contactPhoneStyles.fontFamily ? { fontFamily: contactPhoneStyles.fontFamily } : {}),\n ...(contactPhoneStyles.fontSize ? { fontSize: parseInt(contactPhoneStyles.fontSize, 10) } : {}),\n };\n\n return (\n <View style={styles.contactItem}>\n {renderAvatar(item)}\n <View style={styles.contactInfo}>\n <Text style={[styles.contactName, dynamicNameStyle]} numberOfLines={1}>\n {item.name}\n </Text>\n <Text style={[styles.contactPhone, dynamicPhoneStyle]} numberOfLines={1}>\n {item.phoneNumber}\n </Text>\n </View>\n <ButtonWrapper\n style={[\n styles.actionButton,\n dynamicButtonStyle,\n isInvited && styles.actionButtonInvited,\n ]}\n gradientString={inviteButtonStyles.background?.includes('gradient') ? inviteButtonStyles.background : null}\n onPress={() => handleInvite(item)}\n disabled={isLoading}\n >\n {isLoading ? (\n <ActivityIndicator size=\"small\" color={inviteButtonStyles.color} />\n ) : (\n <Text style={[styles.actionButtonText, dynamicTextStyle]}>\n {isInvited ? '✓' : inviteButtonText}\n </Text>\n )}\n </ButtonWrapper>\n </View>\n );\n };\n\n // Render the \"Invite your contacts\" entry row\n const renderInviteContactsEntry = () => {\n // Build dynamic title style\n const dynamicTitleStyle: any = {\n color: titleStyles.color,\n ...(titleStyles.fontFamily ? { fontFamily: titleStyles.fontFamily } : {}),\n ...(titleStyles.fontSize ? { fontSize: parseInt(titleStyles.fontSize, 10) } : {}),\n ...(titleStyles.fontWeight ? { fontWeight: titleStyles.fontWeight } : {}),\n };\n\n return (\n <TouchableOpacity\n style={styles.inviteContactsEntry}\n onPress={handleNavigateToContacts}\n activeOpacity={0.7}\n >\n <View style={styles.inviteContactsEntryContent}>\n <Text style={[styles.inviteContactsEntryText, dynamicTitleStyle]}>\n {inviteYourContactsText}\n </Text>\n </View>\n <Text style={[styles.chevronIcon, dynamicTitleStyle]}>›</Text>\n </TouchableOpacity>\n );\n };\n\n // Render the back header for contacts list\n const renderContactsHeader = () => {\n return (\n <View>\n <TouchableOpacity\n style={styles.backHeader}\n onPress={handleNavigateBack}\n activeOpacity={0.7}\n >\n <Text style={[styles.backChevron, { color: colors.secondaryForeground }]}>‹</Text>\n <Text style={[styles.backText, { color: colors.foreground }]}>Back</Text>\n </TouchableOpacity>\n <View style={[styles.searchContainer, { borderColor: colors.border }]}>\n <TextInput\n style={[styles.searchInput, { color: colors.foreground }]}\n placeholder=\"Search contacts...\"\n placeholderTextColor={colors.secondaryForeground}\n value={searchQuery}\n onChangeText={setSearchQuery}\n autoCapitalize=\"none\"\n autoCorrect={false}\n />\n </View>\n </View>\n );\n };\n\n // If no contacts provided or empty list, render nothing (no height)\n if (!inviteContactsConfig || contacts.length === 0) {\n return null;\n }\n\n // Contacts list view\n // Note: Using View + map instead of FlatList to avoid \"VirtualizedLists should never be nested\" warning\n // when this component is rendered inside a ScrollView (which InviteFormCore uses)\n if (showContactsList) {\n return (\n <View style={styles.listContainer}>\n {renderContactsHeader()}\n <View style={styles.listContent}>\n {filteredContacts.length === 0 ? (\n <View style={styles.emptyContainer}>\n <Text style={[styles.emptyText, { color: colors.secondaryForeground }]}>\n {searchQuery ? 'No contacts match your search' : emptyStateMessage}\n </Text>\n </View>\n ) : (\n filteredContacts.map((item) => (\n <View key={item.id}>\n {renderContactItem({ item })}\n </View>\n ))\n )}\n </View>\n </View>\n );\n }\n\n // Main view: \"Invite your contacts\" entry\n return (\n <View style={styles.entryContainer}>\n {renderInviteContactsEntry()}\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n entryContainer: {\n // No padding - let the entry take minimal space\n },\n listContainer: {\n flex: 1,\n },\n emptyContainer: {\n padding: 16,\n alignItems: 'center',\n justifyContent: 'center',\n },\n emptyText: {\n fontSize: 14,\n textAlign: 'center',\n },\n listContent: {\n paddingBottom: 16,\n },\n contactItem: {\n flexDirection: 'row',\n alignItems: 'center',\n paddingVertical: 12,\n },\n avatar: {\n width: 44,\n height: 44,\n borderRadius: 22,\n },\n avatarPlaceholder: {\n width: 44,\n height: 44,\n borderRadius: 22,\n alignItems: 'center',\n justifyContent: 'center',\n },\n avatarInitials: {\n fontSize: 16,\n fontWeight: '600',\n },\n contactInfo: {\n flex: 1,\n marginLeft: 12,\n marginRight: 12,\n },\n contactName: {\n fontSize: 16,\n fontWeight: '500',\n },\n contactPhone: {\n fontSize: 13,\n marginTop: 2,\n },\n actionButton: {\n paddingHorizontal: 16,\n paddingVertical: 8,\n borderRadius: 8,\n minWidth: 80,\n alignItems: 'center',\n justifyContent: 'center',\n },\n actionButtonInvited: {\n opacity: 0.7,\n },\n actionButtonText: {\n fontSize: 14,\n fontWeight: '600',\n },\n // \"Invite your contacts\" entry styles\n inviteContactsEntry: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n paddingVertical: 16,\n },\n inviteContactsEntryContent: {\n flexDirection: 'row',\n alignItems: 'center',\n flex: 1,\n },\n inviteContactsEntryText: {\n fontSize: 16,\n fontWeight: '500',\n },\n inviteContactsEntryCount: {\n fontSize: 14,\n marginLeft: 8,\n opacity: 0.7,\n },\n inviteContactsEntryCountSpacing: {\n marginLeft: 8,\n },\n chevronIcon: {\n fontSize: 24,\n fontWeight: '300',\n marginLeft: 8,\n opacity: 0.75,\n },\n // Back header styles\n backHeader: {\n flexDirection: 'row',\n alignItems: 'center',\n paddingVertical: 12,\n marginBottom: 8,\n },\n backChevron: {\n fontSize: 24,\n fontWeight: '300',\n marginRight: 4,\n },\n backText: {\n fontSize: 16,\n fontWeight: '500',\n },\n // Search box styles\n searchContainer: {\n borderWidth: 1,\n borderRadius: 8,\n marginBottom: 12,\n },\n searchInput: {\n paddingHorizontal: 12,\n paddingVertical: 10,\n fontSize: 16,\n },\n});\n","import React from 'react';\nimport { View, Text, StyleSheet, Platform } from 'react-native';\n\nconst isWeb = Platform.OS === 'web';\n\nexport interface VrtxHeadingProps {\n block: any;\n}\n\n/**\n * Process text gradients for headings\n * Converts gradient color values to background-clip: text style (web only)\n */\nfunction processTextGradient(style: any) {\n if (!style) return style;\n\n const processedStyle = { ...style };\n const colorValue = processedStyle.color as string | undefined;\n\n // Handle text gradients on web\n if (isWeb && colorValue && typeof colorValue === 'string' && colorValue.includes('linear-gradient')) {\n // Use backgroundImage instead of background to avoid resetting backgroundClip\n processedStyle.backgroundImage = colorValue;\n processedStyle.backgroundColor = 'transparent'; // Ensure solid background doesn't interfere\n processedStyle.WebkitBackgroundClip = 'text';\n processedStyle.backgroundClip = 'text';\n processedStyle.WebkitTextFillColor = 'transparent';\n processedStyle.color = 'transparent'; // Fallback\n // Always set display to inline-block for gradients to render properly\n processedStyle.display = 'inline-block';\n }\n\n return processedStyle;\n}\n\nexport function VrtxHeading({ block }: VrtxHeadingProps) {\n const overrideTagName = block.settings?.overrideTagName || 'h1';\n const textContent = block.textContent || '';\n\n // Map heading levels to font sizes and weights\n const headingStyles: Record<string, any> = {\n h1: { fontSize: 24, fontWeight: '700', marginBottom: 16 },\n h2: { fontSize: 20, fontWeight: '700', marginBottom: 14 },\n h3: { fontSize: 18, fontWeight: '600', marginBottom: 12 },\n h4: { fontSize: 16, fontWeight: '600', marginBottom: 10 },\n h5: { fontSize: 14, fontWeight: '600', marginBottom: 8 },\n h6: { fontSize: 12, fontWeight: '600', marginBottom: 8 },\n };\n\n const headingStyle = headingStyles[overrideTagName] || headingStyles.h1;\n\n // Process gradient styles\n const processedBlockStyle = processTextGradient(block.style);\n\n return (\n <View key={block.id}>\n <Text style={[headingStyle, processedBlockStyle || {}]}>{textContent}</Text>\n </View>\n );\n}\n\n// const styles = StyleSheet.create({\n// heading: {\n// color: '#000',\n// },\n// });\n","import React, { useRef, useEffect, useCallback } from 'react';\nimport { View, Text, StyleSheet, Platform } from 'react-native';\n\nconst isWeb = Platform.OS === 'web';\n\nexport interface VrtxTextProps {\n block: any;\n isEditMode?: boolean;\n onUpdate?: (blockId: string, updates: any) => void;\n}\n\nconst VrtxTextComponent = ({ block, isEditMode = false, onUpdate }: VrtxTextProps) => {\n // Strip HTML tags to get plain text\n const stripHtml = (html: string) => {\n if (!html) return '';\n const tmp = document.createElement('div');\n tmp.innerHTML = html;\n return tmp.textContent || tmp.innerText || '';\n };\n\n // Process styles for text gradients\n const processTextGradient = (style: any) => {\n if (!style) return style;\n\n const processedStyle = { ...style };\n const colorValue = processedStyle.color as string | undefined;\n\n // Handle text gradients on web\n if (isWeb && colorValue && typeof colorValue === 'string' && colorValue.includes('linear-gradient')) {\n // Use backgroundImage instead of background to avoid resetting backgroundClip\n processedStyle.backgroundImage = colorValue;\n processedStyle.backgroundColor = 'transparent'; // Ensure solid background doesn't interfere\n processedStyle.WebkitBackgroundClip = 'text';\n processedStyle.backgroundClip = 'text';\n processedStyle.WebkitTextFillColor = 'transparent';\n processedStyle.color = 'transparent'; // Fallback\n // Always set display to inline-block for gradients to render properly\n processedStyle.display = 'inline-block';\n }\n\n return processedStyle;\n };\n\n const textContent = isWeb ? stripHtml(block.textContent || '') : block.textContent || '';\n const divRef = useRef<HTMLDivElement | null>(null);\n const blockIdRef = useRef<string>(block.id);\n const updateTimeoutRef = useRef<NodeJS.Timeout | null>(null);\n const onUpdateRef = useRef(onUpdate);\n const initializedRef = useRef(false);\n\n // Keep onUpdateRef in sync with latest onUpdate\n useEffect(() => {\n onUpdateRef.current = onUpdate;\n }, [onUpdate]);\n\n // Initialize content ONCE using ref callback instead of useEffect\n const refCallback = useCallback(\n (element: HTMLDivElement | null) => {\n if (!element || !isWeb || !isEditMode) return;\n\n // Store ref\n divRef.current = element;\n\n // Only initialize once or when block ID changes\n if (!initializedRef.current || blockIdRef.current !== block.id) {\n console.log('🆕 Initializing contentEditable with:', block.textContent);\n element.innerHTML = block.textContent || '';\n blockIdRef.current = block.id;\n initializedRef.current = true;\n }\n },\n [block.id, block.textContent, isWeb, isEditMode]\n );\n\n // Cleanup timeout on unmount\n useEffect(() => {\n return () => {\n if (updateTimeoutRef.current) {\n clearTimeout(updateTimeoutRef.current);\n updateTimeoutRef.current = null;\n }\n };\n }, []);\n\n // On web + edit mode, use contentEditable div\n if (isWeb && isEditMode) {\n return (\n <View>\n <div\n key={`editable-${block.id}`}\n ref={refCallback}\n contentEditable\n suppressContentEditableWarning\n data-block-id={block.id}\n data-text-editable=\"true\"\n onInput={(e: any) => {\n // Debounced auto-save on input\n if (updateTimeoutRef.current) {\n clearTimeout(updateTimeoutRef.current);\n }\n\n const newHtml = e.currentTarget.innerHTML || '';\n console.log('⌨️ Input changed:', newHtml);\n\n // Save after 1 second of no typing\n updateTimeoutRef.current = setTimeout(() => {\n console.log('💾 Auto-saving:', newHtml);\n onUpdateRef.current?.(block.id, {\n textContent: newHtml,\n });\n }, 1000);\n }}\n style={{\n outline: 'none',\n cursor: 'text',\n minHeight: '1em',\n whiteSpace: 'pre-wrap',\n ...processTextGradient(block.style),\n }}\n />\n </View>\n );\n }\n\n // Native rendering or web non-edit mode\n return (\n <View>\n <Text style={[styles.text, block.style ? processTextGradient(block.style) : {}]}>{textContent}</Text>\n </View>\n );\n};\n\n// Memo with custom comparison to prevent re-renders when block reference changes but content is the same\nexport const VrtxText = React.memo(VrtxTextComponent, (prevProps, nextProps) => {\n const sameBlock = prevProps.block.id === nextProps.block.id;\n const sameEditMode = prevProps.isEditMode === nextProps.isEditMode;\n const sameOnUpdate = prevProps.onUpdate === nextProps.onUpdate;\n\n // In edit mode, IGNORE textContent changes in block prop\n // The DOM contentEditable is the source of truth, not the Redux state\n // We only care if the block ID changes (switching to a different block)\n const shouldNotRerender = sameBlock && sameEditMode && sameOnUpdate;\n\n return shouldNotRerender;\n});\n\nconst styles = StyleSheet.create({\n text: {\n fontSize: 14,\n lineHeight: 20,\n color: '#000',\n },\n});\n","import React from 'react';\nimport { View, Text, StyleSheet } from 'react-native';\n\nexport interface VrtxSelectProps {\n block: any;\n}\n\nexport function VrtxSelect({ block }: VrtxSelectProps) {\n // Simple select - would need proper state management for production\n return (\n <View key={block.id} style={styles.section}>\n <Text style={styles.subtitle}>{block.attributes?.label || 'Select an option'}</Text>\n {/* Placeholder - would render actual select component */}\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n section: {\n marginBottom: 24,\n },\n subtitle: {\n fontSize: 16,\n color: '#666',\n marginBottom: 16,\n },\n});\n","import React from 'react';\nimport { View, Text, TouchableOpacity, ActivityIndicator, StyleSheet, ViewStyle, Platform } from 'react-native';\nimport type { ViewType } from '../hooks/useInvitationFormLogic';\nimport { useVortexModules } from '../context/VortexModulesContext';\n\nconst isWeb = Platform.OS === 'web';\n\n// Button wrapper component that handles gradients on web, native gradient libraries, or solid color fallback\ninterface ButtonWrapperProps {\n children: React.ReactNode;\n style: ViewStyle | ViewStyle[];\n gradientString: string | null;\n onPress?: () => void;\n disabled?: boolean;\n}\n\nconst ButtonWrapper: React.FC<ButtonWrapperProps> = ({\n children,\n style,\n gradientString,\n onPress,\n disabled,\n}) => {\n // Get the gradient module and loaders from context\n const { gradientModule, loaders } = useVortexModules();\n const styleArray = Array.isArray(style) ? style : [style];\n\n // On web, use CSS gradients directly\n if (gradientString && isWeb) {\n return (\n <TouchableOpacity\n style={[...styleArray, { background: gradientString } as any]}\n onPress={onPress}\n disabled={disabled}\n activeOpacity={0.7}\n >\n {children}\n </TouchableOpacity>\n );\n }\n\n // On native, try to use gradient library if specified\n if (gradientString && gradientModule && loaders) {\n const GradientComponent = loaders.loadGradientComponent(gradientModule);\n const parsed = loaders.parseCSSLinearGradient(gradientString);\n\n if (GradientComponent && parsed) {\n const points = loaders.angleToGradientPoints(parsed.angle);\n\n return (\n <TouchableOpacity\n onPress={onPress}\n disabled={disabled}\n activeOpacity={0.7}\n >\n <GradientComponent\n colors={parsed.colors}\n locations={parsed.locations}\n start={points.start}\n end={points.end}\n style={styleArray}\n >\n {children}\n </GradientComponent>\n </TouchableOpacity>\n );\n }\n }\n\n // Fallback: solid color from first gradient stop\n const fallbackColor = gradientString && loaders ? loaders.parseGradientFirstColor(gradientString) : null;\n const finalStyle = fallbackColor ? [...styleArray, { backgroundColor: fallbackColor }] : styleArray;\n\n return (\n <TouchableOpacity\n style={finalStyle}\n onPress={onPress}\n disabled={disabled}\n activeOpacity={0.7}\n >\n {children}\n </TouchableOpacity>\n );\n};\n\nexport interface VrtxSubmitProps {\n block: any;\n view: ViewType;\n handleSendInvitation: () => Promise<void>;\n triggerHaptic?: (style: 'light' | 'medium' | 'heavy') => Promise<void>;\n loadingEmailInvite: boolean;\n sendSuccess: boolean;\n /** Number of emails currently in the pill list (for singular/plural button label) */\n emailCount?: number;\n /** Mobile-specific customizations from the vrtx-email-invitations block */\n emailBlockCustomizations?: Record<string, any>;\n /** Style from the email invitations block (to match \"Add by Email\" button appearance) */\n emailBlockStyle?: Record<string, any>;\n}\n\nexport function VrtxSubmit({\n block,\n view,\n handleSendInvitation,\n triggerHaptic,\n loadingEmailInvite,\n sendSuccess,\n emailCount = 0,\n emailBlockCustomizations,\n emailBlockStyle,\n}: VrtxSubmitProps) {\n // Get loaders from context\n const { loaders } = useVortexModules();\n\n if (view !== 'email') return null;\n\n const handleSendInvitationWithHaptics = async () => {\n await triggerHaptic?.('light');\n await handleSendInvitation();\n };\n\n // Use email block style to match the \"Add by Email\" button appearance\n // Fall back to submit block's own style if no email block style provided\n const effectiveStyle = emailBlockStyle && Object.keys(emailBlockStyle).length > 0\n ? emailBlockStyle\n : (block?.style || {});\n\n // Extract gradient string and fallback color\n // On native, 'background' is a CSS property that doesn't work — convert solid colors to 'backgroundColor'\n const rawBackground = effectiveStyle.background || null;\n const isGradient = rawBackground?.includes('gradient');\n const gradientString = isGradient ? rawBackground : null;\n const fallbackColor = isGradient\n ? loaders?.parseGradientFirstColor(rawBackground)\n : rawBackground || effectiveStyle.backgroundColor;\n\n // Extract text color — for email block style, default to dark text like \"Add by Email\" button\n const textColor = effectiveStyle.color || (emailBlockStyle ? '#333' : '#fff');\n\n return (\n <View key={block.id}>\n {sendSuccess ? (\n <View style={styles.successMessageContainer}>\n <Text style={styles.invitedText}>✓ {emailBlockCustomizations?.['mobile.successMessage']?.textContent || 'Invitation sent successfully!'}</Text>\n </View>\n ) : (\n <ButtonWrapper\n style={[\n styles.button,\n styles.fullButton,\n {\n borderWidth: 1,\n borderColor: '#e0e0e0',\n },\n effectiveStyle,\n fallbackColor ? { backgroundColor: fallbackColor } : undefined,\n ]}\n gradientString={gradientString}\n onPress={handleSendInvitationWithHaptics}\n disabled={loadingEmailInvite}\n >\n {loadingEmailInvite ? (\n <ActivityIndicator size=\"small\" color={textColor} />\n ) : (\n <Text style={[styles.buttonText, { color: textColor }]}>\n {(() => {\n // Mobile-specific labels from vrtx-email-invitations block customizations\n // Defaults match elementRegistry: 'Send Invitation' / 'Send Invitations'\n const singularLabel =\n emailBlockCustomizations?.['mobile.sendButton']?.textContent || 'Send Invitation';\n const pluralLabel =\n emailBlockCustomizations?.['mobile.sendButtonPlural']?.textContent || 'Send Invitations';\n return emailCount > 1 ? pluralLabel : singularLabel;\n })()}\n </Text>\n )}\n </ButtonWrapper>\n )}\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n successMessageContainer: {\n padding: 16,\n backgroundColor: '#e8f5e9',\n borderRadius: 8,\n alignItems: 'center',\n },\n invitedText: {\n color: '#2e7d32',\n fontSize: 16,\n fontWeight: '600',\n },\n button: {\n paddingVertical: 12,\n paddingHorizontal: 16,\n borderRadius: 8,\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 8,\n backgroundColor: '#f5f5f5',\n },\n fullButton: {\n width: '100%',\n },\n buttonText: {\n color: '#333',\n fontSize: 16,\n fontWeight: '500',\n },\n});\n","import React, { useState, useCallback } from 'react';\nimport {\n View,\n Text,\n StyleSheet,\n FlatList,\n TouchableOpacity,\n ActivityIndicator,\n Image,\n TextInput,\n Platform,\n} from 'react-native';\nimport { FindFriendsContact } from '../types/findFriends';\nimport { SearchBoxConfig } from '../types/searchBox';\nimport type { SimpleAnalyticsEvent } from '../utils/analytics';\nimport type { IconRendererProps } from './InviteFormCore';\n\nconst isWeb = Platform.OS === 'web';\n\n// Parse CSS linear-gradient to extract first color for fallback on native\nfunction parseGradientFirstColor(gradientString: string): string | null {\n if (!gradientString || !gradientString.includes('linear-gradient')) {\n return null;\n }\n\n const stopsRegex = /(rgba?\\([^)]+\\)|#[0-9a-fA-F]{3,8}|[a-z]+)\\s+(\\d+)%/i;\n const match = stopsRegex.exec(gradientString);\n\n if (match) {\n return match[1].trim();\n }\n\n return null;\n}\n\nexport interface VrtxSearchBoxProps {\n block: any;\n /** Search Box configuration with callbacks */\n searchBoxConfig?: SearchBoxConfig;\n /** Function to create an invitation with internal ID target type */\n createUserIdInvitation?: (userId: string, name?: string, avatarUrl?: string, metadata?: Record<string, unknown>) => Promise<void>;\n /** Trigger haptic feedback */\n triggerHaptic?: (style: 'light' | 'medium' | 'heavy') => Promise<void>;\n /** Callback to emit analytics events */\n onAnalyticsEvent?: (event: SimpleAnalyticsEvent) => void;\n /** Function to render icons (from InviteFormCore) */\n renderIcon?: (props: IconRendererProps) => React.ReactNode;\n /** Theme colors from widget configuration */\n theme?: {\n primaryBackground?: string;\n primaryForeground?: string;\n secondaryBackground?: string;\n secondaryForeground?: string;\n foreground?: string;\n border?: string;\n };\n}\n\nexport function VrtxSearchBox({\n block,\n searchBoxConfig,\n createUserIdInvitation,\n triggerHaptic,\n onAnalyticsEvent,\n renderIcon,\n theme,\n}: VrtxSearchBoxProps) {\n const [query, setQuery] = useState('');\n const [results, setResults] = useState<FindFriendsContact[] | null>(null);\n const [isSearching, setIsSearching] = useState(false);\n const [actionInProgress, setActionInProgress] = useState<string | null>(null);\n\n // Get title from block title attribute (configured in Styles tab)\n const title = block?.attributes?.title || '';\n\n // Extract customization from block settings (editor) or config props, with defaults\n const blockCustomizations = block?.settings?.customizations;\n const placeholder =\n blockCustomizations?.searchPlaceholder?.textContent ??\n 'Search...';\n const connectButtonText =\n blockCustomizations?.connectButton?.textContent ??\n searchBoxConfig?.connectButtonText ??\n 'Connect';\n const noResultsMessage =\n blockCustomizations?.noResultsMessage?.textContent ??\n searchBoxConfig?.noResultsMessage ??\n 'No results found';\n\n // Helper to get theme option value from block.theme.options\n const getBlockThemeValue = (key: string): string | undefined => {\n const options = block?.theme?.options;\n if (!options || !Array.isArray(options)) return undefined;\n const option = options.find((opt: any) => opt.key === key);\n return option?.value || undefined;\n };\n\n // Theme colors with defaults\n const colors = {\n primaryBackground: theme?.primaryBackground ?? '#6291d5',\n primaryForeground: theme?.primaryForeground ?? '#ffffff',\n secondaryBackground: theme?.secondaryBackground ?? '#ffffff',\n secondaryForeground: theme?.secondaryForeground ?? '#353e5c',\n foreground: theme?.foreground ?? '#334153',\n border: theme?.border ?? '#cccccc',\n };\n\n // Button styles from block.theme.options (microTheme)\n const connectButtonStyles = {\n background:\n getBlockThemeValue('--vrtx-search-box-connect-button-background') ||\n colors.primaryBackground,\n color:\n getBlockThemeValue('--vrtx-search-box-connect-button-color') ||\n colors.primaryForeground,\n borderRadius: getBlockThemeValue('--vrtx-search-box-connect-button-border-radius'),\n border: getBlockThemeValue('--vrtx-search-box-connect-button-border'),\n padding: getBlockThemeValue('--vrtx-search-box-connect-button-padding'),\n fontSize: getBlockThemeValue('--vrtx-search-box-connect-button-font-size'),\n fontWeight: getBlockThemeValue('--vrtx-search-box-connect-button-font-weight'),\n };\n\n // Avatar/initials styles from block.theme.options (microTheme)\n const avatarStyles = {\n background:\n getBlockThemeValue('--vrtx-search-box-avatar-background') || colors.primaryBackground,\n color: getBlockThemeValue('--vrtx-search-box-avatar-color') || colors.primaryForeground,\n };\n\n // Contact name styles from block.theme.options (microTheme)\n const contactNameStyles = {\n color: getBlockThemeValue('--vrtx-search-box-contact-name-color') || colors.foreground,\n fontFamily: getBlockThemeValue('--vrtx-search-box-contact-name-font-family'),\n fontSize: getBlockThemeValue('--vrtx-search-box-contact-name-font-size'),\n fontWeight: getBlockThemeValue('--vrtx-search-box-contact-name-font-weight'),\n };\n\n // Contact subtitle styles from block.theme.options (microTheme)\n const contactSubtitleStyles = {\n color:\n getBlockThemeValue('--vrtx-search-box-contact-subtitle-color') ||\n colors.secondaryForeground,\n fontFamily: getBlockThemeValue('--vrtx-search-box-contact-subtitle-font-family'),\n fontSize: getBlockThemeValue('--vrtx-search-box-contact-subtitle-font-size'),\n };\n\n // Title styles from block.theme.options (microTheme)\n const titleStyles = {\n color: getBlockThemeValue('--vrtx-search-box-title-color') || colors.foreground,\n fontFamily: getBlockThemeValue('--vrtx-search-box-title-font-family'),\n fontSize: getBlockThemeValue('--vrtx-search-box-title-font-size'),\n fontWeight: getBlockThemeValue('--vrtx-search-box-title-font-weight'),\n };\n\n // Search button styles from block.theme.options (microTheme)\n const searchButtonStyles = {\n background:\n getBlockThemeValue('--vrtx-search-box-search-button-background') ||\n colors.primaryBackground,\n color:\n getBlockThemeValue('--vrtx-search-box-search-button-color') ||\n colors.primaryForeground,\n borderRadius: getBlockThemeValue('--vrtx-search-box-search-button-border-radius'),\n border: getBlockThemeValue('--vrtx-search-box-search-button-border'),\n padding: getBlockThemeValue('--vrtx-search-box-search-button-padding'),\n };\n\n // Handle search button press\n const handleSearch = useCallback(async () => {\n if (!searchBoxConfig?.onSearch || !query.trim()) return;\n\n setIsSearching(true);\n try {\n const searchResults = await searchBoxConfig.onSearch(query.trim());\n setResults(searchResults);\n } catch (err) {\n console.error('[VrtxSearchBox] Search failed:', err);\n setResults([]);\n } finally {\n setIsSearching(false);\n }\n }, [searchBoxConfig, query]);\n\n // Handle Connect button press\n const handleConnect = useCallback(\n async (contact: FindFriendsContact) => {\n if (!searchBoxConfig?.onConnect) return;\n\n setActionInProgress(contact.userId);\n await triggerHaptic?.('light');\n\n try {\n const shouldCreateInvitation = await searchBoxConfig.onConnect(contact);\n\n if (shouldCreateInvitation && createUserIdInvitation) {\n await createUserIdInvitation(contact.userId, contact.name, contact.avatarUrl, contact.metadata);\n searchBoxConfig.onInvitationCreated?.(contact);\n }\n } catch (err) {\n console.error('[VrtxSearchBox] Connect failed:', err);\n searchBoxConfig.onInvitationError?.(\n contact,\n err instanceof Error ? err : new Error(String(err))\n );\n } finally {\n setActionInProgress(null);\n }\n },\n [searchBoxConfig, createUserIdInvitation, triggerHaptic]\n );\n\n // Render avatar or initials\n const renderAvatar = (contact: FindFriendsContact) => {\n if (contact.avatarUrl) {\n return <Image source={{ uri: contact.avatarUrl }} style={styles.avatar} />;\n }\n\n const initials = contact.name\n .split(' ')\n .map((part) => part[0])\n .join('')\n .toUpperCase()\n .slice(0, 2);\n\n const avatarBackground = avatarStyles.background;\n const isAvatarGradient = avatarBackground?.includes('linear-gradient');\n const avatarBgStyle: any = {};\n\n if (isWeb && avatarBackground) {\n avatarBgStyle.background = avatarBackground;\n } else if (isAvatarGradient && avatarBackground) {\n const fallbackColor = parseGradientFirstColor(avatarBackground);\n avatarBgStyle.backgroundColor = fallbackColor || colors.primaryBackground;\n } else {\n avatarBgStyle.backgroundColor = avatarBackground || colors.primaryBackground;\n }\n\n return (\n <View style={[styles.avatarPlaceholder, avatarBgStyle]}>\n <Text style={[styles.avatarInitials, { color: avatarStyles.color }]}>{initials}</Text>\n </View>\n );\n };\n\n // Helper to parse CSS padding string to React Native padding object\n const parsePadding = (paddingStr: string | undefined) => {\n if (!paddingStr) return {};\n const parts = paddingStr.trim().split(/\\s+/);\n if (parts.length === 1) {\n const val = parseInt(parts[0], 10);\n return isNaN(val) ? {} : { paddingVertical: val, paddingHorizontal: val };\n }\n if (parts.length === 2) {\n const vertical = parseInt(parts[0], 10);\n const horizontal = parseInt(parts[1], 10);\n return {\n ...(isNaN(vertical) ? {} : { paddingVertical: vertical }),\n ...(isNaN(horizontal) ? {} : { paddingHorizontal: horizontal }),\n };\n }\n return {};\n };\n\n // Helper to parse border string (e.g., \"1px solid #ccc\")\n const parseBorder = (borderStr: string | undefined) => {\n if (!borderStr) return {};\n const match = borderStr.match(/^(\\d+)px\\s+(\\w+)\\s+(.+)$/);\n if (match) {\n return {\n borderWidth: parseInt(match[1], 10),\n borderColor: match[3],\n };\n }\n return {};\n };\n\n // Render a single contact item\n const renderContactItem = ({ item }: { item: FindFriendsContact }) => {\n const isLoading = actionInProgress === item.userId;\n\n const backgroundValue = connectButtonStyles.background;\n const isGradient = backgroundValue?.includes('linear-gradient');\n\n const dynamicButtonStyle: any = {\n ...(connectButtonStyles.borderRadius\n ? { borderRadius: parseInt(connectButtonStyles.borderRadius, 10) }\n : {}),\n ...parsePadding(connectButtonStyles.padding),\n ...parseBorder(connectButtonStyles.border),\n };\n\n if (isWeb && backgroundValue) {\n dynamicButtonStyle.background = backgroundValue;\n } else if (isGradient && backgroundValue) {\n const fallbackColor = parseGradientFirstColor(backgroundValue);\n dynamicButtonStyle.backgroundColor = fallbackColor || colors.primaryBackground;\n } else {\n dynamicButtonStyle.backgroundColor = backgroundValue || colors.primaryBackground;\n }\n\n const dynamicTextStyle: any = {\n color: connectButtonStyles.color,\n ...(connectButtonStyles.fontSize\n ? { fontSize: parseInt(connectButtonStyles.fontSize, 10) }\n : {}),\n ...(connectButtonStyles.fontWeight ? { fontWeight: connectButtonStyles.fontWeight } : {}),\n };\n\n const dynamicNameStyle: any = {\n color: contactNameStyles.color,\n ...(contactNameStyles.fontFamily ? { fontFamily: contactNameStyles.fontFamily } : {}),\n ...(contactNameStyles.fontSize\n ? { fontSize: parseInt(contactNameStyles.fontSize, 10) }\n : {}),\n ...(contactNameStyles.fontWeight ? { fontWeight: contactNameStyles.fontWeight } : {}),\n };\n\n const dynamicSubtitleStyle: any = {\n color: contactSubtitleStyles.color,\n ...(contactSubtitleStyles.fontFamily\n ? { fontFamily: contactSubtitleStyles.fontFamily }\n : {}),\n ...(contactSubtitleStyles.fontSize\n ? { fontSize: parseInt(contactSubtitleStyles.fontSize, 10) }\n : {}),\n };\n\n return (\n <View style={styles.contactItem}>\n {renderAvatar(item)}\n <View style={styles.contactInfo}>\n <Text style={[styles.contactName, dynamicNameStyle]} numberOfLines={1}>\n {item.name}\n </Text>\n {item.subtitle && (\n <Text style={[styles.contactSubtitle, dynamicSubtitleStyle]} numberOfLines={1}>\n {item.subtitle}\n </Text>\n )}\n </View>\n <TouchableOpacity\n style={[styles.actionButton, dynamicButtonStyle]}\n onPress={() => handleConnect(item)}\n disabled={isLoading}\n activeOpacity={0.7}\n >\n {isLoading ? (\n <ActivityIndicator size=\"small\" color={connectButtonStyles.color} />\n ) : (\n <Text style={[styles.actionButtonText, dynamicTextStyle]}>{connectButtonText}</Text>\n )}\n </TouchableOpacity>\n </View>\n );\n };\n\n // Build dynamic title style\n const dynamicTitleStyle: any = {\n color: titleStyles.color,\n ...(titleStyles.fontFamily ? { fontFamily: titleStyles.fontFamily } : {}),\n ...(titleStyles.fontSize ? { fontSize: parseInt(titleStyles.fontSize, 10) } : {}),\n ...(titleStyles.fontWeight ? { fontWeight: titleStyles.fontWeight } : {}),\n };\n\n // Show placeholder if no config provided\n if (!searchBoxConfig) {\n return (\n <View style={styles.container}>\n {title ? (\n <Text style={[styles.title, dynamicTitleStyle]}>{title}</Text>\n ) : null}\n <Text style={[styles.placeholderText, { color: colors.secondaryForeground }]}>\n Search Box component - provide searchBoxConfig to enable\n </Text>\n </View>\n );\n }\n\n return (\n <View style={styles.listContainer}>\n {title ? (\n <Text style={[styles.title, dynamicTitleStyle]}>{title}</Text>\n ) : null}\n\n {/* Search input row */}\n <View style={styles.searchRow}>\n <View style={[styles.searchContainer, { borderColor: colors.border }]}>\n <TextInput\n style={[styles.searchInput, { color: colors.foreground }]}\n placeholder={placeholder}\n placeholderTextColor={colors.secondaryForeground}\n value={query}\n onChangeText={setQuery}\n onSubmitEditing={handleSearch}\n autoCapitalize=\"none\"\n autoCorrect={false}\n returnKeyType=\"search\"\n />\n </View>\n <TouchableOpacity\n style={[\n styles.searchButton,\n (() => {\n const btnStyle: any = {};\n const bg = searchButtonStyles.background;\n const isGradient = bg?.includes('linear-gradient');\n if (isWeb && bg) {\n btnStyle.background = bg;\n } else if (isGradient && bg) {\n const fallback = parseGradientFirstColor(bg);\n btnStyle.backgroundColor = fallback || colors.primaryBackground;\n } else {\n btnStyle.backgroundColor = bg || colors.primaryBackground;\n }\n if (searchButtonStyles.borderRadius) {\n btnStyle.borderRadius = parseInt(searchButtonStyles.borderRadius, 10);\n }\n if (searchButtonStyles.border) {\n const match = searchButtonStyles.border.match(/^(\\d+)px\\s+(\\w+)\\s+(.+)$/);\n if (match) {\n btnStyle.borderWidth = parseInt(match[1], 10);\n btnStyle.borderColor = match[3];\n }\n }\n if (searchButtonStyles.padding) {\n const val = parseInt(searchButtonStyles.padding, 10);\n if (!isNaN(val)) {\n btnStyle.padding = val;\n }\n }\n return btnStyle;\n })(),\n ]}\n onPress={handleSearch}\n disabled={isSearching || !query.trim()}\n activeOpacity={0.7}\n >\n {isSearching ? (\n <ActivityIndicator size=\"small\" color={searchButtonStyles.color} />\n ) : renderIcon ? (\n renderIcon({ name: 'search', size: 20, color: searchButtonStyles.color || '#ffffff' })\n ) : (\n <View style={styles.searchIconContainer}>\n <View\n style={[\n styles.searchIconCircle,\n {\n borderColor: searchButtonStyles.color || '#ffffff',\n },\n ]}\n />\n <View\n style={[\n styles.searchIconHandle,\n {\n backgroundColor: searchButtonStyles.color || '#ffffff',\n },\n ]}\n />\n </View>\n )}\n </TouchableOpacity>\n </View>\n\n {/* Results */}\n {results !== null && results.length === 0 && !isSearching && (\n <View style={styles.emptyContainer}>\n <Text style={[styles.emptyText, { color: colors.secondaryForeground }]}>\n {noResultsMessage}\n </Text>\n </View>\n )}\n\n {results !== null && results.length > 0 && (\n <FlatList\n data={results}\n keyExtractor={(item) => item.userId}\n renderItem={renderContactItem}\n showsVerticalScrollIndicator={false}\n contentContainerStyle={styles.listContent}\n />\n )}\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n container: {\n padding: 16,\n alignItems: 'center',\n justifyContent: 'center',\n minHeight: 120,\n },\n listContainer: {\n flex: 1,\n },\n title: {\n fontSize: 18,\n fontWeight: '600',\n marginBottom: 16,\n },\n placeholderText: {\n fontSize: 14,\n textAlign: 'center',\n },\n searchRow: {\n flexDirection: 'row',\n alignItems: 'center',\n marginBottom: 12,\n },\n searchContainer: {\n flex: 1,\n borderWidth: 1,\n borderRadius: 8,\n paddingHorizontal: 12,\n height: 44,\n justifyContent: 'center',\n },\n searchInput: {\n fontSize: 16,\n height: 44,\n },\n searchButton: {\n width: 44,\n height: 44,\n borderRadius: 8,\n marginLeft: 8,\n alignItems: 'center',\n justifyContent: 'center',\n },\n searchIconContainer: {\n width: 20,\n height: 20,\n position: 'relative',\n },\n searchIconCircle: {\n width: 14,\n height: 14,\n borderRadius: 7,\n borderWidth: 2.5,\n position: 'absolute',\n top: 0,\n left: 0,\n },\n searchIconHandle: {\n width: 7,\n height: 2.5,\n borderRadius: 1.25,\n position: 'absolute',\n bottom: 2,\n right: 0,\n transform: [{ rotate: '45deg' }],\n },\n emptyContainer: {\n padding: 16,\n alignItems: 'center',\n justifyContent: 'center',\n },\n emptyText: {\n fontSize: 14,\n textAlign: 'center',\n },\n listContent: {\n paddingBottom: 16,\n },\n contactItem: {\n flexDirection: 'row',\n alignItems: 'center',\n paddingVertical: 12,\n },\n avatar: {\n width: 44,\n height: 44,\n borderRadius: 22,\n },\n avatarPlaceholder: {\n width: 44,\n height: 44,\n borderRadius: 22,\n alignItems: 'center',\n justifyContent: 'center',\n },\n avatarInitials: {\n fontSize: 16,\n fontWeight: '600',\n },\n contactInfo: {\n flex: 1,\n marginLeft: 12,\n marginRight: 12,\n },\n contactName: {\n fontSize: 16,\n fontWeight: '500',\n },\n contactSubtitle: {\n fontSize: 13,\n marginTop: 2,\n },\n actionButton: {\n paddingHorizontal: 16,\n paddingVertical: 8,\n borderRadius: 8,\n minWidth: 80,\n alignItems: 'center',\n justifyContent: 'center',\n },\n actionButtonText: {\n fontSize: 14,\n fontWeight: '600',\n },\n});\n","import React from 'react';\nimport { Platform } from 'react-native';\n\nconst isWeb = Platform.OS === 'web';\n\ninterface PlacedItemToolbarProps {\n wrapperRef: React.RefObject<HTMLDivElement | null>;\n isSelected: boolean;\n componentId: string;\n componentType: string;\n isRow: boolean;\n nodeSubtype?: string;\n}\n\n/**\n * PlacedItemToolbar - A portal-based toolbar that appears on the right side of selected elements\n * Displays a delete button for removing the element from the page builder\n */\nexport const usePlacedItemToolbar = ({\n wrapperRef,\n isSelected,\n componentId,\n componentType,\n isRow,\n nodeSubtype,\n}: PlacedItemToolbarProps) => {\n const toolbarRef = React.useRef<HTMLDivElement | null>(null);\n\n React.useEffect(() => {\n if (!isWeb || !isSelected) {\n // Clean up toolbar if it exists\n if (toolbarRef.current && toolbarRef.current.parentNode) {\n toolbarRef.current.parentNode.removeChild(toolbarRef.current);\n toolbarRef.current = null;\n }\n return;\n }\n\n if (!wrapperRef.current) return;\n\n // Find the container using the same logic as margin detectors\n let scrollContainer: HTMLElement | null = null;\n if (isRow) {\n // For rows, find the outermost container with padding\n scrollContainer = wrapperRef.current.parentElement;\n const rowWidth = wrapperRef.current.getBoundingClientRect().width;\n let attempts = 0;\n while (scrollContainer && attempts < 15) {\n const containerWidth = scrollContainer.getBoundingClientRect().width;\n if (containerWidth > rowWidth + 20) {\n break;\n }\n scrollContainer = scrollContainer.parentElement;\n attempts++;\n }\n if (!scrollContainer || scrollContainer.getBoundingClientRect().width <= rowWidth) {\n scrollContainer = wrapperRef.current.parentElement;\n while (scrollContainer?.parentElement) {\n const parent = scrollContainer.parentElement;\n if (\n parent.getBoundingClientRect().width > scrollContainer.getBoundingClientRect().width\n ) {\n scrollContainer = parent;\n } else {\n break;\n }\n }\n }\n }\n\n // Create toolbar element if it doesn't exist\n if (!toolbarRef.current) {\n toolbarRef.current = document.createElement('div');\n document.body.appendChild(toolbarRef.current);\n }\n\n const handleDelete = (e: MouseEvent) => {\n e.stopPropagation();\n e.preventDefault();\n\n const deleteEvent = new CustomEvent('vortex-delete-component', {\n detail: { id: componentId, type: componentType, subtype: nodeSubtype },\n bubbles: true,\n });\n document.dispatchEvent(deleteEvent);\n };\n\n const updateToolbarPosition = () => {\n if (!wrapperRef.current || !toolbarRef.current) return;\n\n const rect = wrapperRef.current.getBoundingClientRect();\n const toolbar = toolbarRef.current;\n\n // For rows on web, position at extreme right of container\n let leftPos = rect.right + 3;\n if (isRow && scrollContainer) {\n const containerRect = scrollContainer.getBoundingClientRect();\n // Rows...\n leftPos = containerRect.right + 6;\n }\n\n // Update styles\n Object.assign(toolbar.style, {\n position: 'fixed',\n left: `${leftPos}px`,\n top: `${rect.top + rect.height / 2}px`,\n transform: 'translateY(-50%)',\n backgroundColor: '#fff',\n borderRadius: '4px',\n border: '1px solid #1166c2',\n boxShadow: '0px 3px 5px rgba(0, 0, 0, 0.2)',\n display: 'flex',\n flexDirection: 'column',\n zIndex: '1200',\n pointerEvents: 'auto',\n });\n\n // Create delete button if it doesn't exist\n if (toolbar.children.length === 0) {\n const button = document.createElement('button');\n button.title = 'Delete';\n button.innerHTML = `\n <svg focusable=\"false\" aria-hidden=\"true\" viewBox=\"0 0 24 24\" style=\"width: 24px; height: 24px; fill: currentColor;\">\n <path d=\"M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6zM8 9h8v10H8zm7.5-5-1-1h-5l-1 1H5v2h14V4z\"></path>\n </svg>\n `;\n Object.assign(button.style, {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '40px',\n height: '40px',\n border: 'none',\n background: 'transparent',\n cursor: 'pointer',\n color: '#c20a0a',\n fontSize: '20px',\n transition: 'background-color 0.2s',\n });\n\n button.addEventListener('mouseenter', () => {\n button.style.backgroundColor = 'rgba(194, 10, 10, 0.1)';\n });\n button.addEventListener('mouseleave', () => {\n button.style.backgroundColor = 'transparent';\n });\n button.addEventListener('mousedown', (e) => {\n e.stopPropagation();\n e.preventDefault();\n });\n button.addEventListener('click', handleDelete);\n\n toolbar.appendChild(button);\n }\n };\n\n updateToolbarPosition();\n\n window.addEventListener('scroll', updateToolbarPosition, true);\n window.addEventListener('resize', updateToolbarPosition);\n\n return () => {\n window.removeEventListener('scroll', updateToolbarPosition, true);\n window.removeEventListener('resize', updateToolbarPosition);\n if (toolbarRef.current && toolbarRef.current.parentNode) {\n toolbarRef.current.parentNode.removeChild(toolbarRef.current);\n toolbarRef.current = null;\n }\n };\n }, [isSelected, componentId, componentType, isRow, nodeSubtype, wrapperRef]);\n\n return null;\n};\n","import type { Contact } from '../hooks/useInvitationFormLogic';\n\n// Mock contact data for demonstration\nexport const MOCK_CONTACTS: Contact[] = [\n { id: '1', name: 'Alice Johnson', email: 'alice.johnson@example.com' },\n { id: '2', name: 'Bob Smith', email: 'bob.smith@example.com' },\n { id: '3', name: 'Charlie Brown', email: 'charlie.brown@example.com' },\n { id: '4', name: 'Diana Prince', email: 'diana.prince@example.com' },\n { id: '5', name: 'Ethan Hunt', email: 'ethan.hunt@example.com' },\n { id: '6', name: 'Fiona Green', email: 'fiona.green@example.com' },\n];\n\n// Mock Google contact data for demonstration\nexport const MOCK_GOOGLE_CONTACTS: Contact[] = [\n { id: 'g1', name: 'John Doe', email: 'john.doe@gmail.com' },\n { id: 'g2', name: 'Jane Smith', email: 'jane.smith@gmail.com' },\n { id: 'g3', name: 'Michael Johnson', email: 'michael.j@gmail.com' },\n { id: 'g4', name: 'Sarah Williams', email: 'sarah.w@gmail.com' },\n { id: 'g5', name: 'David Brown', email: 'david.brown@gmail.com' },\n { id: 'g6', name: 'Emma Davis', email: 'emma.davis@gmail.com' },\n];\n","/**\n * Gradient Parsing Utilities\n *\n * Pure JavaScript utilities for parsing CSS gradients.\n * These are shared between native (moduleLoaders.ts) and web (moduleLoaders.web.ts)\n * implementations to avoid code duplication.\n *\n * These utilities have NO native dependencies and are safe to import from anywhere.\n */\n\n/**\n * Parsed gradient data structure\n */\nexport interface ParsedGradient {\n type: 'linear';\n angle: number;\n colors: string[];\n locations: number[];\n}\n\n/**\n * Gradient points for LinearGradient component\n */\nexport interface GradientPoints {\n start: { x: number; y: number };\n end: { x: number; y: number };\n}\n\n/**\n * Parses a CSS linear-gradient string into a structured format.\n *\n * Supports formats like:\n * - \"linear-gradient(90deg, #ff0000 0%, #0000ff 100%)\"\n * - \"linear-gradient(to right, #ff0000 0%, #0000ff 100%)\"\n * - \"linear-gradient(135deg, rgba(255,0,0,1) 0%, rgba(0,0,255,1) 100%)\"\n *\n * @param css - CSS linear-gradient string\n * @returns Parsed gradient data or null if parsing fails\n */\nexport function parseCSSLinearGradient(css: string): ParsedGradient | null {\n if (!css || !css.includes('linear-gradient')) {\n return null;\n }\n\n // Parse angle\n let angle = 180; // Default: top to bottom\n\n const angleMatch = css.match(/linear-gradient\\(\\s*(\\d+)deg/i);\n if (angleMatch) {\n angle = parseInt(angleMatch[1], 10);\n } else {\n // Handle directional keywords\n const directionMatch = css.match(/linear-gradient\\(\\s*to\\s+(\\w+)(?:\\s+(\\w+))?/i);\n if (directionMatch) {\n const direction = directionMatch[1].toLowerCase();\n const secondDirection = directionMatch[2]?.toLowerCase();\n\n const directionAngles: Record<string, number> = {\n 'right': 90,\n 'left': 270,\n 'bottom': 180,\n 'top': 0,\n 'right-bottom': 135,\n 'left-bottom': 225,\n 'right-top': 45,\n 'left-top': 315,\n };\n\n const key = secondDirection ? `${direction}-${secondDirection}` : direction;\n angle = directionAngles[key] ?? 180;\n }\n }\n\n // Parse color stops\n const stopsRegex = /(#[0-9a-fA-F]{3,8}|rgba?\\([^)]+\\)|[a-z]+)\\s+(\\d+)%/gi;\n const colors: string[] = [];\n const locations: number[] = [];\n\n let match;\n while ((match = stopsRegex.exec(css)) !== null) {\n const color = match[1].trim();\n const location = parseInt(match[2], 10) / 100;\n\n if (color !== 'to' && color !== 'from') {\n colors.push(color);\n locations.push(location);\n }\n }\n\n if (colors.length < 2) {\n return null;\n }\n\n return { type: 'linear', angle, colors, locations };\n}\n\n/**\n * Converts a CSS gradient angle to start/end points for LinearGradient component.\n *\n * CSS gradient angles:\n * - 0deg = bottom to top\n * - 90deg = left to right\n * - 180deg = top to bottom\n * - 270deg = right to left\n *\n * LinearGradient uses normalized coordinates (0-1) for start/end points.\n *\n * @param angle - CSS gradient angle in degrees\n * @returns Start and end points for LinearGradient\n */\nexport function angleToGradientPoints(angle: number): GradientPoints {\n const normalizedAngle = ((angle % 360) + 360) % 360;\n const rad = ((90 - normalizedAngle) * Math.PI) / 180;\n\n const cos = Math.cos(rad);\n const sin = Math.sin(rad);\n\n return {\n start: { x: 0.5 - cos / 2, y: 0.5 + sin / 2 },\n end: { x: 0.5 + cos / 2, y: 0.5 - sin / 2 },\n };\n}\n\n/**\n * Extracts the first color from a CSS gradient string.\n * Used as a fallback when gradient libraries are not available.\n *\n * @param gradientString - CSS linear-gradient string\n * @returns First color from the gradient or null\n */\nexport function parseGradientFirstColor(gradientString: string): string | null {\n if (!gradientString || !gradientString.includes('linear-gradient')) {\n return null;\n }\n\n const stopsRegex = /(#[0-9a-fA-F]{3,8}|rgba?\\([^)]+\\)|[a-z]+)\\s+(\\d+)%/i;\n const match = stopsRegex.exec(gradientString);\n\n if (match) {\n const color = match[1].trim();\n if (color !== 'to' && color !== 'from') {\n return color;\n }\n }\n\n return null;\n}\n","/**\n * Web-Safe Module Loaders\n *\n * This module provides stub implementations for web environments.\n * On web, we use CSS gradients directly, browser clipboard APIs, etc.\n * All loader functions return null, and components use CSS/browser fallbacks.\n *\n * This file is used by InviteFormWeb (web entry point) to avoid\n * importing native modules that would cause Next.js/webpack build errors.\n */\n\nimport type { ComponentType } from 'react';\nimport type {\n GradientModuleName,\n HapticsModuleName,\n QRCodeModuleName,\n ClipboardModuleName,\n} from '../context/VortexModulesContext';\n\n// ============================================================================\n// Types (re-exported for consistency with moduleLoaders.ts)\n// ============================================================================\n\n/**\n * Props for gradient components\n */\nexport interface GradientProps {\n colors: string[];\n locations?: number[];\n start?: { x: number; y: number };\n end?: { x: number; y: number };\n style?: any;\n children?: React.ReactNode;\n}\n\n/**\n * Props for QR code components\n */\nexport interface QRCodeProps {\n value: string;\n size?: number;\n color?: string;\n backgroundColor?: string;\n style?: any;\n}\n\n/**\n * Haptic feedback style\n */\nexport type HapticStyle = 'light' | 'medium' | 'heavy';\n\n/**\n * Clipboard operations interface\n */\nexport interface ClipboardOperations {\n setString: (text: string) => Promise<void>;\n getString: () => Promise<string>;\n}\n\n// Re-export gradient types from shared module\nexport type { ParsedGradient, GradientPoints } from './gradientUtils';\n\n// ============================================================================\n// Web-Safe Loader Stubs\n// ============================================================================\n\n/**\n * Web-safe gradient loader - always returns null.\n * On web, CSS gradients are used directly via the `background` style property.\n */\nexport function loadGradientComponent(\n _moduleName: GradientModuleName | undefined\n): ComponentType<GradientProps> | null {\n // Web uses CSS gradients directly, no component needed\n return null;\n}\n\n/**\n * Web-safe haptics loader - always returns null.\n * Haptic feedback doesn't make sense on web.\n */\nexport function loadHapticsTrigger(\n _moduleName: HapticsModuleName | undefined\n): ((style: HapticStyle) => Promise<void>) | null {\n // No haptics on web\n return null;\n}\n\n/**\n * Web-safe QR code loader - returns null for native modules.\n * For web, react-qr-code can be loaded if needed.\n */\nexport function loadQRCodeComponent(\n moduleName: QRCodeModuleName | undefined\n): ComponentType<QRCodeProps> | null {\n // Only react-qr-code works on web\n if (moduleName === 'react-qr-code') {\n try {\n const mod = require('react-qr-code');\n return mod.default || null;\n } catch {\n return null;\n }\n }\n // react-native-qrcode-svg is native-only\n return null;\n}\n\n/**\n * Web-safe clipboard loader - always returns null.\n * Web uses navigator.clipboard API directly.\n */\nexport function loadClipboardOperations(\n _moduleName: ClipboardModuleName | undefined\n): ClipboardOperations | null {\n // Web uses navigator.clipboard directly\n return null;\n}\n\n// ============================================================================\n// Gradient Parsing Utilities (re-exported from shared gradientUtils.ts)\n// ============================================================================\n\n// Re-export gradient utilities from the shared module\n// These are pure JS functions with no native dependencies, safe for web\nexport {\n parseCSSLinearGradient,\n angleToGradientPoints,\n parseGradientFirstColor,\n} from './gradientUtils';\n"],"mappings":"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","names":["import_react","import_react_native","import_react","import_react_native","import_react_native","import_react","import_jsx_runtime","_a","_b","import_react_native","import_jsx_runtime","isWeb","ButtonWrapper","_a","styles","import_react","import_react_native","import_jsx_runtime","isWeb","ButtonWrapper","React","styles","_a","_b","_c","import_react","import_react_native","import_jsx_runtime","isWeb","parseGradientFirstColor","ButtonWrapper","_a","_b","styles","import_react","import_react_native","import_jsx_runtime","isWeb","parseGradientFirstColor","ButtonWrapper","_a","_b","title","styles","_c","isLoading","import_react","import_react_native","import_jsx_runtime","isWeb","parseGradientFirstColor","AnimatedInvitationItem","_a","_b","_c","title","styles","isLoading","import_react","import_react_native","import_jsx_runtime","isWeb","parseGradientFirstColor","ButtonWrapper","_a","styles","_b","import_react","import_react_native","import_jsx_runtime","isWeb","parseGradientFirstColor","ButtonWrapper","_a","_b","styles","import_react_native","import_jsx_runtime","isWeb","import_react","import_react_native","import_jsx_runtime","isWeb","processTextGradient","styles","React","import_react_native","import_jsx_runtime","styles","import_react_native","import_jsx_runtime","isWeb","ButtonWrapper","styles","_a","import_react","import_react_native","import_jsx_runtime","isWeb","parseGradientFirstColor","_a","_b","styles","import_react","import_react_native","isWeb","React","import_jsx_runtime","isWeb","parseGradientFirstColor","_a","_b","_c","fontFamily","parseGradientFirstColor","isWeb","_d","_e","_f","_g","React","styles","parseGradientFirstColor","import_jsx_runtime","parseGradientFirstColor"]}
|