Files
status-react/src/react_native/push_notification_ios.cljs
T

87 lines
2.6 KiB
Clojure

(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)))