Improved extensions error handling. Various fixes.

Signed-off-by: Julien Eluard <julien.eluard@gmail.com>
This commit is contained in:
Julien Eluard 2018-11-08 16:30:32 +01:00
parent 7a1a8ba615
commit 009d974d83
No known key found for this signature in database
GPG Key ID: 6FD7DB5437FCBEF6
8 changed files with 49 additions and 42 deletions

View File

@ -11,7 +11,7 @@
com.taoensso/timbre {:mvn/version "4.10.0"} com.taoensso/timbre {:mvn/version "4.10.0"}
hickory {:mvn/version "0.7.1"} hickory {:mvn/version "0.7.1"}
com.cognitect/transit-cljs {:mvn/version "0.8.248"} com.cognitect/transit-cljs {:mvn/version "0.8.248"}
status-im/pluto {:mvn/version "iteration-3"} status-im/pluto {:mvn/version "iteration-4-SNAPSHOT"}
mvxcvi/alphabase {:mvn/version "1.0.0"} mvxcvi/alphabase {:mvn/version "1.0.0"}
rasom/cljs-react-navigation {:mvn/version "0.1.4"}} rasom/cljs-react-navigation {:mvn/version "0.1.4"}}

View File

@ -11,7 +11,7 @@
[com.taoensso/timbre "4.10.0"] [com.taoensso/timbre "4.10.0"]
[hickory "0.7.1"] [hickory "0.7.1"]
[com.cognitect/transit-cljs "0.8.248"] [com.cognitect/transit-cljs "0.8.248"]
[status-im/pluto "iteration-3"] [status-im/pluto "iteration-4-SNAPSHOT"]
[mvxcvi/alphabase "1.0.0"] [mvxcvi/alphabase "1.0.0"]
[rasom/cljs-react-navigation "0.1.4"]] [rasom/cljs-react-navigation "0.1.4"]]
:plugins [[lein-cljsbuild "1.1.7"] :plugins [[lein-cljsbuild "1.1.7"]

View File

@ -147,7 +147,7 @@
(id [_] (name id)) (id [_] (name id))
(scope [_] scope) (scope [_] scope)
(description [_] description) (description [_] description)
(parameters [_] parameters) (parameters [_] (or parameters []))
(validate [_ _ _]) (validate [_ _ _])
(on-send [_ command-message _] (when on-send {:dispatch (on-send command-message)})) (on-send [_ command-message _] (when on-send {:dispatch (on-send command-message)}))
(on-receive [_ command-message _] (when on-receive {:dispatch (on-receive command-message)})) (on-receive [_ command-message _] (when on-receive {:dispatch (on-receive command-message)}))

View File

@ -65,23 +65,27 @@
{:db (update-in db [:extensions-store :collectible] dissoc key)})) {:db (update-in db [:extensions-store :collectible] dissoc key)}))
(defn- json? [res] (defn- json? [res]
(string/starts-with? (get-in res [:headers "content-type"]) "application/json")) (when-let [type (get-in res [:headers "content-type"])]
(string/starts-with? type "application/json")))
(defn- parse-json [o] (defn- parse-json [o]
(js->clj (js/JSON.parse o) :keywordize-keys true)) (when o
(js->clj (js/JSON.parse o) :keywordize-keys true)))
(re-frame/reg-fx (re-frame/reg-fx
::json-parse ::json-parse
(fn [value on-result] (re-frame/dispatch (on-result {:value (parse-json value)})))) (fn [{:keys [value on-result]}]
(re-frame/dispatch (on-result {:value (parse-json value)}))))
(handlers/register-handler-fx (handlers/register-handler-fx
:extensions/json-parse :extensions/json-parse
(fn [_ [_ {:keys [value]}]] (fn [_ [_ m]]
{::json-parse value})) {::json-parse m}))
(re-frame/reg-fx (re-frame/reg-fx
::json-stringify ::json-stringify
(fn [value on-result] (re-frame/dispatch (on-result {:value (js/JSON.stringify (clj->js value))})))) (fn [value on-result]
(re-frame/dispatch (on-result {:value (js/JSON.stringify (clj->js value))}))))
(handlers/register-handler-fx (handlers/register-handler-fx
:extensions/json-stringify :extensions/json-stringify
@ -93,8 +97,8 @@
(fn [_ [_ {:keys [url on-success on-failure timeout]}]] (fn [_ [_ {:keys [url on-success on-failure timeout]}]]
{:http-raw-get (merge {:url url {:http-raw-get (merge {:url url
:success-event-creator :success-event-creator
(fn [o] (fn [{:keys [body] :as o}]
(let [res (if (json? o) (update o :body parse-json o))] (let [res (if (json? body) (update o :body parse-json))]
(on-success res)))} (on-success res)))}
(when on-failure (when on-failure
{:failure-event-creator on-failure}) {:failure-event-creator on-failure})
@ -106,9 +110,11 @@
(fn [_ [_ {:keys [hash on-success on-failure]}]] (fn [_ [_ {:keys [hash on-success on-failure]}]]
{:http-raw-get (merge {:url (str "https://ipfs.infura.io/ipfs/" hash) {:http-raw-get (merge {:url (str "https://ipfs.infura.io/ipfs/" hash)
:success-event-creator :success-event-creator
(fn [o] (fn [{:keys [status body]}]
(let [res (if (json? o) (update o :body parse-json o))] (if (= 200 status)
(on-success res)))} (on-success {:value body})
(when on-failure
(on-failure {:value status}))))}
(when on-failure (when on-failure
{:failure-event-creator on-failure}) {:failure-event-creator on-failure})
{:timeout-ms 5000})})) {:timeout-ms 5000})}))
@ -117,10 +123,10 @@
:http/post :http/post
(fn [_ [_ {:keys [url body on-success on-failure timeout]}]] (fn [_ [_ {:keys [url body on-success on-failure timeout]}]]
{:http-raw-post (merge {:url url {:http-raw-post (merge {:url url
:body body :body (clj->js body)
:success-event-creator :success-event-creator
(fn [o] (fn [{:keys [body] :as o}]
(let [res (if (json? o) (update o :body parse-json o))] (let [res (if (json? body) (update o :body parse-json))]
(on-success res)))} (on-success res)))}
(when on-failure (when on-failure
{:failure-event-creator on-failure}) {:failure-event-creator on-failure})
@ -272,21 +278,18 @@
:method :string :method :string
:params? :vector :params? :vector
:outputs? :vector :outputs? :vector
:on-result? :event}}} :on-result :event}}}
:hooks {:commands commands/command-hook}}) :hooks {:commands commands/command-hook}})
(defn read-extension [{:keys [value]}]
(when (seq value)
(let [{:keys [content]} (first value)]
(reader/read content))))
(defn parse [{:keys [data]}] (defn parse [{:keys [data]}]
(try (try
(let [{:keys [errors] :as extension-data} (reader/parse {:capacities capacities} data)] (reader/parse {:capacities capacities} data)
(when errors (catch :default e {:errors [{:value (str e)}]})))
(println "Failed to parse status extensions" errors))
extension-data) (defn parse-extension [{:keys [type value]}]
(catch :default e (println "EXC" e)))) (if (= type :success)
(parse (reader/read (:content value)))
{:errors [{:type type :value value}]}))
(def uri-prefix "https://get.status.im/extension/") (def uri-prefix "https://get.status.im/extension/")

View File

@ -64,10 +64,11 @@
{:browser/call-rpc [{"jsonrpc" "2.0" {:browser/call-rpc [{"jsonrpc" "2.0"
"method" "eth_call" "method" "eth_call"
"params" [tx-object "latest"]} "params" [tx-object "latest"]}
#(when on-result #(let [result-str (when %2
(let [result-str (when %2 (get (js->clj %2) "result"))
(get (js->clj %2) "result")) result (cond
result (if (and outputs result-str) (= "0x" result-str) nil
(abi-spec/decode (string/replace result-str #"0x" "") outputs) (and outputs result-str)
result-str)] (abi-spec/decode (string/replace result-str #"0x" "") outputs)
(re-frame/dispatch (on-result {:error %1 :result result}))))]}))) :else result-str)]
(re-frame/dispatch (on-result (merge {:result result} (when %1 {:error %1})))))]})))

View File

@ -49,7 +49,7 @@
http-get) http-get)
(defn- http-raw-get [{:keys [url success-event-creator failure-event-creator timeout-ms]}] (defn- http-raw-get [{:keys [url success-event-creator failure-event-creator timeout-ms]}]
(let [on-success #(re-frame/dispatch (success-event-creator %)) (let [on-success #(when-let [event (success-event-creator %)] (re-frame/dispatch event))
on-error (when failure-event-creator #(re-frame/dispatch (failure-event-creator %))) on-error (when failure-event-creator #(re-frame/dispatch (failure-event-creator %)))
opts {:timeout-ms timeout-ms}] opts {:timeout-ms timeout-ms}]
(http/raw-get url on-success on-error opts))) (http/raw-get url on-success on-error opts)))

View File

@ -10,7 +10,7 @@
:extensions/load :extensions/load
(fn [{:keys [extensions follow-up]}] (fn [{:keys [extensions follow-up]}]
(doseq [{:keys [url active?]} extensions] (doseq [{:keys [url active?]} extensions]
(extensions/load-from url #(re-frame/dispatch [follow-up (-> % extensions/read-extension extensions/parse) active?]))))) (extensions/load-from url #(re-frame/dispatch [follow-up (extensions/parse-extension %) active?])))))
(handlers/register-handler-fx (handlers/register-handler-fx
:extensions/stage :extensions/stage
@ -29,4 +29,4 @@
(fn [cofx [_ extensions]] (fn [cofx [_ extensions]]
(apply fx/merge cofx (map (fn [{:keys [id]}] (apply fx/merge cofx (map (fn [{:keys [id]}]
(partial registry/deactivate id)) (partial registry/deactivate id))
extensions)))) extensions))))

View File

@ -1,6 +1,7 @@
(ns status-im.ui.screens.extensions.add.views (ns status-im.ui.screens.extensions.add.views
(:require-macros [status-im.utils.views :as views]) (:require-macros [status-im.utils.views :as views])
(:require [re-frame.core :as re-frame] (:require [re-frame.core :as re-frame]
[reagent.core :as reagent]
[clojure.string :as string] [clojure.string :as string]
[status-im.extensions.core :as extensions] [status-im.extensions.core :as extensions]
[status-im.i18n :as i18n] [status-im.i18n :as i18n]
@ -76,7 +77,8 @@
[react/view {:flex 1} [react/view {:flex 1}
[toolbar/simple-toolbar (i18n/label :t/extension)] [toolbar/simple-toolbar (i18n/label :t/extension)]
[react/view {:style {:flex 1 :justify-content :center :align-items :center}} [react/view {:style {:flex 1 :justify-content :center :align-items :center}}
[react/text (i18n/label :t/invalid-extension)]]]]))) [react/text (i18n/label :t/invalid-extension)]
[react/text (str errors)]]]])))
(def qr-code (def qr-code
[react/touchable-highlight {:on-press #(re-frame/dispatch [:qr-scanner.ui/scan-qr-code-pressed [react/touchable-highlight {:on-press #(re-frame/dispatch [:qr-scanner.ui/scan-qr-code-pressed
@ -88,7 +90,8 @@
(views/defview edit-extension [] (views/defview edit-extension []
(views/letsubs [manage-extension [:get-manage-extension]] (views/letsubs [manage-extension [:get-manage-extension]]
(let [url (get-in manage-extension [:url :value])] (let [url (get-in manage-extension [:url :value])
pressed (reagent/atom false)]
[react/view styles/screen [react/view styles/screen
[status-bar/status-bar] [status-bar/status-bar]
[react/keyboard-avoiding-view components.styles/flex [react/keyboard-avoiding-view components.styles/flex
@ -108,5 +111,5 @@
[components.common/bottom-button [components.common/bottom-button
{:forward? true {:forward? true
:label (i18n/label :t/find) :label (i18n/label :t/find)
:disabled? (not (extensions/valid-uri? url)) :disabled? (and (not @pressed) (not (extensions/valid-uri? url)))
:on-press #(re-frame/dispatch [:extensions.ui/show-button-pressed (string/trim url)])}]]]]))) :on-press #(do (reset! pressed true) (re-frame/dispatch [:extensions.ui/show-button-pressed (string/trim url)]))}]]]])))