diff --git a/.env b/.env index 3870f02d04..4ed47c591d 100644 --- a/.env +++ b/.env @@ -1,2 +1,3 @@ TESTFAIRY_ENABLED=0 -WALLET_WIP_ENABLED=1 \ No newline at end of file +WALLET_WIP_ENABLED=1 +NOTIFICATIONS_WIP_ENABLED=1 \ No newline at end of file diff --git a/.env.jenkins b/.env.jenkins index 99707fc0cb..2b38c7ddb5 100644 --- a/.env.jenkins +++ b/.env.jenkins @@ -1,2 +1,3 @@ TESTFAIRY_ENABLED=1 -WALLET_WIP_ENABLED=1 \ No newline at end of file +WALLET_WIP_ENABLED=1 +NOTIFICATIONS_WIP_ENABLED=1 \ No newline at end of file diff --git a/.env.prod b/.env.prod index 309e3262d2..077361ebee 100644 --- a/.env.prod +++ b/.env.prod @@ -1,2 +1,3 @@ TESTFAIRY_ENABLED=0 -WALLET_WIP_ENABLED=0 \ No newline at end of file +WALLET_WIP_ENABLED=0 +NOTIFICATIONS_WIP_ENABLED=0 \ No newline at end of file diff --git a/src/status_im/android/core.cljs b/src/status_im/android/core.cljs index e0173cf1aa..6188b37979 100644 --- a/src/status_im/android/core.cljs +++ b/src/status_im/android/core.cljs @@ -9,7 +9,10 @@ [status-im.ui.screens.views :as views] [status-im.components.react :as react] [status-im.components.status :as status] - [status-im.utils.error-handler :as error-handler])) + [status-im.utils.error-handler :as error-handler] + [status-im.utils.utils :as utils] + [status-im.utils.config :as config] + [status-im.utils.notifications :as notifications])) (defn init-back-button-handler! [] (let [new-listener (fn [] @@ -62,6 +65,10 @@ (dispatch [:set :keyboard-height 0]))) (.hide react/splash-screen) (.addEventListener react/app-state "change" app-state-change-handler)) + :component-did-mount + (fn [] + (when config/notifications-wip-enabled? + (notifications/on-refresh-fcm-token))) :component-will-unmount (fn [] (.stop react/http-bridge) diff --git a/src/status_im/ios/core.cljs b/src/status_im/ios/core.cljs index 6e33266ebe..803ae6b0ec 100644 --- a/src/status_im/ios/core.cljs +++ b/src/status_im/ios/core.cljs @@ -9,7 +9,10 @@ [status-im.ui.screens.views :as views] [status-im.components.react :as react] [status-im.components.status :as status] - [status-im.utils.error-handler :as error-handler])) + [status-im.utils.error-handler :as error-handler] + [status-im.utils.utils :as utils] + [status-im.utils.config :as config] + [status-im.utils.notifications :as notifications])) (defn orientation->keyword [o] (keyword (.toLowerCase o))) @@ -37,6 +40,11 @@ #(when-not (= 0 @keyboard-height) (dispatch [:set :keyboard-height 0]))) (.hide react/splash-screen)) + :component-did-mount + (fn [] + (when config/notifications-wip-enabled? + (notifications/request-permissions) + (notifications/on-refresh-fcm-token))) :component-will-unmount (fn [] (.stop react/http-bridge)) diff --git a/src/status_im/ui/screens/events.cljs b/src/status_im/ui/screens/events.cljs index eaebc3f955..e200a7a932 100644 --- a/src/status_im/ui/screens/events.cljs +++ b/src/status_im/ui/screens/events.cljs @@ -103,6 +103,11 @@ (i18n/label :testfairy-title) (i18n/label :testfairy-message))))) +(reg-fx + ::get-fcm-token-fx + (fn [] + (notifications/get-fcm-token))) + ;;;; Handlers (register-handler-db @@ -200,6 +205,11 @@ (fn [{{:keys [webview-bridge]} :db} _] (.geoPermissionsGranted webview-bridge))) +(register-handler-fx + :get-fcm-token + (fn [_ _] + {::get-fcm-token-fx nil})) + (register-handler-fx :signal-event (fn [_ [_ event-str]] diff --git a/src/status_im/ui/screens/wallet/events.cljs b/src/status_im/ui/screens/wallet/events.cljs index 00a31bfcc2..8d62100b02 100644 --- a/src/status_im/ui/screens/wallet/events.cljs +++ b/src/status_im/ui/screens/wallet/events.cljs @@ -3,6 +3,7 @@ [status-im.utils.handlers :as handlers] [status-im.utils.prices :as prices] [status-im.utils.transactions :as transactions] + [status-im.utils.utils :as utils] [status-im.ui.screens.wallet.db :as wallet.db] [status-im.components.status :as status] [status-im.ui.screens.wallet.navigation] diff --git a/src/status_im/utils/config.cljs b/src/status_im/utils/config.cljs index f0f3498d9f..7f68a8611b 100644 --- a/src/status_im/utils/config.cljs +++ b/src/status_im/utils/config.cljs @@ -10,4 +10,5 @@ (defn enabled? [v] (= "1" v)) (def testfairy-enabled? (enabled? (get-config :TESTFAIRY_ENABLED))) -(def wallet-wip-enabled? (enabled? (get-config :WALLET_WIP_ENABLED 0))) \ No newline at end of file +(def wallet-wip-enabled? (enabled? (get-config :WALLET_WIP_ENABLED 0))) +(def notifications-wip-enabled? (enabled? (get-config :NOTIFICATIONS_WIP_ENABLED 0))) diff --git a/src/status_im/utils/notifications.cljs b/src/status_im/utils/notifications.cljs index beb14a1346..a13d25d2e1 100644 --- a/src/status_im/utils/notifications.cljs +++ b/src/status_im/utils/notifications.cljs @@ -1,10 +1,29 @@ (ns status-im.utils.notifications - (:require [status-im.react-native.js-dependencies :as rn])) + (:require [status-im.react-native.js-dependencies :as rn] + [status-im.utils.config :as config] + [status-im.utils.utils :as utils] + [status-im.components.react :refer [copy-to-clipboard]] + [taoensso.timbre :as log])) ;; Work in progress namespace responsible for push notifications and interacting ;; with Firebase Cloud Messaging. +;; NOTE: Only need to explicitly request permissions on iOS. +(defn request-permissions [] + (.requestPermissions (.-default rn/react-native-fcm))) + (defn get-fcm-token [] - (let [fcm (aget rn/react-native-fcm "default")] - (.then ((.-getFCMToken fcm)) - (fn [x] (println "*** FCM TOKEN" x))))) + (-> (.getFCMToken (aget rn/react-native-fcm "default")) + (.then (fn [x] + (when config/notifications-wip-enabled? + (log/info "FCM token" x) + (copy-to-clipboard x) + (utils/show-popup "INFO" (str "FCM Token in clipboard: " x))))))) + +(defn on-refresh-fcm-token [] + (.on (.-default rn/react-native-fcm) + (.-RefreshToken (.-FCMEvent rn/react-native-fcm)) + (fn [x] + (log/info "FCM token refreshed" x) + (copy-to-clipboard x) + (utils/show-popup "INFO" (str "FCM token (refreshed) in clipboard: " x)))))