@proveanything/smartlinks-auth-ui 0.1.6 → 0.1.8

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/api.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAExE;;;GAGG;AACH,qBAAa,OAAO;IAClB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,UAAU,CAAC,CAAS;gBAEhB,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM;IAOjE,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAI7D,QAAQ,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;IASnD,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAIvD,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,cAAc,EAAE,MAAM,CAAA;KAAE,CAAC;IAIvE,eAAe,CACnB,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,YAAY,CAAC;IAIlB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAQxG,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAIlH,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAIzG,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IASzH,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAIhF,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAStH,WAAW,IAAI,OAAO,CAAC,YAAY,CAAC;IAmBpC,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAOjG,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAGlF"}
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAExE;;;GAGG;AACH,qBAAa,OAAO;IAClB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,UAAU,CAAC,CAAS;gBAEhB,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM;IAOjE,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAI7D,QAAQ,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;IASnD,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAIvD,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,cAAc,EAAE,MAAM,CAAA;KAAE,CAAC;IAIvE,eAAe,CACnB,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,YAAY,CAAC;IAIlB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAQxG,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAIlH,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAIzG,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IASzH,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAIhF,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAStH,WAAW,IAAI,OAAO,CAAC,YAAY,CAAC;IAuBpC,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAOjG,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAGlF"}
@@ -1 +1 @@
1
- {"version":3,"file":"SmartlinksAuthUI.d.ts","sourceRoot":"","sources":["../../src/components/SmartlinksAuthUI.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;AAUnD,OAAO,KAAK,EAAE,qBAAqB,EAAyC,MAAM,UAAU,CAAC;AAqB7F,eAAO,MAAM,gBAAgB,EAAE,KAAK,CAAC,EAAE,CAAC,qBAAqB,CAk4B5D,CAAC"}
1
+ {"version":3,"file":"SmartlinksAuthUI.d.ts","sourceRoot":"","sources":["../../src/components/SmartlinksAuthUI.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;AAUnD,OAAO,KAAK,EAAE,qBAAqB,EAAyC,MAAM,UAAU,CAAC;AAkD7F,eAAO,MAAM,gBAAgB,EAAE,KAAK,CAAC,EAAE,CAAC,qBAAqB,CAu6B5D,CAAC"}
package/dist/index.esm.js CHANGED
@@ -10653,11 +10653,15 @@ class AuthAPI {
10653
10653
  });
10654
10654
  }
10655
10655
  async fetchConfig() {
10656
+ console.log('[AuthAPI] fetchConfig called with clientId:', this.clientId);
10656
10657
  try {
10657
- return await smartlinks.authKit.load(this.clientId);
10658
+ console.log('[AuthAPI] Calling smartlinks.authKit.load...');
10659
+ const result = await smartlinks.authKit.load(this.clientId);
10660
+ console.log('[AuthAPI] smartlinks.authKit.load returned:', result);
10661
+ return result;
10658
10662
  }
10659
10663
  catch (error) {
10660
- console.warn('Failed to fetch UI config, using defaults:', error);
10664
+ console.warn('[AuthAPI] Failed to fetch UI config, using defaults:', error);
10661
10665
  return {
10662
10666
  branding: {
10663
10667
  title: 'Smartlinks Auth',
@@ -11428,10 +11432,37 @@ const DEFAULT_AUTH_CONFIG = {
11428
11432
  emailDisplayMode: 'button',
11429
11433
  googleOAuthFlow: 'oneTap'
11430
11434
  };
11431
- const SmartlinksAuthUI = ({ apiEndpoint, clientId, clientName, accountData, onAuthSuccess, onAuthError, enabledProviders = ['email', 'google', 'phone'], initialMode = 'login', redirectUrl, theme = 'light', className, customization, skipConfigFetch = false, minimal = false, }) => {
11435
+ // Helper to dynamically load Google Identity Services if not already loaded
11436
+ const loadGoogleIdentityServices = () => {
11437
+ return new Promise((resolve, reject) => {
11438
+ // Check if already loaded
11439
+ if (window.google?.accounts) {
11440
+ resolve();
11441
+ return;
11442
+ }
11443
+ // Check if script is already being loaded
11444
+ const existingScript = document.querySelector('script[src="https://accounts.google.com/gsi/client"]');
11445
+ if (existingScript) {
11446
+ // Wait for existing script to load
11447
+ existingScript.addEventListener('load', () => resolve());
11448
+ existingScript.addEventListener('error', () => reject(new Error('Failed to load Google Identity Services')));
11449
+ return;
11450
+ }
11451
+ // Dynamically inject the script
11452
+ const script = document.createElement('script');
11453
+ script.src = 'https://accounts.google.com/gsi/client';
11454
+ script.async = true;
11455
+ script.defer = true;
11456
+ script.onload = () => resolve();
11457
+ script.onerror = () => reject(new Error('Failed to load Google Identity Services'));
11458
+ document.head.appendChild(script);
11459
+ });
11460
+ };
11461
+ const SmartlinksAuthUI = ({ apiEndpoint, clientId, clientName, accountData, onAuthSuccess, onAuthError, enabledProviders = ['email', 'google', 'phone'], initialMode = 'login', redirectUrl, theme = 'auto', className, customization, skipConfigFetch = false, minimal = false, }) => {
11432
11462
  const [mode, setMode] = useState(initialMode);
11433
11463
  const [loading, setLoading] = useState(false);
11434
11464
  const [error, setError] = useState();
11465
+ const [resolvedTheme, setResolvedTheme] = useState('light');
11435
11466
  const [resetSuccess, setResetSuccess] = useState(false);
11436
11467
  const [authSuccess, setAuthSuccess] = useState(false);
11437
11468
  const [successMessage, setSuccessMessage] = useState();
@@ -11445,11 +11476,26 @@ const SmartlinksAuthUI = ({ apiEndpoint, clientId, clientName, accountData, onAu
11445
11476
  const [showEmailForm, setShowEmailForm] = useState(false); // Track if email form should be shown when emailDisplayMode is 'button'
11446
11477
  const api = new AuthAPI(apiEndpoint, clientId, clientName);
11447
11478
  const auth = useAuth();
11479
+ // Dark mode detection and theme management
11480
+ useEffect(() => {
11481
+ if (theme !== 'auto') {
11482
+ setResolvedTheme(theme);
11483
+ return;
11484
+ }
11485
+ // Auto-detect system theme preference
11486
+ const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');
11487
+ const updateTheme = () => setResolvedTheme(mediaQuery.matches ? 'dark' : 'light');
11488
+ updateTheme();
11489
+ mediaQuery.addEventListener('change', updateTheme);
11490
+ return () => mediaQuery.removeEventListener('change', updateTheme);
11491
+ }, [theme]);
11448
11492
  // Reinitialize Smartlinks SDK when apiEndpoint changes (for test/dev scenarios)
11449
11493
  // IMPORTANT: Preserve bearer token during reinitialization
11450
11494
  useEffect(() => {
11495
+ console.log('[SmartlinksAuthUI] SDK reinitialize useEffect triggered', { apiEndpoint });
11451
11496
  const reinitializeWithToken = async () => {
11452
11497
  if (apiEndpoint) {
11498
+ console.log('[SmartlinksAuthUI] Reinitializing SDK with baseURL:', apiEndpoint);
11453
11499
  // Get current token before reinitializing
11454
11500
  const currentToken = await auth.getToken();
11455
11501
  smartlinks.initializeApi({
@@ -11464,6 +11510,9 @@ const SmartlinksAuthUI = ({ apiEndpoint, clientId, clientName, accountData, onAu
11464
11510
  });
11465
11511
  }
11466
11512
  }
11513
+ else {
11514
+ console.log('[SmartlinksAuthUI] No apiEndpoint, skipping SDK reinitialize');
11515
+ }
11467
11516
  };
11468
11517
  reinitializeWithToken();
11469
11518
  }, [apiEndpoint, auth]);
@@ -11478,13 +11527,22 @@ const SmartlinksAuthUI = ({ apiEndpoint, clientId, clientName, accountData, onAu
11478
11527
  };
11479
11528
  // Fetch UI configuration
11480
11529
  useEffect(() => {
11530
+ console.log('[SmartlinksAuthUI] Config fetch useEffect triggered', {
11531
+ skipConfigFetch,
11532
+ clientId,
11533
+ clientIdType: typeof clientId,
11534
+ clientIdTruthy: !!clientId,
11535
+ apiEndpoint
11536
+ });
11481
11537
  if (skipConfigFetch) {
11538
+ console.log('[SmartlinksAuthUI] Skipping config fetch - skipConfigFetch is true');
11482
11539
  setConfig(customization || {});
11483
11540
  return;
11484
11541
  }
11485
11542
  const fetchConfig = async () => {
11486
11543
  // If no clientId provided, use default config immediately without API call
11487
11544
  if (!clientId) {
11545
+ console.log('[SmartlinksAuthUI] No clientId provided, using default config');
11488
11546
  const defaultConfig = {
11489
11547
  ...DEFAULT_AUTH_CONFIG,
11490
11548
  enabledProviders: enabledProviders || ['email', 'google', 'phone']
@@ -11515,7 +11573,9 @@ const SmartlinksAuthUI = ({ apiEndpoint, clientId, clientName, accountData, onAu
11515
11573
  }
11516
11574
  }
11517
11575
  // Fetch from API
11576
+ console.log('[SmartlinksAuthUI] Fetching config from API for clientId:', clientId);
11518
11577
  const fetchedConfig = await api.fetchConfig();
11578
+ console.log('[SmartlinksAuthUI] Received config:', fetchedConfig);
11519
11579
  // Merge with customization props (props take precedence)
11520
11580
  const mergedConfig = { ...fetchedConfig, ...customization };
11521
11581
  setConfig(mergedConfig);
@@ -11813,9 +11873,11 @@ const SmartlinksAuthUI = ({ apiEndpoint, clientId, clientName, accountData, onAu
11813
11873
  setLoading(true);
11814
11874
  setError(undefined);
11815
11875
  try {
11876
+ // Dynamically load Google Identity Services if not already loaded
11877
+ await loadGoogleIdentityServices();
11816
11878
  const google = window.google;
11817
- if (!google) {
11818
- throw new Error('Google Identity Services not loaded. Please check your internet connection.');
11879
+ if (!google?.accounts) {
11880
+ throw new Error('Google Identity Services failed to initialize');
11819
11881
  }
11820
11882
  if (oauthFlow === 'popup') {
11821
11883
  // Use OAuth2 popup flow (works in iframes but requires popup permission)
@@ -11985,9 +12047,9 @@ const SmartlinksAuthUI = ({ apiEndpoint, clientId, clientName, accountData, onAu
11985
12047
  }
11986
12048
  };
11987
12049
  if (configLoading) {
11988
- return (jsx(AuthContainer, { theme: theme, className: className, minimal: minimal || config?.branding?.minimal || false, children: jsx("div", { style: { textAlign: 'center', padding: '2rem' }, children: jsx("div", { className: "auth-spinner" }) }) }));
12050
+ return (jsx(AuthContainer, { theme: resolvedTheme, className: className, minimal: minimal || config?.branding?.minimal || false, children: jsx("div", { style: { textAlign: 'center', padding: '2rem' }, children: jsx("div", { className: "auth-spinner" }) }) }));
11989
12051
  }
11990
- return (jsx(AuthContainer, { theme: theme, className: className, config: config, minimal: minimal || config?.branding?.minimal || false, children: authSuccess ? (jsxs("div", { style: { textAlign: 'center', padding: '2rem' }, children: [jsx("div", { style: {
12052
+ return (jsx(AuthContainer, { theme: resolvedTheme, className: className, config: config, minimal: minimal || config?.branding?.minimal || false, children: authSuccess ? (jsxs("div", { style: { textAlign: 'center', padding: '2rem' }, children: [jsx("div", { style: {
11991
12053
  color: 'var(--auth-primary-color, #4F46E5)',
11992
12054
  fontSize: '3rem',
11993
12055
  marginBottom: '1rem'