// Dual Portal Demo Extension UI // Uses @alga/extension-iframe-sdk for postMessage communication import { IframeBridge } from '@alga-psa/extension-iframe-sdk'; // Initialize the SDK bridge const bridge = new IframeBridge({ // Allow wildcard for development; in production the SDK validates parent origin devAllowWildcard: true, }); // Parse URL parameters const params = new URLSearchParams(window.location.search); const extensionId = params.get('extensionId') || 'unknown'; const tenant = params.get('tenant') || 'unknown'; const path = params.get('path') || '/'; // Detect which portal we're running in based on the parent URL const referrer = document.referrer || ''; const isClientPortal = referrer.includes('/client-portal/') || window.location.href.includes('/client-portal/'); const portalType = isClientPortal ? 'client' : 'msp'; // DOM elements const ctxEl = document.getElementById('ctx'); const handlerEl = document.getElementById('handler-result'); const badgeEl = document.getElementById('badge'); const portalIndicatorEl = document.getElementById('portal-indicator'); const featuresEl = document.getElementById('features'); /** * Apply portal-specific styling and content */ function applyPortalContext(): void { document.body.classList.add(isClientPortal ? 'client-portal' : 'msp-portal'); if (badgeEl) { badgeEl.textContent = isClientPortal ? 'Client Portal' : 'MSP Portal'; } if (portalIndicatorEl) { const icon = isClientPortal ? `` : ``; const message = isClientPortal ? 'Running in Client Portal context' : 'Running in MSP Portal context'; portalIndicatorEl.innerHTML = `${icon}${message}`; } if (featuresEl) { const checkIcon = ``; const mspFeatures = [ 'View and manage all client data', 'Access administrative settings', 'Configure extension for all tenants', 'View usage analytics and reports', 'Manage user permissions', ]; const clientFeatures = [ 'View your own data only', 'Submit support requests', 'Access self-service portal', 'View your billing information', 'Update account preferences', ]; const features = isClientPortal ? clientFeatures : mspFeatures; featuresEl.innerHTML = features.map((f) => `
${userTypeDisplay}
${clientIdDisplay}
${data.portalType || portalType}
${data.context?.tenantId || 'N/A'}
${data.context?.extensionId || 'N/A'}
${data.context?.requestId || 'N/A'}
${data.timestamp || 'N/A'}
${data.version || 'N/A'}