Skip to content

Events

Sesamy JS emits various events throughout the user lifecycle that you can listen to for custom behavior, analytics tracking, and UI updates.

Event Reference

All events are dispatched as standard browser CustomEvent objects that can be listened to using addEventListener.

sesamyJsReady

Fired when the Sesamy JS library has been fully initialized and is ready to use.

Event Detail: {} (empty object)

When it fires:

  • After all configurations are loaded
  • After authentication state is initialized
  • When all API methods are available

Example:

javascript
window.addEventListener('sesamyJsReady', () => {
  console.log('Sesamy JS is ready!');

  // Safe to call API methods now
  window.sesamy.auth.isAuthenticated().then((isAuth) => {
    console.log('User authenticated:', isAuth);
  });
});

Common use cases:

  • Initialize your app's authentication UI
  • Load user profile data
  • Check entitlements for protected content
  • Set up analytics tracking

sesamyJsAuthInitialized

Fired when the authentication system has been initialized, before the full SDK is ready.

Event Detail: {} (empty object)

When it fires:

  • After Auth0 client is configured
  • Before redirect callback handling completes
  • Before sesamyJsReady event

Example:

javascript
window.addEventListener('sesamyJsAuthInitialized', () => {
  console.log('Auth system initialized');
  // Show loading state while waiting for full initialization
});

Common use cases:

  • Display early loading indicators
  • Handle authentication state transitions
  • Debug authentication flow

sesamyJsAuthenticated

Fired when a user successfully authenticates (login, signup, or token refresh).

Event Detail:

typescript
{
  sub: string;              // User ID
  email: string;            // User email
  email_verified: boolean;  // Email verification status
  name?: string;            // User's full name
  picture?: string;         // Profile picture URL
  appState?: any;          // Custom metadata passed during login
  // ... other JWT claims and user properties
}

When it fires:

  • After successful redirect-based login
  • After successful popup-based login
  • After manual token is set via setToken()
  • When returning user's session is restored

Example:

javascript
window.addEventListener('sesamyJsAuthenticated', (event) => {
  const { email, appState, sub } = event.detail;

  console.log('User authenticated:', email);

  // Access custom login metadata
  if (appState?.source === 'registration-wall') {
    // Track conversion from paywall
    analytics.track('paywall_conversion', {
      userId: sub,
      source: appState.source,
      articleId: appState.articleId,
    });
  }

  // Update UI
  document.querySelector('.user-email').textContent = email;
  document.querySelector('.premium-content').style.display = 'block';
});

Common use cases:

  • Update authentication UI
  • Track user registration/login events
  • Redirect to protected content
  • Initialize user-specific features
  • Send conversion events to analytics

Canceling auto-reload:

For popup-based logins, you can prevent the automatic page reload by calling preventDefault():

javascript
window.addEventListener('sesamyJsAuthenticated', (event) => {
  event.preventDefault(); // Prevent automatic reload
  console.log('User authenticated, handling manually');
  // Manually update UI instead of reloading
});

sesamyJsLogout

Fired when a user logs out.

Event Detail: {} (empty object)

When it fires:

  • After window.sesamy.auth.logout() is called
  • Before redirect to logout URL

Example:

javascript
window.addEventListener('sesamyJsLogout', () => {
  console.log('User logged out');

  // Clear user-specific data
  sessionStorage.clear();

  // Update UI
  document.querySelector('.user-profile').style.display = 'none';
  document.querySelector('.login-button').style.display = 'block';

  // Track logout event
  if (window.gtag) {
    window.gtag('event', 'logout');
  }
});

Common use cases:

  • Clear cached user data
  • Reset UI to logged-out state
  • Track logout analytics
  • Clean up user-specific resources

sesamyJsPurchase

Fired when a purchase is completed and the user returns to your site.

Event Detail:

typescript
{
  itemSrc: string; // The item source identifier for the purchased item
}

When it fires:

  • After successful purchase completion
  • When user returns from checkout with sesamy-purchase query parameter

Example:

javascript
window.addEventListener('sesamyJsPurchase', (event) => {
  const { itemSrc } = event.detail;

  console.log('Purchase completed:', itemSrc);

  // Show thank you message
  showNotification('Thank you for your purchase!');

  // Track conversion
  if (window.gtag) {
    window.gtag('event', 'purchase', {
      item_id: itemSrc,
      value: /* amount */,
      currency: 'USD'
    });
  }

  // Refresh content access
  window.location.reload();
});

Common use cases:

  • Display purchase confirmation
  • Track e-commerce conversions
  • Unlock purchased content
  • Send confirmation emails
  • Update user entitlements UI

sesamyUserAttributeChanged

Fired when user attributes (tags) are modified.

Event Detail: {} (empty object)

When it fires:

  • After window.sesamy.setTag() is called
  • When user tags are updated

Example:

javascript
window.addEventListener('sesamyUserAttributeChanged', async () => {
  console.log('User attributes changed');

  // Refresh user data
  const tags = await window.sesamy.getTags();
  console.log('Updated tags:', tags);

  // Update UI based on new attributes
  updateUserBadges(tags);
});

Common use cases:

  • Refresh user profile UI
  • Update personalization features
  • Trigger content recommendations
  • Sync with external systems

sesamyJsClearCache

Fired when the SDK cache is cleared.

Event Detail: {} (empty object)

When it fires:

  • After window.sesamy.clearCache() is called
  • After purchases
  • After certain user attribute changes

Example:

javascript
window.addEventListener('sesamyJsClearCache', () => {
  console.log('Cache cleared, data will be refreshed');

  // Reload entitlements or other cached data
  refreshContentAccess();
});

Common use cases:

  • Trigger data refresh
  • Debug caching issues
  • Coordinate cache invalidation
  • Update dependent systems

Event Patterns

Initialization Flow

javascript
// 1. Auth system initializes
window.addEventListener('sesamyJsAuthInitialized', () => {
  console.log('1. Auth initialized');
});

// 2. Full SDK ready
window.addEventListener('sesamyJsReady', () => {
  console.log('2. SDK ready');
});

// 3. User authenticated (if logged in)
window.addEventListener('sesamyJsAuthenticated', () => {
  console.log('3. User authenticated');
});

Login/Logout Cycle

javascript
// User logs in
window.addEventListener('sesamyJsAuthenticated', (event) => {
  console.log('Logged in as:', event.detail.email);
  showUserProfile(event.detail);
});

// User logs out
window.addEventListener('sesamyJsLogout', () => {
  console.log('Logged out');
  hideUserProfile();
});

Purchase Flow

javascript
// User clicks "Subscribe"
document.querySelector('#subscribe-btn').addEventListener('click', () => {
  window.sesamy.checkout('item-sku-123');
});

// User completes purchase and returns
window.addEventListener('sesamyJsPurchase', async (event) => {
  const { itemSrc } = event.detail;

  // Show confirmation
  alert('Purchase successful!');

  // Verify access
  const hasAccess = await window.sesamy.hasAccess(itemSrc);
  if (hasAccess) {
    // Unlock content
    document.querySelector('.premium-content').classList.remove('locked');
  }
});

Tracking with Google Analytics

javascript
// Track all major events
window.addEventListener('sesamyJsAuthenticated', (event) => {
  gtag('event', 'login', {
    method: 'Sesamy',
    user_id: event.detail.sub
  });
});

window.addEventListener('sesamyJsLogout', () => {
  gtag('event', 'logout');
});

window.addEventListener('sesamyJsPurchase', (event) => {
  gtag('event', 'purchase', {
    transaction_id: event.detail.itemSrc,
    value: /* amount */,
    currency: 'USD',
    items: [{
      item_id: event.detail.itemSrc,
      item_name: /* product name */
    }]
  });
});

Debugging Events

javascript
// Log all Sesamy events
const sesamyEvents = [
  'sesamyJsReady',
  'sesamyJsAuthInitialized',
  'sesamyJsAuthenticated',
  'sesamyJsLogout',
  'sesamyJsPurchase',
  'sesamyUserAttributeChanged',
  'sesamyJsClearCache',
];

sesamyEvents.forEach((eventName) => {
  window.addEventListener(eventName, (event) => {
    console.log(`[${eventName}]`, event.detail);
  });
});

Best Practices

Always Wait for Ready

javascript
// ❌ Bad: Calling before ready
window.sesamy.auth.isAuthenticated(); // May fail

// ✅ Good: Wait for ready event
window.addEventListener('sesamyJsReady', async () => {
  const isAuth = await window.sesamy.auth.isAuthenticated();
});

Handle Authentication State

javascript
// ✅ Good: Comprehensive auth handling
let isUserAuthenticated = false;

window.addEventListener('sesamyJsReady', async () => {
  isUserAuthenticated = await window.sesamy.auth.isAuthenticated();
  updateUI();
});

window.addEventListener('sesamyJsAuthenticated', () => {
  isUserAuthenticated = true;
  updateUI();
});

window.addEventListener('sesamyJsLogout', () => {
  isUserAuthenticated = false;
  updateUI();
});

function updateUI() {
  document.querySelector('.auth-status').textContent = isUserAuthenticated
    ? 'Logged In'
    : 'Logged Out';
}

Use Event Delegation

javascript
// ✅ Good: Single event handler for multiple updates
window.addEventListener('sesamyJsAuthenticated', (event) => {
  // Update multiple UI components
  updateHeader(event.detail);
  updateSidebar(event.detail);
  trackAnalytics(event.detail);
});

TypeScript Support

All events include proper TypeScript types when using Sesamy JS with TypeScript:

typescript
import { Events } from '@sesamy/sesamy-js';

window.addEventListener(Events.AUTHENTICATED, (event: CustomEvent) => {
  const { email, appState, sub } = event.detail;
  // TypeScript knows the shape of event.detail
});

Next Steps

Released under the MIT License.