(ns react-native.push-notification-ios (:require ["@react-native-community/push-notification-ios" :default pn-ios] [promesa.core :as promesa] [react-native.platform :as platform])) (defn present-local-notification [title message user-info] (.presentLocalNotification ^js pn-ios #js {:alertBody message :alertTitle title :userInfo user-info})) (defn add-listener [event callback] (.addEventListener ^js pn-ios event callback) #js {:remove (fn [] (.removeEventListener ^js pn-ios event))}) (defn request-permissions [] (-> (.requestPermissions ^js pn-ios) (.then #()) (.catch #()))) (defn abandon-permissions [] (.abandonPermissions ^js pn-ios)) (defn remove-all-delivered-notifications [] (.removeAllDeliveredNotifications ^js pn-ios)) (defn- create-registration-success-sub [on-registered-success] (add-listener "register" (fn [token] (on-registered-success token)))) (defn- create-registration-fail-sub [on-registered-fail] (add-listener "registrationError" (fn [event] (on-registered-fail (ex-info "Failed to register for remote token" {:code (.-code event) :description (.-message event) :details (.-details event)}))))) (defn- remove-registration-subs [subscriptions] (doseq [listener-sub subscriptions] (.remove listener-sub))) (defn- start-registration [_options] (request-permissions)) (defn- remote-token-registration-process [options] (let [state (atom {:subs []})] (promesa/create (fn [resolver rejector] (let [on-finish-registration (fn [result] (remove-registration-subs (:subs @state)) (if (:error result) (rejector result) (resolver result)))] (swap! state assoc :subs [(create-registration-success-sub on-finish-registration) (create-registration-fail-sub on-finish-registration)]) (start-registration options)))))) (defn- fail-request-for-android [_options] (promesa/rejected (ex-info "Failed to register for APNS token" {:code nil :description "Cannot register APNS token on Android" :details {}}))) (defn request-remote-token "Requests and registers a device token for remote push-notifications for iOS." [options] (if platform/ios? (remote-token-registration-process options) (fail-request-for-android options)))