From 38570aa42ffeaa49fe58733e099c3109f0598bc2 Mon Sep 17 00:00:00 2001 From: Julien Eluard Date: Mon, 4 Feb 2019 14:12:46 +0100 Subject: [PATCH] Migrated to latest pluto release Signed-off-by: Andrey Shovkoplyas --- deps.edn | 4 +- project.clj | 2 +- src/status_im/chat/commands/core.cljs | 54 +---- src/status_im/extensions/camera.cljs | 6 +- src/status_im/extensions/core.cljs | 221 ++++++++++-------- src/status_im/extensions/ethereum.cljs | 18 +- src/status_im/extensions/registry.cljs | 97 ++++++-- src/status_im/native_module/impl/module.cljs | 6 - .../ui/screens/extensions/add/views.cljs | 20 +- .../ui/screens/wallet/settings/views.cljs | 17 +- 10 files changed, 227 insertions(+), 218 deletions(-) diff --git a/deps.edn b/deps.edn index b949a097e1..7580ed6e55 100644 --- a/deps.edn +++ b/deps.edn @@ -1,6 +1,6 @@ {:paths ["components/src" "src" "react-native/src/cljsjs" "resources"] :deps {org.clojure/clojure {:mvn/version "1.9.0"} ;; Keep in sync with .TOOLVERSIONS - org.clojure/clojurescript {:mvn/version "1.10.439"} + org.clojure/clojurescript {:mvn/version "1.10.238"} org.clojure/core.async {:mvn/version "0.4.474"} reagent {:mvn/version "0.7.0" :exclusions [cljsjs/react cljsjs/react-dom cljsjs/react-dom-server cljsjs/create-react-class]} @@ -11,7 +11,7 @@ com.taoensso/timbre {:mvn/version "4.10.0"} hickory {:mvn/version "0.7.1"} com.cognitect/transit-cljs {:mvn/version "0.8.248"} - status-im/pluto {:mvn/version "iteration-4-7"} + status-im/pluto {:mvn/version "iteration-4-8"} mvxcvi/alphabase {:mvn/version "1.0.0"} rasom/cljs-react-navigation {:mvn/version "0.1.4"}} diff --git a/project.clj b/project.clj index 0bee29f85a..deace729b4 100644 --- a/project.clj +++ b/project.clj @@ -11,7 +11,7 @@ [com.taoensso/timbre "4.10.0"] [hickory "0.7.1"] [com.cognitect/transit-cljs "0.8.248"] - [status-im/pluto "iteration-4-7"] + [status-im/pluto "iteration-4-8"] [mvxcvi/alphabase "1.0.0"] [rasom/cljs-react-navigation "0.1.4"]] :plugins [[lein-cljsbuild "1.1.7"] diff --git a/src/status_im/chat/commands/core.cljs b/src/status_im/chat/commands/core.cljs index fb92bfc2a4..697965ca76 100644 --- a/src/status_im/chat/commands/core.cljs +++ b/src/status_im/chat/commands/core.cljs @@ -1,8 +1,5 @@ (ns status-im.chat.commands.core - (:require [re-frame.core :as re-frame] - [clojure.set :as set] - [pluto.reader.hooks :as hooks] - [status-im.constants :as constants] + (:require [clojure.set :as set] [status-im.chat.constants :as chat.constants] [status-im.chat.commands.protocol :as protocol] [status-im.chat.commands.impl.transactions :as transactions] @@ -129,55 +126,6 @@ {} access-scope->command-id))))})) -(def command-hook - "Hook for extensions" - {:properties - {:description? :string - :scope #{:personal-chats :public-chats :group-chats} - :short-preview? :view - :preview? :view - :on-send? :event - :on-receive? :event - :on-send-sync? :event - :parameters? [{:id :keyword - :type {:one-of #{:text :phone :password :number}} - :placeholder :string - :suggestions? :view}]} - :hook - (reify hooks/Hook - (hook-in [_ id {extension-id :id} {:keys [description scope parameters preview short-preview - on-send on-receive on-send-sync]} cofx] - (let [new-command (if on-send-sync - (reify protocol/Command - (id [_] (name id)) - (scope [_] scope) - (description [_] description) - (parameters [_] (or parameters [])) - (validate [_ _ _]) - (on-send [_ command-message _] (when on-send {:dispatch (on-send command-message)})) - (on-receive [_ command-message _] (when on-receive {:dispatch (on-receive command-message)})) - (short-preview [_ props] (when short-preview (short-preview props))) - (preview [_ props] (when preview (preview props))) - protocol/Yielding - (yield-control [_ props _] {:dispatch (on-send-sync props)}) - protocol/Extension - (extension-id [_] extension-id)) - (reify protocol/Command - (id [_] (name id)) - (scope [_] scope) - (description [_] description) - (parameters [_] (or parameters [])) - (validate [_ _ _]) - (on-send [_ command-message _] (when on-send {:dispatch (on-send command-message)})) - (on-receive [_ command-message _] (when on-receive {:dispatch (on-receive command-message)})) - (short-preview [_ props] (when short-preview (short-preview props))) - (preview [_ props] (when preview (preview props))) - protocol/Extension - (extension-id [_] extension-id)))] - (load-commands cofx [new-command]))) - (unhook [_ id _ {:keys [scope]} {:keys [db] :as cofx}] - (remove-command (get-in db [:id->command [(name id) scope] :type]) cofx)))}) - (handlers/register-handler-fx :load-commands (fn [cofx [_ commands]] diff --git a/src/status_im/extensions/camera.cljs b/src/status_im/extensions/camera.cljs index 89218158a8..8b0e62aefd 100644 --- a/src/status_im/extensions/camera.cljs +++ b/src/status_im/extensions/camera.cljs @@ -28,13 +28,13 @@ :extensions/camera-error (fn [cofx [_ error {:keys [on-failure]}]] (when on-failure - {:dispatch (on-failure {:result error})}))) + (on-failure {:result error})))) (handlers/register-handler-fx :extensions/camera-picture-taken (fn [cofx [_ data {{:keys [on-success]} :data back? :back?}]] (fx/merge cofx - {:dispatch (on-success {:result data})} + (on-success {:result data}) (when back? (navigation/navigate-back))))) @@ -50,7 +50,7 @@ :extensions/camera-qr-code-scanned (fn [cofx [_ _ qr-code {{:keys [on-success]} :data}]] (fx/merge cofx - {:dispatch (on-success {:result qr-code})} + (on-success {:result qr-code}) (navigation/navigate-back)))) (handlers/register-handler-fx diff --git a/src/status_im/extensions/core.cljs b/src/status_im/extensions/core.cljs index 0f9983760c..5e00d2901a 100644 --- a/src/status_im/extensions/core.cljs +++ b/src/status_im/extensions/core.cljs @@ -1,9 +1,10 @@ (ns status-im.extensions.core (:refer-clojure :exclude [list]) (:require [clojure.string :as string] + [pluto.core :as pluto] [pluto.storages :as storages] - [pluto.reader :as reader] [re-frame.core :as re-frame] + [re-frame.registrar :as registrar] [status-im.chat.commands.core :as commands] [status-im.chat.commands.impl.transactions :as transactions] [status-im.ui.components.button.view :as button] @@ -30,7 +31,7 @@ (re-frame/reg-fx ::identity-event - (fn [{:keys [cb]}] (re-frame/dispatch (cb {})))) + (fn [{:keys [cb]}] (cb {}))) (re-frame/reg-event-fx :extensions/identity-event @@ -58,8 +59,8 @@ (re-frame/reg-fx ::schedule-start (fn [{:keys [interval on-created on-result]}] - (let [id (js/setInterval #(re-frame/dispatch (on-result {})) interval)] - (re-frame/dispatch (on-created {:value id}))))) + (let [id (js/setInterval #(on-result {}) interval)] + (on-created {:value id})))) (handlers/register-handler-fx :extensions/schedule-start @@ -190,7 +191,7 @@ (re-frame/reg-fx ::json-parse (fn [{:keys [value on-result]}] - (re-frame/dispatch (on-result {:value (parse-json value)})))) + (on-result {:value (parse-json value)}))) (handlers/register-handler-fx :extensions/json-parse @@ -200,7 +201,7 @@ (re-frame/reg-fx ::json-stringify (fn [value on-result] - (re-frame/dispatch (on-result {:value (js/JSON.stringify (clj->js value))})))) + (on-result {:value (js/JSON.stringify (clj->js value))}))) (handlers/register-handler-fx :extensions/json-stringify @@ -309,7 +310,7 @@ :selection-modal-screen (assoc params :on-select #(do (re-frame/dispatch [:navigate-back]) - (re-frame/dispatch (on-select %))))))) + (on-select %)))))) (defn operation->fn [k] (case k @@ -321,7 +322,7 @@ (re-frame/reg-fx ::arithmetic (fn [{:keys [operation values on-result]}] - (re-frame/dispatch (on-result {:value (apply (operation->fn operation) values)})))) + (on-result {:value (apply (operation->fn operation) values)}))) (handlers/register-handler-fx :extensions/arithmetic @@ -335,10 +336,10 @@ (defn button [{:keys [on-click enabled disabled] :as m} label] [button/secondary-button (merge {:disabled? (or (when (contains? m :enabled) (or (nil? enabled) (false? enabled))) disabled)} - (when on-click {:on-press #(re-frame/dispatch (on-click {}))})) label]) + (when on-click {:on-press #(on-click {})})) label]) (defn on-input-change-text [on-change value] - (re-frame/dispatch (on-change {:value value}))) + (on-change {:value value})) (defn- on-input-change-text-delay [current on-change value delay] ;; If an input change handler has been already scheduled cancel it. @@ -360,7 +361,7 @@ #(on-input-change-text on-change %))}))]) (defn touchable-opacity [{:keys [style on-press]} & children] - (into [react/touchable-opacity (merge (when on-press {:on-press #(re-frame/dispatch (on-press {}))}) + (into [react/touchable-opacity (merge (when on-press {:on-press #(on-press {})}) (when style {:style style}))] children)) (defn image [{:keys [source uri style]}] @@ -396,7 +397,7 @@ [react/view {:style {:background-color colors/white}} [checkbox/checkbox {:checked? checked :style {:padding 0} - :on-value-change #(re-frame/dispatch (on-change {:value %}))}]]) + :on-value-change #(on-change {:value %})}]]) (defn activity-indicator-size [k] (condp = k @@ -411,7 +412,7 @@ (when-let [size' (activity-indicator-size size)] {:size size'}))]) (defn picker [{:keys [style on-change selected enabled data]}] - [react/picker {:style style :on-change #(re-frame/dispatch (on-change {:value %})) :selected selected :enabled enabled :data data}]) + [react/picker {:style style :on-change #(on-change {:value %}) :selected selected :enabled enabled :data data}]) (defn- wrap-text-child [o] (if (ifn? o) o (str o))) @@ -442,23 +443,23 @@ [icons/icon key o]) (def capacities - {:components {'view {:value view} - 'scroll-view {:value scroll-view :properties {:keyboard-should-persist-taps :keyword :content-container-style :map}} - 'keyboard-avoiding-view {:value react/keyboard-avoiding-view} - 'text {:value text} - 'touchable-opacity {:value touchable-opacity :properties {:on-press :event}} - 'icon {:value icon :properties {:key :keyword :color :any}} - 'image {:value image :properties {:uri :string :source :string}} - 'input {:value input :properties {:on-change :event :placeholder :string :keyboard-type :keyword :change-delay? :number :placeholder-text-color :any :selection-color :any}} - 'button {:value button :properties {:enabled :boolean :disabled :boolean :on-click :event}} - 'link {:value link :properties {:uri :string :text? :string :open-in? {:one-of #{:device :status}}}} - 'list {:value list :properties {:data :vector :item-view :view :key? :keyword}} - 'checkbox {:value checkbox :properties {:on-change :event :checked :boolean}} - 'activity-indicator {:value activity-indicator :properties {:animating :boolean :color :string :size :keyword :hides-when-stopped :boolean}} - 'picker {:value picker :properties {:on-change :event :selected :string :enabled :boolean :data :vector}} - 'nft-token-viewer {:value transactions/nft-token :properties {:token :string}} - 'transaction-status {:value transactions/transaction-status :properties {:outgoing :string :tx-hash :string}} - 'map {:value map/map-webview + {:components {'view {:data view} + 'scroll-view {:data scroll-view :properties {:keyboard-should-persist-taps :keyword :content-container-style :map}} + 'keyboard-avoiding-view {:data react/keyboard-avoiding-view} + 'text {:data text} + 'touchable-opacity {:data touchable-opacity :properties {:on-press :event}} + 'icon {:data icon :properties {:key :keyword :color :any}} + 'image {:data image :properties {:uri :string :source :string}} + 'input {:data input :properties {:on-change :event :placeholder :string :keyboard-type :keyword :change-delay? :number :placeholder-text-color :any :selection-color :any}} + 'button {:data button :properties {:enabled :boolean :disabled :boolean :on-click :event}} + 'link {:data link :properties {:uri :string :text? :string :open-in? {:one-of #{:device :status}}}} + 'list {:data list :properties {:data :vector :item-view :view :key? :keyword}} + 'checkbox {:data checkbox :properties {:on-change :event :checked :boolean}} + 'activity-indicator {:data activity-indicator :properties {:animating :boolean :color :string :size :keyword :hides-when-stopped :boolean}} + 'picker {:data picker :properties {:on-change :event :selected :string :enabled :boolean :data :vector}} + 'nft-token-viewer {:data transactions/nft-token :properties {:token :string}} + 'transaction-status {:data transactions/transaction-status :properties {:outgoing :string :tx-hash :string}} + 'map {:data map/map-webview :properties {:marker {:lng :number :lat :number :boundingbox {:lng1 :number @@ -468,45 +469,45 @@ :fly? :boolean :interactive? :boolean :on-change :event}} - 'map-link {:value map-link :properties {:text :string :lng :any :lat :any}}} - :queries {'identity {:value :extensions/identity :arguments {:value :map}} - 'store/get {:value :store/get :arguments {:key :string}} - 'contacts/all {:value :extensions.contacts/all} ;; :photo :name :address :public-key - 'wallet/collectibles {:value :get-collectible-token :arguments {:token :string :symbol :string}} - 'wallet/balance {:value :extensions.wallet/balance :arguments {:token :string}} - 'wallet/token {:value :extensions.wallet/token :arguments {:token :string :amount? :number :amount-in-wei? :number}} - 'wallet/tokens {:value :extensions.wallet/tokens :arguments {:filter? :vector :visible? :boolean}}} + 'map-link {:data map-link :properties {:text :string :lng :any :lat :any}}} + :queries {'identity {:data :extensions/identity :arguments {:value :map}} + 'store/get {:data :store/get :arguments {:key :string}} + 'contacts/all {:data :extensions.contacts/all} ;; :photo :name :address :public-key + 'wallet/collectibles {:data :get-collectible-token :arguments {:token :string :symbol :string}} + 'wallet/balance {:data :extensions.wallet/balance :arguments {:token :string}} + 'wallet/token {:data :extensions.wallet/token :arguments {:token :string :amount? :number :amount-in-wei? :number}} + 'wallet/tokens {:data :extensions.wallet/tokens :arguments {:filter? :vector :visible? :boolean}}} :events {'identity {:permissions [:read] - :value :extensions/identity-event + :data :extensions/identity-event :arguments {:cb :event}} 'alert {:permissions [:read] - :value :alert + :data :alert :arguments {:value :string}} 'selection-screen {:permissions [:read] - :value :extensions/show-selection-screen + :data :extensions/show-selection-screen :arguments {:items :vector :on-select :event :render :view :title :string :extractor-key :keyword}} 'chat.command/set-parameter {:permissions [:read] - :value :extensions.chat.command/set-parameter + :data :extensions.chat.command/set-parameter :arguments {:value :any}} 'chat.command/set-custom-parameter {:permissions [:read] - :value :extensions.chat.command/set-custom-parameter + :data :extensions.chat.command/set-custom-parameter :arguments {:key :keyword :value :any}} 'chat.command/set-parameter-with-custom-params {:permissions [:read] - :value :extensions.chat.command/set-parameter-with-custom-params + :data :extensions.chat.command/set-parameter-with-custom-params :arguments {:value :string :params :map}} 'chat.command/send-plain-text-message {:permissions [:read] - :value :extensions.chat.command/send-plain-text-message + :data :extensions.chat.command/send-plain-text-message :arguments {:value :string}} 'chat.command/send-message {:permissions [:read] - :value :extensions.chat.command/send-message + :data :extensions.chat.command/send-message :arguments {:params :map}} 'chat.command/open-public-chat {:permissions [:read] @@ -514,11 +515,11 @@ :arguments {:topic :string :navigate-to :boolean}} 'log {:permissions [:read] - :value :log + :data :log :arguments {:value :string}} 'arithmetic {:permissions [:read] - :value :extensions/arithmetic + :data :extensions/arithmetic :arguments {:values :vector :operation {:one-of #{:plus :minus :times :divide}} :on-result :event}} @@ -538,53 +539,53 @@ :on-failure? :event}} 'schedule/start {:permissions [:read] - :value :extensions/schedule-start + :data :extensions/schedule-start :arguments {:interval :number :on-created :event :on-result :event}} 'schedule/cancel {:permissions [:read] - :value :extensions/schedule-cancel + :data :extensions/schedule-cancel :arguments {:value :number}} 'json/parse {:permissions [:read] - :value :extensions/json-parse + :data :extensions/json-parse :arguments {:value :string :on-result :event}} 'json/stringify {:permissions [:read] - :value :extensions/json-stringify + :data :extensions/json-stringify :arguments {:value :string :on-result :event}} 'store/put {:permissions [:read] - :value :store/put + :data :store/put :arguments {:key :string :value :any}} 'store/puts {:permissions [:read] - :value :store/puts + :data :store/puts :arguments {:value :vector}} 'store/append {:permissions [:read] - :value :store/append + :data :store/append :arguments {:key :string :value :any}} 'store/clear {:permissions [:read] - :value :store/clear + :data :store/clear :arguments {:key :string}} 'store/clear-all {:permissions [:read] - :value :store/clear-all} + :data :store/clear-all} 'http/get {:permissions [:read] - :value :http/get + :data :http/get :arguments {:url :string :timeout? :string :on-success :event :on-failure? :event}} 'http/post {:permissions [:read] - :value :http/post + :data :http/post :arguments {:url :string :body :string :timeout? :string @@ -592,26 +593,26 @@ :on-failure? :event}} 'ipfs/cat {:permissions [:read] - :value :ipfs/cat + :data :ipfs/cat :arguments {:hash :string :on-success :event :on-failure? :event}} 'ipfs/add {:permissions [:read] - :value :ipfs/add + :data :ipfs/add :arguments {:value :string :on-success :event :on-failure? :event}} 'ethereum/transaction-receipt {:permissions [:read] - :value :extensions/ethereum-transaction-receipt + :data :extensions/ethereum-transaction-receipt :arguments {:value :string :topics-hints :vector :on-success :event :on-failure? :event}} 'ethereum/await-transaction-receipt {:permissions [:read] - :value :extensions/ethereum-await-transaction-receipt + :data :extensions/ethereum-await-transaction-receipt :arguments {:value :string :interval :number :topics-hints :vector @@ -619,18 +620,18 @@ :on-failure? :event}} 'ethereum/sign {:permissions [:read] - :value :extensions/ethereum-sign + :data :extensions/ethereum-sign :arguments {:message? :string :data? :string :on-success :event :on-failure? :event}} 'ethereum/create-address {:permissions [:read] - :value :extensions/ethereum-create-address + :data :extensions/ethereum-create-address :arguments {:on-result :event}} 'ethereum/send-transaction {:permissions [:read] - :value :extensions/ethereum-send-transaction + :data :extensions/ethereum-send-transaction :arguments {:to :string :gas? :string :gas-price? :string @@ -642,7 +643,7 @@ :on-failure? :event}} 'ethereum/logs {:permissions [:read] - :value :extensions/ethereum-logs + :data :extensions/ethereum-logs :arguments {:from? :string :to? :string :address? :vector @@ -652,7 +653,7 @@ :on-failure? :event}} 'ethereum/create-filter {:permissions [:read] - :value :extensions/ethereum-create-filter + :data :extensions/ethereum-create-filter :arguments {:type {:one-of #{:filter :block :pending-transaction}} :from? :string :to? :string @@ -663,35 +664,35 @@ :on-failure? :event}} 'ethereum/logs-changes {:permissions [:read] - :value :extensions/ethereum-logs-changes + :data :extensions/ethereum-logs-changes :arguments {:id :string :topics-hints :vector}} 'ethereum/cancel-filter {:permissions [:read] - :value :extensions/ethereum-cancel-filter + :data :extensions/ethereum-cancel-filter :arguments {:id :string}} 'ethereum.ens/resolve {:permissions [:read] - :value :extensions/ethereum-resolve-ens + :data :extensions/ethereum-resolve-ens :arguments {:name :string :on-success :event :on-failure? :event}} 'ethereum.erc20/total-supply {:permissions [:read] - :value :extensions/ethereum-erc20-total-supply + :data :extensions/ethereum-erc20-total-supply :arguments {:contract :string :on-success :event :on-failure? :event}} 'ethereum.erc20/balance-of {:permissions [:read] - :value :extensions/ethereum-erc20-balance-of + :data :extensions/ethereum-erc20-balance-of :arguments {:contract :string :token-owner :string :on-success :event :on-failure? :event}} 'ethereum.erc20/transfer {:permissions [:read] - :value :extensions/ethereum-erc20-transfer + :data :extensions/ethereum-erc20-transfer :arguments {:contract :string :to :string :value :number @@ -699,7 +700,7 @@ :on-failure? :event}} 'ethereum.erc20/transfer-from {:permissions [:read] - :value :extensions/ethereum-erc20-transfer-from + :data :extensions/ethereum-erc20-transfer-from :arguments {:contract :string :from :string :to :string @@ -708,7 +709,7 @@ :on-failure? :event}} 'ethereum.erc20/approve {:permissions [:read] - :value :extensions/ethereum-erc20-approve + :data :extensions/ethereum-erc20-approve :arguments {:contract :string :spender :string :value :number @@ -716,7 +717,7 @@ :on-failure? :event}} 'ethereum.erc20/allowance {:permissions [:read] - :value :extensions/ethereum-erc20-allowance + :data :extensions/ethereum-erc20-allowance :arguments {:contract :string :token-owner :string :spender :string @@ -724,14 +725,14 @@ :on-failure? :event}} 'ethereum.erc721/owner-of {:permissions [:read] - :value :extensions/ethereum-erc721-owner-of + :data :extensions/ethereum-erc721-owner-of :arguments {:contract :string :token-id :string :on-success :event :on-failure? :event}} 'ethereum.erc721/is-approved-for-all {:permissions [:read] - :value :extensions/ethereum-erc721-is-approved-for-all + :data :extensions/ethereum-erc721-is-approved-for-all :arguments {:contract :string :owner :string :operator :string @@ -739,14 +740,14 @@ :on-failure? :event}} 'ethereum.erc721/get-approved {:permissions [:read] - :value :extensions/ethereum-erc721-get-approved + :data :extensions/ethereum-erc721-get-approved :arguments {:contract :string :token-id :string :on-success :event :on-failure? :event}} 'ethereum.erc721/set-approval-for-all {:permissions [:read] - :value :extensions/ethereum-erc721-set-approval-for-all + :data :extensions/ethereum-erc721-set-approval-for-all :arguments {:contract :string :operator :string :approved :boolean @@ -754,7 +755,7 @@ :on-failure? :event}} 'ethereum.erc721/safe-transfer-from {:permissions [:read] - :value :extensions/ethereum-erc721-safe-transfer-from + :data :extensions/ethereum-erc721-safe-transfer-from :arguments {:contract :string :from :string :to :string @@ -764,7 +765,7 @@ :on-failure? :event}} 'ethereum/call {:permissions [:read] - :value :extensions/ethereum-call + :data :extensions/ethereum-call :arguments {:to :string :method :string :params? :vector @@ -773,7 +774,7 @@ :on-failure? :event}} 'ethereum/shh_post {:permissions [:read] - :value :extensions/shh-post + :data :extensions/shh-post :arguments {:from? :string :to? :string :topics :vector @@ -784,7 +785,7 @@ :on-failure? :event}} 'ethereum/shh-new-identity {:permissions [:read] - :value :extensions/shh-new-identity + :data :extensions/shh-new-identity :arguments {:on-success :event :on-failure? :event}} 'ethereum/shh-has-identity @@ -795,45 +796,75 @@ :on-failure? :event}} 'ethereum/shh-new-group {:permissions [:read] - :value :extensions/shh-new-group + :data :extensions/shh-new-group :arguments {:on-success :event :on-failure? :event}} 'ethereum/shh-add-to-group {:permissions [:read] - :value :extensions/shh-add-to-group + :data :extensions/shh-add-to-group :arguments {:address :string :on-success :event :on-failure? :event}} 'ethereum/shh_new-filter {:permissions [:read] - :value :extensions/shh-new-filter + :data :extensions/shh-new-filter :arguments {:to? :string :topics :vector :on-success :event :on-failure? :event}} 'ethereum/shh-uninstall-filter {:permissions [:read] - :value :extensions/shh-uninstall-filter + :data :extensions/shh-uninstall-filter :arguments {:id :string}} 'ethereum/shh-get-filter-changes {:permissions [:read] - :value :extensions/shh-get-filter-changes + :data :extensions/shh-get-filter-changes :arguments {:id :string}} 'ethereum/shh-get-messages {:permissions [:read] - :value :extensions/shh-get-messages + :data :extensions/shh-get-messages :arguments {:id :string}}} - :hooks {:chat.command commands/command-hook - :wallet.settings settings/hook}}) + :hooks {:wallet.settings + {:properties + {:label :string + :view :view + :on-open? :event + :on-close? :event}} + :chat.command + {:properties + {:description? :string + :scope #{:personal-chats :public-chats :group-chats} + :short-preview? :view + :preview? :view + :on-send? :event + :on-receive? :event + :on-send-sync? :event + :parameters? [{:id :keyword + :type {:one-of #{:text :phone :password :number}} + :placeholder :string + :suggestions? :view}]}}}}) + +(defn dispatch-events [_ events] + (doseq [event events] + (when (vector? event) + (re-frame/dispatch event)))) + +(defn resolve-query [[id :as data]] + (when (registrar/get-handler :sub id) + (re-frame/subscribe data))) (defn parse [{:keys [data]} id] (try - (reader/parse {:capacities capacities :env {:id id}} data) + (pluto/parse {:capacities capacities + :env {:id id} + :event-fn dispatch-events + :query-fn resolve-query} + data) (catch :default e {:errors [{:value (str e)}]}))) (defn parse-extension [{:keys [type value]} id] (if (= type :success) - (parse (reader/read (:content value)) id) + (parse (pluto/read (:content value)) id) {:errors [{:type type :value value}]})) (def uri-prefix "https://get.status.im/extension/") diff --git a/src/status_im/extensions/ethereum.cljs b/src/status_im/extensions/ethereum.cljs index e6e0a51be6..91999e4dd6 100644 --- a/src/status_im/extensions/ethereum.cljs +++ b/src/status_im/extensions/ethereum.cljs @@ -1,6 +1,5 @@ (ns status-im.extensions.ethereum (:require [clojure.string :as string] - [re-frame.core :as re-frame] [status-im.constants :as constants] [status-im.i18n :as i18n] [status-im.models.wallet :as models.wallet] @@ -12,7 +11,6 @@ [status-im.utils.ethereum.core :as ethereum] [status-im.utils.handlers :as handlers] [status-im.utils.money :as money] - [clojure.string :as string] [status-im.utils.types :as types] [status-im.native-module.core :as status])) @@ -20,13 +18,13 @@ :extensions/wallet-ui-on-success (fn [cofx [_ on-success _ result _]] (fx/merge cofx - {:dispatch (on-success {:value result})} + (when on-success (on-success {:value result})) (navigation/navigate-back)))) (handlers/register-handler-fx :extensions/wallet-ui-on-failure (fn [_ [_ on-failure message]] - (when on-failure {:dispatch (on-failure {:value message})}))) + (when on-failure (on-failure {:value message})))) (defn- wrap-with-resolution [db arguments address-keyword f] "function responsible to resolve ens taken from argument @@ -85,9 +83,9 @@ (defn- rpc-dispatch [error result f on-success on-failure] (when result - (re-frame/dispatch (on-success {:value (f result)}))) + (on-success {:value (f result)})) (when (and error on-failure) - (re-frame/dispatch (on-failure {:value error})))) + (on-failure {:value error}))) (defn- rpc-handler [o f on-success on-failure] (let [{:keys [error result]} (types/json->clj o)] @@ -370,9 +368,9 @@ network-info (get-in db [:account/account :networks network]) chain (ethereum/network->chain-keyword network-info) registry (get ens/ens-registries chain)] - (ens/get-addr web3 registry name #(re-frame/dispatch (on-success {:value %})))) + (ens/get-addr web3 registry name #(on-success {:value %}))) (when on-failure - (re-frame/dispatch (on-failure {:value (str "'" name "' is not a valid name")})))))) + (on-failure {:value (str "'" name "' is not a valid name")}))))) ;; EXTENSION SIGN -> SIGN MESSAGE (handlers/register-handler-fx @@ -380,7 +378,7 @@ (fn [{db :db :as cofx} [_ _ {:keys [message data id on-success on-failure]}]] (if (and message data) (when on-failure - {:dispatch (on-failure {:error "only one of :message and :data can be used"})}) + (on-failure {:error "only one of :message and :data can be used"})) (fx/merge cofx {:db (assoc-in db [:wallet :send-transaction] {:id id @@ -400,7 +398,7 @@ (status/call-private-rpc payload #(let [{:keys [error result]} (types/json->clj %1) response (if error {:result result :error error} {:result result})] - (re-frame/dispatch (on-result response))))))) + (on-result response)))))) ;; poll logs implementation (handlers/register-handler-fx diff --git a/src/status_im/extensions/registry.cljs b/src/status_im/extensions/registry.cljs index 9bafc14d66..3fd835adf8 100644 --- a/src/status_im/extensions/registry.cljs +++ b/src/status_im/extensions/registry.cljs @@ -1,29 +1,88 @@ (ns status-im.extensions.registry (:refer-clojure :exclude [list]) - (:require [clojure.string :as string] - [pluto.reader.hooks :as hooks] + (:require [clojure.set :as set] + [clojure.string :as string] [re-frame.core :as re-frame] + [pluto.core :as pluto] [status-im.accounts.update.core :as accounts.update] + [status-im.chat.commands.core :as commands] + [status-im.chat.commands.protocol :as protocol] [status-im.i18n :as i18n] - [status-im.utils.fx :as fx] - [clojure.set :as set] - [status-im.ui.screens.navigation :as navigation])) + [status-im.ui.screens.navigation :as navigation] + [status-im.utils.fx :as fx])) + +(defprotocol Hook + "Encapsulate hook lifecycle." + (hook-in [this id env properties cofx] "Hook it into host app.") + (unhook [this id env properties cofx] "Remove extension hook from app.")) + +(defmulti hook-for (fn [hook] (pluto/hook-type hook))) + +(defmethod hook-for "wallet.settings" [_] + (reify Hook + (hook-in [_ id _ m {:keys [db]}] + {:db (assoc-in db [:wallet :settings id] m)}) + (unhook [_ id _ _ {:keys [db]}] + {:db (update-in db [:wallet :settings] dissoc id)}))) + +(defmethod hook-for "chat.command" [_] + (reify Hook + (hook-in [_ id {extension-id :id} {:keys [description scope parameters preview short-preview + on-send on-receive on-send-sync]} cofx] + (let [new-command (if on-send-sync + (reify protocol/Command + (id [_] (name id)) + (scope [_] scope) + (description [_] description) + (parameters [_] (or parameters [])) + (validate [_ _ _]) + (on-send [_ command-message _] (when on-send (on-send command-message))) + (on-receive [_ command-message _] (when on-receive (on-receive command-message))) + (short-preview [_ props] (when short-preview (short-preview props))) + (preview [_ props] (when preview (preview props))) + protocol/Yielding + (yield-control [_ props _] (on-send-sync props)) + protocol/Extension + (extension-id [_] extension-id)) + (reify protocol/Command + (id [_] (name id)) + (scope [_] scope) + (description [_] description) + (parameters [_] (or parameters [])) + (validate [_ _ _]) + (on-send [_ command-message _] (when on-send (on-send command-message))) + (on-receive [_ command-message _] (when on-receive (on-receive command-message))) + (short-preview [_ props] (when short-preview (short-preview props))) + (preview [_ props] (when preview (preview props))) + protocol/Extension + (extension-id [_] extension-id)))] + (commands/load-commands cofx [new-command]))) + (unhook [_ id _ {:keys [scope]} {:keys [db] :as cofx}] + (when-let [command (get-in db [:id->command [(name id) scope] :type])] + (commands/remove-command command cofx))))) + +(defmethod hook-for :default [a] + (reify Hook + (hook-in [this id env properties cofx]) + (unhook [this id env properties cofx]))) + +(defn hook-id + [s] + (when s + (last (string/split (name s) #"\.")))) (fx/defn update-hooks [{:keys [db] :as cofx} hook-fn extension-id] (let [account (get db :account/account) hooks (get-in account [:extensions extension-id :hooks])] (apply fx/merge cofx - (mapcat (fn [[_ extension-hooks]] - (map (fn [[hook-id {parsed :parsed {hook :hook} :hook-ref}]] - (when hook - (partial hook-fn hook hook-id {:id extension-id} parsed))) - extension-hooks)) - hooks)))) + (map (fn [[type extension]] + (hook-fn (hook-for type) (hook-id type) {:id extension-id} extension cofx)) + hooks)))) (fx/defn disable-hooks [{:keys [db] :as cofx} extension-id] - (update-hooks cofx hooks/unhook extension-id)) + (update-hooks cofx unhook extension-id)) (fx/defn add-to-registry [{:keys [db] :as cofx} extension-id extension-data active?] @@ -32,14 +91,14 @@ :active? active?}] (fx/merge cofx {:db (update-in db [:account/account :extensions extension-id] merge data)} - (update-hooks hooks/hook-in extension-id)))) + (update-hooks hook-in extension-id)))) (fx/defn remove-from-registry [cofx extension-id] (let [extensions (get-in cofx [:db :account/account :extensions])] (fx/merge cofx (when (get-in extensions [extension-id :active?]) - (update-hooks hooks/unhook extension-id)) + (update-hooks unhook extension-id)) {:db (update-in cofx [:db :account/account :extensions] dissoc extension-id)}))) (fx/defn change-state @@ -47,8 +106,8 @@ (let [extensions (get-in cofx [:db :account/account :extensions]) new-extensions (assoc-in extensions [extension-key :active?] active?) hook-fn (if active? - hooks/hook-in - hooks/unhook)] + hook-in + unhook)] (fx/merge cofx (accounts.update/account-update {:extensions new-extensions} {:success-event nil}) (update-hooks hook-fn extension-key)))) @@ -57,7 +116,7 @@ [{:keys [db] :as cofx} url {:keys [hooks] :as extension-data} modal?] (let [{:account/keys [account]} db extension {:id url - :name (get-in extension-data ['meta :name]) + :name (or (get-in extension-data [:meta :name]) "Unnamed") :url url :active? true} new-extensions (assoc (:extensions account) url extension)] @@ -115,13 +174,13 @@ (into acc))) #{} (get-in cofx [:db :account/account :extensions])) - hooks (->> (get-in extension-data [:data :hooks type]) + hooks (->> (get-in extension-data [:hooks type]) (keys) (into #{}))] (set/intersection added-hooks hooks))) (defn existing-hooks [cofx extension-data] - (->> (get-in extension-data [:data :hooks]) + (->> (get-in extension-data [:hooks]) (keys) (map #(existing-hooks-for % cofx extension-data)) (apply set/union))) diff --git a/src/status_im/native_module/impl/module.cljs b/src/status_im/native_module/impl/module.cljs index 8d6df732f2..8639f2268d 100644 --- a/src/status_im/native_module/impl/module.cljs +++ b/src/status_im/native_module/impl/module.cljs @@ -1,12 +1,6 @@ (ns status-im.native-module.impl.module - (:require-macros - [cljs.core.async.macros :refer [go-loop go]]) (:require [status-im.ui.components.react :as r] [re-frame.core :as re-frame] - [taoensso.timbre :as log] - [cljs.core.async :as async] - [status-im.utils.platform :as p] - [status-im.utils.async :as async-util] [status-im.react-native.js-dependencies :as rn-dependencies] [clojure.string :as string] [status-im.utils.platform :as platform])) diff --git a/src/status_im/ui/screens/extensions/add/views.cljs b/src/status_im/ui/screens/extensions/add/views.cljs index 1f4fd6e2b5..7200f7cfcb 100644 --- a/src/status_im/ui/screens/extensions/add/views.cljs +++ b/src/status_im/ui/screens/extensions/add/views.cljs @@ -3,6 +3,7 @@ (:require [re-frame.core :as re-frame] [reagent.core :as reagent] [clojure.string :as string] + [pluto.reader.errors :as errors] [status-im.extensions.core :as extensions] [status-im.i18n :as i18n] [status-im.ui.components.react :as react] @@ -23,13 +24,6 @@ [react/view {:flex 1} content]]]) -(defn hooks [{:keys [hooks]}] - (mapcat (fn [[hook-id values]] - (map (fn [[id]] - (str (name hook-id) "." (name id))) - values)) - hooks)) - (views/defview show-extension-base [modal?] (views/letsubs [{:keys [extension-data url]} [:get-staged-extension]] (let [{:keys [data errors]} extension-data] @@ -45,15 +39,15 @@ (i18n/label :t/extensions-disclaimer)]] [cartouche {:header (i18n/label :t/identifier)} [react/text {:style styles/text} - (str (get-in data ['meta :name]))]] + (str (get-in data [:meta :name]))]] [cartouche {:header (i18n/label :t/name)} [react/text {:style styles/text} - (str (get-in data ['meta :name]))]] + (str (get-in data [:meta :name]))]] [cartouche {:header (i18n/label :t/description)} [react/text {:style styles/text} - (str (get-in data ['meta :description]))]] + (str (get-in data [:meta :description]))]] [cartouche {:header (i18n/label :t/hooks)} - (into [react/view] (for [hook (hooks data)] + (into [react/view] (for [hook (keys (:hooks data))] [react/text {:style styles/text} (str hook)]))] [cartouche {:header (i18n/label :t/permissions)} @@ -61,9 +55,9 @@ (i18n/label :t/none)]] [cartouche {:header (i18n/label :t/errors)} (if errors - (into [react/view] (for [error errors] + (into [react/view] (for [{::errors/keys [type value]} errors] [react/text {:style styles/text} - (str (name (:pluto.reader.errors/type error)) " " (str (:pluto.reader.errors/value error)))])) + (str (when type (name type)) " " (str value))])) [react/text {:style styles/text} (i18n/label :t/none)])]]] [react/view styles/bottom-container diff --git a/src/status_im/ui/screens/wallet/settings/views.cljs b/src/status_im/ui/screens/wallet/settings/views.cljs index 9ce2371e83..9bfff46f86 100644 --- a/src/status_im/ui/screens/wallet/settings/views.cljs +++ b/src/status_im/ui/screens/wallet/settings/views.cljs @@ -1,7 +1,6 @@ (ns status-im.ui.screens.wallet.settings.views (:require-macros [status-im.utils.views :refer [defview letsubs]]) (:require [re-frame.core :as re-frame] - [pluto.reader.hooks :as hooks] [status-im.i18n :as i18n] [status-im.ui.components.colors :as colors] [status-im.ui.components.list.views :as list] @@ -15,20 +14,6 @@ [status-im.utils.ethereum.tokens :as tokens] [status-im.ui.components.toolbar.actions :as actions])) -(def hook - "Hook for extensions" - {:properties - {:label :string - :view :view - :on-open? :event - :on-close? :event} - :hook - (reify hooks/Hook - (hook-in [_ id _ {:keys [label view _]} {:keys [db]}] - {:db (assoc-in db [:wallet :settings id] {:label label :view view})}) - (unhook [_ id _ _ {:keys [db]}] - {:db (update-in db [:wallet :settings] dissoc id)}))}) - (defn- render-token [{:keys [symbol name icon]} visible-tokens] [list/list-item-with-checkbox {:checked? (contains? visible-tokens (keyword symbol)) @@ -80,7 +65,7 @@ {:label label :action #(do (when on-open - (re-frame/dispatch (on-open address))) + (on-open address)) (re-frame/dispatch [:navigate-to :wallet-settings-hook m]))}) (defview toolbar-view []