@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":"VrtxOutgoingInvitations.js","sourceRoot":"","sources":["../../src/components/VrtxOutgoingInvitations.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} from 'react-native';\nimport { OutgoingInvitationsConfig, OutgoingInvitationItem } from '../types/invitations';\nimport { EventNames } from '@teamvortexsoftware/analytics-client';\nimport type { SimpleAnalyticsEvent } from '../utils/analytics';\nimport { subscribeToInvitationEvent } from '../utils/invitationEvents';\n\nconst isWeb = Platform.OS === 'web';\n\n// Parse CSS linear-gradient to extract first color for fallback on native\nfunction parseGradientFirstColor(gradientString: string): string | null {\n if (!gradientString || !gradientString.includes('linear-gradient')) {\n return null;\n }\n\n const stopsRegex = /(rgba?\\([^)]+\\)|#[0-9a-fA-F]{3,8}|[a-z]+)\\s+(\\d+)%/i;\n const match = stopsRegex.exec(gradientString);\n\n if (match) {\n return match[1].trim();\n }\n\n return null;\n}\n\nexport interface VrtxOutgoingInvitationsProps {\n block: any;\n /** Outgoing Invitations configuration with optional onCancel callback */\n outgoingInvitationsConfig?: OutgoingInvitationsConfig;\n /** API URL for fetching invitations (required - passed from parent InviteFormCore) */\n apiUrl: string;\n /** JWT token for authentication (required - passed from parent InviteFormCore) */\n jwt: string;\n /** Trigger haptic feedback */\n triggerHaptic?: (style: 'light' | 'medium' | 'heavy') => Promise<void>;\n /** Theme colors from widget configuration */\n theme?: {\n primaryBackground?: string;\n primaryForeground?: string;\n secondaryBackground?: string;\n secondaryForeground?: string;\n foreground?: string;\n border?: string;\n };\n /** Callback to emit analytics events */\n onAnalyticsEvent?: (event: SimpleAnalyticsEvent) => void;\n}\n\n// Animated item wrapper for fade-out effect\nfunction AnimatedInvitationItem({\n item,\n renderContent,\n onRemove,\n}: {\n item: OutgoingInvitationItem;\n renderContent: (item: OutgoingInvitationItem) => React.ReactNode;\n onRemove: (id: string) => void;\n}) {\n const fadeAnim = useRef(new Animated.Value(1)).current;\n const heightAnim = useRef(new Animated.Value(1)).current;\n\n const animateOut = useCallback(() => {\n // Use sequential animations to avoid mixing useNativeDriver: true and false\n Animated.timing(fadeAnim, {\n toValue: 0,\n duration: 150,\n useNativeDriver: true,\n }).start(() => {\n onRemove(item.id);\n });\n }, [fadeAnim, item.id, onRemove]);\n\n return (\n <Animated.View\n style={{\n opacity: fadeAnim,\n }}\n >\n {renderContent({ ...item, metadata: { ...item.metadata, animateOut } })}\n </Animated.View>\n );\n}\n\nexport function VrtxOutgoingInvitations({\n block,\n outgoingInvitationsConfig,\n apiUrl,\n jwt,\n triggerHaptic,\n theme,\n onAnalyticsEvent,\n}: VrtxOutgoingInvitationsProps) {\n // Extract mock invitations from config (internal preview use only)\n const _mockInvitations = outgoingInvitationsConfig?._mockInvitations;\n // Local state for managing the displayed invitations (for animate-out)\n const [displayedInvitations, setDisplayedInvitations] = useState<OutgoingInvitationItem[]>([]);\n const [actionInProgress, setActionInProgress] = useState<string | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n // Use mock mode if _mockInvitations provided (preview), otherwise API mode\n const isMockMode = !!_mockInvitations;\n\n // Fetch invitations from API\n const fetchInvitations = useCallback(async () => {\n if (!apiUrl || !jwt) return;\n\n setIsLoading(true);\n setError(null);\n\n try {\n const response = await fetch(`${apiUrl}/api/v1/invitations/sent`, {\n method: 'GET',\n headers: {\n Authorization: `Bearer ${jwt}`,\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch invitations: ${response.status}`);\n }\n\n const data = await response.json();\n // Filter out shareable link invitations (targetType \"share\") - matches iOS SDK\n const filtered = (data.data?.invitations || []).filter((inv: any) => {\n const targetType = inv.targets?.[0]?.targetType;\n return targetType !== 'share';\n });\n const mappedInvitations: OutgoingInvitationItem[] = filtered.map((inv: any) => {\n // Extract target (invitee) info from the targets array - matches iOS SDK\n const target = inv.targets?.[0];\n const targetName = target?.targetName;\n const targetValue = target?.targetValue;\n \n // Use targetName as display name if available, otherwise fall back to targetValue\n const name = targetName ?? targetValue ?? inv.senderIdentifier ?? 'Unknown';\n return {\n id: inv.id,\n name,\n userId: targetValue,\n avatarUrl: target?.targetAvatarUrl,\n isVortexInvitation: true,\n metadata: inv,\n };\n });\n\n // Merge config invitations with API invitations, deduplicating by userId.\n const configInvitations = outgoingInvitationsConfig?.invitations || [];\n const apiUserIds = new Set(\n mappedInvitations\n .filter((inv) => inv.userId)\n .map((inv) => inv.userId)\n );\n const dedupedConfig = configInvitations.filter(\n (inv) => !inv.userId || !apiUserIds.has(inv.userId)\n );\n setDisplayedInvitations([...dedupedConfig, ...mappedInvitations]);\n } catch (err) {\n console.error('[VrtxOutgoingInvitations] Fetch failed:', err);\n setError(err instanceof Error ? err.message : 'Failed to load invitations');\n } finally {\n setIsLoading(false);\n }\n }, [apiUrl, jwt, outgoingInvitationsConfig?.invitations]);\n\n // Revoke invitation via API\n const revokeInvitation = useCallback(\n async (invitationId: string): Promise<boolean> => {\n if (!apiUrl || !jwt) return false;\n\n try {\n const response = await fetch(`${apiUrl}/api/v1/invitations/${invitationId}`, {\n method: 'DELETE',\n headers: {\n Authorization: `Bearer ${jwt}`,\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok && response.status !== 204) {\n throw new Error(`Failed to revoke invitation: ${response.status}`);\n }\n\n return true;\n } catch (err) {\n console.error('[VrtxOutgoingInvitations] Revoke failed:', err);\n return false;\n }\n },\n [apiUrl, jwt]\n );\n\n // Fetch invitations on mount - use mock data in preview mode, otherwise fetch from API\n useEffect(() => {\n if (isMockMode) {\n setDisplayedInvitations(_mockInvitations || []);\n } else {\n fetchInvitations();\n }\n }, [isMockMode, _mockInvitations, fetchInvitations]);\n\n // Subscribe to invitation events to refresh the list when new invitations are created\n useEffect(() => {\n if (isMockMode) return; // Don't subscribe in mock mode\n \n const unsubscribe = subscribeToInvitationEvent('invitationCreated', () => {\n console.log('[VrtxOutgoingInvitations] Invitation created event received, refreshing...');\n fetchInvitations();\n });\n \n return unsubscribe;\n }, [isMockMode, fetchInvitations]);\n\n // Extract customization from block settings (widget configuration), with defaults\n const blockCustomizations = block?.settings?.customizations;\n const cancelButtonText =\n blockCustomizations?.cancelButton?.textContent ?? 'Cancel';\n const emptyStateMessage =\n blockCustomizations?.emptyStateMessage?.textContent ?? 'No sent invitations';\n\n // Confirmation dialog texts from widget configuration\n const cancelConfirmTitle =\n blockCustomizations?.cancelConfirmTitle?.textContent ?? 'Cancel Invitation';\n const cancelConfirmMessage =\n blockCustomizations?.cancelConfirmMessage?.textContent ?? 'Cancel invitation to {name}?';\n const confirmButtonText =\n blockCustomizations?.confirmButtonText?.textContent ?? 'Confirm';\n const dismissButtonText =\n blockCustomizations?.dismissButtonText?.textContent ?? 'Keep';\n\n // Helper to get theme option value from block.theme.options\n const getBlockThemeValue = (key: string): string | undefined => {\n const options = block?.theme?.options;\n if (!options || !Array.isArray(options)) return undefined;\n const option = options.find((opt: any) => opt.key === key);\n return option?.value || undefined;\n };\n\n // Theme colors with defaults\n const colors = {\n primaryBackground: theme?.primaryBackground ?? '#6291d5',\n primaryForeground: theme?.primaryForeground ?? '#ffffff',\n secondaryBackground: theme?.secondaryBackground ?? '#ffffff',\n secondaryForeground: theme?.secondaryForeground ?? '#353e5c',\n foreground: theme?.foreground ?? '#334153',\n border: theme?.border ?? '#cccccc',\n };\n\n // Button styles from block.theme.options (microTheme)\n const cancelButtonStyles = {\n background:\n getBlockThemeValue('--vrtx-outgoing-invitations-cancel-button-background') ||\n colors.secondaryBackground,\n color:\n getBlockThemeValue('--vrtx-outgoing-invitations-cancel-button-color') ||\n colors.secondaryForeground,\n borderRadius: getBlockThemeValue('--vrtx-outgoing-invitations-cancel-button-border-radius'),\n border: getBlockThemeValue('--vrtx-outgoing-invitations-cancel-button-border'),\n padding: getBlockThemeValue('--vrtx-outgoing-invitations-cancel-button-padding'),\n fontSize: getBlockThemeValue('--vrtx-outgoing-invitations-cancel-button-font-size'),\n fontWeight: getBlockThemeValue('--vrtx-outgoing-invitations-cancel-button-font-weight'),\n };\n\n // Avatar/initials styles from block.theme.options (microTheme)\n const avatarStyles = {\n background:\n getBlockThemeValue('--vrtx-outgoing-invitations-avatar-background') ||\n colors.primaryBackground,\n color:\n getBlockThemeValue('--vrtx-outgoing-invitations-avatar-color') || colors.primaryForeground,\n };\n\n // Contact name styles from block.theme.options (microTheme)\n const nameStyles = {\n color: getBlockThemeValue('--vrtx-outgoing-invitations-name-color') || colors.foreground,\n fontFamily: getBlockThemeValue('--vrtx-outgoing-invitations-name-font-family'),\n fontSize: getBlockThemeValue('--vrtx-outgoing-invitations-name-font-size'),\n fontWeight: getBlockThemeValue('--vrtx-outgoing-invitations-name-font-weight'),\n };\n\n // Subtitle styles from block.theme.options (microTheme)\n const subtitleStyles = {\n color:\n getBlockThemeValue('--vrtx-outgoing-invitations-subtitle-color') ||\n colors.secondaryForeground,\n fontFamily: getBlockThemeValue('--vrtx-outgoing-invitations-subtitle-font-family'),\n fontSize: getBlockThemeValue('--vrtx-outgoing-invitations-subtitle-font-size'),\n };\n\n // Title styles from block.theme.options (microTheme)\n const titleStyles = {\n color: getBlockThemeValue('--vrtx-outgoing-invitations-title-color') || colors.foreground,\n fontFamily: getBlockThemeValue('--vrtx-outgoing-invitations-title-font-family'),\n fontSize: getBlockThemeValue('--vrtx-outgoing-invitations-title-font-size'),\n fontWeight: getBlockThemeValue('--vrtx-outgoing-invitations-title-font-weight'),\n };\n\n // Remove invitation from displayed list (after animation)\n const handleRemoveFromDisplay = useCallback((id: string) => {\n setDisplayedInvitations((prev) => prev.filter((inv) => inv.id !== id));\n }, []);\n\n // Show confirmation dialog\n const showConfirmation = useCallback(\n (title: string, message: string, onConfirm: () => void) => {\n if (isWeb) {\n // Web: use window.confirm\n const confirmed = window.confirm(message);\n if (confirmed) {\n onConfirm();\n }\n } else {\n // Native: use Alert\n Alert.alert(title, message, [\n {\n text: dismissButtonText,\n style: 'cancel',\n },\n {\n text: confirmButtonText,\n onPress: onConfirm,\n },\n ]);\n }\n },\n [confirmButtonText, dismissButtonText]\n );\n\n // Handle Cancel button press\n const handleCancel = useCallback(\n async (invitation: OutgoingInvitationItem, animateOut?: () => void) => {\n const message = cancelConfirmMessage.replace('{name}', invitation.name);\n\n showConfirmation(cancelConfirmTitle, message, async () => {\n setActionInProgress(invitation.id);\n await triggerHaptic?.('light');\n\n // Emit analytics event for delete button click\n onAnalyticsEvent?.({\n name: EventNames.OUTBOUND_INVITATION_DELETE_CLICKED,\n payload: { invitationId: invitation.id, inviteeName: invitation.name },\n });\n\n try {\n // Call the callback if provided and check return value\n let shouldProceed = true;\n if (outgoingInvitationsConfig?.onCancel) {\n const result = await outgoingInvitationsConfig.onCancel(invitation);\n // If callback returns false explicitly, don't proceed\n if (result === false) {\n shouldProceed = false;\n }\n }\n\n if (!shouldProceed) {\n setActionInProgress(null);\n return;\n }\n\n // In mock mode (web), skip API call AND don't remove the invitation (no-op)\n if (isMockMode) {\n // No-op in mock mode\n } else {\n // Real mode: call DELETE endpoint and remove on success\n const success = await revokeInvitation(invitation.id);\n\n if (success) {\n // Animate out after successful action\n if (animateOut) {\n animateOut();\n } else {\n handleRemoveFromDisplay(invitation.id);\n }\n }\n }\n } catch (err) {\n console.error('[VrtxOutgoingInvitations] Cancel failed:', err);\n } finally {\n setActionInProgress(null);\n }\n });\n },\n [\n outgoingInvitationsConfig,\n revokeInvitation,\n triggerHaptic,\n cancelConfirmTitle,\n cancelConfirmMessage,\n showConfirmation,\n handleRemoveFromDisplay,\n onAnalyticsEvent,\n ]\n );\n\n // Helper to parse CSS padding string to React Native padding object\n const parsePadding = (paddingStr: string | undefined) => {\n if (!paddingStr) return {};\n const parts = paddingStr.trim().split(/\\s+/);\n if (parts.length === 1) {\n const val = parseInt(parts[0], 10);\n return isNaN(val) ? {} : { paddingVertical: val, paddingHorizontal: val };\n }\n if (parts.length === 2) {\n const vertical = parseInt(parts[0], 10);\n const horizontal = parseInt(parts[1], 10);\n return {\n ...(isNaN(vertical) ? {} : { paddingVertical: vertical }),\n ...(isNaN(horizontal) ? {} : { paddingHorizontal: horizontal }),\n };\n }\n return {};\n };\n\n // Helper to parse border string (e.g., \"1px solid #ccc\")\n const parseBorder = (borderStr: string | undefined) => {\n if (!borderStr) return {};\n const match = borderStr.match(/^(\\d+)px\\s+(\\w+)\\s+(.+)$/);\n if (match) {\n return {\n borderWidth: parseInt(match[1], 10),\n borderColor: match[3],\n };\n }\n return {};\n };\n\n // Render avatar or initials\n const renderAvatar = (invitation: OutgoingInvitationItem) => {\n if (invitation.avatarUrl) {\n return <Image source={{ uri: invitation.avatarUrl }} style={styles.avatar} />;\n }\n\n // Generate initials from name\n const initials = invitation.name\n .split(' ')\n .map((part: string) => part[0])\n .join('')\n .toUpperCase()\n .slice(0, 2);\n\n // Handle avatar background with gradient support\n const avatarBackground = avatarStyles.background;\n const isAvatarGradient = avatarBackground?.includes('linear-gradient');\n const avatarBgStyle: any = {};\n\n if (isWeb && avatarBackground) {\n avatarBgStyle.background = avatarBackground;\n } else if (isAvatarGradient && avatarBackground) {\n const fallbackColor = parseGradientFirstColor(avatarBackground);\n avatarBgStyle.backgroundColor = fallbackColor || colors.primaryBackground;\n } else {\n avatarBgStyle.backgroundColor = avatarBackground || colors.primaryBackground;\n }\n\n return (\n <View style={[styles.avatarPlaceholder, avatarBgStyle]}>\n <Text style={[styles.avatarInitials, { color: avatarStyles.color }]}>{initials}</Text>\n </View>\n );\n };\n\n // Build button style with gradient support\n const buildButtonStyle = (buttonStyles: any, fallbackBg: string) => {\n const backgroundValue = buttonStyles.background;\n const isGradient = backgroundValue?.includes('linear-gradient');\n\n const dynamicButtonStyle: any = {\n ...(buttonStyles.borderRadius\n ? { borderRadius: parseInt(buttonStyles.borderRadius, 10) }\n : {}),\n ...parsePadding(buttonStyles.padding),\n ...parseBorder(buttonStyles.border),\n };\n\n if (isWeb && backgroundValue) {\n dynamicButtonStyle.background = backgroundValue;\n } else if (isGradient && backgroundValue) {\n const fallbackColor = parseGradientFirstColor(backgroundValue);\n dynamicButtonStyle.backgroundColor = fallbackColor || fallbackBg;\n } else {\n dynamicButtonStyle.backgroundColor = backgroundValue || fallbackBg;\n }\n\n return dynamicButtonStyle;\n };\n\n // Render a single invitation item\n const renderInvitationContent = (item: OutgoingInvitationItem) => {\n const isLoading = actionInProgress === item.id;\n const animateOut = item.metadata?.animateOut as (() => void) | undefined;\n\n // Build dynamic button style\n const cancelButtonDynamicStyle = buildButtonStyle(\n cancelButtonStyles,\n colors.secondaryBackground\n );\n\n // Build dynamic text style\n const cancelTextStyle: any = {\n color: cancelButtonStyles.color,\n ...(cancelButtonStyles.fontSize\n ? { fontSize: parseInt(cancelButtonStyles.fontSize, 10) }\n : {}),\n ...(cancelButtonStyles.fontWeight ? { fontWeight: cancelButtonStyles.fontWeight } : {}),\n };\n\n // Build dynamic name style\n const dynamicNameStyle: any = {\n color: nameStyles.color,\n ...(nameStyles.fontFamily ? { fontFamily: nameStyles.fontFamily } : {}),\n ...(nameStyles.fontSize ? { fontSize: parseInt(nameStyles.fontSize, 10) } : {}),\n ...(nameStyles.fontWeight ? { fontWeight: nameStyles.fontWeight } : {}),\n };\n\n // Build dynamic subtitle style\n const dynamicSubtitleStyle: any = {\n color: subtitleStyles.color,\n ...(subtitleStyles.fontFamily ? { fontFamily: subtitleStyles.fontFamily } : {}),\n ...(subtitleStyles.fontSize ? { fontSize: parseInt(subtitleStyles.fontSize, 10) } : {}),\n };\n\n return (\n <View style={styles.invitationItem}>\n {renderAvatar(item)}\n <View style={styles.invitationInfo}>\n <Text style={[styles.invitationName, dynamicNameStyle]} numberOfLines={1}>\n {item.name}\n </Text>\n {(() => {\n const displaySubtitle = outgoingInvitationsConfig?.getSubtitle?.(item);\n return displaySubtitle ? (\n <Text style={[styles.invitationSubtitle, dynamicSubtitleStyle]} numberOfLines={1}>\n {displaySubtitle}\n </Text>\n ) : null;\n })()}\n </View>\n {/* Cancel button */}\n <TouchableOpacity\n style={[styles.actionButton, cancelButtonDynamicStyle]}\n onPress={() => handleCancel(item, animateOut)}\n disabled={isLoading}\n activeOpacity={0.7}\n >\n {isLoading ? (\n <ActivityIndicator size=\"small\" color={cancelButtonStyles.color} />\n ) : (\n <Text style={[styles.actionButtonText, cancelTextStyle]}>{cancelButtonText}</Text>\n )}\n </TouchableOpacity>\n </View>\n );\n };\n\n // Render item with animation wrapper\n const renderItem = ({ item }: { item: OutgoingInvitationItem }) => {\n return (\n <AnimatedInvitationItem\n item={item}\n renderContent={renderInvitationContent}\n onRemove={handleRemoveFromDisplay}\n />\n );\n };\n\n\n // Loading state (API mode)\n if (isLoading) {\n return (\n <View style={styles.container}>\n <ActivityIndicator size=\"large\" color={colors.primaryBackground} />\n </View>\n );\n }\n\n // Error state (API mode)\n if (error) {\n return (\n <View style={styles.container}>\n <Text style={[styles.errorText, { color: '#dc2626' }]}>{error}</Text>\n </View>\n );\n }\n\n // Empty state - render nothing (no-op component with no height)\n if (displayedInvitations.length === 0) {\n return null;\n }\n\n // Get title from block attributes (configured in editor as \"Title\")\n const title = block?.attributes?.title;\n\n // Build dynamic title style\n const dynamicTitleStyle: any = {\n color: titleStyles.color,\n ...(titleStyles.fontFamily ? { fontFamily: titleStyles.fontFamily } : {}),\n ...(titleStyles.fontSize ? { fontSize: parseInt(titleStyles.fontSize, 10) } : {}),\n ...(titleStyles.fontWeight ? { fontWeight: titleStyles.fontWeight } : {}),\n };\n\n // Main view: Invitations list\n // Note: Using View + map instead of FlatList to avoid \"VirtualizedLists should never be nested\" warning\n // when this component is rendered inside a ScrollView (which InviteFormCore uses)\n return (\n <View style={styles.listContainer}>\n {title && (\n <Text style={[styles.title, dynamicTitleStyle]}>{title}</Text>\n )}\n <View style={styles.listContent}>\n {displayedInvitations.map((item) => (\n <View key={item.id}>\n {renderItem({ item })}\n </View>\n ))}\n </View>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n container: {\n padding: 16,\n alignItems: 'center',\n justifyContent: 'center',\n minHeight: 120,\n },\n listContainer: {\n flex: 1,\n },\n title: {\n fontSize: 16,\n fontWeight: '600',\n marginBottom: 12,\n },\n placeholderText: {\n fontSize: 14,\n textAlign: 'center',\n },\n emptyText: {\n fontSize: 14,\n textAlign: 'center',\n },\n errorText: {\n fontSize: 14,\n textAlign: 'center',\n },\n listContent: {\n paddingBottom: 16,\n },\n invitationItem: {\n flexDirection: 'row',\n alignItems: 'center',\n paddingVertical: 12,\n },\n avatar: {\n width: 44,\n height: 44,\n borderRadius: 22,\n },\n avatarPlaceholder: {\n width: 44,\n height: 44,\n borderRadius: 22,\n alignItems: 'center',\n justifyContent: 'center',\n },\n avatarInitials: {\n fontSize: 16,\n fontWeight: '600',\n },\n invitationInfo: {\n flex: 1,\n marginLeft: 12,\n marginRight: 12,\n },\n invitationName: {\n fontSize: 16,\n fontWeight: '500',\n },\n invitationSubtitle: {\n fontSize: 13,\n marginTop: 2,\n },\n actionButton: {\n paddingHorizontal: 16,\n paddingVertical: 8,\n borderRadius: 8,\n minWidth: 80,\n alignItems: 'center',\n justifyContent: 'center',\n },\n actionButtonText: {\n fontSize: 14,\n fontWeight: '600',\n },\n});\n"]}
|
|
@@ -0,0 +1,487 @@
|
|
|
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.VrtxSearchBox = VrtxSearchBox;
|
|
46
|
+
const react_1 = __importStar(require("react"));
|
|
47
|
+
const react_native_1 = require("react-native");
|
|
48
|
+
const isWeb = react_native_1.Platform.OS === 'web';
|
|
49
|
+
// Parse CSS linear-gradient to extract first color for fallback on native
|
|
50
|
+
function parseGradientFirstColor(gradientString) {
|
|
51
|
+
if (!gradientString || !gradientString.includes('linear-gradient')) {
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
const stopsRegex = /(rgba?\([^)]+\)|#[0-9a-fA-F]{3,8}|[a-z]+)\s+(\d+)%/i;
|
|
55
|
+
const match = stopsRegex.exec(gradientString);
|
|
56
|
+
if (match) {
|
|
57
|
+
return match[1].trim();
|
|
58
|
+
}
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
function VrtxSearchBox({ block, searchBoxConfig, createUserIdInvitation, triggerHaptic, onAnalyticsEvent, renderIcon, theme, }) {
|
|
62
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r;
|
|
63
|
+
const [query, setQuery] = (0, react_1.useState)('');
|
|
64
|
+
const [results, setResults] = (0, react_1.useState)(null);
|
|
65
|
+
const [isSearching, setIsSearching] = (0, react_1.useState)(false);
|
|
66
|
+
const [actionInProgress, setActionInProgress] = (0, react_1.useState)(null);
|
|
67
|
+
// Get title from block title attribute (configured in Styles tab)
|
|
68
|
+
const title = ((_a = block === null || block === void 0 ? void 0 : block.attributes) === null || _a === void 0 ? void 0 : _a.title) || '';
|
|
69
|
+
// Extract customization from block settings (editor) or config props, with defaults
|
|
70
|
+
const blockCustomizations = (_b = block === null || block === void 0 ? void 0 : block.settings) === null || _b === void 0 ? void 0 : _b.customizations;
|
|
71
|
+
const placeholder = (_d = (_c = blockCustomizations === null || blockCustomizations === void 0 ? void 0 : blockCustomizations.searchPlaceholder) === null || _c === void 0 ? void 0 : _c.textContent) !== null && _d !== void 0 ? _d : 'Search...';
|
|
72
|
+
const connectButtonText = (_g = (_f = (_e = blockCustomizations === null || blockCustomizations === void 0 ? void 0 : blockCustomizations.connectButton) === null || _e === void 0 ? void 0 : _e.textContent) !== null && _f !== void 0 ? _f : searchBoxConfig === null || searchBoxConfig === void 0 ? void 0 : searchBoxConfig.connectButtonText) !== null && _g !== void 0 ? _g : 'Connect';
|
|
73
|
+
const noResultsMessage = (_k = (_j = (_h = blockCustomizations === null || blockCustomizations === void 0 ? void 0 : blockCustomizations.noResultsMessage) === null || _h === void 0 ? void 0 : _h.textContent) !== null && _j !== void 0 ? _j : searchBoxConfig === null || searchBoxConfig === void 0 ? void 0 : searchBoxConfig.noResultsMessage) !== null && _k !== void 0 ? _k : 'No results found';
|
|
74
|
+
// Helper to get theme option value from block.theme.options
|
|
75
|
+
const getBlockThemeValue = (key) => {
|
|
76
|
+
var _a;
|
|
77
|
+
const options = (_a = block === null || block === void 0 ? void 0 : block.theme) === null || _a === void 0 ? void 0 : _a.options;
|
|
78
|
+
if (!options || !Array.isArray(options))
|
|
79
|
+
return undefined;
|
|
80
|
+
const option = options.find((opt) => opt.key === key);
|
|
81
|
+
return (option === null || option === void 0 ? void 0 : option.value) || undefined;
|
|
82
|
+
};
|
|
83
|
+
// Theme colors with defaults
|
|
84
|
+
const colors = {
|
|
85
|
+
primaryBackground: (_l = theme === null || theme === void 0 ? void 0 : theme.primaryBackground) !== null && _l !== void 0 ? _l : '#6291d5',
|
|
86
|
+
primaryForeground: (_m = theme === null || theme === void 0 ? void 0 : theme.primaryForeground) !== null && _m !== void 0 ? _m : '#ffffff',
|
|
87
|
+
secondaryBackground: (_o = theme === null || theme === void 0 ? void 0 : theme.secondaryBackground) !== null && _o !== void 0 ? _o : '#ffffff',
|
|
88
|
+
secondaryForeground: (_p = theme === null || theme === void 0 ? void 0 : theme.secondaryForeground) !== null && _p !== void 0 ? _p : '#353e5c',
|
|
89
|
+
foreground: (_q = theme === null || theme === void 0 ? void 0 : theme.foreground) !== null && _q !== void 0 ? _q : '#334153',
|
|
90
|
+
border: (_r = theme === null || theme === void 0 ? void 0 : theme.border) !== null && _r !== void 0 ? _r : '#cccccc',
|
|
91
|
+
};
|
|
92
|
+
// Button styles from block.theme.options (microTheme)
|
|
93
|
+
const connectButtonStyles = {
|
|
94
|
+
background: getBlockThemeValue('--vrtx-search-box-connect-button-background') ||
|
|
95
|
+
colors.primaryBackground,
|
|
96
|
+
color: getBlockThemeValue('--vrtx-search-box-connect-button-color') ||
|
|
97
|
+
colors.primaryForeground,
|
|
98
|
+
borderRadius: getBlockThemeValue('--vrtx-search-box-connect-button-border-radius'),
|
|
99
|
+
border: getBlockThemeValue('--vrtx-search-box-connect-button-border'),
|
|
100
|
+
padding: getBlockThemeValue('--vrtx-search-box-connect-button-padding'),
|
|
101
|
+
fontSize: getBlockThemeValue('--vrtx-search-box-connect-button-font-size'),
|
|
102
|
+
fontWeight: getBlockThemeValue('--vrtx-search-box-connect-button-font-weight'),
|
|
103
|
+
};
|
|
104
|
+
// Avatar/initials styles from block.theme.options (microTheme)
|
|
105
|
+
const avatarStyles = {
|
|
106
|
+
background: getBlockThemeValue('--vrtx-search-box-avatar-background') || colors.primaryBackground,
|
|
107
|
+
color: getBlockThemeValue('--vrtx-search-box-avatar-color') || colors.primaryForeground,
|
|
108
|
+
};
|
|
109
|
+
// Contact name styles from block.theme.options (microTheme)
|
|
110
|
+
const contactNameStyles = {
|
|
111
|
+
color: getBlockThemeValue('--vrtx-search-box-contact-name-color') || colors.foreground,
|
|
112
|
+
fontFamily: getBlockThemeValue('--vrtx-search-box-contact-name-font-family'),
|
|
113
|
+
fontSize: getBlockThemeValue('--vrtx-search-box-contact-name-font-size'),
|
|
114
|
+
fontWeight: getBlockThemeValue('--vrtx-search-box-contact-name-font-weight'),
|
|
115
|
+
};
|
|
116
|
+
// Contact subtitle styles from block.theme.options (microTheme)
|
|
117
|
+
const contactSubtitleStyles = {
|
|
118
|
+
color: getBlockThemeValue('--vrtx-search-box-contact-subtitle-color') ||
|
|
119
|
+
colors.secondaryForeground,
|
|
120
|
+
fontFamily: getBlockThemeValue('--vrtx-search-box-contact-subtitle-font-family'),
|
|
121
|
+
fontSize: getBlockThemeValue('--vrtx-search-box-contact-subtitle-font-size'),
|
|
122
|
+
};
|
|
123
|
+
// Title styles from block.theme.options (microTheme)
|
|
124
|
+
const titleStyles = {
|
|
125
|
+
color: getBlockThemeValue('--vrtx-search-box-title-color') || colors.foreground,
|
|
126
|
+
fontFamily: getBlockThemeValue('--vrtx-search-box-title-font-family'),
|
|
127
|
+
fontSize: getBlockThemeValue('--vrtx-search-box-title-font-size'),
|
|
128
|
+
fontWeight: getBlockThemeValue('--vrtx-search-box-title-font-weight'),
|
|
129
|
+
};
|
|
130
|
+
// Search button styles from block.theme.options (microTheme)
|
|
131
|
+
const searchButtonStyles = {
|
|
132
|
+
background: getBlockThemeValue('--vrtx-search-box-search-button-background') ||
|
|
133
|
+
colors.primaryBackground,
|
|
134
|
+
color: getBlockThemeValue('--vrtx-search-box-search-button-color') ||
|
|
135
|
+
colors.primaryForeground,
|
|
136
|
+
borderRadius: getBlockThemeValue('--vrtx-search-box-search-button-border-radius'),
|
|
137
|
+
border: getBlockThemeValue('--vrtx-search-box-search-button-border'),
|
|
138
|
+
padding: getBlockThemeValue('--vrtx-search-box-search-button-padding'),
|
|
139
|
+
};
|
|
140
|
+
// Handle search button press
|
|
141
|
+
const handleSearch = (0, react_1.useCallback)(() => __awaiter(this, void 0, void 0, function* () {
|
|
142
|
+
if (!(searchBoxConfig === null || searchBoxConfig === void 0 ? void 0 : searchBoxConfig.onSearch) || !query.trim())
|
|
143
|
+
return;
|
|
144
|
+
setIsSearching(true);
|
|
145
|
+
try {
|
|
146
|
+
const searchResults = yield searchBoxConfig.onSearch(query.trim());
|
|
147
|
+
setResults(searchResults);
|
|
148
|
+
}
|
|
149
|
+
catch (err) {
|
|
150
|
+
console.error('[VrtxSearchBox] Search failed:', err);
|
|
151
|
+
setResults([]);
|
|
152
|
+
}
|
|
153
|
+
finally {
|
|
154
|
+
setIsSearching(false);
|
|
155
|
+
}
|
|
156
|
+
}), [searchBoxConfig, query]);
|
|
157
|
+
// Handle Connect button press
|
|
158
|
+
const handleConnect = (0, react_1.useCallback)((contact) => __awaiter(this, void 0, void 0, function* () {
|
|
159
|
+
var _a, _b;
|
|
160
|
+
if (!(searchBoxConfig === null || searchBoxConfig === void 0 ? void 0 : searchBoxConfig.onConnect))
|
|
161
|
+
return;
|
|
162
|
+
setActionInProgress(contact.userId);
|
|
163
|
+
yield (triggerHaptic === null || triggerHaptic === void 0 ? void 0 : triggerHaptic('light'));
|
|
164
|
+
try {
|
|
165
|
+
const shouldCreateInvitation = yield searchBoxConfig.onConnect(contact);
|
|
166
|
+
if (shouldCreateInvitation && createUserIdInvitation) {
|
|
167
|
+
yield createUserIdInvitation(contact.userId, contact.name, contact.avatarUrl, contact.metadata);
|
|
168
|
+
(_a = searchBoxConfig.onInvitationCreated) === null || _a === void 0 ? void 0 : _a.call(searchBoxConfig, contact);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
catch (err) {
|
|
172
|
+
console.error('[VrtxSearchBox] Connect failed:', err);
|
|
173
|
+
(_b = searchBoxConfig.onInvitationError) === null || _b === void 0 ? void 0 : _b.call(searchBoxConfig, contact, err instanceof Error ? err : new Error(String(err)));
|
|
174
|
+
}
|
|
175
|
+
finally {
|
|
176
|
+
setActionInProgress(null);
|
|
177
|
+
}
|
|
178
|
+
}), [searchBoxConfig, createUserIdInvitation, triggerHaptic]);
|
|
179
|
+
// Render avatar or initials
|
|
180
|
+
const renderAvatar = (contact) => {
|
|
181
|
+
if (contact.avatarUrl) {
|
|
182
|
+
return <react_native_1.Image source={{ uri: contact.avatarUrl }} style={styles.avatar}/>;
|
|
183
|
+
}
|
|
184
|
+
const initials = contact.name
|
|
185
|
+
.split(' ')
|
|
186
|
+
.map((part) => part[0])
|
|
187
|
+
.join('')
|
|
188
|
+
.toUpperCase()
|
|
189
|
+
.slice(0, 2);
|
|
190
|
+
const avatarBackground = avatarStyles.background;
|
|
191
|
+
const isAvatarGradient = avatarBackground === null || avatarBackground === void 0 ? void 0 : avatarBackground.includes('linear-gradient');
|
|
192
|
+
const avatarBgStyle = {};
|
|
193
|
+
if (isWeb && avatarBackground) {
|
|
194
|
+
avatarBgStyle.background = avatarBackground;
|
|
195
|
+
}
|
|
196
|
+
else if (isAvatarGradient && avatarBackground) {
|
|
197
|
+
const fallbackColor = parseGradientFirstColor(avatarBackground);
|
|
198
|
+
avatarBgStyle.backgroundColor = fallbackColor || colors.primaryBackground;
|
|
199
|
+
}
|
|
200
|
+
else {
|
|
201
|
+
avatarBgStyle.backgroundColor = avatarBackground || colors.primaryBackground;
|
|
202
|
+
}
|
|
203
|
+
return (<react_native_1.View style={[styles.avatarPlaceholder, avatarBgStyle]}>
|
|
204
|
+
<react_native_1.Text style={[styles.avatarInitials, { color: avatarStyles.color }]}>{initials}</react_native_1.Text>
|
|
205
|
+
</react_native_1.View>);
|
|
206
|
+
};
|
|
207
|
+
// Helper to parse CSS padding string to React Native padding object
|
|
208
|
+
const parsePadding = (paddingStr) => {
|
|
209
|
+
if (!paddingStr)
|
|
210
|
+
return {};
|
|
211
|
+
const parts = paddingStr.trim().split(/\s+/);
|
|
212
|
+
if (parts.length === 1) {
|
|
213
|
+
const val = parseInt(parts[0], 10);
|
|
214
|
+
return isNaN(val) ? {} : { paddingVertical: val, paddingHorizontal: val };
|
|
215
|
+
}
|
|
216
|
+
if (parts.length === 2) {
|
|
217
|
+
const vertical = parseInt(parts[0], 10);
|
|
218
|
+
const horizontal = parseInt(parts[1], 10);
|
|
219
|
+
return Object.assign(Object.assign({}, (isNaN(vertical) ? {} : { paddingVertical: vertical })), (isNaN(horizontal) ? {} : { paddingHorizontal: horizontal }));
|
|
220
|
+
}
|
|
221
|
+
return {};
|
|
222
|
+
};
|
|
223
|
+
// Helper to parse border string (e.g., "1px solid #ccc")
|
|
224
|
+
const parseBorder = (borderStr) => {
|
|
225
|
+
if (!borderStr)
|
|
226
|
+
return {};
|
|
227
|
+
const match = borderStr.match(/^(\d+)px\s+(\w+)\s+(.+)$/);
|
|
228
|
+
if (match) {
|
|
229
|
+
return {
|
|
230
|
+
borderWidth: parseInt(match[1], 10),
|
|
231
|
+
borderColor: match[3],
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
return {};
|
|
235
|
+
};
|
|
236
|
+
// Render a single contact item
|
|
237
|
+
const renderContactItem = ({ item }) => {
|
|
238
|
+
const isLoading = actionInProgress === item.userId;
|
|
239
|
+
const backgroundValue = connectButtonStyles.background;
|
|
240
|
+
const isGradient = backgroundValue === null || backgroundValue === void 0 ? void 0 : backgroundValue.includes('linear-gradient');
|
|
241
|
+
const dynamicButtonStyle = Object.assign(Object.assign(Object.assign({}, (connectButtonStyles.borderRadius
|
|
242
|
+
? { borderRadius: parseInt(connectButtonStyles.borderRadius, 10) }
|
|
243
|
+
: {})), parsePadding(connectButtonStyles.padding)), parseBorder(connectButtonStyles.border));
|
|
244
|
+
if (isWeb && backgroundValue) {
|
|
245
|
+
dynamicButtonStyle.background = backgroundValue;
|
|
246
|
+
}
|
|
247
|
+
else if (isGradient && backgroundValue) {
|
|
248
|
+
const fallbackColor = parseGradientFirstColor(backgroundValue);
|
|
249
|
+
dynamicButtonStyle.backgroundColor = fallbackColor || colors.primaryBackground;
|
|
250
|
+
}
|
|
251
|
+
else {
|
|
252
|
+
dynamicButtonStyle.backgroundColor = backgroundValue || colors.primaryBackground;
|
|
253
|
+
}
|
|
254
|
+
const dynamicTextStyle = Object.assign(Object.assign({ color: connectButtonStyles.color }, (connectButtonStyles.fontSize
|
|
255
|
+
? { fontSize: parseInt(connectButtonStyles.fontSize, 10) }
|
|
256
|
+
: {})), (connectButtonStyles.fontWeight ? { fontWeight: connectButtonStyles.fontWeight } : {}));
|
|
257
|
+
const dynamicNameStyle = Object.assign(Object.assign(Object.assign({ color: contactNameStyles.color }, (contactNameStyles.fontFamily ? { fontFamily: contactNameStyles.fontFamily } : {})), (contactNameStyles.fontSize
|
|
258
|
+
? { fontSize: parseInt(contactNameStyles.fontSize, 10) }
|
|
259
|
+
: {})), (contactNameStyles.fontWeight ? { fontWeight: contactNameStyles.fontWeight } : {}));
|
|
260
|
+
const dynamicSubtitleStyle = Object.assign(Object.assign({ color: contactSubtitleStyles.color }, (contactSubtitleStyles.fontFamily
|
|
261
|
+
? { fontFamily: contactSubtitleStyles.fontFamily }
|
|
262
|
+
: {})), (contactSubtitleStyles.fontSize
|
|
263
|
+
? { fontSize: parseInt(contactSubtitleStyles.fontSize, 10) }
|
|
264
|
+
: {}));
|
|
265
|
+
return (<react_native_1.View style={styles.contactItem}>
|
|
266
|
+
{renderAvatar(item)}
|
|
267
|
+
<react_native_1.View style={styles.contactInfo}>
|
|
268
|
+
<react_native_1.Text style={[styles.contactName, dynamicNameStyle]} numberOfLines={1}>
|
|
269
|
+
{item.name}
|
|
270
|
+
</react_native_1.Text>
|
|
271
|
+
{item.subtitle && (<react_native_1.Text style={[styles.contactSubtitle, dynamicSubtitleStyle]} numberOfLines={1}>
|
|
272
|
+
{item.subtitle}
|
|
273
|
+
</react_native_1.Text>)}
|
|
274
|
+
</react_native_1.View>
|
|
275
|
+
<react_native_1.TouchableOpacity style={[styles.actionButton, dynamicButtonStyle]} onPress={() => handleConnect(item)} disabled={isLoading} activeOpacity={0.7}>
|
|
276
|
+
{isLoading ? (<react_native_1.ActivityIndicator size="small" color={connectButtonStyles.color}/>) : (<react_native_1.Text style={[styles.actionButtonText, dynamicTextStyle]}>{connectButtonText}</react_native_1.Text>)}
|
|
277
|
+
</react_native_1.TouchableOpacity>
|
|
278
|
+
</react_native_1.View>);
|
|
279
|
+
};
|
|
280
|
+
// Build dynamic title style
|
|
281
|
+
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 } : {}));
|
|
282
|
+
// Show placeholder if no config provided
|
|
283
|
+
if (!searchBoxConfig) {
|
|
284
|
+
return (<react_native_1.View style={styles.container}>
|
|
285
|
+
{title ? (<react_native_1.Text style={[styles.title, dynamicTitleStyle]}>{title}</react_native_1.Text>) : null}
|
|
286
|
+
<react_native_1.Text style={[styles.placeholderText, { color: colors.secondaryForeground }]}>
|
|
287
|
+
Search Box component - provide searchBoxConfig to enable
|
|
288
|
+
</react_native_1.Text>
|
|
289
|
+
</react_native_1.View>);
|
|
290
|
+
}
|
|
291
|
+
return (<react_native_1.View style={styles.listContainer}>
|
|
292
|
+
{title ? (<react_native_1.Text style={[styles.title, dynamicTitleStyle]}>{title}</react_native_1.Text>) : null}
|
|
293
|
+
|
|
294
|
+
{/* Search input row */}
|
|
295
|
+
<react_native_1.View style={styles.searchRow}>
|
|
296
|
+
<react_native_1.View style={[styles.searchContainer, { borderColor: colors.border }]}>
|
|
297
|
+
<react_native_1.TextInput style={[styles.searchInput, { color: colors.foreground }]} placeholder={placeholder} placeholderTextColor={colors.secondaryForeground} value={query} onChangeText={setQuery} onSubmitEditing={handleSearch} autoCapitalize="none" autoCorrect={false} returnKeyType="search"/>
|
|
298
|
+
</react_native_1.View>
|
|
299
|
+
<react_native_1.TouchableOpacity style={[
|
|
300
|
+
styles.searchButton,
|
|
301
|
+
(() => {
|
|
302
|
+
const btnStyle = {};
|
|
303
|
+
const bg = searchButtonStyles.background;
|
|
304
|
+
const isGradient = bg === null || bg === void 0 ? void 0 : bg.includes('linear-gradient');
|
|
305
|
+
if (isWeb && bg) {
|
|
306
|
+
btnStyle.background = bg;
|
|
307
|
+
}
|
|
308
|
+
else if (isGradient && bg) {
|
|
309
|
+
const fallback = parseGradientFirstColor(bg);
|
|
310
|
+
btnStyle.backgroundColor = fallback || colors.primaryBackground;
|
|
311
|
+
}
|
|
312
|
+
else {
|
|
313
|
+
btnStyle.backgroundColor = bg || colors.primaryBackground;
|
|
314
|
+
}
|
|
315
|
+
if (searchButtonStyles.borderRadius) {
|
|
316
|
+
btnStyle.borderRadius = parseInt(searchButtonStyles.borderRadius, 10);
|
|
317
|
+
}
|
|
318
|
+
if (searchButtonStyles.border) {
|
|
319
|
+
const match = searchButtonStyles.border.match(/^(\d+)px\s+(\w+)\s+(.+)$/);
|
|
320
|
+
if (match) {
|
|
321
|
+
btnStyle.borderWidth = parseInt(match[1], 10);
|
|
322
|
+
btnStyle.borderColor = match[3];
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
if (searchButtonStyles.padding) {
|
|
326
|
+
const val = parseInt(searchButtonStyles.padding, 10);
|
|
327
|
+
if (!isNaN(val)) {
|
|
328
|
+
btnStyle.padding = val;
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
return btnStyle;
|
|
332
|
+
})(),
|
|
333
|
+
]} onPress={handleSearch} disabled={isSearching || !query.trim()} activeOpacity={0.7}>
|
|
334
|
+
{isSearching ? (<react_native_1.ActivityIndicator size="small" color={searchButtonStyles.color}/>) : renderIcon ? (renderIcon({ name: 'search', size: 20, color: searchButtonStyles.color || '#ffffff' })) : (<react_native_1.View style={styles.searchIconContainer}>
|
|
335
|
+
<react_native_1.View style={[
|
|
336
|
+
styles.searchIconCircle,
|
|
337
|
+
{
|
|
338
|
+
borderColor: searchButtonStyles.color || '#ffffff',
|
|
339
|
+
},
|
|
340
|
+
]}/>
|
|
341
|
+
<react_native_1.View style={[
|
|
342
|
+
styles.searchIconHandle,
|
|
343
|
+
{
|
|
344
|
+
backgroundColor: searchButtonStyles.color || '#ffffff',
|
|
345
|
+
},
|
|
346
|
+
]}/>
|
|
347
|
+
</react_native_1.View>)}
|
|
348
|
+
</react_native_1.TouchableOpacity>
|
|
349
|
+
</react_native_1.View>
|
|
350
|
+
|
|
351
|
+
{/* Results */}
|
|
352
|
+
{results !== null && results.length === 0 && !isSearching && (<react_native_1.View style={styles.emptyContainer}>
|
|
353
|
+
<react_native_1.Text style={[styles.emptyText, { color: colors.secondaryForeground }]}>
|
|
354
|
+
{noResultsMessage}
|
|
355
|
+
</react_native_1.Text>
|
|
356
|
+
</react_native_1.View>)}
|
|
357
|
+
|
|
358
|
+
{results !== null && results.length > 0 && (<react_native_1.FlatList data={results} keyExtractor={(item) => item.userId} renderItem={renderContactItem} showsVerticalScrollIndicator={false} contentContainerStyle={styles.listContent}/>)}
|
|
359
|
+
</react_native_1.View>);
|
|
360
|
+
}
|
|
361
|
+
const styles = react_native_1.StyleSheet.create({
|
|
362
|
+
container: {
|
|
363
|
+
padding: 16,
|
|
364
|
+
alignItems: 'center',
|
|
365
|
+
justifyContent: 'center',
|
|
366
|
+
minHeight: 120,
|
|
367
|
+
},
|
|
368
|
+
listContainer: {
|
|
369
|
+
flex: 1,
|
|
370
|
+
},
|
|
371
|
+
title: {
|
|
372
|
+
fontSize: 18,
|
|
373
|
+
fontWeight: '600',
|
|
374
|
+
marginBottom: 16,
|
|
375
|
+
},
|
|
376
|
+
placeholderText: {
|
|
377
|
+
fontSize: 14,
|
|
378
|
+
textAlign: 'center',
|
|
379
|
+
},
|
|
380
|
+
searchRow: {
|
|
381
|
+
flexDirection: 'row',
|
|
382
|
+
alignItems: 'center',
|
|
383
|
+
marginBottom: 12,
|
|
384
|
+
},
|
|
385
|
+
searchContainer: {
|
|
386
|
+
flex: 1,
|
|
387
|
+
borderWidth: 1,
|
|
388
|
+
borderRadius: 8,
|
|
389
|
+
paddingHorizontal: 12,
|
|
390
|
+
height: 44,
|
|
391
|
+
justifyContent: 'center',
|
|
392
|
+
},
|
|
393
|
+
searchInput: {
|
|
394
|
+
fontSize: 16,
|
|
395
|
+
height: 44,
|
|
396
|
+
},
|
|
397
|
+
searchButton: {
|
|
398
|
+
width: 44,
|
|
399
|
+
height: 44,
|
|
400
|
+
borderRadius: 8,
|
|
401
|
+
marginLeft: 8,
|
|
402
|
+
alignItems: 'center',
|
|
403
|
+
justifyContent: 'center',
|
|
404
|
+
},
|
|
405
|
+
searchIconContainer: {
|
|
406
|
+
width: 20,
|
|
407
|
+
height: 20,
|
|
408
|
+
position: 'relative',
|
|
409
|
+
},
|
|
410
|
+
searchIconCircle: {
|
|
411
|
+
width: 14,
|
|
412
|
+
height: 14,
|
|
413
|
+
borderRadius: 7,
|
|
414
|
+
borderWidth: 2.5,
|
|
415
|
+
position: 'absolute',
|
|
416
|
+
top: 0,
|
|
417
|
+
left: 0,
|
|
418
|
+
},
|
|
419
|
+
searchIconHandle: {
|
|
420
|
+
width: 7,
|
|
421
|
+
height: 2.5,
|
|
422
|
+
borderRadius: 1.25,
|
|
423
|
+
position: 'absolute',
|
|
424
|
+
bottom: 2,
|
|
425
|
+
right: 0,
|
|
426
|
+
transform: [{ rotate: '45deg' }],
|
|
427
|
+
},
|
|
428
|
+
emptyContainer: {
|
|
429
|
+
padding: 16,
|
|
430
|
+
alignItems: 'center',
|
|
431
|
+
justifyContent: 'center',
|
|
432
|
+
},
|
|
433
|
+
emptyText: {
|
|
434
|
+
fontSize: 14,
|
|
435
|
+
textAlign: 'center',
|
|
436
|
+
},
|
|
437
|
+
listContent: {
|
|
438
|
+
paddingBottom: 16,
|
|
439
|
+
},
|
|
440
|
+
contactItem: {
|
|
441
|
+
flexDirection: 'row',
|
|
442
|
+
alignItems: 'center',
|
|
443
|
+
paddingVertical: 12,
|
|
444
|
+
},
|
|
445
|
+
avatar: {
|
|
446
|
+
width: 44,
|
|
447
|
+
height: 44,
|
|
448
|
+
borderRadius: 22,
|
|
449
|
+
},
|
|
450
|
+
avatarPlaceholder: {
|
|
451
|
+
width: 44,
|
|
452
|
+
height: 44,
|
|
453
|
+
borderRadius: 22,
|
|
454
|
+
alignItems: 'center',
|
|
455
|
+
justifyContent: 'center',
|
|
456
|
+
},
|
|
457
|
+
avatarInitials: {
|
|
458
|
+
fontSize: 16,
|
|
459
|
+
fontWeight: '600',
|
|
460
|
+
},
|
|
461
|
+
contactInfo: {
|
|
462
|
+
flex: 1,
|
|
463
|
+
marginLeft: 12,
|
|
464
|
+
marginRight: 12,
|
|
465
|
+
},
|
|
466
|
+
contactName: {
|
|
467
|
+
fontSize: 16,
|
|
468
|
+
fontWeight: '500',
|
|
469
|
+
},
|
|
470
|
+
contactSubtitle: {
|
|
471
|
+
fontSize: 13,
|
|
472
|
+
marginTop: 2,
|
|
473
|
+
},
|
|
474
|
+
actionButton: {
|
|
475
|
+
paddingHorizontal: 16,
|
|
476
|
+
paddingVertical: 8,
|
|
477
|
+
borderRadius: 8,
|
|
478
|
+
minWidth: 80,
|
|
479
|
+
alignItems: 'center',
|
|
480
|
+
justifyContent: 'center',
|
|
481
|
+
},
|
|
482
|
+
actionButtonText: {
|
|
483
|
+
fontSize: 14,
|
|
484
|
+
fontWeight: '600',
|
|
485
|
+
},
|
|
486
|
+
});
|
|
487
|
+
//# sourceMappingURL=VrtxSearchBox.js.map
|