@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,"file":"VrtxInvitationSuggestions.js","sourceRoot":"","sources":["../../src/components/VrtxInvitationSuggestions.tsx"],"names":[],"mappings":"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","sourcesContent":["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"]}
|
|
@@ -0,0 +1,512 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
36
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
37
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
38
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
39
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
40
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
41
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
42
|
+
});
|
|
43
|
+
};
|
|
44
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
45
|
+
exports.VrtxInviteContacts = VrtxInviteContacts;
|
|
46
|
+
const react_1 = __importStar(require("react"));
|
|
47
|
+
const react_native_1 = require("react-native");
|
|
48
|
+
const VortexModulesContext_1 = require("../context/VortexModulesContext");
|
|
49
|
+
const isWeb = react_native_1.Platform.OS === 'web';
|
|
50
|
+
// Parse CSS linear-gradient to extract first color for fallback on native
|
|
51
|
+
function parseGradientFirstColor(gradientString) {
|
|
52
|
+
if (!gradientString || !gradientString.includes('linear-gradient')) {
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
const stopsRegex = /(rgba?\([^)]+\)|#[0-9a-fA-F]{3,8}|[a-z]+)\s+(\d+)%/i;
|
|
56
|
+
const match = stopsRegex.exec(gradientString);
|
|
57
|
+
if (match) {
|
|
58
|
+
return match[1].trim();
|
|
59
|
+
}
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
function ButtonWrapper({ children, style, gradientString, onPress, disabled, }) {
|
|
63
|
+
const { gradientModule, loaders } = (0, VortexModulesContext_1.useVortexModules)();
|
|
64
|
+
const styleArray = Array.isArray(style) ? style : [style];
|
|
65
|
+
// On web, use CSS gradients directly
|
|
66
|
+
if (gradientString && isWeb) {
|
|
67
|
+
return (<react_native_1.TouchableOpacity style={[...styleArray, { background: gradientString }]} onPress={onPress} disabled={disabled} activeOpacity={0.7}>
|
|
68
|
+
{children}
|
|
69
|
+
</react_native_1.TouchableOpacity>);
|
|
70
|
+
}
|
|
71
|
+
// On native, try to use gradient library if specified
|
|
72
|
+
if (gradientString && gradientModule && loaders) {
|
|
73
|
+
const GradientComponent = loaders.loadGradientComponent(gradientModule);
|
|
74
|
+
const parsed = loaders.parseCSSLinearGradient(gradientString);
|
|
75
|
+
if (GradientComponent && parsed) {
|
|
76
|
+
const points = loaders.angleToGradientPoints(parsed.angle);
|
|
77
|
+
return (<react_native_1.TouchableOpacity onPress={onPress} disabled={disabled} activeOpacity={0.7}>
|
|
78
|
+
<GradientComponent colors={parsed.colors} locations={parsed.locations} start={points.start} end={points.end} style={styleArray}>
|
|
79
|
+
{children}
|
|
80
|
+
</GradientComponent>
|
|
81
|
+
</react_native_1.TouchableOpacity>);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
// Fallback: solid color from first gradient stop
|
|
85
|
+
const fallbackColor = gradientString && loaders ? loaders.parseGradientFirstColor(gradientString) : null;
|
|
86
|
+
const finalStyle = fallbackColor ? [...styleArray, { backgroundColor: fallbackColor }] : styleArray;
|
|
87
|
+
return (<react_native_1.TouchableOpacity style={finalStyle} onPress={onPress} disabled={disabled} activeOpacity={0.7}>
|
|
88
|
+
{children}
|
|
89
|
+
</react_native_1.TouchableOpacity>);
|
|
90
|
+
}
|
|
91
|
+
// Helper function to sort contacts alphabetically by name
|
|
92
|
+
function sortContacts(contacts) {
|
|
93
|
+
return [...contacts].sort((a, b) => a.name.localeCompare(b.name));
|
|
94
|
+
}
|
|
95
|
+
function VrtxInviteContacts({ block, inviteContactsConfig, createSmsInvitation, triggerHaptic, theme, smsMessageTemplate, }) {
|
|
96
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u;
|
|
97
|
+
const [showContactsList, setShowContactsList] = (0, react_1.useState)(false);
|
|
98
|
+
const [actionInProgress, setActionInProgress] = (0, react_1.useState)(null);
|
|
99
|
+
const [searchQuery, setSearchQuery] = (0, react_1.useState)('');
|
|
100
|
+
const [invitedContacts, setInvitedContacts] = (0, react_1.useState)(new Set());
|
|
101
|
+
// Get contacts from config
|
|
102
|
+
const contacts = (0, react_1.useMemo)(() => {
|
|
103
|
+
if (!(inviteContactsConfig === null || inviteContactsConfig === void 0 ? void 0 : inviteContactsConfig.contacts) || inviteContactsConfig.contacts.length === 0) {
|
|
104
|
+
return [];
|
|
105
|
+
}
|
|
106
|
+
return sortContacts(inviteContactsConfig.contacts);
|
|
107
|
+
}, [inviteContactsConfig === null || inviteContactsConfig === void 0 ? void 0 : inviteContactsConfig.contacts]);
|
|
108
|
+
// Filter contacts based on search query
|
|
109
|
+
const filteredContacts = (0, react_1.useMemo)(() => {
|
|
110
|
+
if (!searchQuery.trim()) {
|
|
111
|
+
return contacts;
|
|
112
|
+
}
|
|
113
|
+
const query = searchQuery.toLowerCase().trim();
|
|
114
|
+
return contacts.filter((contact) => contact.name.toLowerCase().includes(query) ||
|
|
115
|
+
contact.phoneNumber.includes(query));
|
|
116
|
+
}, [contacts, searchQuery]);
|
|
117
|
+
// Extract customization from block settings (editor) or config props, with defaults
|
|
118
|
+
const blockCustomizations = (_a = block === null || block === void 0 ? void 0 : block.settings) === null || _a === void 0 ? void 0 : _a.customizations;
|
|
119
|
+
const inviteYourContactsText = (_d = (_c = (_b = blockCustomizations === null || blockCustomizations === void 0 ? void 0 : blockCustomizations.inviteYourContactsText) === null || _b === void 0 ? void 0 : _b.textContent) !== null && _c !== void 0 ? _c : inviteContactsConfig === null || inviteContactsConfig === void 0 ? void 0 : inviteContactsConfig.inviteYourContactsText) !== null && _d !== void 0 ? _d : 'Invite your contacts';
|
|
120
|
+
const inviteButtonText = (_g = (_f = (_e = blockCustomizations === null || blockCustomizations === void 0 ? void 0 : blockCustomizations.inviteButton) === null || _e === void 0 ? void 0 : _e.textContent) !== null && _f !== void 0 ? _f : inviteContactsConfig === null || inviteContactsConfig === void 0 ? void 0 : inviteContactsConfig.inviteButtonText) !== null && _g !== void 0 ? _g : 'Invite';
|
|
121
|
+
const emptyStateMessage = (_k = (_j = (_h = blockCustomizations === null || blockCustomizations === void 0 ? void 0 : blockCustomizations.emptyStateMessage) === null || _h === void 0 ? void 0 : _h.textContent) !== null && _j !== void 0 ? _j : inviteContactsConfig === null || inviteContactsConfig === void 0 ? void 0 : inviteContactsConfig.emptyStateMessage) !== null && _k !== void 0 ? _k : 'No contacts to invite';
|
|
122
|
+
const smsMessage = (_o = (_m = (_l = blockCustomizations === null || blockCustomizations === void 0 ? void 0 : blockCustomizations.smsMessage) === null || _l === void 0 ? void 0 : _l.textContent) !== null && _m !== void 0 ? _m : smsMessageTemplate) !== null && _o !== void 0 ? _o : 'Check this out! {{link}}';
|
|
123
|
+
// Helper to get theme option value from block.theme.options
|
|
124
|
+
const getBlockThemeValue = (key) => {
|
|
125
|
+
var _a;
|
|
126
|
+
const options = (_a = block === null || block === void 0 ? void 0 : block.theme) === null || _a === void 0 ? void 0 : _a.options;
|
|
127
|
+
if (!options || !Array.isArray(options))
|
|
128
|
+
return undefined;
|
|
129
|
+
const option = options.find((opt) => opt.key === key);
|
|
130
|
+
return (option === null || option === void 0 ? void 0 : option.value) || undefined;
|
|
131
|
+
};
|
|
132
|
+
// Theme colors with defaults
|
|
133
|
+
const colors = {
|
|
134
|
+
primaryBackground: (_p = theme === null || theme === void 0 ? void 0 : theme.primaryBackground) !== null && _p !== void 0 ? _p : '#6291d5',
|
|
135
|
+
primaryForeground: (_q = theme === null || theme === void 0 ? void 0 : theme.primaryForeground) !== null && _q !== void 0 ? _q : '#ffffff',
|
|
136
|
+
secondaryBackground: (_r = theme === null || theme === void 0 ? void 0 : theme.secondaryBackground) !== null && _r !== void 0 ? _r : '#ffffff',
|
|
137
|
+
secondaryForeground: (_s = theme === null || theme === void 0 ? void 0 : theme.secondaryForeground) !== null && _s !== void 0 ? _s : '#353e5c',
|
|
138
|
+
foreground: (_t = theme === null || theme === void 0 ? void 0 : theme.foreground) !== null && _t !== void 0 ? _t : '#334153',
|
|
139
|
+
border: (_u = theme === null || theme === void 0 ? void 0 : theme.border) !== null && _u !== void 0 ? _u : '#cccccc',
|
|
140
|
+
};
|
|
141
|
+
// Button styles from block.theme.options (microTheme)
|
|
142
|
+
const inviteButtonStyles = {
|
|
143
|
+
background: getBlockThemeValue('--vrtx-invite-contacts-invite-button-background') || colors.primaryBackground,
|
|
144
|
+
color: getBlockThemeValue('--vrtx-invite-contacts-invite-button-color') || colors.primaryForeground,
|
|
145
|
+
borderRadius: getBlockThemeValue('--vrtx-invite-contacts-invite-button-border-radius'),
|
|
146
|
+
border: getBlockThemeValue('--vrtx-invite-contacts-invite-button-border'),
|
|
147
|
+
padding: getBlockThemeValue('--vrtx-invite-contacts-invite-button-padding'),
|
|
148
|
+
fontSize: getBlockThemeValue('--vrtx-invite-contacts-invite-button-font-size'),
|
|
149
|
+
fontWeight: getBlockThemeValue('--vrtx-invite-contacts-invite-button-font-weight'),
|
|
150
|
+
};
|
|
151
|
+
// Avatar/initials styles from block.theme.options (microTheme)
|
|
152
|
+
const avatarStyles = {
|
|
153
|
+
background: getBlockThemeValue('--vrtx-invite-contacts-avatar-background') || colors.primaryBackground,
|
|
154
|
+
color: getBlockThemeValue('--vrtx-invite-contacts-avatar-color') || colors.primaryForeground,
|
|
155
|
+
};
|
|
156
|
+
// Contact name styles from block.theme.options (microTheme)
|
|
157
|
+
const contactNameStyles = {
|
|
158
|
+
color: getBlockThemeValue('--vrtx-invite-contacts-name-color') || colors.foreground,
|
|
159
|
+
fontFamily: getBlockThemeValue('--vrtx-invite-contacts-name-font-family'),
|
|
160
|
+
fontSize: getBlockThemeValue('--vrtx-invite-contacts-name-font-size'),
|
|
161
|
+
fontWeight: getBlockThemeValue('--vrtx-invite-contacts-name-font-weight'),
|
|
162
|
+
};
|
|
163
|
+
// Contact phone/subtitle styles from block.theme.options (microTheme)
|
|
164
|
+
const contactPhoneStyles = {
|
|
165
|
+
color: getBlockThemeValue('--vrtx-invite-contacts-subtitle-color') || colors.secondaryForeground,
|
|
166
|
+
fontFamily: getBlockThemeValue('--vrtx-invite-contacts-subtitle-font-family'),
|
|
167
|
+
fontSize: getBlockThemeValue('--vrtx-invite-contacts-subtitle-font-size'),
|
|
168
|
+
};
|
|
169
|
+
// Title styles from block.theme.options (microTheme) - for "Invite your contacts" text
|
|
170
|
+
const titleStyles = {
|
|
171
|
+
color: getBlockThemeValue('--vrtx-invite-contacts-title-color') || colors.foreground,
|
|
172
|
+
fontFamily: getBlockThemeValue('--vrtx-invite-contacts-title-font-family'),
|
|
173
|
+
fontSize: getBlockThemeValue('--vrtx-invite-contacts-title-font-size'),
|
|
174
|
+
fontWeight: getBlockThemeValue('--vrtx-invite-contacts-title-font-weight'),
|
|
175
|
+
};
|
|
176
|
+
// Handle navigation to contacts list
|
|
177
|
+
const handleNavigateToContacts = (0, react_1.useCallback)(() => __awaiter(this, void 0, void 0, function* () {
|
|
178
|
+
var _a;
|
|
179
|
+
yield (triggerHaptic === null || triggerHaptic === void 0 ? void 0 : triggerHaptic('light'));
|
|
180
|
+
setShowContactsList(true);
|
|
181
|
+
(_a = inviteContactsConfig === null || inviteContactsConfig === void 0 ? void 0 : inviteContactsConfig.onNavigateToContacts) === null || _a === void 0 ? void 0 : _a.call(inviteContactsConfig);
|
|
182
|
+
}), [triggerHaptic, inviteContactsConfig]);
|
|
183
|
+
// Handle navigation back from contacts list
|
|
184
|
+
const handleNavigateBack = (0, react_1.useCallback)(() => __awaiter(this, void 0, void 0, function* () {
|
|
185
|
+
var _a;
|
|
186
|
+
yield (triggerHaptic === null || triggerHaptic === void 0 ? void 0 : triggerHaptic('light'));
|
|
187
|
+
setShowContactsList(false);
|
|
188
|
+
setSearchQuery('');
|
|
189
|
+
(_a = inviteContactsConfig === null || inviteContactsConfig === void 0 ? void 0 : inviteContactsConfig.onNavigateBack) === null || _a === void 0 ? void 0 : _a.call(inviteContactsConfig);
|
|
190
|
+
}), [triggerHaptic, inviteContactsConfig]);
|
|
191
|
+
// Handle Invite button press
|
|
192
|
+
const handleInvite = (0, react_1.useCallback)((contact) => __awaiter(this, void 0, void 0, function* () {
|
|
193
|
+
var _a, _b;
|
|
194
|
+
setActionInProgress(contact.id);
|
|
195
|
+
yield (triggerHaptic === null || triggerHaptic === void 0 ? void 0 : triggerHaptic('light'));
|
|
196
|
+
try {
|
|
197
|
+
// Create SMS invitation and get short link
|
|
198
|
+
let shortLink = null;
|
|
199
|
+
if (createSmsInvitation) {
|
|
200
|
+
shortLink = yield createSmsInvitation(contact.phoneNumber, contact.name);
|
|
201
|
+
}
|
|
202
|
+
if (shortLink) {
|
|
203
|
+
// Replace {{link}} placeholder with actual link
|
|
204
|
+
const message = smsMessage.replace('{{link}}', shortLink);
|
|
205
|
+
// Open SMS app with pre-filled message
|
|
206
|
+
const smsUrl = react_native_1.Platform.select({
|
|
207
|
+
ios: `sms:${contact.phoneNumber}&body=${encodeURIComponent(message)}`,
|
|
208
|
+
android: `sms:${contact.phoneNumber}?body=${encodeURIComponent(message)}`,
|
|
209
|
+
default: `sms:${contact.phoneNumber}?body=${encodeURIComponent(message)}`,
|
|
210
|
+
});
|
|
211
|
+
yield react_native_1.Linking.openURL(smsUrl);
|
|
212
|
+
// Mark contact as invited
|
|
213
|
+
setInvitedContacts((prev) => new Set(prev).add(contact.id));
|
|
214
|
+
// Call optional callback for custom handling
|
|
215
|
+
yield ((_a = inviteContactsConfig === null || inviteContactsConfig === void 0 ? void 0 : inviteContactsConfig.onInvite) === null || _a === void 0 ? void 0 : _a.call(inviteContactsConfig, contact, shortLink));
|
|
216
|
+
// Notify other components that an invitation was created (for refresh)
|
|
217
|
+
(_b = inviteContactsConfig === null || inviteContactsConfig === void 0 ? void 0 : inviteContactsConfig.onInvitationCreated) === null || _b === void 0 ? void 0 : _b.call(inviteContactsConfig, contact, shortLink);
|
|
218
|
+
}
|
|
219
|
+
else {
|
|
220
|
+
console.warn('[VrtxInviteContacts] Failed to create SMS invitation - no short link returned');
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
catch (err) {
|
|
224
|
+
console.error('[VrtxInviteContacts] Invite failed:', err);
|
|
225
|
+
}
|
|
226
|
+
finally {
|
|
227
|
+
setActionInProgress(null);
|
|
228
|
+
}
|
|
229
|
+
}), [createSmsInvitation, triggerHaptic, inviteContactsConfig, smsMessage]);
|
|
230
|
+
// Render avatar or initials
|
|
231
|
+
const renderAvatar = (contact) => {
|
|
232
|
+
if (contact.avatarUrl) {
|
|
233
|
+
return <react_native_1.Image source={{ uri: contact.avatarUrl }} style={styles.avatar}/>;
|
|
234
|
+
}
|
|
235
|
+
// Generate initials from name
|
|
236
|
+
const initials = contact.name
|
|
237
|
+
.split(' ')
|
|
238
|
+
.map((part) => part[0])
|
|
239
|
+
.join('')
|
|
240
|
+
.toUpperCase()
|
|
241
|
+
.slice(0, 2);
|
|
242
|
+
// Handle avatar background with gradient support
|
|
243
|
+
const avatarBackground = avatarStyles.background;
|
|
244
|
+
const isAvatarGradient = avatarBackground === null || avatarBackground === void 0 ? void 0 : avatarBackground.includes('linear-gradient');
|
|
245
|
+
const avatarBgStyle = {};
|
|
246
|
+
if (isWeb && avatarBackground) {
|
|
247
|
+
avatarBgStyle.background = avatarBackground;
|
|
248
|
+
}
|
|
249
|
+
else if (isAvatarGradient && avatarBackground) {
|
|
250
|
+
const fallbackColor = parseGradientFirstColor(avatarBackground);
|
|
251
|
+
avatarBgStyle.backgroundColor = fallbackColor || colors.primaryBackground;
|
|
252
|
+
}
|
|
253
|
+
else {
|
|
254
|
+
avatarBgStyle.backgroundColor = avatarBackground || colors.primaryBackground;
|
|
255
|
+
}
|
|
256
|
+
return (<react_native_1.View style={[styles.avatarPlaceholder, avatarBgStyle]}>
|
|
257
|
+
<react_native_1.Text style={[styles.avatarInitials, { color: avatarStyles.color }]}>{initials}</react_native_1.Text>
|
|
258
|
+
</react_native_1.View>);
|
|
259
|
+
};
|
|
260
|
+
// Helper to parse CSS padding string to React Native padding object
|
|
261
|
+
const parsePadding = (paddingStr) => {
|
|
262
|
+
if (!paddingStr)
|
|
263
|
+
return {};
|
|
264
|
+
const parts = paddingStr.trim().split(/\s+/);
|
|
265
|
+
if (parts.length === 1) {
|
|
266
|
+
const val = parseInt(parts[0], 10);
|
|
267
|
+
return isNaN(val) ? {} : { paddingVertical: val, paddingHorizontal: val };
|
|
268
|
+
}
|
|
269
|
+
if (parts.length === 2) {
|
|
270
|
+
const vertical = parseInt(parts[0], 10);
|
|
271
|
+
const horizontal = parseInt(parts[1], 10);
|
|
272
|
+
return Object.assign(Object.assign({}, (isNaN(vertical) ? {} : { paddingVertical: vertical })), (isNaN(horizontal) ? {} : { paddingHorizontal: horizontal }));
|
|
273
|
+
}
|
|
274
|
+
return {};
|
|
275
|
+
};
|
|
276
|
+
// Helper to parse border string (e.g., "1px solid #ccc")
|
|
277
|
+
const parseBorder = (borderStr) => {
|
|
278
|
+
if (!borderStr)
|
|
279
|
+
return {};
|
|
280
|
+
const match = borderStr.match(/^(\d+)px\s+(\w+)\s+(.+)$/);
|
|
281
|
+
if (match) {
|
|
282
|
+
return {
|
|
283
|
+
borderWidth: parseInt(match[1], 10),
|
|
284
|
+
borderColor: match[3],
|
|
285
|
+
};
|
|
286
|
+
}
|
|
287
|
+
return {};
|
|
288
|
+
};
|
|
289
|
+
// Render a single contact item
|
|
290
|
+
const renderContactItem = ({ item }) => {
|
|
291
|
+
var _a;
|
|
292
|
+
const isLoading = actionInProgress === item.id;
|
|
293
|
+
const isInvited = invitedContacts.has(item.id);
|
|
294
|
+
// Build dynamic button style
|
|
295
|
+
const backgroundValue = inviteButtonStyles.background;
|
|
296
|
+
const isGradient = backgroundValue === null || backgroundValue === void 0 ? void 0 : backgroundValue.includes('linear-gradient');
|
|
297
|
+
const dynamicButtonStyle = Object.assign(Object.assign(Object.assign({}, (inviteButtonStyles.borderRadius ? { borderRadius: parseInt(inviteButtonStyles.borderRadius, 10) } : {})), parsePadding(inviteButtonStyles.padding)), parseBorder(inviteButtonStyles.border));
|
|
298
|
+
if (isWeb && backgroundValue) {
|
|
299
|
+
dynamicButtonStyle.background = backgroundValue;
|
|
300
|
+
}
|
|
301
|
+
else if (isGradient && backgroundValue) {
|
|
302
|
+
const fallbackColor = parseGradientFirstColor(backgroundValue);
|
|
303
|
+
dynamicButtonStyle.backgroundColor = fallbackColor || colors.primaryBackground;
|
|
304
|
+
}
|
|
305
|
+
else {
|
|
306
|
+
dynamicButtonStyle.backgroundColor = backgroundValue || colors.primaryBackground;
|
|
307
|
+
}
|
|
308
|
+
// Build dynamic text style
|
|
309
|
+
const dynamicTextStyle = Object.assign(Object.assign({ color: inviteButtonStyles.color }, (inviteButtonStyles.fontSize ? { fontSize: parseInt(inviteButtonStyles.fontSize, 10) } : {})), (inviteButtonStyles.fontWeight ? { fontWeight: inviteButtonStyles.fontWeight } : {}));
|
|
310
|
+
// Build dynamic contact name style
|
|
311
|
+
const dynamicNameStyle = Object.assign(Object.assign(Object.assign({ color: contactNameStyles.color }, (contactNameStyles.fontFamily ? { fontFamily: contactNameStyles.fontFamily } : {})), (contactNameStyles.fontSize ? { fontSize: parseInt(contactNameStyles.fontSize, 10) } : {})), (contactNameStyles.fontWeight ? { fontWeight: contactNameStyles.fontWeight } : {}));
|
|
312
|
+
// Build dynamic contact phone style
|
|
313
|
+
const dynamicPhoneStyle = Object.assign(Object.assign({ color: contactPhoneStyles.color }, (contactPhoneStyles.fontFamily ? { fontFamily: contactPhoneStyles.fontFamily } : {})), (contactPhoneStyles.fontSize ? { fontSize: parseInt(contactPhoneStyles.fontSize, 10) } : {}));
|
|
314
|
+
return (<react_native_1.View style={styles.contactItem}>
|
|
315
|
+
{renderAvatar(item)}
|
|
316
|
+
<react_native_1.View style={styles.contactInfo}>
|
|
317
|
+
<react_native_1.Text style={[styles.contactName, dynamicNameStyle]} numberOfLines={1}>
|
|
318
|
+
{item.name}
|
|
319
|
+
</react_native_1.Text>
|
|
320
|
+
<react_native_1.Text style={[styles.contactPhone, dynamicPhoneStyle]} numberOfLines={1}>
|
|
321
|
+
{item.phoneNumber}
|
|
322
|
+
</react_native_1.Text>
|
|
323
|
+
</react_native_1.View>
|
|
324
|
+
<ButtonWrapper style={[
|
|
325
|
+
styles.actionButton,
|
|
326
|
+
dynamicButtonStyle,
|
|
327
|
+
isInvited && styles.actionButtonInvited,
|
|
328
|
+
]} gradientString={((_a = inviteButtonStyles.background) === null || _a === void 0 ? void 0 : _a.includes('gradient')) ? inviteButtonStyles.background : null} onPress={() => handleInvite(item)} disabled={isLoading}>
|
|
329
|
+
{isLoading ? (<react_native_1.ActivityIndicator size="small" color={inviteButtonStyles.color}/>) : (<react_native_1.Text style={[styles.actionButtonText, dynamicTextStyle]}>
|
|
330
|
+
{isInvited ? '✓' : inviteButtonText}
|
|
331
|
+
</react_native_1.Text>)}
|
|
332
|
+
</ButtonWrapper>
|
|
333
|
+
</react_native_1.View>);
|
|
334
|
+
};
|
|
335
|
+
// Render the "Invite your contacts" entry row
|
|
336
|
+
const renderInviteContactsEntry = () => {
|
|
337
|
+
// Build dynamic title style
|
|
338
|
+
const dynamicTitleStyle = Object.assign(Object.assign(Object.assign({ color: titleStyles.color }, (titleStyles.fontFamily ? { fontFamily: titleStyles.fontFamily } : {})), (titleStyles.fontSize ? { fontSize: parseInt(titleStyles.fontSize, 10) } : {})), (titleStyles.fontWeight ? { fontWeight: titleStyles.fontWeight } : {}));
|
|
339
|
+
return (<react_native_1.TouchableOpacity style={styles.inviteContactsEntry} onPress={handleNavigateToContacts} activeOpacity={0.7}>
|
|
340
|
+
<react_native_1.View style={styles.inviteContactsEntryContent}>
|
|
341
|
+
<react_native_1.Text style={[styles.inviteContactsEntryText, dynamicTitleStyle]}>
|
|
342
|
+
{inviteYourContactsText}
|
|
343
|
+
</react_native_1.Text>
|
|
344
|
+
</react_native_1.View>
|
|
345
|
+
<react_native_1.Text style={[styles.chevronIcon, dynamicTitleStyle]}>›</react_native_1.Text>
|
|
346
|
+
</react_native_1.TouchableOpacity>);
|
|
347
|
+
};
|
|
348
|
+
// Render the back header for contacts list
|
|
349
|
+
const renderContactsHeader = () => {
|
|
350
|
+
return (<react_native_1.View>
|
|
351
|
+
<react_native_1.TouchableOpacity style={styles.backHeader} onPress={handleNavigateBack} activeOpacity={0.7}>
|
|
352
|
+
<react_native_1.Text style={[styles.backChevron, { color: colors.secondaryForeground }]}>‹</react_native_1.Text>
|
|
353
|
+
<react_native_1.Text style={[styles.backText, { color: colors.foreground }]}>Back</react_native_1.Text>
|
|
354
|
+
</react_native_1.TouchableOpacity>
|
|
355
|
+
<react_native_1.View style={[styles.searchContainer, { borderColor: colors.border }]}>
|
|
356
|
+
<react_native_1.TextInput style={[styles.searchInput, { color: colors.foreground }]} placeholder="Search contacts..." placeholderTextColor={colors.secondaryForeground} value={searchQuery} onChangeText={setSearchQuery} autoCapitalize="none" autoCorrect={false}/>
|
|
357
|
+
</react_native_1.View>
|
|
358
|
+
</react_native_1.View>);
|
|
359
|
+
};
|
|
360
|
+
// If no contacts provided or empty list, render nothing (no height)
|
|
361
|
+
if (!inviteContactsConfig || contacts.length === 0) {
|
|
362
|
+
return null;
|
|
363
|
+
}
|
|
364
|
+
// Contacts list view
|
|
365
|
+
// Note: Using View + map instead of FlatList to avoid "VirtualizedLists should never be nested" warning
|
|
366
|
+
// when this component is rendered inside a ScrollView (which InviteFormCore uses)
|
|
367
|
+
if (showContactsList) {
|
|
368
|
+
return (<react_native_1.View style={styles.listContainer}>
|
|
369
|
+
{renderContactsHeader()}
|
|
370
|
+
<react_native_1.View style={styles.listContent}>
|
|
371
|
+
{filteredContacts.length === 0 ? (<react_native_1.View style={styles.emptyContainer}>
|
|
372
|
+
<react_native_1.Text style={[styles.emptyText, { color: colors.secondaryForeground }]}>
|
|
373
|
+
{searchQuery ? 'No contacts match your search' : emptyStateMessage}
|
|
374
|
+
</react_native_1.Text>
|
|
375
|
+
</react_native_1.View>) : (filteredContacts.map((item) => (<react_native_1.View key={item.id}>
|
|
376
|
+
{renderContactItem({ item })}
|
|
377
|
+
</react_native_1.View>)))}
|
|
378
|
+
</react_native_1.View>
|
|
379
|
+
</react_native_1.View>);
|
|
380
|
+
}
|
|
381
|
+
// Main view: "Invite your contacts" entry
|
|
382
|
+
return (<react_native_1.View style={styles.entryContainer}>
|
|
383
|
+
{renderInviteContactsEntry()}
|
|
384
|
+
</react_native_1.View>);
|
|
385
|
+
}
|
|
386
|
+
const styles = react_native_1.StyleSheet.create({
|
|
387
|
+
entryContainer: {
|
|
388
|
+
// No padding - let the entry take minimal space
|
|
389
|
+
},
|
|
390
|
+
listContainer: {
|
|
391
|
+
flex: 1,
|
|
392
|
+
},
|
|
393
|
+
emptyContainer: {
|
|
394
|
+
padding: 16,
|
|
395
|
+
alignItems: 'center',
|
|
396
|
+
justifyContent: 'center',
|
|
397
|
+
},
|
|
398
|
+
emptyText: {
|
|
399
|
+
fontSize: 14,
|
|
400
|
+
textAlign: 'center',
|
|
401
|
+
},
|
|
402
|
+
listContent: {
|
|
403
|
+
paddingBottom: 16,
|
|
404
|
+
},
|
|
405
|
+
contactItem: {
|
|
406
|
+
flexDirection: 'row',
|
|
407
|
+
alignItems: 'center',
|
|
408
|
+
paddingVertical: 12,
|
|
409
|
+
},
|
|
410
|
+
avatar: {
|
|
411
|
+
width: 44,
|
|
412
|
+
height: 44,
|
|
413
|
+
borderRadius: 22,
|
|
414
|
+
},
|
|
415
|
+
avatarPlaceholder: {
|
|
416
|
+
width: 44,
|
|
417
|
+
height: 44,
|
|
418
|
+
borderRadius: 22,
|
|
419
|
+
alignItems: 'center',
|
|
420
|
+
justifyContent: 'center',
|
|
421
|
+
},
|
|
422
|
+
avatarInitials: {
|
|
423
|
+
fontSize: 16,
|
|
424
|
+
fontWeight: '600',
|
|
425
|
+
},
|
|
426
|
+
contactInfo: {
|
|
427
|
+
flex: 1,
|
|
428
|
+
marginLeft: 12,
|
|
429
|
+
marginRight: 12,
|
|
430
|
+
},
|
|
431
|
+
contactName: {
|
|
432
|
+
fontSize: 16,
|
|
433
|
+
fontWeight: '500',
|
|
434
|
+
},
|
|
435
|
+
contactPhone: {
|
|
436
|
+
fontSize: 13,
|
|
437
|
+
marginTop: 2,
|
|
438
|
+
},
|
|
439
|
+
actionButton: {
|
|
440
|
+
paddingHorizontal: 16,
|
|
441
|
+
paddingVertical: 8,
|
|
442
|
+
borderRadius: 8,
|
|
443
|
+
minWidth: 80,
|
|
444
|
+
alignItems: 'center',
|
|
445
|
+
justifyContent: 'center',
|
|
446
|
+
},
|
|
447
|
+
actionButtonInvited: {
|
|
448
|
+
opacity: 0.7,
|
|
449
|
+
},
|
|
450
|
+
actionButtonText: {
|
|
451
|
+
fontSize: 14,
|
|
452
|
+
fontWeight: '600',
|
|
453
|
+
},
|
|
454
|
+
// "Invite your contacts" entry styles
|
|
455
|
+
inviteContactsEntry: {
|
|
456
|
+
flexDirection: 'row',
|
|
457
|
+
alignItems: 'center',
|
|
458
|
+
justifyContent: 'space-between',
|
|
459
|
+
paddingVertical: 16,
|
|
460
|
+
},
|
|
461
|
+
inviteContactsEntryContent: {
|
|
462
|
+
flexDirection: 'row',
|
|
463
|
+
alignItems: 'center',
|
|
464
|
+
flex: 1,
|
|
465
|
+
},
|
|
466
|
+
inviteContactsEntryText: {
|
|
467
|
+
fontSize: 16,
|
|
468
|
+
fontWeight: '500',
|
|
469
|
+
},
|
|
470
|
+
inviteContactsEntryCount: {
|
|
471
|
+
fontSize: 14,
|
|
472
|
+
marginLeft: 8,
|
|
473
|
+
opacity: 0.7,
|
|
474
|
+
},
|
|
475
|
+
inviteContactsEntryCountSpacing: {
|
|
476
|
+
marginLeft: 8,
|
|
477
|
+
},
|
|
478
|
+
chevronIcon: {
|
|
479
|
+
fontSize: 24,
|
|
480
|
+
fontWeight: '300',
|
|
481
|
+
marginLeft: 8,
|
|
482
|
+
opacity: 0.75,
|
|
483
|
+
},
|
|
484
|
+
// Back header styles
|
|
485
|
+
backHeader: {
|
|
486
|
+
flexDirection: 'row',
|
|
487
|
+
alignItems: 'center',
|
|
488
|
+
paddingVertical: 12,
|
|
489
|
+
marginBottom: 8,
|
|
490
|
+
},
|
|
491
|
+
backChevron: {
|
|
492
|
+
fontSize: 24,
|
|
493
|
+
fontWeight: '300',
|
|
494
|
+
marginRight: 4,
|
|
495
|
+
},
|
|
496
|
+
backText: {
|
|
497
|
+
fontSize: 16,
|
|
498
|
+
fontWeight: '500',
|
|
499
|
+
},
|
|
500
|
+
// Search box styles
|
|
501
|
+
searchContainer: {
|
|
502
|
+
borderWidth: 1,
|
|
503
|
+
borderRadius: 8,
|
|
504
|
+
marginBottom: 12,
|
|
505
|
+
},
|
|
506
|
+
searchInput: {
|
|
507
|
+
paddingHorizontal: 12,
|
|
508
|
+
paddingVertical: 10,
|
|
509
|
+
fontSize: 16,
|
|
510
|
+
},
|
|
511
|
+
});
|
|
512
|
+
//# sourceMappingURL=VrtxInviteContacts.js.map
|