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