@proveanything/smartlinks-auth-ui 0.5.0 → 0.5.2

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/index.js CHANGED
@@ -11509,10 +11509,14 @@ class AuthAPI {
11509
11509
  return smartlinks__namespace.authKit.verifyMagicLink(this.clientId, token);
11510
11510
  }
11511
11511
  // ============= WhatsApp =============
11512
- async sendWhatsApp(redirectUrl, phoneNumber) {
11512
+ async sendWhatsApp(redirectUrl, phoneNumber, reply) {
11513
11513
  // phoneNumber is optional — backend extracts it from the inbound WhatsApp webhook.
11514
- // Cast keeps us forward-compatible with the relaxed backend schema.
11515
- return smartlinks__namespace.authKit.sendWhatsApp(this.clientId, { phoneNumber: phoneNumber ?? '', redirectUrl });
11514
+ // `reply`, when provided, is sent back to the user via WhatsApp on successful verification.
11515
+ return smartlinks__namespace.authKit.sendWhatsApp(this.clientId, {
11516
+ phoneNumber: phoneNumber ?? '',
11517
+ redirectUrl,
11518
+ ...(reply ? { reply } : {}),
11519
+ });
11516
11520
  }
11517
11521
  async getWhatsAppStatus(token) {
11518
11522
  return smartlinks__namespace.authKit.getWhatsAppStatus(this.clientId, token);
@@ -12843,6 +12847,31 @@ const getActionResultErrorMessage = (result) => {
12843
12847
  details: candidate.details,
12844
12848
  });
12845
12849
  };
12850
+ const interpolateReply = (input, vars) => {
12851
+ if (!input)
12852
+ return input;
12853
+ return input
12854
+ .replace(/\{\{\s*name\s*\}\}/gi, vars.name?.trim() || 'there')
12855
+ .replace(/\{\{\s*clientName\s*\}\}/gi, vars.clientName?.trim() || '')
12856
+ .replace(/\{\{\s*phoneNumber\s*\}\}/gi, vars.phoneNumber?.trim() || '');
12857
+ };
12858
+ const buildWhatsAppReply = (cfg, vars) => {
12859
+ if (!cfg)
12860
+ return undefined;
12861
+ if (cfg.enabled === false)
12862
+ return undefined;
12863
+ const text = interpolateReply(cfg.text, vars);
12864
+ const cta = cfg.cta && cfg.cta.buttonUrl && cfg.cta.buttonLabel
12865
+ ? {
12866
+ body: interpolateReply(cfg.cta.body, vars) || '',
12867
+ buttonLabel: interpolateReply(cfg.cta.buttonLabel, vars) || cfg.cta.buttonLabel,
12868
+ buttonUrl: interpolateReply(cfg.cta.buttonUrl, vars) || cfg.cta.buttonUrl,
12869
+ }
12870
+ : undefined;
12871
+ if (!text && !cta)
12872
+ return undefined;
12873
+ return { ...(text ? { text } : {}), ...(cta ? { cta } : {}) };
12874
+ };
12846
12875
  // Default Smartlinks Google OAuth Client ID (public - safe to expose)
12847
12876
  const DEFAULT_GOOGLE_CLIENT_ID = '696509063554-jdlbjl8vsjt7cr0vgkjkjf3ffnvi3a70.apps.googleusercontent.com';
12848
12877
  // Default Google OAuth proxy URL (hosted on our whitelisted domain)
@@ -13020,7 +13049,7 @@ const checkSilentGoogleSignIn = async (clientId, googleClientId) => {
13020
13049
  });
13021
13050
  };
13022
13051
  // getFriendlyErrorMessage is now imported from ../utils/errorHandling
13023
- const SmartlinksAuthUI = ({ apiEndpoint, clientId, clientName, accountData, onAuthSuccess, onAuthError, onRedirect, enabledProviders = ['email', 'google', 'phone'], initialMode, signupProminence, redirectUrl, theme = 'light', className, customization, skipConfigFetch = false, minimal = false, logger, proxyMode = false, collectionId, disableConfigCache = false, enableSilentGoogleSignIn = false, }) => {
13052
+ const SmartlinksAuthUI = ({ apiEndpoint, clientId, clientName, accountData, onAuthSuccess, onAuthError, onRedirect, enabledProviders = ['email', 'google', 'phone'], initialMode, signupProminence, redirectUrl, theme = 'light', className, customization, skipConfigFetch = false, minimal = false, logger, proxyMode = false, collectionId, disableConfigCache = false, enableSilentGoogleSignIn = false, whatsappReply, }) => {
13024
13053
  // Resolve signup prominence from props, customization, config, or default
13025
13054
  const resolvedSignupProminence = signupProminence || customization?.signupProminence || 'minimal';
13026
13055
  // Determine initial mode based on signupProminence setting
@@ -14243,9 +14272,13 @@ const SmartlinksAuthUI = ({ apiEndpoint, clientId, clientName, accountData, onAu
14243
14272
  try {
14244
14273
  // No ensureAccount and no phone number — the backend creates/links the
14245
14274
  // account from the inbound WhatsApp webhook (sender's number is the proof).
14246
- // displayName is reserved for a future "name on first contact" hook.
14247
- void displayName;
14248
- const result = await api.sendWhatsApp(getRedirectUrl());
14275
+ // Resolve reply config: per-call prop wins, otherwise fall back to AuthKit default.
14276
+ const replyConfig = whatsappReply ?? config?.whatsappReply;
14277
+ const reply = buildWhatsAppReply(replyConfig, {
14278
+ name: displayName,
14279
+ clientName,
14280
+ });
14281
+ const result = await api.sendWhatsApp(getRedirectUrl(), undefined, reply);
14249
14282
  return result;
14250
14283
  }
14251
14284
  catch (err) {
@@ -15608,11 +15641,12 @@ const AuthUIPreview = ({ customization, enabledProviders = ['email', 'google', '
15608
15641
  const showGoogle = enabledProviders.includes('google');
15609
15642
  const showPhone = enabledProviders.includes('phone');
15610
15643
  const showMagicLink = enabledProviders.includes('magic-link');
15644
+ const showWhatsApp = enabledProviders.includes('whatsapp');
15611
15645
  // Determine ordered providers (excluding email if in button mode)
15612
15646
  const orderedProviders = providerOrder && providerOrder.length > 0
15613
15647
  ? providerOrder.filter(p => enabledProviders.includes(p) && p !== 'email')
15614
15648
  : enabledProviders.filter(p => p !== 'email');
15615
- const hasOtherProviders = showGoogle || showPhone || showMagicLink;
15649
+ const hasOtherProviders = showGoogle || showPhone || showMagicLink || showWhatsApp;
15616
15650
  // Render provider button helper
15617
15651
  const renderProviderButton = (provider) => {
15618
15652
  if (provider === 'google' && showGoogle) {
@@ -15624,6 +15658,9 @@ const AuthUIPreview = ({ customization, enabledProviders = ['email', 'google', '
15624
15658
  if (provider === 'magic-link' && showMagicLink) {
15625
15659
  return (jsxRuntime.jsxs("button", { className: "auth-provider-button", disabled: true, children: [jsxRuntime.jsx("svg", { width: "18", height: "18", viewBox: "0 0 20 20", fill: "none", stroke: "currentColor", children: jsxRuntime.jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M3 8l7.89 5.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z" }) }), jsxRuntime.jsx("span", { children: "Continue with Magic Link" })] }, "magic-link"));
15626
15660
  }
15661
+ if (provider === 'whatsapp' && showWhatsApp) {
15662
+ return (jsxRuntime.jsxs("button", { className: "auth-provider-button", disabled: true, style: { background: '#25D366', color: '#fff', borderColor: '#25D366' }, children: [jsxRuntime.jsx("svg", { width: "18", height: "18", viewBox: "0 0 24 24", fill: "currentColor", "aria-hidden": "true", children: jsxRuntime.jsx("path", { d: "M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51-.173-.008-.371-.01-.57-.01-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413.247-.694.247-1.289.173-1.413-.074-.124-.272-.198-.57-.347m-5.421 7.403h-.004a9.87 9.87 0 01-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 01-1.51-5.26c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.825 9.825 0 012.893 6.994c-.003 5.45-4.437 9.884-9.885 9.884m8.413-18.297A11.815 11.815 0 0012.05 0C5.495 0 .16 5.335.157 11.892c0 2.096.547 4.142 1.588 5.945L.057 24l6.305-1.654a11.882 11.882 0 005.683 1.448h.005c6.554 0 11.89-5.335 11.893-11.893A11.821 11.821 0 0020.464 3.488" }) }), jsxRuntime.jsx("span", { children: "Continue with WhatsApp" })] }, "whatsapp"));
15663
+ }
15627
15664
  if (provider === 'email' && showEmail && emailDisplayMode === 'button') {
15628
15665
  return (jsxRuntime.jsxs("button", { className: "auth-provider-button", disabled: true, children: [jsxRuntime.jsx("svg", { width: "18", height: "18", viewBox: "0 0 20 20", fill: "none", stroke: "currentColor", children: jsxRuntime.jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M3 8l7.89 5.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z" }) }), jsxRuntime.jsx("span", { children: "Continue with Email" })] }, "email"));
15629
15666
  }