notification-kit
Version:
A unified notification library for React + Capacitor apps. One API for push notifications, in-app notifications, and local notifications across Web, iOS, and Android.
1 lines • 35.1 kB
Source Map (JSON)
{"version":3,"file":"OneSignalProvider-mRblKTku.mjs","sources":["../src/providers/OneSignalNativeBridge.ts","../src/providers/OneSignalProvider.ts"],"sourcesContent":["import { DynamicLoader } from '@/utils/dynamic-loader'\nimport { Logger } from '@/utils/logger'\nimport type { OneSignalConfig } from '@/types'\n\n/**\n * Native bridge for OneSignal configuration\n * Handles runtime configuration injection for iOS and Android\n */\nexport class OneSignalNativeBridge {\n private static isInitialized = false\n\n /**\n * Initialize OneSignal on native platforms with runtime configuration\n */\n static async initializeNative(config: OneSignalConfig): Promise<void> {\n if (this.isInitialized) {\n Logger.warn('OneSignal native bridge already initialized')\n return\n }\n\n const isNative = await DynamicLoader.isNativePlatform()\n if (!isNative) {\n // Not a native platform, skip native initialization\n return\n }\n\n const platform = await DynamicLoader.getPlatform()\n \n try {\n // For Capacitor apps, we need to use the OneSignal Capacitor SDK\n // which handles native configuration programmatically\n const capacitor = await DynamicLoader.loadCapacitorCore()\n if (!capacitor) {\n throw new Error('Capacitor not available for native OneSignal initialization')\n }\n\n // Use Capacitor's plugin system to communicate with native code\n // This approach avoids hardcoding credentials in native files\n await this.configureNativePlatform(platform, config)\n \n this.isInitialized = true\n Logger.info(`OneSignal native bridge initialized for ${platform}`)\n } catch (error) {\n Logger.error('Failed to initialize OneSignal native bridge:', error)\n throw error\n }\n }\n\n /**\n * Configure OneSignal for specific native platform\n */\n private static async configureNativePlatform(\n platform: string,\n config: OneSignalConfig\n ): Promise<void> {\n // Instead of using Info.plist or AndroidManifest.xml,\n // we'll use the OneSignal SDK's programmatic initialization\n \n // The OneSignal Capacitor plugin (when available) would handle this\n // For now, we document the approach for developers\n \n if (platform === 'ios') {\n await this.configureIOS(config)\n } else if (platform === 'android') {\n await this.configureAndroid(config)\n }\n }\n\n /**\n * Configure OneSignal for iOS\n */\n private static async configureIOS(config: OneSignalConfig): Promise<void> {\n // iOS configuration approach:\n // 1. The OneSignal SDK for iOS supports programmatic initialization\n // 2. Instead of Info.plist, use the SDK's initialization method\n // 3. This is typically done in the AppDelegate or via a Capacitor plugin\n \n Logger.debug('iOS OneSignal configuration:', {\n appId: config.appId ? '***' : 'not provided',\n // Log config status without exposing sensitive data\n })\n\n // Note: Actual implementation would require a Capacitor plugin\n // that bridges to native iOS code to call:\n // OneSignal.initWithLaunchOptions(launchOptions, appId: config.appId)\n }\n\n /**\n * Configure OneSignal for Android\n */\n private static async configureAndroid(config: OneSignalConfig): Promise<void> {\n // Android configuration approach:\n // 1. The OneSignal SDK for Android supports programmatic initialization\n // 2. Instead of AndroidManifest.xml meta-data, use the SDK's init method\n // 3. This is typically done in the Application class or via a Capacitor plugin\n \n Logger.debug('Android OneSignal configuration:', {\n appId: config.appId ? '***' : 'not provided',\n // Log config status without exposing sensitive data\n })\n\n // Note: Actual implementation would require a Capacitor plugin\n // that bridges to native Android code to call:\n // OneSignal.initWithContext(context, config.appId)\n }\n\n /**\n * Get initialization status\n */\n static isNativeInitialized(): boolean {\n return this.isInitialized\n }\n\n /**\n * Reset initialization (useful for testing)\n */\n static reset(): void {\n this.isInitialized = false\n }\n}","import { DynamicLoader } from '@/utils/dynamic-loader'\nimport { OneSignalNativeBridge } from './OneSignalNativeBridge'\nimport { ConfigValidator } from '@/utils/config-validator'\nimport type OneSignal from 'react-onesignal'\nimport type {\n NotificationProvider,\n OneSignalConfig,\n PushNotificationPayload,\n PermissionStatus,\n ProviderCapabilities,\n} from '@/types'\n\n/**\n * OneSignal provider for push notifications\n */\nexport class OneSignalProvider implements NotificationProvider {\n readonly name = 'onesignal'\n readonly type = 'onesignal' as const\n\n private config: OneSignalConfig | null = null\n private initialized = false\n private OneSignal: typeof OneSignal | null = null\n private messageListeners: ((payload: PushNotificationPayload) => void)[] = []\n private tokenListeners: ((token: string) => void)[] = []\n private errorListeners: ((error: Error) => void)[] = []\n\n /**\n * Initialize OneSignal provider\n */\n async init(config: OneSignalConfig): Promise<void> {\n try {\n // Validate configuration\n ConfigValidator.validateOneSignalConfig(config)\n ConfigValidator.validateEnvironmentVariables('onesignal')\n \n this.config = config\n\n const isNative = await DynamicLoader.isNativePlatform()\n \n if (isNative) {\n // For native platforms, initialize through the native bridge\n await OneSignalNativeBridge.initializeNative(config)\n \n // Native platforms use the OneSignal Capacitor SDK\n // which has a different API than react-onesignal\n this.initialized = true\n await this.setupNativeEventListeners()\n } else {\n // For web platform, use react-onesignal\n const initOptions: Record<string, unknown> = {\n appId: config.appId,\n safari_web_id: config.safariWebId,\n autoPrompt: config.autoPrompt ?? true,\n autoResubscribe: config.autoResubscribe ?? true,\n path: config.path,\n serviceWorkerPath: config.serviceWorkerPath,\n serviceWorkerUpdaterPath: config.serviceWorkerUpdaterPath,\n notificationClickHandlerMatch:\n config.notificationClickHandlerMatch ?? 'origin',\n notificationClickHandlerAction:\n config.notificationClickHandlerAction ?? 'focusOrNavigate',\n allowLocalhostAsSecureOrigin:\n config.allowLocalhostAsSecureOrigin ?? false,\n }\n\n if (config.promptOptions) {\n initOptions.promptOptions = config.promptOptions\n }\n\n if (config.welcomeNotification) {\n initOptions.welcomeNotification = config.welcomeNotification\n }\n\n // Dynamically import OneSignal\n const oneSignalModule = await DynamicLoader.loadOneSignal()\n if (!oneSignalModule) {\n throw new Error('OneSignal is required but not installed')\n }\n this.OneSignal = oneSignalModule.default\n \n await this.OneSignal.init(initOptions as Parameters<typeof this.OneSignal.init>[0])\n\n this.initialized = true\n await this.setupEventListeners()\n }\n } catch (error) {\n this.handleError(new Error(`OneSignal initialization failed: ${error}`))\n throw error\n }\n }\n\n /**\n * Destroy OneSignal provider\n */\n async destroy(): Promise<void> {\n try {\n if (this.initialized) {\n // OneSignal doesn't have a destroy method, so we'll just clean up our state\n this.initialized = false\n this.config = null\n this.messageListeners = []\n this.tokenListeners = []\n this.errorListeners = []\n }\n } catch (error) {\n this.handleError(new Error(`OneSignal destroy failed: ${error}`))\n throw error\n }\n }\n\n /**\n * Request notification permission\n */\n async requestPermission(): Promise<boolean> {\n try {\n const isNative = await DynamicLoader.isNativePlatform()\n if (isNative) {\n return await this.requestNativePermission()\n } else {\n return await this.requestWebPermission()\n }\n } catch (error) {\n this.handleError(new Error(`Permission request failed: ${error}`))\n return false\n }\n }\n\n /**\n * Check notification permission status\n */\n async checkPermission(): Promise<PermissionStatus> {\n try {\n const isNative = await DynamicLoader.isNativePlatform()\n if (isNative) {\n return await this.checkNativePermission()\n } else {\n return await this.checkWebPermission()\n }\n } catch (error) {\n this.handleError(new Error(`Permission check failed: ${error}`))\n return 'denied'\n }\n }\n\n /**\n * Get OneSignal player ID (token)\n */\n async getToken(): Promise<string> {\n try {\n if (!this.OneSignal) {\n throw new Error('OneSignal not initialized')\n }\n const playerId = await (\n this.OneSignal as unknown as { getUserId: () => Promise<string> }\n ).getUserId()\n\n if (playerId) {\n return playerId\n } else {\n throw new Error('No OneSignal player ID available')\n }\n } catch (error) {\n this.handleError(new Error(`Token retrieval failed: ${error}`))\n throw error\n }\n }\n\n /**\n * Refresh OneSignal token\n */\n async refreshToken(): Promise<string> {\n try {\n // OneSignal handles token refresh automatically\n const newToken = await this.getToken()\n this.notifyTokenListeners(newToken)\n return newToken\n } catch (error) {\n this.handleError(new Error(`Token refresh failed: ${error}`))\n throw error\n }\n }\n\n /**\n * Delete OneSignal token\n */\n async deleteToken(): Promise<void> {\n try {\n if (!this.OneSignal) {\n throw new Error('OneSignal not initialized')\n }\n await (\n this.OneSignal as unknown as { logoutUser: () => Promise<void> }\n ).logoutUser()\n } catch (error) {\n this.handleError(new Error(`Token deletion failed: ${error}`))\n throw error\n }\n }\n\n /**\n * Subscribe to tag (OneSignal's equivalent of topics)\n */\n async subscribe(topic: string): Promise<void> {\n try {\n if (!this.OneSignal) {\n throw new Error('OneSignal not initialized')\n }\n await (\n this.OneSignal as unknown as {\n sendTag: (key: string, value: string) => Promise<void>\n }\n ).sendTag(topic, 'true')\n } catch (error) {\n this.handleError(new Error(`Tag subscription failed: ${error}`))\n throw error\n }\n }\n\n /**\n * Unsubscribe from tag\n */\n async unsubscribe(topic: string): Promise<void> {\n try {\n if (!this.OneSignal) {\n throw new Error('OneSignal not initialized')\n }\n await (\n this.OneSignal as unknown as { deleteTag: (key: string) => Promise<void> }\n ).deleteTag(topic)\n } catch (error) {\n this.handleError(new Error(`Tag unsubscription failed: ${error}`))\n throw error\n }\n }\n\n /**\n * Get subscribed tags\n */\n async getSubscriptions(): Promise<string[]> {\n try {\n if (!this.OneSignal) {\n throw new Error('OneSignal not initialized')\n }\n const tags = await (\n this.OneSignal as unknown as {\n getTags: () => Promise<Record<string, string>>\n }\n ).getTags()\n return Object.keys(tags || {})\n } catch (error) {\n this.handleError(new Error(`Get subscriptions failed: ${error}`))\n throw error\n }\n }\n\n /**\n * Send notification (requires REST API)\n */\n async sendNotification(payload: PushNotificationPayload): Promise<void> {\n if (!this.config?.restApiKey) {\n throw new Error('REST API key required for sending notifications')\n }\n\n try {\n const response = await fetch(\n 'https://onesignal.com/api/v1/notifications',\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Basic ${this.config.restApiKey}`,\n },\n body: JSON.stringify({\n app_id: this.config.appId,\n headings: { en: payload.notification?.title || 'Notification' },\n contents: { en: payload.notification?.body || '' },\n data: payload.data,\n included_segments: ['All'],\n }),\n }\n )\n\n if (!response.ok) {\n throw new Error(`OneSignal API error: ${response.statusText}`)\n }\n } catch (error) {\n this.handleError(new Error(`Send notification failed: ${error}`))\n throw error\n }\n }\n\n /**\n * Listen for messages\n */\n onMessage(callback: (payload: PushNotificationPayload) => void): () => void {\n this.messageListeners.push(callback)\n\n return () => {\n const index = this.messageListeners.indexOf(callback)\n if (index > -1) {\n this.messageListeners.splice(index, 1)\n }\n }\n }\n\n /**\n * Listen for token refresh\n */\n onTokenRefresh(callback: (token: string) => void): () => void {\n this.tokenListeners.push(callback)\n\n return () => {\n const index = this.tokenListeners.indexOf(callback)\n if (index > -1) {\n this.tokenListeners.splice(index, 1)\n }\n }\n }\n\n /**\n * Listen for errors\n */\n onError(callback: (error: Error) => void): () => void {\n this.errorListeners.push(callback)\n\n return () => {\n const index = this.errorListeners.indexOf(callback)\n if (index > -1) {\n this.errorListeners.splice(index, 1)\n }\n }\n }\n\n /**\n * Check if OneSignal is supported\n */\n async isSupported(): Promise<boolean> {\n try {\n const isNative = await DynamicLoader.isNativePlatform()\n if (isNative) {\n return true\n } else {\n // Check if we're in a supported browser environment\n return (\n typeof window !== 'undefined' &&\n 'serviceWorker' in navigator &&\n 'PushManager' in window\n )\n }\n } catch (_error) {\n return false\n }\n }\n\n /**\n * Get provider capabilities\n */\n async getCapabilities(): Promise<ProviderCapabilities> {\n const isWeb = !(await DynamicLoader.isNativePlatform())\n\n return {\n pushNotifications: true,\n topics: true, // Using tags\n richMedia: true,\n actions: true,\n backgroundSync: true,\n analytics: true,\n segmentation: true,\n scheduling: true,\n geofencing: false,\n inAppMessages: true,\n webPush: isWeb,\n badges: !isWeb,\n sounds: true,\n vibration: !isWeb,\n lights: !isWeb,\n bigText: !isWeb,\n bigPicture: !isWeb,\n inbox: false,\n progress: false,\n channels: !isWeb,\n groups: !isWeb,\n categories: true,\n quietHours: true,\n deliveryReceipts: true,\n clickTracking: true,\n impressionTracking: true,\n customData: true,\n multipleDevices: true,\n userTags: true,\n triggers: true,\n templates: true,\n abTesting: true,\n automation: true,\n journeys: true,\n realTimeUpdates: true,\n }\n }\n\n /**\n * Setup native event listeners for Capacitor\n */\n private async setupNativeEventListeners(): Promise<void> {\n try {\n // For native platforms, we use Capacitor's push notification events\n const pushNotificationsModule = await DynamicLoader.loadPushNotifications()\n if (!pushNotificationsModule) {\n throw new Error('Push notifications module not available')\n }\n \n const { PushNotifications } = pushNotificationsModule\n\n // Listen for push notifications\n await PushNotifications.addListener('pushNotificationReceived', notification => {\n const payload: PushNotificationPayload = {\n data: notification.data || {},\n notification: {\n title: notification.title || '',\n body: notification.body || '',\n ...(notification.id && { id: notification.id }),\n ...(notification.badge && { badge: notification.badge.toString() }),\n },\n }\n this.notifyMessageListeners(payload)\n })\n\n // Listen for notification actions\n await PushNotifications.addListener('pushNotificationActionPerformed', notificationAction => {\n const payload: PushNotificationPayload = {\n data: notificationAction.notification.data || {},\n notification: {\n title: notificationAction.notification.title || '',\n body: notificationAction.notification.body || '',\n ...(notificationAction.notification.id && { id: notificationAction.notification.id }),\n },\n }\n this.notifyMessageListeners(payload)\n })\n\n // Listen for registration changes\n await PushNotifications.addListener('registration', token => {\n this.notifyTokenListeners(token.value)\n })\n\n // Listen for registration errors\n await PushNotifications.addListener('registrationError', error => {\n this.handleError(new Error(`Registration error: ${error.error}`))\n })\n } catch (error) {\n this.handleError(new Error(`Native event listener setup failed: ${error}`))\n }\n }\n\n /**\n * Setup event listeners\n */\n private async setupEventListeners(): Promise<void> {\n try {\n if (!this.OneSignal) {\n throw new Error('OneSignal not initialized')\n }\n const oneSignalInstance = this.OneSignal as unknown as {\n on: (event: string, callback: (data: unknown) => void) => void\n }\n\n // Listen for notification received\n oneSignalInstance.on('notificationReceived', notification => {\n const notificationData = notification as Record<string, unknown>\n const notificationObj: Record<string, unknown> = {\n title: notificationData.heading as string,\n body: notificationData.content as string,\n }\n\n if (notificationData.icon)\n notificationObj.icon = notificationData.icon as string\n if (notificationData.badge)\n notificationObj.badge = notificationData.badge as string\n if (notificationData.image)\n notificationObj.image = notificationData.image as string\n\n const payload: PushNotificationPayload = {\n data:\n (notificationData.additionalData as Record<string, unknown>) || {},\n notification: notificationObj,\n }\n\n this.notifyMessageListeners(payload)\n })\n\n // Listen for notification clicked\n oneSignalInstance.on('notificationClicked', notification => {\n const notificationData = notification as Record<string, unknown>\n const notificationObj: Record<string, unknown> = {\n title: notificationData.heading as string,\n body: notificationData.content as string,\n }\n\n if (notificationData.icon)\n notificationObj.icon = notificationData.icon as string\n if (notificationData.badge)\n notificationObj.badge = notificationData.badge as string\n if (notificationData.image)\n notificationObj.image = notificationData.image as string\n\n const payload: PushNotificationPayload = {\n data:\n (notificationData.additionalData as Record<string, unknown>) || {},\n notification: notificationObj,\n }\n\n this.notifyMessageListeners(payload)\n })\n\n // Listen for subscription changes\n oneSignalInstance.on('subscriptionChanged', isSubscribed => {\n if (isSubscribed) {\n this.getToken()\n .then(token => {\n this.notifyTokenListeners(token)\n })\n .catch(error => {\n this.handleError(\n new Error(\n `Token refresh on subscription change failed: ${error}`\n )\n )\n })\n }\n })\n } catch (error) {\n this.handleError(new Error(`Event listener setup failed: ${error}`))\n }\n }\n\n /**\n * Request native permission\n */\n private async requestNativePermission(): Promise<boolean> {\n try {\n const pushNotificationsModule = await DynamicLoader.loadPushNotifications()\n if (!pushNotificationsModule) {\n throw new Error('Push notifications require @capacitor/push-notifications')\n }\n const { PushNotifications } = pushNotificationsModule\n const result = await PushNotifications.requestPermissions()\n return result.receive === 'granted'\n } catch (_error) {\n return false\n }\n }\n\n /**\n * Check native permission\n */\n private async checkNativePermission(): Promise<PermissionStatus> {\n try {\n const pushNotificationsModule = await DynamicLoader.loadPushNotifications()\n if (!pushNotificationsModule) {\n throw new Error('Push notifications require @capacitor/push-notifications')\n }\n const { PushNotifications } = pushNotificationsModule\n const result = await PushNotifications.checkPermissions()\n\n if (result.receive === 'granted') {\n return 'granted'\n } else if (result.receive === 'denied') {\n return 'denied'\n } else if (result.receive === 'prompt') {\n return 'prompt'\n } else {\n return 'unknown'\n }\n } catch (_error) {\n return 'denied'\n }\n }\n\n /**\n * Request web permission\n */\n private async requestWebPermission(): Promise<boolean> {\n try {\n if (!this.OneSignal) {\n throw new Error('OneSignal not initialized')\n }\n const permission = await (\n this.OneSignal as unknown as { showSlidedownPrompt: () => Promise<boolean> }\n ).showSlidedownPrompt()\n return permission\n } catch (_error) {\n // Fallback to native browser permission\n if ('Notification' in window) {\n const permission = await Notification.requestPermission()\n return permission === 'granted'\n }\n return false\n }\n }\n\n /**\n * Check web permission\n */\n private async checkWebPermission(): Promise<PermissionStatus> {\n try {\n if (!this.OneSignal) {\n throw new Error('OneSignal not initialized')\n }\n const isSubscribed = await (\n this.OneSignal as unknown as {\n isPushNotificationsEnabled: () => Promise<boolean>\n }\n ).isPushNotificationsEnabled()\n return isSubscribed ? 'granted' : 'prompt'\n } catch (_error) {\n // Fallback to native browser permission\n if ('Notification' in window) {\n const permission = Notification.permission\n if (permission === 'default') {\n return 'prompt'\n }\n return permission as PermissionStatus\n }\n return 'denied'\n }\n }\n\n /**\n * Notify message listeners\n */\n private notifyMessageListeners(payload: PushNotificationPayload): void {\n this.messageListeners.forEach(listener => {\n try {\n listener(payload)\n } catch (error) {\n this.handleError(new Error(`Message listener error: ${error}`))\n }\n })\n }\n\n /**\n * Notify token listeners\n */\n private notifyTokenListeners(token: string): void {\n this.tokenListeners.forEach(listener => {\n try {\n listener(token)\n } catch (error) {\n this.handleError(new Error(`Token listener error: ${error}`))\n }\n })\n }\n\n /**\n * Handle errors\n */\n private handleError(error: Error): void {\n this.errorListeners.forEach(listener => {\n try {\n listener(error)\n } catch (listenerError) {\n // Silently ignore error listener failures\n }\n })\n }\n}\n"],"names":[],"mappings":"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"}