@teamvortexsoftware/vortex-react-native 0.0.13 → 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/LICENSE +201 -0
- package/README.md +1227 -11
- 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 +1 -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 +2 -0
- package/dist/hooks/useThemeStyles.js.map +1 -0
- package/dist/hooks/useVortexInvite.js +467 -56
- 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 +10205 -4
- 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/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 +1 -0
- package/dist/types/hooks/useThemeStyles.d.ts.map +1 -1
- package/dist/types/hooks/useVortexInvite.d.ts +48 -6
- package/dist/types/hooks/useVortexInvite.d.ts.map +1 -1
- 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 +21 -0
- package/dist/types/index.d.ts.map +1 -1
- 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/{shared/InvitationResult.js → types/platformOperations.js} +1 -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 +11 -3
- package/dist/types/utils/formUtils.d.ts.map +1 -1
- 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 +3 -1
- package/dist/types/utils/themeUtils.d.ts.map +1 -1
- package/dist/types/vortexInvite.d.ts +145 -5
- package/dist/types/vortexInvite.d.ts.map +1 -1
- 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 +161 -51
- 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 +117 -32
- package/dist/utils/themeUtils.js.map +1 -0
- package/dist/vortexInvite.js +78 -167
- package/dist/vortexInvite.js.map +1 -0
- package/package.json +69 -31
- package/dist/components/Clipboard.js +0 -64
- package/dist/shared/api.js +0 -90
- package/dist/tests/TestVortexInvite.js +0 -134
- package/dist/types/components/Clipboard.d.ts +0 -16
- package/dist/types/components/Clipboard.d.ts.map +0 -1
- package/dist/types/shared/InvitationResult.d.ts +0 -24
- package/dist/types/shared/InvitationResult.d.ts.map +0 -1
- package/dist/types/shared/api.d.ts +0 -14
- package/dist/types/shared/api.d.ts.map +0 -1
- package/dist/types/tests/TestVortexInvite.d.ts +0 -4
- package/dist/types/tests/TestVortexInvite.d.ts.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VrtxEmailInvitations.js","sourceRoot":"","sources":["../../src/components/VrtxEmailInvitations.tsx"],"names":[],"mappings":"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","sourcesContent":["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"]}
|
|
@@ -0,0 +1,400 @@
|
|
|
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.VrtxFindFriends = VrtxFindFriends;
|
|
46
|
+
const react_1 = __importStar(require("react"));
|
|
47
|
+
const react_native_1 = require("react-native");
|
|
48
|
+
const analytics_client_1 = require("@teamvortexsoftware/analytics-client");
|
|
49
|
+
const VortexModulesContext_1 = require("../context/VortexModulesContext");
|
|
50
|
+
const invitationEvents_1 = require("../utils/invitationEvents");
|
|
51
|
+
const isWeb = react_native_1.Platform.OS === 'web';
|
|
52
|
+
// Parse CSS linear-gradient to extract first color for fallback on native
|
|
53
|
+
function parseGradientFirstColor(gradientString) {
|
|
54
|
+
if (!gradientString || !gradientString.includes('linear-gradient')) {
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
const stopsRegex = /(rgba?\([^)]+\)|#[0-9a-fA-F]{3,8}|[a-z]+)\s+(\d+)%/i;
|
|
58
|
+
const match = stopsRegex.exec(gradientString);
|
|
59
|
+
if (match) {
|
|
60
|
+
return match[1].trim();
|
|
61
|
+
}
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
function ButtonWrapper({ children, style, gradientString, onPress, disabled, }) {
|
|
65
|
+
const { gradientModule, loaders } = (0, VortexModulesContext_1.useVortexModules)();
|
|
66
|
+
const styleArray = Array.isArray(style) ? style : [style];
|
|
67
|
+
// On web, use CSS gradients directly
|
|
68
|
+
if (gradientString && isWeb) {
|
|
69
|
+
return (<react_native_1.TouchableOpacity style={[...styleArray, { background: gradientString }]} onPress={onPress} disabled={disabled} activeOpacity={0.7}>
|
|
70
|
+
{children}
|
|
71
|
+
</react_native_1.TouchableOpacity>);
|
|
72
|
+
}
|
|
73
|
+
// On native, try to use gradient library if specified
|
|
74
|
+
if (gradientString && gradientModule && loaders) {
|
|
75
|
+
const GradientComponent = loaders.loadGradientComponent(gradientModule);
|
|
76
|
+
const parsed = loaders.parseCSSLinearGradient(gradientString);
|
|
77
|
+
if (GradientComponent && parsed) {
|
|
78
|
+
const points = loaders.angleToGradientPoints(parsed.angle);
|
|
79
|
+
return (<react_native_1.TouchableOpacity onPress={onPress} disabled={disabled} activeOpacity={0.7}>
|
|
80
|
+
<GradientComponent colors={parsed.colors} locations={parsed.locations} start={points.start} end={points.end} style={styleArray}>
|
|
81
|
+
{children}
|
|
82
|
+
</GradientComponent>
|
|
83
|
+
</react_native_1.TouchableOpacity>);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
// Fallback: solid color from first gradient stop
|
|
87
|
+
const fallbackColor = gradientString && loaders ? loaders.parseGradientFirstColor(gradientString) : null;
|
|
88
|
+
const finalStyle = fallbackColor ? [...styleArray, { backgroundColor: fallbackColor }] : styleArray;
|
|
89
|
+
return (<react_native_1.TouchableOpacity style={finalStyle} onPress={onPress} disabled={disabled} activeOpacity={0.7}>
|
|
90
|
+
{children}
|
|
91
|
+
</react_native_1.TouchableOpacity>);
|
|
92
|
+
}
|
|
93
|
+
function VrtxFindFriends({ block, findFriendsConfig, createUserIdInvitation, triggerHaptic, onAnalyticsEvent, theme, }) {
|
|
94
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p;
|
|
95
|
+
const [actionInProgress, setActionInProgress] = (0, react_1.useState)(null);
|
|
96
|
+
// Track contacts that have been successfully invited (to hide them from the list)
|
|
97
|
+
const [invitedContactIds, setInvitedContactIds] = (0, react_1.useState)(new Set());
|
|
98
|
+
// Get title from block title attribute (configured in Styles tab)
|
|
99
|
+
const title = ((_a = block === null || block === void 0 ? void 0 : block.attributes) === null || _a === void 0 ? void 0 : _a.title) || '';
|
|
100
|
+
// Extract customization from block settings (editor) or config props, with defaults
|
|
101
|
+
const blockCustomizations = (_b = block === null || block === void 0 ? void 0 : block.settings) === null || _b === void 0 ? void 0 : _b.customizations;
|
|
102
|
+
const connectButtonText = (_e = (_d = (_c = blockCustomizations === null || blockCustomizations === void 0 ? void 0 : blockCustomizations.connectButton) === null || _c === void 0 ? void 0 : _c.textContent) !== null && _d !== void 0 ? _d : findFriendsConfig === null || findFriendsConfig === void 0 ? void 0 : findFriendsConfig.connectButtonText) !== null && _e !== void 0 ? _e : 'Connect';
|
|
103
|
+
const emptyStateMessage = (_h = (_g = (_f = blockCustomizations === null || blockCustomizations === void 0 ? void 0 : blockCustomizations.emptyStateMessage) === null || _f === void 0 ? void 0 : _f.textContent) !== null && _g !== void 0 ? _g : findFriendsConfig === null || findFriendsConfig === void 0 ? void 0 : findFriendsConfig.emptyStateMessage) !== null && _h !== void 0 ? _h : 'No contacts found';
|
|
104
|
+
// Helper to get theme option value from block.theme.options
|
|
105
|
+
const getBlockThemeValue = (key) => {
|
|
106
|
+
var _a;
|
|
107
|
+
const options = (_a = block === null || block === void 0 ? void 0 : block.theme) === null || _a === void 0 ? void 0 : _a.options;
|
|
108
|
+
if (!options || !Array.isArray(options))
|
|
109
|
+
return undefined;
|
|
110
|
+
const option = options.find((opt) => opt.key === key);
|
|
111
|
+
return (option === null || option === void 0 ? void 0 : option.value) || undefined;
|
|
112
|
+
};
|
|
113
|
+
// Theme colors with defaults
|
|
114
|
+
const colors = {
|
|
115
|
+
primaryBackground: (_j = theme === null || theme === void 0 ? void 0 : theme.primaryBackground) !== null && _j !== void 0 ? _j : '#6291d5',
|
|
116
|
+
primaryForeground: (_k = theme === null || theme === void 0 ? void 0 : theme.primaryForeground) !== null && _k !== void 0 ? _k : '#ffffff',
|
|
117
|
+
secondaryBackground: (_l = theme === null || theme === void 0 ? void 0 : theme.secondaryBackground) !== null && _l !== void 0 ? _l : '#ffffff',
|
|
118
|
+
secondaryForeground: (_m = theme === null || theme === void 0 ? void 0 : theme.secondaryForeground) !== null && _m !== void 0 ? _m : '#353e5c',
|
|
119
|
+
foreground: (_o = theme === null || theme === void 0 ? void 0 : theme.foreground) !== null && _o !== void 0 ? _o : '#334153',
|
|
120
|
+
border: (_p = theme === null || theme === void 0 ? void 0 : theme.border) !== null && _p !== void 0 ? _p : '#cccccc',
|
|
121
|
+
};
|
|
122
|
+
// Button styles from block.theme.options (microTheme)
|
|
123
|
+
const connectButtonStyles = {
|
|
124
|
+
background: getBlockThemeValue('--vrtx-find-friends-connect-button-background') ||
|
|
125
|
+
colors.primaryBackground,
|
|
126
|
+
color: getBlockThemeValue('--vrtx-find-friends-connect-button-color') ||
|
|
127
|
+
colors.primaryForeground,
|
|
128
|
+
borderRadius: getBlockThemeValue('--vrtx-find-friends-connect-button-border-radius'),
|
|
129
|
+
border: getBlockThemeValue('--vrtx-find-friends-connect-button-border'),
|
|
130
|
+
padding: getBlockThemeValue('--vrtx-find-friends-connect-button-padding'),
|
|
131
|
+
fontSize: getBlockThemeValue('--vrtx-find-friends-connect-button-font-size'),
|
|
132
|
+
fontWeight: getBlockThemeValue('--vrtx-find-friends-connect-button-font-weight'),
|
|
133
|
+
};
|
|
134
|
+
// Avatar/initials styles from block.theme.options (microTheme)
|
|
135
|
+
const avatarStyles = {
|
|
136
|
+
background: getBlockThemeValue('--vrtx-find-friends-avatar-background') || colors.primaryBackground,
|
|
137
|
+
color: getBlockThemeValue('--vrtx-find-friends-avatar-color') || colors.primaryForeground,
|
|
138
|
+
};
|
|
139
|
+
// Contact name styles from block.theme.options (microTheme)
|
|
140
|
+
const contactNameStyles = {
|
|
141
|
+
color: getBlockThemeValue('--vrtx-find-friends-contact-name-color') || colors.foreground,
|
|
142
|
+
fontFamily: getBlockThemeValue('--vrtx-find-friends-contact-name-font-family'),
|
|
143
|
+
fontSize: getBlockThemeValue('--vrtx-find-friends-contact-name-font-size'),
|
|
144
|
+
fontWeight: getBlockThemeValue('--vrtx-find-friends-contact-name-font-weight'),
|
|
145
|
+
};
|
|
146
|
+
// Contact subtitle styles from block.theme.options (microTheme)
|
|
147
|
+
const contactSubtitleStyles = {
|
|
148
|
+
color: getBlockThemeValue('--vrtx-find-friends-contact-subtitle-color') ||
|
|
149
|
+
colors.secondaryForeground,
|
|
150
|
+
fontFamily: getBlockThemeValue('--vrtx-find-friends-contact-subtitle-font-family'),
|
|
151
|
+
fontSize: getBlockThemeValue('--vrtx-find-friends-contact-subtitle-font-size'),
|
|
152
|
+
};
|
|
153
|
+
// Title styles from block.theme.options (microTheme)
|
|
154
|
+
const titleStyles = {
|
|
155
|
+
color: getBlockThemeValue('--vrtx-find-friends-title-color') || colors.foreground,
|
|
156
|
+
fontFamily: getBlockThemeValue('--vrtx-find-friends-title-font-family'),
|
|
157
|
+
fontSize: getBlockThemeValue('--vrtx-find-friends-title-font-size'),
|
|
158
|
+
fontWeight: getBlockThemeValue('--vrtx-find-friends-title-font-weight'),
|
|
159
|
+
};
|
|
160
|
+
// Handle Connect button press
|
|
161
|
+
const handleConnect = (0, react_1.useCallback)((contact) => __awaiter(this, void 0, void 0, function* () {
|
|
162
|
+
var _a, _b;
|
|
163
|
+
if (!(findFriendsConfig === null || findFriendsConfig === void 0 ? void 0 : findFriendsConfig.onConnect))
|
|
164
|
+
return;
|
|
165
|
+
setActionInProgress(contact.userId);
|
|
166
|
+
yield (triggerHaptic === null || triggerHaptic === void 0 ? void 0 : triggerHaptic('light'));
|
|
167
|
+
// Track find friends invite click (matches iOS SDK)
|
|
168
|
+
onAnalyticsEvent === null || onAnalyticsEvent === void 0 ? void 0 : onAnalyticsEvent({
|
|
169
|
+
name: analytics_client_1.EventNames.FIND_FRIENDS_INVITE_CLICKED,
|
|
170
|
+
payload: {
|
|
171
|
+
contactId: contact.userId,
|
|
172
|
+
contactName: contact.name,
|
|
173
|
+
},
|
|
174
|
+
});
|
|
175
|
+
try {
|
|
176
|
+
// Call customer's callback to determine if we should create the invitation
|
|
177
|
+
const shouldCreateInvitation = yield findFriendsConfig.onConnect(contact);
|
|
178
|
+
if (shouldCreateInvitation && createUserIdInvitation) {
|
|
179
|
+
// Create invitation via Vortex backend (pass full contact info like iOS SDK)
|
|
180
|
+
yield createUserIdInvitation(contact.userId, contact.name, contact.avatarUrl, contact.metadata);
|
|
181
|
+
// Mark contact as invited (removes from list)
|
|
182
|
+
setInvitedContactIds((prev) => new Set(prev).add(contact.userId));
|
|
183
|
+
// Notify other components (e.g., VrtxOutgoingInvitations) to refresh
|
|
184
|
+
(0, invitationEvents_1.emitInvitationEvent)('invitationCreated');
|
|
185
|
+
(_a = findFriendsConfig.onInvitationCreated) === null || _a === void 0 ? void 0 : _a.call(findFriendsConfig, contact);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
catch (err) {
|
|
189
|
+
console.error('[VrtxFindFriends] Connect failed:', err);
|
|
190
|
+
(_b = findFriendsConfig.onInvitationError) === null || _b === void 0 ? void 0 : _b.call(findFriendsConfig, contact, err instanceof Error ? err : new Error(String(err)));
|
|
191
|
+
}
|
|
192
|
+
finally {
|
|
193
|
+
setActionInProgress(null);
|
|
194
|
+
}
|
|
195
|
+
}), [findFriendsConfig, createUserIdInvitation, triggerHaptic, onAnalyticsEvent]);
|
|
196
|
+
// Render avatar or initials
|
|
197
|
+
const renderAvatar = (contact) => {
|
|
198
|
+
if (contact.avatarUrl) {
|
|
199
|
+
return <react_native_1.Image source={{ uri: contact.avatarUrl }} style={styles.avatar}/>;
|
|
200
|
+
}
|
|
201
|
+
// Generate initials from name
|
|
202
|
+
const initials = contact.name
|
|
203
|
+
.split(' ')
|
|
204
|
+
.map((part) => part[0])
|
|
205
|
+
.join('')
|
|
206
|
+
.toUpperCase()
|
|
207
|
+
.slice(0, 2);
|
|
208
|
+
// Handle avatar background with gradient support
|
|
209
|
+
const avatarBackground = avatarStyles.background;
|
|
210
|
+
const isAvatarGradient = avatarBackground === null || avatarBackground === void 0 ? void 0 : avatarBackground.includes('linear-gradient');
|
|
211
|
+
const avatarBgStyle = {};
|
|
212
|
+
if (isWeb && avatarBackground) {
|
|
213
|
+
avatarBgStyle.background = avatarBackground;
|
|
214
|
+
}
|
|
215
|
+
else if (isAvatarGradient && avatarBackground) {
|
|
216
|
+
const fallbackColor = parseGradientFirstColor(avatarBackground);
|
|
217
|
+
avatarBgStyle.backgroundColor = fallbackColor || colors.primaryBackground;
|
|
218
|
+
}
|
|
219
|
+
else {
|
|
220
|
+
avatarBgStyle.backgroundColor = avatarBackground || colors.primaryBackground;
|
|
221
|
+
}
|
|
222
|
+
return (<react_native_1.View style={[styles.avatarPlaceholder, avatarBgStyle]}>
|
|
223
|
+
<react_native_1.Text style={[styles.avatarInitials, { color: avatarStyles.color }]}>{initials}</react_native_1.Text>
|
|
224
|
+
</react_native_1.View>);
|
|
225
|
+
};
|
|
226
|
+
// Helper to parse CSS padding string to React Native padding object
|
|
227
|
+
const parsePadding = (paddingStr) => {
|
|
228
|
+
if (!paddingStr)
|
|
229
|
+
return {};
|
|
230
|
+
const parts = paddingStr.trim().split(/\s+/);
|
|
231
|
+
if (parts.length === 1) {
|
|
232
|
+
const val = parseInt(parts[0], 10);
|
|
233
|
+
return isNaN(val) ? {} : { paddingVertical: val, paddingHorizontal: val };
|
|
234
|
+
}
|
|
235
|
+
if (parts.length === 2) {
|
|
236
|
+
const vertical = parseInt(parts[0], 10);
|
|
237
|
+
const horizontal = parseInt(parts[1], 10);
|
|
238
|
+
return Object.assign(Object.assign({}, (isNaN(vertical) ? {} : { paddingVertical: vertical })), (isNaN(horizontal) ? {} : { paddingHorizontal: horizontal }));
|
|
239
|
+
}
|
|
240
|
+
return {};
|
|
241
|
+
};
|
|
242
|
+
// Helper to parse border string (e.g., "1px solid #ccc")
|
|
243
|
+
const parseBorder = (borderStr) => {
|
|
244
|
+
if (!borderStr)
|
|
245
|
+
return {};
|
|
246
|
+
const match = borderStr.match(/^(\d+)px\s+(\w+)\s+(.+)$/);
|
|
247
|
+
if (match) {
|
|
248
|
+
return {
|
|
249
|
+
borderWidth: parseInt(match[1], 10),
|
|
250
|
+
borderColor: match[3],
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
return {};
|
|
254
|
+
};
|
|
255
|
+
// Render a single contact item
|
|
256
|
+
const renderContactItem = ({ item }) => {
|
|
257
|
+
var _a;
|
|
258
|
+
const isLoading = actionInProgress === item.userId;
|
|
259
|
+
// Build dynamic button style (without background - handled by ButtonWrapper)
|
|
260
|
+
const dynamicButtonStyle = Object.assign(Object.assign(Object.assign(Object.assign({}, (connectButtonStyles.borderRadius
|
|
261
|
+
? { borderRadius: parseInt(connectButtonStyles.borderRadius, 10) }
|
|
262
|
+
: {})), parsePadding(connectButtonStyles.padding)), parseBorder(connectButtonStyles.border)), { backgroundColor: colors.primaryBackground });
|
|
263
|
+
// Build dynamic text style
|
|
264
|
+
const dynamicTextStyle = Object.assign(Object.assign({ color: connectButtonStyles.color }, (connectButtonStyles.fontSize
|
|
265
|
+
? { fontSize: parseInt(connectButtonStyles.fontSize, 10) }
|
|
266
|
+
: {})), (connectButtonStyles.fontWeight ? { fontWeight: connectButtonStyles.fontWeight } : {}));
|
|
267
|
+
// Build dynamic contact name style
|
|
268
|
+
const dynamicNameStyle = Object.assign(Object.assign(Object.assign({ color: contactNameStyles.color }, (contactNameStyles.fontFamily ? { fontFamily: contactNameStyles.fontFamily } : {})), (contactNameStyles.fontSize
|
|
269
|
+
? { fontSize: parseInt(contactNameStyles.fontSize, 10) }
|
|
270
|
+
: {})), (contactNameStyles.fontWeight ? { fontWeight: contactNameStyles.fontWeight } : {}));
|
|
271
|
+
// Build dynamic contact subtitle style
|
|
272
|
+
const dynamicSubtitleStyle = Object.assign(Object.assign({ color: contactSubtitleStyles.color }, (contactSubtitleStyles.fontFamily
|
|
273
|
+
? { fontFamily: contactSubtitleStyles.fontFamily }
|
|
274
|
+
: {})), (contactSubtitleStyles.fontSize
|
|
275
|
+
? { fontSize: parseInt(contactSubtitleStyles.fontSize, 10) }
|
|
276
|
+
: {}));
|
|
277
|
+
return (<react_native_1.View style={styles.contactItem}>
|
|
278
|
+
{renderAvatar(item)}
|
|
279
|
+
<react_native_1.View style={styles.contactInfo}>
|
|
280
|
+
<react_native_1.Text style={[styles.contactName, dynamicNameStyle]} numberOfLines={1}>
|
|
281
|
+
{item.name}
|
|
282
|
+
</react_native_1.Text>
|
|
283
|
+
{item.subtitle && (<react_native_1.Text style={[styles.contactSubtitle, dynamicSubtitleStyle]} numberOfLines={1}>
|
|
284
|
+
{item.subtitle}
|
|
285
|
+
</react_native_1.Text>)}
|
|
286
|
+
</react_native_1.View>
|
|
287
|
+
<ButtonWrapper style={[styles.actionButton, dynamicButtonStyle]} gradientString={((_a = connectButtonStyles.background) === null || _a === void 0 ? void 0 : _a.includes('gradient')) ? connectButtonStyles.background : null} onPress={() => handleConnect(item)} disabled={isLoading}>
|
|
288
|
+
{isLoading ? (<react_native_1.ActivityIndicator size="small" color={connectButtonStyles.color}/>) : (<react_native_1.Text style={[styles.actionButtonText, dynamicTextStyle]}>{connectButtonText}</react_native_1.Text>)}
|
|
289
|
+
</ButtonWrapper>
|
|
290
|
+
</react_native_1.View>);
|
|
291
|
+
};
|
|
292
|
+
// Build dynamic title style
|
|
293
|
+
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 } : {}));
|
|
294
|
+
// Show placeholder if no config provided
|
|
295
|
+
if (!findFriendsConfig) {
|
|
296
|
+
return (<react_native_1.View style={styles.container}>
|
|
297
|
+
{title ? (<react_native_1.Text style={[styles.title, dynamicTitleStyle]}>{title}</react_native_1.Text>) : null}
|
|
298
|
+
<react_native_1.Text style={[styles.placeholderText, { color: colors.secondaryForeground }]}>
|
|
299
|
+
Find Friends component - provide findFriendsConfig to enable
|
|
300
|
+
</react_native_1.Text>
|
|
301
|
+
</react_native_1.View>);
|
|
302
|
+
}
|
|
303
|
+
const allContacts = findFriendsConfig.contacts || [];
|
|
304
|
+
// Filter out contacts that have already been invited
|
|
305
|
+
const contacts = allContacts.filter((c) => !invitedContactIds.has(c.userId));
|
|
306
|
+
// Empty state - no contacts to show (either none provided or all invited)
|
|
307
|
+
if (contacts.length === 0) {
|
|
308
|
+
return (<react_native_1.View style={styles.container}>
|
|
309
|
+
{title ? (<react_native_1.Text style={[styles.title, dynamicTitleStyle]}>{title}</react_native_1.Text>) : null}
|
|
310
|
+
<react_native_1.Text style={[styles.emptyText, { color: colors.secondaryForeground }]}>
|
|
311
|
+
{emptyStateMessage}
|
|
312
|
+
</react_native_1.Text>
|
|
313
|
+
</react_native_1.View>);
|
|
314
|
+
}
|
|
315
|
+
// Main view: Contacts list with title
|
|
316
|
+
// Note: Using View + map instead of FlatList to avoid "VirtualizedLists should never be nested" warning
|
|
317
|
+
// when this component is rendered inside a ScrollView (which InviteFormCore uses)
|
|
318
|
+
return (<react_native_1.View style={styles.listContainer}>
|
|
319
|
+
{title ? (<react_native_1.Text style={[styles.title, dynamicTitleStyle]}>{title}</react_native_1.Text>) : null}
|
|
320
|
+
<react_native_1.View style={styles.listContent}>
|
|
321
|
+
{contacts.map((item) => (<react_native_1.View key={item.userId}>
|
|
322
|
+
{renderContactItem({ item })}
|
|
323
|
+
</react_native_1.View>))}
|
|
324
|
+
</react_native_1.View>
|
|
325
|
+
</react_native_1.View>);
|
|
326
|
+
}
|
|
327
|
+
const styles = react_native_1.StyleSheet.create({
|
|
328
|
+
container: {
|
|
329
|
+
padding: 16,
|
|
330
|
+
alignItems: 'center',
|
|
331
|
+
justifyContent: 'center',
|
|
332
|
+
minHeight: 120,
|
|
333
|
+
},
|
|
334
|
+
listContainer: {
|
|
335
|
+
flex: 1,
|
|
336
|
+
},
|
|
337
|
+
title: {
|
|
338
|
+
fontSize: 18,
|
|
339
|
+
fontWeight: '600',
|
|
340
|
+
marginBottom: 16,
|
|
341
|
+
},
|
|
342
|
+
placeholderText: {
|
|
343
|
+
fontSize: 14,
|
|
344
|
+
textAlign: 'center',
|
|
345
|
+
},
|
|
346
|
+
emptyText: {
|
|
347
|
+
fontSize: 14,
|
|
348
|
+
textAlign: 'center',
|
|
349
|
+
},
|
|
350
|
+
listContent: {
|
|
351
|
+
paddingBottom: 16,
|
|
352
|
+
},
|
|
353
|
+
contactItem: {
|
|
354
|
+
flexDirection: 'row',
|
|
355
|
+
alignItems: 'center',
|
|
356
|
+
paddingVertical: 12,
|
|
357
|
+
},
|
|
358
|
+
avatar: {
|
|
359
|
+
width: 44,
|
|
360
|
+
height: 44,
|
|
361
|
+
borderRadius: 22,
|
|
362
|
+
},
|
|
363
|
+
avatarPlaceholder: {
|
|
364
|
+
width: 44,
|
|
365
|
+
height: 44,
|
|
366
|
+
borderRadius: 22,
|
|
367
|
+
alignItems: 'center',
|
|
368
|
+
justifyContent: 'center',
|
|
369
|
+
},
|
|
370
|
+
avatarInitials: {
|
|
371
|
+
fontSize: 16,
|
|
372
|
+
fontWeight: '600',
|
|
373
|
+
},
|
|
374
|
+
contactInfo: {
|
|
375
|
+
flex: 1,
|
|
376
|
+
marginLeft: 12,
|
|
377
|
+
marginRight: 12,
|
|
378
|
+
},
|
|
379
|
+
contactName: {
|
|
380
|
+
fontSize: 16,
|
|
381
|
+
fontWeight: '500',
|
|
382
|
+
},
|
|
383
|
+
contactSubtitle: {
|
|
384
|
+
fontSize: 13,
|
|
385
|
+
marginTop: 2,
|
|
386
|
+
},
|
|
387
|
+
actionButton: {
|
|
388
|
+
paddingHorizontal: 16,
|
|
389
|
+
paddingVertical: 8,
|
|
390
|
+
borderRadius: 8,
|
|
391
|
+
minWidth: 80,
|
|
392
|
+
alignItems: 'center',
|
|
393
|
+
justifyContent: 'center',
|
|
394
|
+
},
|
|
395
|
+
actionButtonText: {
|
|
396
|
+
fontSize: 14,
|
|
397
|
+
fontWeight: '600',
|
|
398
|
+
},
|
|
399
|
+
});
|
|
400
|
+
//# sourceMappingURL=VrtxFindFriends.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VrtxFindFriends.js","sourceRoot":"","sources":["../../src/components/VrtxFindFriends.tsx"],"names":[],"mappings":"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","sourcesContent":["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"]}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.VrtxHeading = VrtxHeading;
|
|
7
|
+
const react_1 = __importDefault(require("react"));
|
|
8
|
+
const react_native_1 = require("react-native");
|
|
9
|
+
const isWeb = react_native_1.Platform.OS === 'web';
|
|
10
|
+
/**
|
|
11
|
+
* Process text gradients for headings
|
|
12
|
+
* Converts gradient color values to background-clip: text style (web only)
|
|
13
|
+
*/
|
|
14
|
+
function processTextGradient(style) {
|
|
15
|
+
if (!style)
|
|
16
|
+
return style;
|
|
17
|
+
const processedStyle = Object.assign({}, style);
|
|
18
|
+
const colorValue = processedStyle.color;
|
|
19
|
+
// Handle text gradients on web
|
|
20
|
+
if (isWeb && colorValue && typeof colorValue === 'string' && colorValue.includes('linear-gradient')) {
|
|
21
|
+
// Use backgroundImage instead of background to avoid resetting backgroundClip
|
|
22
|
+
processedStyle.backgroundImage = colorValue;
|
|
23
|
+
processedStyle.backgroundColor = 'transparent'; // Ensure solid background doesn't interfere
|
|
24
|
+
processedStyle.WebkitBackgroundClip = 'text';
|
|
25
|
+
processedStyle.backgroundClip = 'text';
|
|
26
|
+
processedStyle.WebkitTextFillColor = 'transparent';
|
|
27
|
+
processedStyle.color = 'transparent'; // Fallback
|
|
28
|
+
// Always set display to inline-block for gradients to render properly
|
|
29
|
+
processedStyle.display = 'inline-block';
|
|
30
|
+
}
|
|
31
|
+
return processedStyle;
|
|
32
|
+
}
|
|
33
|
+
function VrtxHeading({ block }) {
|
|
34
|
+
var _a;
|
|
35
|
+
const overrideTagName = ((_a = block.settings) === null || _a === void 0 ? void 0 : _a.overrideTagName) || 'h1';
|
|
36
|
+
const textContent = block.textContent || '';
|
|
37
|
+
// Map heading levels to font sizes and weights
|
|
38
|
+
const headingStyles = {
|
|
39
|
+
h1: { fontSize: 24, fontWeight: '700', marginBottom: 16 },
|
|
40
|
+
h2: { fontSize: 20, fontWeight: '700', marginBottom: 14 },
|
|
41
|
+
h3: { fontSize: 18, fontWeight: '600', marginBottom: 12 },
|
|
42
|
+
h4: { fontSize: 16, fontWeight: '600', marginBottom: 10 },
|
|
43
|
+
h5: { fontSize: 14, fontWeight: '600', marginBottom: 8 },
|
|
44
|
+
h6: { fontSize: 12, fontWeight: '600', marginBottom: 8 },
|
|
45
|
+
};
|
|
46
|
+
const headingStyle = headingStyles[overrideTagName] || headingStyles.h1;
|
|
47
|
+
// Process gradient styles
|
|
48
|
+
const processedBlockStyle = processTextGradient(block.style);
|
|
49
|
+
return (<react_native_1.View key={block.id}>
|
|
50
|
+
<react_native_1.Text style={[headingStyle, processedBlockStyle || {}]}>{textContent}</react_native_1.Text>
|
|
51
|
+
</react_native_1.View>);
|
|
52
|
+
}
|
|
53
|
+
// const styles = StyleSheet.create({
|
|
54
|
+
// heading: {
|
|
55
|
+
// color: '#000',
|
|
56
|
+
// },
|
|
57
|
+
// });
|
|
58
|
+
//# sourceMappingURL=VrtxHeading.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VrtxHeading.js","sourceRoot":"","sources":["../../src/components/VrtxHeading.tsx"],"names":[],"mappings":";;;;;AAmCA,kCAwBC;AA3DD,kDAA0B;AAC1B,+CAAgE;AAEhE,MAAM,KAAK,GAAG,uBAAQ,CAAC,EAAE,KAAK,KAAK,CAAC;AAMpC;;;GAGG;AACH,SAAS,mBAAmB,CAAC,KAAU;IACrC,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IAEzB,MAAM,cAAc,qBAAQ,KAAK,CAAE,CAAC;IACpC,MAAM,UAAU,GAAG,cAAc,CAAC,KAA2B,CAAC;IAE9D,+BAA+B;IAC/B,IAAI,KAAK,IAAI,UAAU,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,UAAU,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACpG,8EAA8E;QAC9E,cAAc,CAAC,eAAe,GAAG,UAAU,CAAC;QAC5C,cAAc,CAAC,eAAe,GAAG,aAAa,CAAC,CAAC,4CAA4C;QAC5F,cAAc,CAAC,oBAAoB,GAAG,MAAM,CAAC;QAC7C,cAAc,CAAC,cAAc,GAAG,MAAM,CAAC;QACvC,cAAc,CAAC,mBAAmB,GAAG,aAAa,CAAC;QACnD,cAAc,CAAC,KAAK,GAAG,aAAa,CAAC,CAAC,WAAW;QACjD,sEAAsE;QACtE,cAAc,CAAC,OAAO,GAAG,cAAc,CAAC;IAC1C,CAAC;IAED,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,SAAgB,WAAW,CAAC,EAAE,KAAK,EAAoB;;IACrD,MAAM,eAAe,GAAG,CAAA,MAAA,KAAK,CAAC,QAAQ,0CAAE,eAAe,KAAI,IAAI,CAAC;IAChE,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,IAAI,EAAE,CAAC;IAE5C,+CAA+C;IAC/C,MAAM,aAAa,GAAwB;QACzC,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE,EAAE;QACzD,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE,EAAE;QACzD,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE,EAAE;QACzD,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE,EAAE;QACzD,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,EAAE;QACxD,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,EAAE;KACzD,CAAC;IAEF,MAAM,YAAY,GAAG,aAAa,CAAC,eAAe,CAAC,IAAI,aAAa,CAAC,EAAE,CAAC;IAExE,0BAA0B;IAC1B,MAAM,mBAAmB,GAAG,mBAAmB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAE7D,OAAO,CACL,CAAC,mBAAI,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAClB;MAAA,CAAC,mBAAI,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,EAAE,mBAAmB,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,mBAAI,CAC7E;IAAA,EAAE,mBAAI,CAAC,CACR,CAAC;AACJ,CAAC;AAED,qCAAqC;AACrC,eAAe;AACf,qBAAqB;AACrB,OAAO;AACP,MAAM","sourcesContent":["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"]}
|