Chat WebView bridge refactoring (#2535)

This commit is contained in:
Alexander Pantyuhov 2017-12-04 13:22:41 +01:00 committed by Oskar Thorén
parent 16930cf4e1
commit 3795cd9888
7 changed files with 93 additions and 89 deletions

View File

@ -20,7 +20,8 @@
status-im.chat.events.animation
status-im.chat.events.receive-message
status-im.chat.events.sign-up
status-im.chat.events.console))
status-im.chat.events.console
status-im.chat.events.webview-bridge))
;;;; Coeffects

View File

@ -0,0 +1,56 @@
(ns status-im.chat.events.webview-bridge
(:require [re-frame.core :as re-frame]
[status-im.ui.components.nfc :as nfc]
[status-im.utils.handlers :as handlers]
[status-im.utils.types :as types]
[taoensso.timbre :as log]))
;;;; Effects
(re-frame/reg-fx
::webview-nfc
(fn [{:keys [event params]}]
(let [callback #(re-frame/dispatch [:chat-webview-bridge/send-to-bridge
{:params % :event "nfc"}])]
(case (keyword event)
:get-card-id (nfc/get-card-id #(callback {:event :get-card-id :card %})
#(callback {:event :get-card-id :error %}))
:read-tag (let [{:keys [sectors]} params]
(nfc/read-tag sectors
#(callback {:event :read-tag :card %})
#(callback {:event :read-tag :error %})))
:write-tag (let [{:keys [sectors id]} params]
(nfc/write-tag sectors
id
#(callback {:event :write-tag :card %})
#(callback {:event :write-tag :error %})))
:default))))
(re-frame/reg-fx
::send-to-bridge
(fn [[webview-bridge data]]
(when webview-bridge
(.sendToBridge webview-bridge data))))
;;;; Handlers
(handlers/register-handler-db
:chat-webview-bridge/set-ref
(fn [db [_ ref]]
(assoc db :webview-bridge ref)))
(handlers/register-handler-fx
:chat-webview-bridge/process-message
(fn [{:keys [db]} [_ message-string]]
(let [{:keys [event options] :as message} (types/json->clj message-string)
event' (keyword event)
params (:data options)]
(log/debug (str "message from webview: " message))
(case event'
:nfc {::webview-nfc params}
nil))))
(handlers/register-handler-fx
:chat-webview-bridge/send-to-bridge
(fn [{{:keys [webview-bridge]} :db} [_ data]]
{::send-to-bridge [webview-bridge data]}))

View File

@ -16,8 +16,7 @@
[status-im.utils.random :as random]
[status-im.utils.handlers :refer [register-handler register-handler-fx] :as u]
status-im.chat.events
status-im.chat.handlers.send-message
status-im.chat.handlers.webview-bridge))
status-im.chat.handlers.send-message))
(defn remove-chat
[db [_ chat-id]]

View File

@ -1,45 +0,0 @@
(ns status-im.chat.handlers.webview-bridge
(:require [re-frame.core :refer [dispatch]]
[status-im.utils.handlers :as handlers]
[status-im.utils.types :as types]
[taoensso.timbre :as log]
[status-im.ui.components.nfc :as nfc]))
(handlers/register-handler :set-webview-bridge
(fn [db [_ bridge]]
(assoc db :webview-bridge bridge)))
(handlers/register-handler :webview-bridge-message
(handlers/side-effect!
(fn [_ [_ message-string]]
(let [{:keys [event options] :as message} (types/json->clj message-string)
event' (keyword event)
params (:data options)]
(log/debug (str "message from webview: " message))
(case event'
:nfc (dispatch [:webview-nfc params])
(log/error (str "Unknown event: " event')))))))
(handlers/register-handler :send-to-webview-bridge
(handlers/side-effect!
(fn [{:keys [webview-bridge]} [_ data]]
(when webview-bridge
(.sendToBridge webview-bridge (types/clj->json data))))))
(handlers/register-handler :webview-nfc
(handlers/side-effect!
(fn [_ [_ {:keys [event params]}]]
(let [callback #(dispatch [:send-to-webview-bridge {:params % :event "nfc"}])]
(case (keyword event)
:get-card-id (nfc/get-card-id #(callback {:event :get-card-id :card %})
#(callback {:event :get-card-id :error %}))
:read-tag (let [{:keys [sectors]} params]
(nfc/read-tag sectors
#(callback {:event :read-tag :card %})
#(callback {:event :read-tag :error %})))
:write-tag (let [{:keys [sectors id]} params]
(nfc/write-tag sectors
id
#(callback {:event :write-tag :card %})
#(callback {:event :write-tag :error %})))
:default)))))

View File

@ -1,70 +1,63 @@
(ns status-im.chat.views.input.input-actions
(:require-macros [status-im.utils.views :refer [defview]])
(:require [clojure.string :as str]
[reagent.core :as r]
[re-frame.core :refer [subscribe dispatch]]
(:require [re-frame.core :as re-frame]
[taoensso.timbre :as log]
[status-im.ui.components.react :refer [view
text
icon
touchable-highlight]]
[status-im.ui.components.react :as react]
[status-im.chat.styles.input.input-actions :as style]))
(defmulti action-view (fn [{:keys [type]}] (keyword type)))
(defmethod action-view :fullscreen
[_]
(let [fullscreen? (subscribe [:chat-ui-props :fullscreen?])]
(let [fullscreen? (re-frame/subscribe [:chat-ui-props :fullscreen?])]
(fn []
[touchable-highlight
{:on-press #(dispatch [:set-chat-ui-props {:fullscreen? (not @fullscreen?)}])}
[react/touchable-highlight
{:on-press #(re-frame/dispatch [:set-chat-ui-props {:fullscreen? (not @fullscreen?)}])}
(if @fullscreen?
[view (style/action-view true)
[icon :action_fullscreen_collapse style/action-view-icon]]
[view (style/action-view true)
[icon :action_fullscreen_expand style/action-view-fullscreen-expand-icon]])])))
[react/view (style/action-view true)
[react/icon :action_fullscreen_collapse style/action-view-icon]]
[react/view (style/action-view true)
[react/icon :action_fullscreen_expand style/action-view-fullscreen-expand-icon]])])))
(defmethod action-view :web-view-back
[_]
(let [result-box (subscribe [:chat-ui-props :result-box])
webview (subscribe [:get :webview-bridge])]
(let [result-box (re-frame/subscribe [:chat-ui-props :result-box])
webview (re-frame/subscribe [:get :webview-bridge])]
(fn []
[touchable-highlight
[react/touchable-highlight
{:on-press #(.goBack @webview)}
[view (style/action-view true)
[icon :action_back style/action-view-icon-tinted]]]
[react/view (style/action-view true)
[react/icon :action_back style/action-view-icon-tinted]]]
#_(if (:can-go-back? @result-box)
[view (style/action-view false)
[icon :action_back style/action-view-icon]]))))
[react/view (style/action-view false)
[react/icon :action_back style/action-view-icon]]))))
(defmethod action-view :web-view-forward
[_]
(let [result-box (subscribe [:chat-ui-props :result-box])
webview (subscribe [:get :webview-bridge])]
(let [result-box (re-frame/subscribe [:chat-ui-props :result-box])
webview (re-frame/subscribe [:get :webview-bridge])]
(fn []
[touchable-highlight
[react/touchable-highlight
{:on-press #(.goForward @webview)}
[view (style/action-view true)
[icon :action_forward style/action-view-icon-tinted]]]
[react/view (style/action-view true)
[react/icon :action_forward style/action-view-icon-tinted]]]
#_(if (:can-go-forward? @result-box)
[view (style/action-view false)
[icon :action_forward style/action-view-icon]]))))
[react/view (style/action-view false)
[react/icon :action_forward style/action-view-icon]]))))
(defmethod action-view :default
[{:keys [image executeJs]}]
[touchable-highlight
{:on-press #(dispatch [:send-to-webview-bridge {:event "actions-execute-js"
:js executeJs}])}
[view (style/action-view true)
[icon (str "action_" image) style/action-view-icon]]])
[react/touchable-highlight
{:on-press #(re-frame/dispatch [:chat-webview-bridge/send-to-bridge
{:event "actions-execute-js"
:js executeJs}])}
[react/view (style/action-view true)
[react/icon (str "action_" image) style/action-view-icon]]])
(defn input-actions-view []
(let [result-box (subscribe [:chat-ui-props :result-box])]
(let [result-box (re-frame/subscribe [:chat-ui-props :result-box])]
(fn []
(let [{:keys [actions]} @result-box]
[view style/actions-container
[react/view style/actions-container
(for [{:keys [type] :as action} actions]
^{:key type}
[action-view action])]))))

View File

@ -35,8 +35,8 @@
result-box [:chat-ui-props :result-box]]
(when url
[webview-bridge
{:ref #(dispatch [:set-webview-bridge %])
:on-bridge-message #(dispatch [:webview-bridge-message %])
{:ref #(dispatch [:chat-webview-bridge/set-ref %])
:on-bridge-message #(dispatch [:chat-webview-bridge/process-message %])
:source {:uri url}
:render-error web-view-error
:java-script-enabled true

View File

@ -33,7 +33,7 @@
:icon :icons/address
:icon-opts {:color :blue}
:on-press #(do
(dispatch [:send-to-webview-bridge
(dispatch [:chat-webview-bridge/send-to-bridge
{:event (name :webview-send-transaction)}])
(dispatch [:navigate-back]))}]
[action-separator]