@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":"VrtxIncomingInvitations.js","sourceRoot":"","sources":["../../src/components/VrtxIncomingInvitations.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 Alert,\n Animated,\n ViewStyle,\n} from 'react-native';\nimport { IncomingInvitationsConfig, IncomingInvitationItem } from '../types/invitations';\nimport type { IncomingInvitation } from '../VortexClient';\nimport { EventNames } from '@teamvortexsoftware/analytics-client';\nimport type { SimpleAnalyticsEvent } from '../utils/analytics';\nimport { VortexClient } from '../VortexClient';\nimport { useVortexModules } from '../context/VortexModulesContext';\n\nconst isWeb = Platform.OS === 'web';\n\n// Parse CSS linear-gradient to extract first color for fallback on native\nfunction parseGradientFirstColor(gradientString: string): string | null {\n if (!gradientString || !gradientString.includes('linear-gradient')) {\n return null;\n }\n\n const stopsRegex = /(rgba?\\([^)]+\\)|#[0-9a-fA-F]{3,8}|[a-z]+)\\s+(\\d+)%/i;\n const match = stopsRegex.exec(gradientString);\n\n if (match) {\n return match[1].trim();\n }\n\n return null;\n}\n\n// Button wrapper component that handles gradients on web, native gradient libraries, or solid color fallback\ninterface ButtonWrapperProps {\n children: React.ReactNode;\n style: ViewStyle | ViewStyle[];\n gradientString: string | null;\n onPress?: () => void;\n disabled?: boolean;\n}\n\nfunction ButtonWrapper({\n children,\n style,\n gradientString,\n onPress,\n disabled,\n}: ButtonWrapperProps) {\n const { gradientModule, loaders } = useVortexModules();\n const styleArray = Array.isArray(style) ? style : [style];\n\n // On web, use CSS gradients directly\n if (gradientString && isWeb) {\n return (\n <TouchableOpacity\n style={[...styleArray, { background: gradientString } as any]}\n onPress={onPress}\n disabled={disabled}\n activeOpacity={0.7}\n >\n {children}\n </TouchableOpacity>\n );\n }\n\n // On native, try to use gradient library if specified\n if (gradientString && gradientModule && loaders) {\n const GradientComponent = loaders.loadGradientComponent(gradientModule);\n const parsed = loaders.parseCSSLinearGradient(gradientString);\n\n if (GradientComponent && parsed) {\n const points = loaders.angleToGradientPoints(parsed.angle);\n\n return (\n <TouchableOpacity\n onPress={onPress}\n disabled={disabled}\n activeOpacity={0.7}\n >\n <GradientComponent\n colors={parsed.colors}\n locations={parsed.locations}\n start={points.start}\n end={points.end}\n style={styleArray}\n >\n {children}\n </GradientComponent>\n </TouchableOpacity>\n );\n }\n }\n\n // Fallback: solid color from first gradient stop\n const fallbackColor = gradientString && loaders ? loaders.parseGradientFirstColor(gradientString) : null;\n const finalStyle = fallbackColor ? [...styleArray, { backgroundColor: fallbackColor }] : styleArray;\n\n return (\n <TouchableOpacity\n style={finalStyle}\n onPress={onPress}\n disabled={disabled}\n activeOpacity={0.7}\n >\n {children}\n </TouchableOpacity>\n );\n}\n\nexport interface VrtxIncomingInvitationsProps {\n block: any;\n /** Incoming Invitations configuration with callbacks */\n incomingInvitationsConfig?: IncomingInvitationsConfig;\n /** API URL for making invitation API calls (required for automatic API integration) */\n apiUrl?: string;\n /** JWT token for authentication (required for automatic API integration) */\n jwt?: string;\n /** Trigger haptic feedback */\n triggerHaptic?: (style: 'light' | 'medium' | 'heavy') => Promise<void>;\n /** Theme colors from widget configuration */\n theme?: {\n primaryBackground?: string;\n primaryForeground?: string;\n secondaryBackground?: string;\n secondaryForeground?: string;\n foreground?: string;\n border?: string;\n };\n /** Callback to emit analytics events */\n onAnalyticsEvent?: (event: SimpleAnalyticsEvent) => void;\n}\n\n// Animated item wrapper for fade-out effect\nfunction AnimatedInvitationItem({\n item,\n renderContent,\n onRemove,\n}: {\n item: IncomingInvitationItem;\n renderContent: (item: IncomingInvitationItem) => React.ReactNode;\n onRemove: (id: string) => void;\n}) {\n const fadeAnim = useRef(new Animated.Value(1)).current;\n const heightAnim = useRef(new Animated.Value(1)).current;\n\n const animateOut = useCallback(() => {\n Animated.parallel([\n Animated.timing(fadeAnim, {\n toValue: 0,\n duration: 200,\n useNativeDriver: true,\n }),\n Animated.timing(heightAnim, {\n toValue: 0,\n duration: 200,\n useNativeDriver: true,\n }),\n ]).start(() => {\n onRemove(item.id);\n });\n }, [fadeAnim, heightAnim, item.id, onRemove]);\n\n return (\n <Animated.View\n style={{\n opacity: fadeAnim,\n transform: [{ scaleY: heightAnim }],\n }}\n >\n {renderContent({ ...item, metadata: { ...item.metadata, animateOut } })}\n </Animated.View>\n );\n}\n\nexport function VrtxIncomingInvitations({\n block,\n incomingInvitationsConfig,\n apiUrl,\n jwt,\n triggerHaptic,\n theme,\n onAnalyticsEvent,\n}: VrtxIncomingInvitationsProps) {\n // Local state for managing the displayed invitations (for animate-out)\n const [displayedInvitations, setDisplayedInvitations] = useState<IncomingInvitationItem[]>(\n incomingInvitationsConfig?.invitations || []\n );\n const [actionInProgress, setActionInProgress] = useState<string | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n\n // Fetch invitations from API in the background.\n // Note: This component may remount multiple times due to parent re-renders\n // (EditableWrapper is defined inside InviteFormCore's render body).\n // To avoid flashing a loading spinner on each remount, we show config\n // invitations immediately and only show loading if there are none.\n useEffect(() => {\n if (!apiUrl || !jwt) return;\n\n let cancelled = false;\n const hasConfigInvitations = (incomingInvitationsConfig?.invitations?.length ?? 0) > 0;\n\n // Only show loading spinner if we have NO config invitations to display\n if (!hasConfigInvitations) {\n setIsLoading(true);\n }\n\n const loadInvitations = async () => {\n try {\n const client = new VortexClient({ jwt, baseURL: apiUrl });\n const apiInvitations = await client.getIncomingInvitations();\n\n // Filter out already accepted invitations (client-side filter)\n const pendingInvitations = apiInvitations.filter((inv: IncomingInvitation) => {\n const status = inv.status?.toLowerCase() ?? '';\n return status !== 'accepted' && status !== 'accepted_elsewhere';\n });\n\n // Map API invitations to InvitationItem format\n const mappedInvitations: IncomingInvitationItem[] = pendingInvitations.map((inv: IncomingInvitation) => ({\n id: inv.id,\n name: inv.creatorName || inv.senderIdentifier || 'Unknown',\n userId: inv.foreignCreatorId || undefined,\n avatarUrl: inv.creatorAvatarUrl || inv.avatarUrl,\n isVortexInvitation: true,\n metadata: inv.metadata || undefined,\n }));\n\n if (!cancelled) {\n // Merge config invitations with API invitations, deduplicating by userId.\n const configInvitations = incomingInvitationsConfig?.invitations || [];\n const apiUserIds = new Set(\n mappedInvitations\n .filter((inv) => inv.userId)\n .map((inv) => inv.userId)\n );\n const dedupedConfig = configInvitations.filter(\n (inv) => !inv.userId || !apiUserIds.has(inv.userId)\n );\n setDisplayedInvitations([...dedupedConfig, ...mappedInvitations]);\n }\n } catch (error) {\n // Silently fail - just show config invitations\n if (__DEV__) {\n console.warn('[VrtxIncomingInvitations] Failed to fetch incoming invitations:', error);\n }\n } finally {\n if (!cancelled) {\n setIsLoading(false);\n }\n }\n };\n\n loadInvitations();\n return () => { cancelled = true; };\n }, [apiUrl, jwt, incomingInvitationsConfig?.invitations]);\n\n // Extract customization from block settings or config props, with defaults\n const blockCustomizations = block?.settings?.customizations;\n const acceptButtonText =\n blockCustomizations?.acceptButton?.textContent ??\n incomingInvitationsConfig?.acceptButtonText ??\n 'Accept';\n const deleteButtonText =\n blockCustomizations?.deleteButton?.textContent ??\n incomingInvitationsConfig?.deleteButtonText ??\n 'Delete';\n const emptyStateMessage =\n blockCustomizations?.emptyStateMessage?.textContent ??\n incomingInvitationsConfig?.emptyStateMessage ??\n 'No incoming invitations';\n\n // Confirmation dialog texts\n const acceptConfirmTitle = incomingInvitationsConfig?.acceptConfirmTitle ?? 'Accept Invitation';\n const acceptConfirmMessage =\n incomingInvitationsConfig?.acceptConfirmMessage ?? 'Accept invitation from {name}?';\n const deleteConfirmTitle = incomingInvitationsConfig?.deleteConfirmTitle ?? 'Delete Invitation';\n const deleteConfirmMessage =\n incomingInvitationsConfig?.deleteConfirmMessage ?? 'Delete invitation from {name}?';\n const confirmButtonText = incomingInvitationsConfig?.confirmButtonText ?? 'Confirm';\n const cancelButtonText = incomingInvitationsConfig?.cancelButtonText ?? 'Cancel';\n\n // Helper to get theme option value from block.theme.options\n const getBlockThemeValue = (key: string): string | undefined => {\n const options = block?.theme?.options;\n if (!options || !Array.isArray(options)) return undefined;\n const option = options.find((opt: any) => opt.key === key);\n return option?.value || undefined;\n };\n\n // Theme colors with defaults\n const colors = {\n primaryBackground: theme?.primaryBackground ?? '#6291d5',\n primaryForeground: theme?.primaryForeground ?? '#ffffff',\n secondaryBackground: theme?.secondaryBackground ?? '#ffffff',\n secondaryForeground: theme?.secondaryForeground ?? '#353e5c',\n foreground: theme?.foreground ?? '#334153',\n border: theme?.border ?? '#cccccc',\n };\n\n // Button styles from block.theme.options (microTheme)\n const acceptButtonStyles = {\n background:\n getBlockThemeValue('--vrtx-incoming-invitations-accept-button-background') ||\n colors.primaryBackground,\n color:\n getBlockThemeValue('--vrtx-incoming-invitations-accept-button-color') ||\n colors.primaryForeground,\n borderRadius: getBlockThemeValue('--vrtx-incoming-invitations-accept-button-border-radius'),\n border: getBlockThemeValue('--vrtx-incoming-invitations-accept-button-border'),\n padding: getBlockThemeValue('--vrtx-incoming-invitations-accept-button-padding'),\n fontSize: getBlockThemeValue('--vrtx-incoming-invitations-accept-button-font-size'),\n fontWeight: getBlockThemeValue('--vrtx-incoming-invitations-accept-button-font-weight'),\n };\n\n const deleteButtonStyles = {\n background:\n getBlockThemeValue('--vrtx-incoming-invitations-delete-button-background') ||\n colors.secondaryBackground,\n color:\n getBlockThemeValue('--vrtx-incoming-invitations-delete-button-color') ||\n colors.secondaryForeground,\n borderRadius: getBlockThemeValue('--vrtx-incoming-invitations-delete-button-border-radius'),\n border: getBlockThemeValue('--vrtx-incoming-invitations-delete-button-border'),\n padding: getBlockThemeValue('--vrtx-incoming-invitations-delete-button-padding'),\n fontSize: getBlockThemeValue('--vrtx-incoming-invitations-delete-button-font-size'),\n fontWeight: getBlockThemeValue('--vrtx-incoming-invitations-delete-button-font-weight'),\n };\n\n // Avatar/initials styles from block.theme.options (microTheme)\n const avatarStyles = {\n background:\n getBlockThemeValue('--vrtx-incoming-invitations-avatar-background') ||\n colors.primaryBackground,\n color:\n getBlockThemeValue('--vrtx-incoming-invitations-avatar-color') || colors.primaryForeground,\n };\n\n // Contact name styles from block.theme.options (microTheme)\n const nameStyles = {\n color: getBlockThemeValue('--vrtx-incoming-invitations-name-color') || colors.foreground,\n fontFamily: getBlockThemeValue('--vrtx-incoming-invitations-name-font-family'),\n fontSize: getBlockThemeValue('--vrtx-incoming-invitations-name-font-size'),\n fontWeight: getBlockThemeValue('--vrtx-incoming-invitations-name-font-weight'),\n };\n\n // Subtitle styles from block.theme.options (microTheme)\n const subtitleStyles = {\n color:\n getBlockThemeValue('--vrtx-incoming-invitations-subtitle-color') ||\n colors.secondaryForeground,\n fontFamily: getBlockThemeValue('--vrtx-incoming-invitations-subtitle-font-family'),\n fontSize: getBlockThemeValue('--vrtx-incoming-invitations-subtitle-font-size'),\n };\n\n // Title styles from block.theme.options (microTheme)\n const titleStyles = {\n color: getBlockThemeValue('--vrtx-incoming-invitations-title-color') || colors.foreground,\n fontFamily: getBlockThemeValue('--vrtx-incoming-invitations-title-font-family'),\n fontSize: getBlockThemeValue('--vrtx-incoming-invitations-title-font-size'),\n fontWeight: getBlockThemeValue('--vrtx-incoming-invitations-title-font-weight'),\n };\n\n // Remove invitation from displayed list (after animation)\n const handleRemoveFromDisplay = useCallback((id: string) => {\n setDisplayedInvitations((prev) => prev.filter((inv) => inv.id !== id));\n }, []);\n\n // Show confirmation dialog\n const showConfirmation = useCallback(\n (\n title: string,\n message: string,\n onConfirm: () => void\n ) => {\n if (isWeb) {\n // Web: use window.confirm\n const confirmed = window.confirm(message);\n if (confirmed) {\n onConfirm();\n }\n } else {\n // Native: use Alert\n Alert.alert(title, message, [\n {\n text: cancelButtonText,\n style: 'cancel',\n },\n {\n text: confirmButtonText,\n onPress: onConfirm,\n },\n ]);\n }\n },\n [confirmButtonText, cancelButtonText]\n );\n\n // Handle Accept button press\n const handleAccept = useCallback(\n async (invitation: IncomingInvitationItem, animateOut?: () => void) => {\n const message = acceptConfirmMessage.replace('{name}', invitation.name);\n\n showConfirmation(acceptConfirmTitle, message, async () => {\n setActionInProgress(invitation.id);\n await triggerHaptic?.('light');\n\n // Emit analytics event for accept button click\n onAnalyticsEvent?.({\n name: EventNames.INBOUND_INVITATION_ACCEPT_CLICKED,\n payload: { invitationId: invitation.id, inviterName: invitation.name },\n });\n\n try {\n // Call the callback if provided and check return value\n let shouldProceed = true;\n if (incomingInvitationsConfig?.onAccept) {\n const result = await incomingInvitationsConfig.onAccept(invitation);\n // If callback returns false explicitly, don't proceed\n if (result === false) {\n shouldProceed = false;\n }\n }\n\n if (!shouldProceed) {\n setActionInProgress(null);\n return;\n }\n\n // Only call Vortex API for Vortex invitations\n if (invitation.isVortexInvitation && apiUrl && jwt) {\n const client = new VortexClient({ jwt, baseURL: apiUrl });\n const result = await client.acceptIncomingInvitation(invitation.id);\n if (!result.success) {\n console.error('[VrtxIncomingInvitations] API accept failed:', result.message);\n throw new Error(result.message || 'Failed to accept invitation');\n }\n }\n\n // Animate out after successful action\n if (animateOut) {\n animateOut();\n } else {\n handleRemoveFromDisplay(invitation.id);\n }\n } catch (err) {\n console.error('[VrtxIncomingInvitations] Accept failed:', err);\n } finally {\n setActionInProgress(null);\n }\n });\n },\n [\n incomingInvitationsConfig,\n apiUrl,\n jwt,\n triggerHaptic,\n acceptConfirmTitle,\n acceptConfirmMessage,\n showConfirmation,\n handleRemoveFromDisplay,\n onAnalyticsEvent,\n ]\n );\n\n // Handle Delete button press\n const handleDelete = useCallback(\n async (invitation: IncomingInvitationItem, animateOut?: () => void) => {\n const message = deleteConfirmMessage.replace('{name}', invitation.name);\n\n showConfirmation(deleteConfirmTitle, message, async () => {\n setActionInProgress(invitation.id);\n await triggerHaptic?.('light');\n\n // Emit analytics event for delete button click\n onAnalyticsEvent?.({\n name: EventNames.INBOUND_INVITATION_DELETE_CLICKED,\n payload: { invitationId: invitation.id, inviterName: invitation.name },\n });\n\n try {\n // Call the callback if provided and check return value\n let shouldProceed = true;\n if (incomingInvitationsConfig?.onDelete) {\n const result = await incomingInvitationsConfig.onDelete(invitation);\n // If callback returns false explicitly, don't proceed\n if (result === false) {\n shouldProceed = false;\n }\n }\n\n if (!shouldProceed) {\n setActionInProgress(null);\n return;\n }\n\n // Only call Vortex API for Vortex invitations\n if (invitation.isVortexInvitation && apiUrl && jwt) {\n const client = new VortexClient({ jwt, baseURL: apiUrl });\n const result = await client.deleteIncomingInvitation(invitation.id);\n if (!result.success) {\n console.error('[VrtxIncomingInvitations] API delete failed:', result.message);\n throw new Error(result.message || 'Failed to delete invitation');\n }\n }\n\n // Animate out after successful action\n if (animateOut) {\n animateOut();\n } else {\n handleRemoveFromDisplay(invitation.id);\n }\n } catch (err) {\n console.error('[VrtxIncomingInvitations] Delete failed:', err);\n } finally {\n setActionInProgress(null);\n }\n });\n },\n [\n incomingInvitationsConfig,\n apiUrl,\n jwt,\n triggerHaptic,\n deleteConfirmTitle,\n deleteConfirmMessage,\n showConfirmation,\n handleRemoveFromDisplay,\n onAnalyticsEvent,\n ]\n );\n\n // Helper to parse CSS padding string to React Native padding object\n const parsePadding = (paddingStr: string | undefined) => {\n if (!paddingStr) return {};\n const parts = paddingStr.trim().split(/\\s+/);\n if (parts.length === 1) {\n const val = parseInt(parts[0], 10);\n return isNaN(val) ? {} : { paddingVertical: val, paddingHorizontal: val };\n }\n if (parts.length === 2) {\n const vertical = parseInt(parts[0], 10);\n const horizontal = parseInt(parts[1], 10);\n return {\n ...(isNaN(vertical) ? {} : { paddingVertical: vertical }),\n ...(isNaN(horizontal) ? {} : { paddingHorizontal: horizontal }),\n };\n }\n return {};\n };\n\n // Helper to parse border string (e.g., \"1px solid #ccc\")\n const parseBorder = (borderStr: string | undefined) => {\n if (!borderStr) return {};\n const match = borderStr.match(/^(\\d+)px\\s+(\\w+)\\s+(.+)$/);\n if (match) {\n return {\n borderWidth: parseInt(match[1], 10),\n borderColor: match[3],\n };\n }\n return {};\n };\n\n // Render avatar or initials\n const renderAvatar = (invitation: IncomingInvitationItem) => {\n if (invitation.avatarUrl) {\n return <Image source={{ uri: invitation.avatarUrl }} style={styles.avatar} />;\n }\n\n // Generate initials from name\n const initials = invitation.name\n .split(' ')\n .map((part: string) => part[0])\n .join('')\n .toUpperCase()\n .slice(0, 2);\n\n // Handle avatar background with gradient support\n const avatarBackground = avatarStyles.background;\n const isAvatarGradient = avatarBackground?.includes('linear-gradient');\n const avatarBgStyle: any = {};\n\n if (isWeb && avatarBackground) {\n avatarBgStyle.background = avatarBackground;\n } else if (isAvatarGradient && avatarBackground) {\n const fallbackColor = parseGradientFirstColor(avatarBackground);\n avatarBgStyle.backgroundColor = fallbackColor || colors.primaryBackground;\n } else {\n avatarBgStyle.backgroundColor = avatarBackground || colors.primaryBackground;\n }\n\n return (\n <View style={[styles.avatarPlaceholder, avatarBgStyle]}>\n <Text style={[styles.avatarInitials, { color: avatarStyles.color }]}>{initials}</Text>\n </View>\n );\n };\n\n // Build button style with gradient support\n const buildButtonStyle = (buttonStyles: any, fallbackBg: string) => {\n const backgroundValue = buttonStyles.background;\n const isGradient = backgroundValue?.includes('linear-gradient');\n\n const dynamicButtonStyle: any = {\n ...(buttonStyles.borderRadius\n ? { borderRadius: parseInt(buttonStyles.borderRadius, 10) }\n : {}),\n ...parsePadding(buttonStyles.padding),\n ...parseBorder(buttonStyles.border),\n };\n\n if (isWeb && backgroundValue) {\n dynamicButtonStyle.background = backgroundValue;\n } else if (isGradient && backgroundValue) {\n const fallbackColor = parseGradientFirstColor(backgroundValue);\n dynamicButtonStyle.backgroundColor = fallbackColor || fallbackBg;\n } else {\n dynamicButtonStyle.backgroundColor = backgroundValue || fallbackBg;\n }\n\n return dynamicButtonStyle;\n };\n\n // Render a single invitation item\n const renderInvitationContent = (item: IncomingInvitationItem) => {\n const isLoading = actionInProgress === item.id;\n const animateOut = item.metadata?.animateOut as (() => void) | undefined;\n\n // Build dynamic button styles\n const deleteButtonDynamicStyle = buildButtonStyle(deleteButtonStyles, colors.secondaryBackground);\n const acceptButtonDynamicStyle = buildButtonStyle(acceptButtonStyles, colors.primaryBackground);\n\n // Build dynamic text styles\n const deleteTextStyle: any = {\n color: deleteButtonStyles.color,\n ...(deleteButtonStyles.fontSize ? { fontSize: parseInt(deleteButtonStyles.fontSize, 10) } : {}),\n ...(deleteButtonStyles.fontWeight ? { fontWeight: deleteButtonStyles.fontWeight } : {}),\n };\n\n const acceptTextStyle: any = {\n color: acceptButtonStyles.color,\n ...(acceptButtonStyles.fontSize ? { fontSize: parseInt(acceptButtonStyles.fontSize, 10) } : {}),\n ...(acceptButtonStyles.fontWeight ? { fontWeight: acceptButtonStyles.fontWeight } : {}),\n };\n\n // Build dynamic name style\n const dynamicNameStyle: any = {\n color: nameStyles.color,\n ...(nameStyles.fontFamily ? { fontFamily: nameStyles.fontFamily } : {}),\n ...(nameStyles.fontSize ? { fontSize: parseInt(nameStyles.fontSize, 10) } : {}),\n ...(nameStyles.fontWeight ? { fontWeight: nameStyles.fontWeight } : {}),\n };\n\n // Build dynamic subtitle style\n const dynamicSubtitleStyle: any = {\n color: subtitleStyles.color,\n ...(subtitleStyles.fontFamily ? { fontFamily: subtitleStyles.fontFamily } : {}),\n ...(subtitleStyles.fontSize ? { fontSize: parseInt(subtitleStyles.fontSize, 10) } : {}),\n };\n\n return (\n <View style={styles.invitationItem}>\n {renderAvatar(item)}\n <View style={styles.invitationInfo}>\n <Text style={[styles.invitationName, dynamicNameStyle]} numberOfLines={1}>\n {item.name}\n </Text>\n {(() => {\n const displaySubtitle = incomingInvitationsConfig?.getSubtitle?.(item);\n return displaySubtitle ? (\n <Text style={[styles.invitationSubtitle, dynamicSubtitleStyle]} numberOfLines={1}>\n {displaySubtitle}\n </Text>\n ) : null;\n })()}\n </View>\n <View style={styles.buttonContainer}>\n {/* Delete button (left) */}\n <ButtonWrapper\n style={[styles.actionButton, deleteButtonDynamicStyle, styles.deleteButton]}\n gradientString={deleteButtonStyles.background?.includes('gradient') ? deleteButtonStyles.background : null}\n onPress={() => handleDelete(item, animateOut)}\n disabled={isLoading}\n >\n {isLoading ? (\n <ActivityIndicator size=\"small\" color={deleteButtonStyles.color} />\n ) : (\n <Text style={[styles.actionButtonText, deleteTextStyle]}>{deleteButtonText}</Text>\n )}\n </ButtonWrapper>\n {/* Accept button (right) */}\n <ButtonWrapper\n style={[styles.actionButton, acceptButtonDynamicStyle]}\n gradientString={acceptButtonStyles.background?.includes('gradient') ? acceptButtonStyles.background : null}\n onPress={() => handleAccept(item, animateOut)}\n disabled={isLoading}\n >\n {isLoading ? (\n <ActivityIndicator size=\"small\" color={acceptButtonStyles.color} />\n ) : (\n <Text style={[styles.actionButtonText, acceptTextStyle]}>{acceptButtonText}</Text>\n )}\n </ButtonWrapper>\n </View>\n </View>\n );\n };\n\n // Render item with animation wrapper\n const renderItem = ({ item }: { item: IncomingInvitationItem }) => {\n return (\n <AnimatedInvitationItem\n item={item}\n renderContent={renderInvitationContent}\n onRemove={handleRemoveFromDisplay}\n />\n );\n };\n\n // Show placeholder if no config provided and no API credentials\n if (!incomingInvitationsConfig && !(apiUrl && jwt)) {\n const label = block?.attributes?.label || '';\n return (\n <View style={styles.container}>\n {label ? <Text style={[styles.label, { color: colors.foreground }]}>{label}</Text> : null}\n <Text style={[styles.placeholderText, { color: colors.secondaryForeground }]}>\n Incoming Invitations component - provide incomingInvitationsConfig or apiUrl+jwt to enable\n </Text>\n </View>\n );\n }\n\n // Loading state — only shown when there are no config invitations to display\n if (isLoading) {\n return (\n <View style={styles.container}>\n <ActivityIndicator size=\"large\" color={colors.primaryBackground} />\n </View>\n );\n }\n\n // Empty state - render nothing (0 height) when no invitations, like iOS\n if (displayedInvitations.length === 0) {\n return null;\n }\n\n // Get title from block attributes (configured in editor as \"Title\")\n const title = block?.attributes?.title;\n\n // Build dynamic title style\n const dynamicTitleStyle: any = {\n color: titleStyles.color,\n ...(titleStyles.fontFamily ? { fontFamily: titleStyles.fontFamily } : {}),\n ...(titleStyles.fontSize ? { fontSize: parseInt(titleStyles.fontSize, 10) } : {}),\n ...(titleStyles.fontWeight ? { fontWeight: titleStyles.fontWeight } : {}),\n };\n\n // Main view: Invitations list\n // Note: Using View + map instead of FlatList to avoid \"VirtualizedLists should never be nested\" warning\n // when this component is rendered inside a ScrollView (which InviteFormCore uses)\n return (\n <View style={styles.listContainer}>\n {title && (\n <Text style={[styles.title, dynamicTitleStyle]}>{title}</Text>\n )}\n <View style={styles.listContent}>\n {displayedInvitations.map((item) => (\n <View key={item.id}>\n {renderItem({ item })}\n </View>\n ))}\n </View>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n container: {\n padding: 16,\n alignItems: 'center',\n justifyContent: 'center',\n minHeight: 120,\n },\n listContainer: {\n flex: 1,\n },\n title: {\n fontSize: 16,\n fontWeight: '600',\n marginBottom: 12,\n },\n label: {\n fontSize: 16,\n fontWeight: '500',\n marginBottom: 12,\n },\n placeholderText: {\n fontSize: 14,\n textAlign: 'center',\n },\n emptyText: {\n fontSize: 14,\n textAlign: 'center',\n },\n listContent: {\n paddingBottom: 16,\n },\n invitationItem: {\n flexDirection: 'row',\n alignItems: 'center',\n paddingVertical: 12,\n },\n avatar: {\n width: 44,\n height: 44,\n borderRadius: 22,\n },\n avatarPlaceholder: {\n width: 44,\n height: 44,\n borderRadius: 22,\n alignItems: 'center',\n justifyContent: 'center',\n },\n avatarInitials: {\n fontSize: 16,\n fontWeight: '600',\n },\n invitationInfo: {\n flex: 1,\n marginLeft: 12,\n marginRight: 12,\n },\n invitationName: {\n fontSize: 16,\n fontWeight: '500',\n },\n invitationSubtitle: {\n fontSize: 13,\n marginTop: 2,\n },\n buttonContainer: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 8,\n },\n actionButton: {\n paddingHorizontal: 12,\n paddingVertical: 8,\n borderRadius: 8,\n minWidth: 70,\n alignItems: 'center',\n justifyContent: 'center',\n },\n deleteButton: {\n marginRight: 8,\n },\n actionButtonText: {\n fontSize: 14,\n fontWeight: '600',\n },\n});\n"]}
|
|
@@ -0,0 +1,506 @@
|
|
|
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.VrtxInvitationSuggestions = VrtxInvitationSuggestions;
|
|
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
|
+
// Animated item wrapper for fade-out effect
|
|
94
|
+
function AnimatedSuggestionItem({ item, renderContent, onRemove, }) {
|
|
95
|
+
const fadeAnim = (0, react_1.useRef)(new react_native_1.Animated.Value(1)).current;
|
|
96
|
+
const heightAnim = (0, react_1.useRef)(new react_native_1.Animated.Value(1)).current;
|
|
97
|
+
const animateOut = (0, react_1.useCallback)(() => {
|
|
98
|
+
react_native_1.Animated.parallel([
|
|
99
|
+
react_native_1.Animated.timing(fadeAnim, {
|
|
100
|
+
toValue: 0,
|
|
101
|
+
duration: 200,
|
|
102
|
+
useNativeDriver: false,
|
|
103
|
+
}),
|
|
104
|
+
react_native_1.Animated.timing(heightAnim, {
|
|
105
|
+
toValue: 0,
|
|
106
|
+
duration: 200,
|
|
107
|
+
useNativeDriver: false,
|
|
108
|
+
}),
|
|
109
|
+
]).start(() => {
|
|
110
|
+
onRemove(item.id);
|
|
111
|
+
});
|
|
112
|
+
}, [fadeAnim, heightAnim, item.id, onRemove]);
|
|
113
|
+
return (<react_native_1.Animated.View style={{
|
|
114
|
+
opacity: fadeAnim,
|
|
115
|
+
transform: [{ scaleY: heightAnim }],
|
|
116
|
+
}}>
|
|
117
|
+
{renderContent(Object.assign(Object.assign({}, item), { metadata: Object.assign(Object.assign({}, item.metadata), { animateOut }) }))}
|
|
118
|
+
</react_native_1.Animated.View>);
|
|
119
|
+
}
|
|
120
|
+
function VrtxInvitationSuggestions({ block, invitationSuggestionsConfig, createUserIdInvitation, triggerHaptic, onAnalyticsEvent, theme, }) {
|
|
121
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p;
|
|
122
|
+
// Local state for managing the displayed suggestions (for animate-out)
|
|
123
|
+
const [displayedSuggestions, setDisplayedSuggestions] = (0, react_1.useState)((invitationSuggestionsConfig === null || invitationSuggestionsConfig === void 0 ? void 0 : invitationSuggestionsConfig.suggestions) || []);
|
|
124
|
+
const [actionInProgress, setActionInProgress] = (0, react_1.useState)(null);
|
|
125
|
+
// Sync with props when suggestions change
|
|
126
|
+
(0, react_1.useEffect)(() => {
|
|
127
|
+
setDisplayedSuggestions((invitationSuggestionsConfig === null || invitationSuggestionsConfig === void 0 ? void 0 : invitationSuggestionsConfig.suggestions) || []);
|
|
128
|
+
}, [invitationSuggestionsConfig === null || invitationSuggestionsConfig === void 0 ? void 0 : invitationSuggestionsConfig.suggestions]);
|
|
129
|
+
// Extract customization from block settings or config props, with defaults
|
|
130
|
+
const blockCustomizations = (_a = block === null || block === void 0 ? void 0 : block.settings) === null || _a === void 0 ? void 0 : _a.customizations;
|
|
131
|
+
const inviteButtonText = (_d = (_c = (_b = blockCustomizations === null || blockCustomizations === void 0 ? void 0 : blockCustomizations.inviteButton) === null || _b === void 0 ? void 0 : _b.textContent) !== null && _c !== void 0 ? _c : invitationSuggestionsConfig === null || invitationSuggestionsConfig === void 0 ? void 0 : invitationSuggestionsConfig.inviteButtonText) !== null && _d !== void 0 ? _d : 'Invite';
|
|
132
|
+
const emptyStateMessage = (_g = (_f = (_e = blockCustomizations === null || blockCustomizations === void 0 ? void 0 : blockCustomizations.emptyStateMessage) === null || _e === void 0 ? void 0 : _e.textContent) !== null && _f !== void 0 ? _f : invitationSuggestionsConfig === null || invitationSuggestionsConfig === void 0 ? void 0 : invitationSuggestionsConfig.emptyStateMessage) !== null && _g !== void 0 ? _g : 'No suggestions';
|
|
133
|
+
// Helper to get theme option value from block.theme.options
|
|
134
|
+
const getBlockThemeValue = (key) => {
|
|
135
|
+
var _a;
|
|
136
|
+
const options = (_a = block === null || block === void 0 ? void 0 : block.theme) === null || _a === void 0 ? void 0 : _a.options;
|
|
137
|
+
if (!options || !Array.isArray(options))
|
|
138
|
+
return undefined;
|
|
139
|
+
const option = options.find((opt) => opt.key === key);
|
|
140
|
+
return (option === null || option === void 0 ? void 0 : option.value) || undefined;
|
|
141
|
+
};
|
|
142
|
+
// Theme colors with defaults
|
|
143
|
+
const colors = {
|
|
144
|
+
primaryBackground: (_h = theme === null || theme === void 0 ? void 0 : theme.primaryBackground) !== null && _h !== void 0 ? _h : '#6291d5',
|
|
145
|
+
primaryForeground: (_j = theme === null || theme === void 0 ? void 0 : theme.primaryForeground) !== null && _j !== void 0 ? _j : '#ffffff',
|
|
146
|
+
secondaryBackground: (_k = theme === null || theme === void 0 ? void 0 : theme.secondaryBackground) !== null && _k !== void 0 ? _k : '#ffffff',
|
|
147
|
+
secondaryForeground: (_l = theme === null || theme === void 0 ? void 0 : theme.secondaryForeground) !== null && _l !== void 0 ? _l : '#353e5c',
|
|
148
|
+
foreground: (_m = theme === null || theme === void 0 ? void 0 : theme.foreground) !== null && _m !== void 0 ? _m : '#334153',
|
|
149
|
+
border: (_o = theme === null || theme === void 0 ? void 0 : theme.border) !== null && _o !== void 0 ? _o : '#cccccc',
|
|
150
|
+
};
|
|
151
|
+
// Button styles from block.theme.options (microTheme)
|
|
152
|
+
const inviteButtonStyles = {
|
|
153
|
+
background: getBlockThemeValue('--vrtx-invitation-suggestions-invite-button-background') ||
|
|
154
|
+
colors.primaryBackground,
|
|
155
|
+
color: getBlockThemeValue('--vrtx-invitation-suggestions-invite-button-color') ||
|
|
156
|
+
colors.primaryForeground,
|
|
157
|
+
borderRadius: getBlockThemeValue('--vrtx-invitation-suggestions-invite-button-border-radius'),
|
|
158
|
+
border: getBlockThemeValue('--vrtx-invitation-suggestions-invite-button-border'),
|
|
159
|
+
padding: getBlockThemeValue('--vrtx-invitation-suggestions-invite-button-padding'),
|
|
160
|
+
fontSize: getBlockThemeValue('--vrtx-invitation-suggestions-invite-button-font-size'),
|
|
161
|
+
fontWeight: getBlockThemeValue('--vrtx-invitation-suggestions-invite-button-font-weight'),
|
|
162
|
+
};
|
|
163
|
+
// Dismiss button styles from block.theme.options (microTheme)
|
|
164
|
+
const dismissButtonStyles = {
|
|
165
|
+
background: getBlockThemeValue('--vrtx-invitation-suggestions-dismiss-button-background') ||
|
|
166
|
+
'transparent',
|
|
167
|
+
color: getBlockThemeValue('--vrtx-invitation-suggestions-dismiss-button-color') ||
|
|
168
|
+
colors.secondaryForeground,
|
|
169
|
+
};
|
|
170
|
+
// Avatar/initials styles from block.theme.options (microTheme)
|
|
171
|
+
const avatarStyles = {
|
|
172
|
+
background: getBlockThemeValue('--vrtx-invitation-suggestions-avatar-background') ||
|
|
173
|
+
colors.primaryBackground,
|
|
174
|
+
color: getBlockThemeValue('--vrtx-invitation-suggestions-avatar-color') || colors.primaryForeground,
|
|
175
|
+
};
|
|
176
|
+
// Name styles from block.theme.options (microTheme)
|
|
177
|
+
const nameStyles = {
|
|
178
|
+
color: getBlockThemeValue('--vrtx-invitation-suggestions-name-color') || colors.foreground,
|
|
179
|
+
fontFamily: getBlockThemeValue('--vrtx-invitation-suggestions-name-font-family'),
|
|
180
|
+
fontSize: getBlockThemeValue('--vrtx-invitation-suggestions-name-font-size'),
|
|
181
|
+
fontWeight: getBlockThemeValue('--vrtx-invitation-suggestions-name-font-weight'),
|
|
182
|
+
};
|
|
183
|
+
// Subtitle styles from block.theme.options (microTheme)
|
|
184
|
+
const subtitleStyles = {
|
|
185
|
+
color: getBlockThemeValue('--vrtx-invitation-suggestions-subtitle-color') ||
|
|
186
|
+
colors.secondaryForeground,
|
|
187
|
+
fontFamily: getBlockThemeValue('--vrtx-invitation-suggestions-subtitle-font-family'),
|
|
188
|
+
fontSize: getBlockThemeValue('--vrtx-invitation-suggestions-subtitle-font-size'),
|
|
189
|
+
};
|
|
190
|
+
// Title styles from block.theme.options (microTheme)
|
|
191
|
+
const titleStyles = {
|
|
192
|
+
color: getBlockThemeValue('--vrtx-invitation-suggestions-title-color') || colors.foreground,
|
|
193
|
+
fontFamily: getBlockThemeValue('--vrtx-invitation-suggestions-title-font-family'),
|
|
194
|
+
fontSize: getBlockThemeValue('--vrtx-invitation-suggestions-title-font-size'),
|
|
195
|
+
fontWeight: getBlockThemeValue('--vrtx-invitation-suggestions-title-font-weight'),
|
|
196
|
+
};
|
|
197
|
+
// Get title from block attributes (configured in Styles tab)
|
|
198
|
+
const title = ((_p = block === null || block === void 0 ? void 0 : block.attributes) === null || _p === void 0 ? void 0 : _p.title) || '';
|
|
199
|
+
// Remove suggestion from displayed list (after animation)
|
|
200
|
+
const handleRemoveFromDisplay = (0, react_1.useCallback)((id) => {
|
|
201
|
+
setDisplayedSuggestions((prev) => prev.filter((s) => s.id !== id));
|
|
202
|
+
}, []);
|
|
203
|
+
// Handle Invite button press (no confirmation)
|
|
204
|
+
const handleInvite = (0, react_1.useCallback)((suggestion, animateOut) => __awaiter(this, void 0, void 0, function* () {
|
|
205
|
+
if (!(invitationSuggestionsConfig === null || invitationSuggestionsConfig === void 0 ? void 0 : invitationSuggestionsConfig.onInvite))
|
|
206
|
+
return;
|
|
207
|
+
setActionInProgress(suggestion.id);
|
|
208
|
+
yield (triggerHaptic === null || triggerHaptic === void 0 ? void 0 : triggerHaptic('light'));
|
|
209
|
+
// Emit analytics event for PYMK invite click
|
|
210
|
+
onAnalyticsEvent === null || onAnalyticsEvent === void 0 ? void 0 : onAnalyticsEvent({
|
|
211
|
+
name: analytics_client_1.EventNames.PYMK_INVITE_CLICKED,
|
|
212
|
+
segmentation: {
|
|
213
|
+
suggestionId: suggestion.id,
|
|
214
|
+
suggestionName: suggestion.name,
|
|
215
|
+
},
|
|
216
|
+
});
|
|
217
|
+
try {
|
|
218
|
+
// Call customer's callback
|
|
219
|
+
yield invitationSuggestionsConfig.onInvite(suggestion);
|
|
220
|
+
// Create the invitation via the Vortex API so it appears in Outgoing Invitations
|
|
221
|
+
if (createUserIdInvitation) {
|
|
222
|
+
yield createUserIdInvitation(suggestion.id, suggestion.name, suggestion.avatarUrl, suggestion.metadata);
|
|
223
|
+
// Notify other components (e.g., VrtxOutgoingInvitations) to refresh
|
|
224
|
+
(0, invitationEvents_1.emitInvitationEvent)('invitationCreated');
|
|
225
|
+
}
|
|
226
|
+
// Animate out after successful action
|
|
227
|
+
if (animateOut) {
|
|
228
|
+
animateOut();
|
|
229
|
+
}
|
|
230
|
+
else {
|
|
231
|
+
handleRemoveFromDisplay(suggestion.id);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
catch (err) {
|
|
235
|
+
console.error('[VrtxInvitationSuggestions] Invite failed:', err);
|
|
236
|
+
}
|
|
237
|
+
finally {
|
|
238
|
+
setActionInProgress(null);
|
|
239
|
+
}
|
|
240
|
+
}), [invitationSuggestionsConfig, createUserIdInvitation, triggerHaptic, onAnalyticsEvent, handleRemoveFromDisplay]);
|
|
241
|
+
// Handle Dismiss (X) button press (no confirmation)
|
|
242
|
+
const handleDismiss = (0, react_1.useCallback)((suggestion, animateOut) => __awaiter(this, void 0, void 0, function* () {
|
|
243
|
+
if (!(invitationSuggestionsConfig === null || invitationSuggestionsConfig === void 0 ? void 0 : invitationSuggestionsConfig.onDismiss))
|
|
244
|
+
return;
|
|
245
|
+
setActionInProgress(suggestion.id);
|
|
246
|
+
yield (triggerHaptic === null || triggerHaptic === void 0 ? void 0 : triggerHaptic('light'));
|
|
247
|
+
// Emit analytics event for PYMK dismiss click
|
|
248
|
+
onAnalyticsEvent === null || onAnalyticsEvent === void 0 ? void 0 : onAnalyticsEvent({
|
|
249
|
+
name: analytics_client_1.EventNames.PYMK_DELETE_CLICKED,
|
|
250
|
+
segmentation: {
|
|
251
|
+
suggestionId: suggestion.id,
|
|
252
|
+
suggestionName: suggestion.name,
|
|
253
|
+
},
|
|
254
|
+
});
|
|
255
|
+
try {
|
|
256
|
+
yield invitationSuggestionsConfig.onDismiss(suggestion);
|
|
257
|
+
// Animate out after successful action
|
|
258
|
+
if (animateOut) {
|
|
259
|
+
animateOut();
|
|
260
|
+
}
|
|
261
|
+
else {
|
|
262
|
+
handleRemoveFromDisplay(suggestion.id);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
catch (err) {
|
|
266
|
+
console.error('[VrtxInvitationSuggestions] Dismiss failed:', err);
|
|
267
|
+
}
|
|
268
|
+
finally {
|
|
269
|
+
setActionInProgress(null);
|
|
270
|
+
}
|
|
271
|
+
}), [invitationSuggestionsConfig, triggerHaptic, onAnalyticsEvent, handleRemoveFromDisplay]);
|
|
272
|
+
// Helper to parse CSS padding string to React Native padding object
|
|
273
|
+
const parsePadding = (paddingStr) => {
|
|
274
|
+
if (!paddingStr)
|
|
275
|
+
return {};
|
|
276
|
+
const parts = paddingStr.trim().split(/\s+/);
|
|
277
|
+
if (parts.length === 1) {
|
|
278
|
+
const val = parseInt(parts[0], 10);
|
|
279
|
+
return isNaN(val) ? {} : { paddingVertical: val, paddingHorizontal: val };
|
|
280
|
+
}
|
|
281
|
+
if (parts.length === 2) {
|
|
282
|
+
const vertical = parseInt(parts[0], 10);
|
|
283
|
+
const horizontal = parseInt(parts[1], 10);
|
|
284
|
+
return Object.assign(Object.assign({}, (isNaN(vertical) ? {} : { paddingVertical: vertical })), (isNaN(horizontal) ? {} : { paddingHorizontal: horizontal }));
|
|
285
|
+
}
|
|
286
|
+
return {};
|
|
287
|
+
};
|
|
288
|
+
// Helper to parse border string (e.g., "1px solid #ccc")
|
|
289
|
+
const parseBorder = (borderStr) => {
|
|
290
|
+
if (!borderStr)
|
|
291
|
+
return {};
|
|
292
|
+
const match = borderStr.match(/^(\d+)px\s+(\w+)\s+(.+)$/);
|
|
293
|
+
if (match) {
|
|
294
|
+
return {
|
|
295
|
+
borderWidth: parseInt(match[1], 10),
|
|
296
|
+
borderColor: match[3],
|
|
297
|
+
};
|
|
298
|
+
}
|
|
299
|
+
return {};
|
|
300
|
+
};
|
|
301
|
+
// Render avatar or initials
|
|
302
|
+
const renderAvatar = (suggestion) => {
|
|
303
|
+
if (suggestion.avatarUrl) {
|
|
304
|
+
return <react_native_1.Image source={{ uri: suggestion.avatarUrl }} style={styles.avatar}/>;
|
|
305
|
+
}
|
|
306
|
+
// Generate initials from name
|
|
307
|
+
const initials = suggestion.name
|
|
308
|
+
.split(' ')
|
|
309
|
+
.map((part) => part[0])
|
|
310
|
+
.join('')
|
|
311
|
+
.toUpperCase()
|
|
312
|
+
.slice(0, 2);
|
|
313
|
+
// Handle avatar background with gradient support
|
|
314
|
+
const avatarBackground = avatarStyles.background;
|
|
315
|
+
const isAvatarGradient = avatarBackground === null || avatarBackground === void 0 ? void 0 : avatarBackground.includes('linear-gradient');
|
|
316
|
+
const avatarBgStyle = {};
|
|
317
|
+
if (isWeb && avatarBackground) {
|
|
318
|
+
avatarBgStyle.background = avatarBackground;
|
|
319
|
+
}
|
|
320
|
+
else if (isAvatarGradient && avatarBackground) {
|
|
321
|
+
const fallbackColor = parseGradientFirstColor(avatarBackground);
|
|
322
|
+
avatarBgStyle.backgroundColor = fallbackColor || colors.primaryBackground;
|
|
323
|
+
}
|
|
324
|
+
else {
|
|
325
|
+
avatarBgStyle.backgroundColor = avatarBackground || colors.primaryBackground;
|
|
326
|
+
}
|
|
327
|
+
return (<react_native_1.View style={[styles.avatarPlaceholder, avatarBgStyle]}>
|
|
328
|
+
<react_native_1.Text style={[styles.avatarInitials, { color: avatarStyles.color }]}>{initials}</react_native_1.Text>
|
|
329
|
+
</react_native_1.View>);
|
|
330
|
+
};
|
|
331
|
+
// Build button style with gradient support
|
|
332
|
+
const buildButtonStyle = (buttonStyles, fallbackBg) => {
|
|
333
|
+
const backgroundValue = buttonStyles.background;
|
|
334
|
+
const isGradient = backgroundValue === null || backgroundValue === void 0 ? void 0 : backgroundValue.includes('linear-gradient');
|
|
335
|
+
const dynamicButtonStyle = Object.assign(Object.assign(Object.assign({}, (buttonStyles.borderRadius
|
|
336
|
+
? { borderRadius: parseInt(buttonStyles.borderRadius, 10) }
|
|
337
|
+
: {})), parsePadding(buttonStyles.padding)), parseBorder(buttonStyles.border));
|
|
338
|
+
if (isWeb && backgroundValue) {
|
|
339
|
+
dynamicButtonStyle.background = backgroundValue;
|
|
340
|
+
}
|
|
341
|
+
else if (isGradient && backgroundValue) {
|
|
342
|
+
const fallbackColor = parseGradientFirstColor(backgroundValue);
|
|
343
|
+
dynamicButtonStyle.backgroundColor = fallbackColor || fallbackBg;
|
|
344
|
+
}
|
|
345
|
+
else {
|
|
346
|
+
dynamicButtonStyle.backgroundColor = backgroundValue || fallbackBg;
|
|
347
|
+
}
|
|
348
|
+
return dynamicButtonStyle;
|
|
349
|
+
};
|
|
350
|
+
// Render a single suggestion item
|
|
351
|
+
const renderSuggestionContent = (item) => {
|
|
352
|
+
var _a, _b;
|
|
353
|
+
const isLoading = actionInProgress === item.id;
|
|
354
|
+
const animateOut = (_a = item.metadata) === null || _a === void 0 ? void 0 : _a.animateOut;
|
|
355
|
+
// Build dynamic button style
|
|
356
|
+
const inviteButtonDynamicStyle = buildButtonStyle(inviteButtonStyles, colors.primaryBackground);
|
|
357
|
+
// Build dynamic text style
|
|
358
|
+
const inviteTextStyle = Object.assign(Object.assign({ color: inviteButtonStyles.color }, (inviteButtonStyles.fontSize
|
|
359
|
+
? { fontSize: parseInt(inviteButtonStyles.fontSize, 10) }
|
|
360
|
+
: {})), (inviteButtonStyles.fontWeight ? { fontWeight: inviteButtonStyles.fontWeight } : {}));
|
|
361
|
+
// Build dynamic name style
|
|
362
|
+
const dynamicNameStyle = Object.assign(Object.assign(Object.assign({ color: nameStyles.color }, (nameStyles.fontFamily ? { fontFamily: nameStyles.fontFamily } : {})), (nameStyles.fontSize ? { fontSize: parseInt(nameStyles.fontSize, 10) } : {})), (nameStyles.fontWeight ? { fontWeight: nameStyles.fontWeight } : {}));
|
|
363
|
+
// Build dynamic subtitle style
|
|
364
|
+
const dynamicSubtitleStyle = Object.assign(Object.assign({ color: subtitleStyles.color }, (subtitleStyles.fontFamily ? { fontFamily: subtitleStyles.fontFamily } : {})), (subtitleStyles.fontSize ? { fontSize: parseInt(subtitleStyles.fontSize, 10) } : {}));
|
|
365
|
+
return (<react_native_1.View style={styles.suggestionItem}>
|
|
366
|
+
{renderAvatar(item)}
|
|
367
|
+
<react_native_1.View style={styles.suggestionInfo}>
|
|
368
|
+
<react_native_1.Text style={[styles.suggestionName, dynamicNameStyle]} numberOfLines={1}>
|
|
369
|
+
{item.name}
|
|
370
|
+
</react_native_1.Text>
|
|
371
|
+
{item.subtitle && (<react_native_1.Text style={[styles.suggestionSubtitle, dynamicSubtitleStyle]} numberOfLines={1}>
|
|
372
|
+
{item.subtitle}
|
|
373
|
+
</react_native_1.Text>)}
|
|
374
|
+
</react_native_1.View>
|
|
375
|
+
{/* Invite button */}
|
|
376
|
+
<ButtonWrapper style={[styles.actionButton, inviteButtonDynamicStyle]} gradientString={((_b = inviteButtonStyles.background) === null || _b === void 0 ? void 0 : _b.includes('gradient')) ? inviteButtonStyles.background : null} onPress={() => handleInvite(item, animateOut)} disabled={isLoading}>
|
|
377
|
+
{isLoading ? (<react_native_1.ActivityIndicator size="small" color={inviteButtonStyles.color}/>) : (<react_native_1.Text style={[styles.actionButtonText, inviteTextStyle]}>{inviteButtonText}</react_native_1.Text>)}
|
|
378
|
+
</ButtonWrapper>
|
|
379
|
+
{/* Dismiss (X) button */}
|
|
380
|
+
<react_native_1.TouchableOpacity style={[styles.dismissButton, { backgroundColor: dismissButtonStyles.background }]} onPress={() => handleDismiss(item, animateOut)} disabled={isLoading} activeOpacity={0.7}>
|
|
381
|
+
<react_native_1.Text style={[styles.dismissButtonText, { color: dismissButtonStyles.color }]}>✕</react_native_1.Text>
|
|
382
|
+
</react_native_1.TouchableOpacity>
|
|
383
|
+
</react_native_1.View>);
|
|
384
|
+
};
|
|
385
|
+
// Render item with animation wrapper
|
|
386
|
+
const renderSuggestionItem = ({ item }) => {
|
|
387
|
+
return (<AnimatedSuggestionItem item={item} renderContent={renderSuggestionContent} onRemove={handleRemoveFromDisplay}/>);
|
|
388
|
+
};
|
|
389
|
+
// Build dynamic title style
|
|
390
|
+
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 } : {}));
|
|
391
|
+
// Show placeholder if no config provided
|
|
392
|
+
if (!invitationSuggestionsConfig) {
|
|
393
|
+
return (<react_native_1.View style={styles.container}>
|
|
394
|
+
{title ? <react_native_1.Text style={[styles.title, dynamicTitleStyle]}>{title}</react_native_1.Text> : null}
|
|
395
|
+
<react_native_1.Text style={[styles.placeholderText, { color: colors.secondaryForeground }]}>
|
|
396
|
+
Invitation Suggestions component - provide invitationSuggestionsConfig to enable
|
|
397
|
+
</react_native_1.Text>
|
|
398
|
+
</react_native_1.View>);
|
|
399
|
+
}
|
|
400
|
+
// Empty state
|
|
401
|
+
if (displayedSuggestions.length === 0) {
|
|
402
|
+
return (<react_native_1.View style={styles.container}>
|
|
403
|
+
{title ? <react_native_1.Text style={[styles.title, dynamicTitleStyle]}>{title}</react_native_1.Text> : null}
|
|
404
|
+
<react_native_1.Text style={[styles.emptyText, { color: colors.secondaryForeground }]}>
|
|
405
|
+
{emptyStateMessage}
|
|
406
|
+
</react_native_1.Text>
|
|
407
|
+
</react_native_1.View>);
|
|
408
|
+
}
|
|
409
|
+
// Main list view
|
|
410
|
+
// Note: Using View + map instead of FlatList to avoid "VirtualizedLists should never be nested" warning
|
|
411
|
+
// when this component is rendered inside a ScrollView (which InviteFormCore uses)
|
|
412
|
+
return (<react_native_1.View style={styles.listContainer}>
|
|
413
|
+
{title ? <react_native_1.Text style={[styles.title, dynamicTitleStyle]}>{title}</react_native_1.Text> : null}
|
|
414
|
+
<react_native_1.View style={styles.listContent}>
|
|
415
|
+
{displayedSuggestions.map((item) => (<react_native_1.View key={item.id}>
|
|
416
|
+
{renderSuggestionItem({ item })}
|
|
417
|
+
</react_native_1.View>))}
|
|
418
|
+
</react_native_1.View>
|
|
419
|
+
</react_native_1.View>);
|
|
420
|
+
}
|
|
421
|
+
const styles = react_native_1.StyleSheet.create({
|
|
422
|
+
container: {
|
|
423
|
+
padding: 16,
|
|
424
|
+
alignItems: 'center',
|
|
425
|
+
justifyContent: 'center',
|
|
426
|
+
minHeight: 120,
|
|
427
|
+
},
|
|
428
|
+
listContainer: {
|
|
429
|
+
flex: 1,
|
|
430
|
+
},
|
|
431
|
+
title: {
|
|
432
|
+
fontSize: 18,
|
|
433
|
+
fontWeight: '600',
|
|
434
|
+
marginBottom: 16,
|
|
435
|
+
},
|
|
436
|
+
placeholderText: {
|
|
437
|
+
fontSize: 14,
|
|
438
|
+
textAlign: 'center',
|
|
439
|
+
},
|
|
440
|
+
emptyText: {
|
|
441
|
+
fontSize: 14,
|
|
442
|
+
textAlign: 'center',
|
|
443
|
+
},
|
|
444
|
+
listContent: {
|
|
445
|
+
paddingBottom: 16,
|
|
446
|
+
},
|
|
447
|
+
suggestionItem: {
|
|
448
|
+
flexDirection: 'row',
|
|
449
|
+
alignItems: 'center',
|
|
450
|
+
paddingVertical: 12,
|
|
451
|
+
},
|
|
452
|
+
avatar: {
|
|
453
|
+
width: 44,
|
|
454
|
+
height: 44,
|
|
455
|
+
borderRadius: 22,
|
|
456
|
+
},
|
|
457
|
+
avatarPlaceholder: {
|
|
458
|
+
width: 44,
|
|
459
|
+
height: 44,
|
|
460
|
+
borderRadius: 22,
|
|
461
|
+
alignItems: 'center',
|
|
462
|
+
justifyContent: 'center',
|
|
463
|
+
},
|
|
464
|
+
avatarInitials: {
|
|
465
|
+
fontSize: 16,
|
|
466
|
+
fontWeight: '600',
|
|
467
|
+
},
|
|
468
|
+
suggestionInfo: {
|
|
469
|
+
flex: 1,
|
|
470
|
+
marginLeft: 12,
|
|
471
|
+
marginRight: 12,
|
|
472
|
+
},
|
|
473
|
+
suggestionName: {
|
|
474
|
+
fontSize: 16,
|
|
475
|
+
fontWeight: '500',
|
|
476
|
+
},
|
|
477
|
+
suggestionSubtitle: {
|
|
478
|
+
fontSize: 13,
|
|
479
|
+
marginTop: 2,
|
|
480
|
+
},
|
|
481
|
+
dismissButton: {
|
|
482
|
+
width: 32,
|
|
483
|
+
height: 32,
|
|
484
|
+
borderRadius: 16,
|
|
485
|
+
alignItems: 'center',
|
|
486
|
+
justifyContent: 'center',
|
|
487
|
+
marginLeft: 8,
|
|
488
|
+
},
|
|
489
|
+
dismissButtonText: {
|
|
490
|
+
fontSize: 16,
|
|
491
|
+
fontWeight: '500',
|
|
492
|
+
},
|
|
493
|
+
actionButton: {
|
|
494
|
+
paddingHorizontal: 16,
|
|
495
|
+
paddingVertical: 8,
|
|
496
|
+
borderRadius: 8,
|
|
497
|
+
minWidth: 70,
|
|
498
|
+
alignItems: 'center',
|
|
499
|
+
justifyContent: 'center',
|
|
500
|
+
},
|
|
501
|
+
actionButtonText: {
|
|
502
|
+
fontSize: 14,
|
|
503
|
+
fontWeight: '600',
|
|
504
|
+
},
|
|
505
|
+
});
|
|
506
|
+
//# sourceMappingURL=VrtxInvitationSuggestions.js.map
|