import {Capacitor} from "@capacitor/core" import {notificationSettings, pushState} from "@app/core/state" import {WebNotifications} from "@app/util/push/adapters/web" import {CapacitorNotifications} from "@app/util/push/adapters/capacitor" import {AndroidFallbackNotifications} from "@app/util/push/adapters/android" import type {IPushAdapter} from "@app/util/push/adapters/common" export {onNotification} from "@app/util/push/adapters/common" export class Push { static _adapter: IPushAdapter | undefined static _getAdapter() { if (!Push._adapter) { const {useFallback} = pushState.get() if (Capacitor.getPlatform() === "android" && useFallback) { Push._adapter = new AndroidFallbackNotifications() } else if (Capacitor.isNativePlatform()) { Push._adapter = new CapacitorNotifications() } else { Push._adapter = new WebNotifications() } } return Push._adapter } static async request() { const adapter = Push._getAdapter() let permission = await adapter.request() if (permission !== "granted" && adapter instanceof CapacitorNotifications) { Push._adapter = new AndroidFallbackNotifications() permission = await Push._adapter.request() if (permission === "granted") { pushState.set({useFallback: true}) } } return permission } static disable() { return Push._getAdapter().disable() } static enable() { return Push._getAdapter().enable() } static sync() { return notificationSettings.subscribe(({push}) => { if (push) { Push.enable() } else { Push.disable() } }) } }