Add support for browse dapps

Signed-off-by: Andrea Maria Piana <andrea.maria.piana@gmail.com>
This commit is contained in:
Andrea Maria Piana 2018-06-28 13:03:34 +02:00
parent c11781d01b
commit a7fc05fcd3
No known key found for this signature in database
GPG Key ID: AA6CCA6DE0E06424
9 changed files with 108 additions and 34 deletions

View File

@ -8,7 +8,6 @@
[status-im.chat.models.message :as models.message]
[status-im.chat.console :as console]
[status-im.commands.events.loading :as events.loading]
[status-im.ui.components.list-selection :as list-selection]
[status-im.ui.screens.navigation :as navigation]
[status-im.utils.handlers :as handlers]
[status-im.utils.handlers-macro :as handlers-macro]
@ -30,10 +29,6 @@
;;;; Effects
(re-frame/reg-fx
:browse
(fn [link]
(list-selection/browse link)))
(re-frame/reg-fx
:show-cooldown-warning
@ -202,11 +197,6 @@
(group-chat-messages)
(add-default-contacts)))))
(handlers/register-handler-fx
:browse-link-from-message
(fn [_ [_ link]]
{:browse link}))
(defn- send-messages-seen [chat-id message-ids {:keys [db] :as cofx}]
(when (and (not (get-in db [:chats chat-id :public?]))
(not (models/bot-only-chat? db chat-id)))

View File

@ -7,9 +7,10 @@
(when-let [handler (:action (nth options index))]
(handler)))))
(defn- show [{:keys [title options]}]
(defn- show [{:keys [title options cancel-text]}]
(let [dialog (new rn-dependencies/dialogs)]
(.set dialog (clj->js {:title title
:negativeText cancel-text
:items (mapv :label options)
:itemsCallback (callback options)}))
(.show dialog)))

View File

@ -35,3 +35,9 @@
{:label (i18n/label :t/browsing-open-in-web-browser)
:action #(.openURL react/linking (http/normalize-url link))}]
:cancel-text (i18n/label :t/browsing-cancel)}))
(defn browse-dapp [link]
(show {:title (i18n/label :t/browsing-title)
:options [{:label (i18n/label :t/browsing-open-in-browser)
:action #(re-frame/dispatch [:open-browser {:url link}])}]
:cancel-text (i18n/label :t/browsing-cancel)}))

View File

@ -4,6 +4,8 @@
[re-frame.core :as re-frame]
[status-im.utils.random :as random]
[status-im.i18n :as i18n]
[status-im.ui.components.list-selection :as list-selection]
[status-im.utils.universal-links.core :as utils.universal-links]
[status-im.data-store.browser :as browser-store]
[status-im.utils.http :as http]))
@ -14,6 +16,19 @@
(let [browsers (into {} (map #(vector (:browser-id %) %) all-stored-browsers))]
{:db (assoc db :browser/browsers browsers)})))
(re-frame/reg-fx
:browse
(fn [link]
(if (utils.universal-links/universal-link? link)
(do
(utils.universal-links/open! link))
(list-selection/browse link))))
(handlers/register-handler-fx
:browse-link-from-message
(fn [_ [_ link]]
{:browse link}))
(defn get-new-browser [browser now]
(cond-> browser
true

View File

@ -272,12 +272,11 @@
(transport/stop-whisper)))
{:get-encryption-key [this-event]})))
(handlers/register-handler-fx
:initialize-db
(fn [{{:keys [status-module-initialized? status-node-started?
(defn initialize-db [encryption-key
{{:universal-links/keys [url]
:keys [status-module-initialized? status-node-started?
network-status network peers-count peers-summary device-UUID]
:or {network (get app-db :network)}} :db}
[_ encryption-key]]
:or {network (get app-db :network)}} :db}]
{::init-store encryption-key
:db (assoc app-db
:contacts/contacts {}
@ -287,7 +286,13 @@
:status-module-initialized? (or platform/ios? js/goog.DEBUG status-module-initialized?)
:status-node-started? status-node-started?
:network network
:device-UUID device-UUID)}))
:universal-links/url url
:device-UUID device-UUID)})
(handlers/register-handler-fx
:initialize-db
(fn [cofx [_ encryption-key]]
(initialize-db encryption-key cofx)))
(handlers/register-handler-db
:initialize-account-db

View File

@ -5,26 +5,42 @@
[status-im.utils.config :as config]
[status-im.chat.events :as chat.events]
[status-im.models.account :as models.account]
[status-im.ui.components.list-selection :as list-selection]
[status-im.ui.components.react :as react]))
(def public-chat-regex #".*/chat/public/(.*)$")
(def profile-regex #".*/user/(.*)$")
(def browse-regex #".*/browse/(.*)$")
(defn match-url [url regex]
(some->> url
(re-matches regex)
peek))
(defn universal-link? [url]
(boolean
(re-matches #"^(app|http|https)://get.status.im/.*$" url)))
(defn open! [url]
(log/info "universal-links: opening " url)
(if-let [dapp-url (match-url url browse-regex)]
(list-selection/browse-dapp dapp-url)
(.openURL react/linking url)))
(defn handle-browse [url cofx]
(log/info "universal-links: handling browse " url)
{:browse url})
(defn handle-public-chat [public-chat cofx]
(log/info "universal-links: handling public chat " public-chat)
(chat.events/create-new-public-chat public-chat cofx))
(defn handle-view-profile [profile-id cofx]
(log/info "universal links: handling view profile" profile-id)
(log/info "universal-links: handling view profile" profile-id)
(chat.events/show-profile profile-id cofx))
(defn handle-not-found [full-url]
(log/info "universal links: no handler for " full-url))
(defn match-url [url regex]
(some->> url
(re-matches regex)
peek))
(log/info "universal-links: no handler for " full-url))
(defn stored-url-event
"Return an event description for processing a url if in the database"
@ -37,7 +53,7 @@
[url]
(if-not (nil? url)
(re-frame/dispatch [:handle-universal-link url])
(log/debug "universal links: no url")))
(log/debug "universal-links: no url")))
(defn store-url-for-later
"Store the url in the db to be processed on login"
@ -59,6 +75,9 @@
(match-url url profile-regex)
(handle-view-profile (match-url url profile-regex) cofx)
(match-url url browse-regex)
(handle-browse url cofx)
:else (handle-not-found url)))
(defn handle-url

View File

@ -43,6 +43,7 @@
[status-im.test.utils.prices]
[status-im.test.utils.keychain.core]
[status-im.test.utils.universal-links.core]
[status-im.test.ui.screens.events]
[status-im.test.ui.screens.accounts.login.events]))
(enable-console-print!)
@ -97,4 +98,5 @@
'status-im.test.utils.prices
'status-im.test.utils.keychain.core
'status-im.test.utils.universal-links.core
'status-im.test.ui.screens.events
'status-im.test.ui.screens.accounts.login.events)

View File

@ -0,0 +1,10 @@
(ns status-im.test.ui.screens.events
(:require [cljs.test :refer-macros [deftest is testing]]
[status-im.ui.screens.events :as events]))
(deftest initialize-db
(testing "it preserves universal-links/url"
(is (= "some-url" (get-in (events/initialize-db "blah"
{:db
{:universal-links/url "some-url"}})
[:db :universal-links/url])))))

View File

@ -20,6 +20,13 @@
(is (get-in (links/handle-url "app://get.status.im/chat/public/status"
{:db db})
[:db :chats "status"]))))
(testing "a browse dapp link"
(testing "it open the dapps"
(is
(= "app://get.status.im/browse/www.cryptokitties.co"
(:browse (links/handle-url "app://get.status.im/browse/www.cryptokitties.co"
{:db db}))))))
(testing "a user profile link"
(testing "it loads the profile"
(let [actual (links/handle-url "app://get.status.im/user/profile-id"
@ -45,6 +52,26 @@
(links/url-event-listener #js {})
(is (= nil @actual)))))))
(deftest universal-link-test
(testing "app://get.status.im/blah"
(testing "it returns true"
(is (links/universal-link? "app://get.status.im/blah"))))
(testing "http://get.status.im/blah"
(testing "it returns true"
(is (links/universal-link? "http://get.status.im/blah"))))
(testing "https://get.status.im/blah"
(testing "it returns true"
(is (links/universal-link? "https://get.status.im/blah"))))
(testing "app://not.status.im/blah"
(testing "it returns false"
(is (not (links/universal-link? "https://not.status.im/blah")))))
(testing "http://not.status.im/blah"
(testing "it returns false"
(is (not (links/universal-link? "https://not.status.im/blah")))))
(testing "https://not.status.im/blah"
(testing "it returns false"
(is (not (links/universal-link? "https://not.status.im/blah"))))))
(deftest stored-url-event
(testing "the url is in the database"
(testing "it returns the event"
@ -54,4 +81,3 @@
(testing "it returns nil"
(= nil
(links/stored-url-event {:db {}})))))