From 6e84cf22a90a6bd3be0884fca05750c58ccbe49c Mon Sep 17 00:00:00 2001 From: tbenr Date: Thu, 28 Mar 2019 18:05:45 +0100 Subject: [PATCH] fixes #7363 Signed-off-by: Julien Eluard --- src/status_im/extensions/registry.cljs | 55 ++++++++++++++++++++------ 1 file changed, 42 insertions(+), 13 deletions(-) diff --git a/src/status_im/extensions/registry.cljs b/src/status_im/extensions/registry.cljs index 3fd835adf8..eea62466ab 100644 --- a/src/status_im/extensions/registry.cljs +++ b/src/status_im/extensions/registry.cljs @@ -107,35 +107,64 @@ new-extensions (assoc-in extensions [extension-key :active?] active?) hook-fn (if active? hook-in - unhook)] + unhook) + lifecycle-event (if active? + (get-in extensions [extension-key :lifecycle :on-activation]) + (get-in extensions [extension-key :lifecycle :on-deactivation]))] (fx/merge cofx + ;; on-deactivate called before + (when (and (not active?) lifecycle-event) (lifecycle-event)) (accounts.update/account-update {:extensions new-extensions} {:success-event nil}) - (update-hooks hook-fn extension-key)))) + (update-hooks hook-fn extension-key) + ;; on-activation called after + (when (and active? lifecycle-event) (lifecycle-event))))) (fx/defn install [{:keys [db] :as cofx} url {:keys [hooks] :as extension-data} modal?] (let [{:account/keys [account]} db - extension {:id url - :name (or (get-in extension-data [:meta :name]) "Unnamed") - :url url + on-installation (get-in extension-data [:lifecycle :on-installation]) + on-activation (get-in extension-data [:lifecycle :on-activation]) + ephemeral? (get-in extension-data [:lifecycle :ephemeral]) + extension {:id url + :name (or (get-in extension-data [:meta :name]) "Unnamed") + :url url + :lifecycle {:on-installation on-installation + :on-deinstallation (get-in extension-data [:lifecycle :on-deinstallation]) + :on-activation on-activation + :on-deactivation (get-in extension-data [:lifecycle :on-deactivation]) + :ephemeral? ephemeral?} :active? true} new-extensions (assoc (:extensions account) url extension)] - (fx/merge cofx - {:utils/show-popup {:title (i18n/label :t/success) - :content (i18n/label :t/extension-installed) - :on-dismiss #(re-frame/dispatch (if modal? - [:navigate-back] - [:navigate-to-clean :my-profile]))}} - (when hooks (accounts.update/account-update {:extensions new-extensions} {})) - (when hooks (add-to-registry url extension-data true))))) + (if ephemeral? + (fx/merge cofx + {:dispatch (if modal? + [:navigate-back] + [:navigate-to-clean :my-profile])} + (when on-activation (on-activation))) + (fx/merge cofx + {:utils/show-popup {:title (i18n/label :t/success) + :content (i18n/label :t/extension-installed) + :on-dismiss #(re-frame/dispatch (if modal? + [:navigate-back] + [:navigate-to-clean :my-profile]))}} + (when hooks (accounts.update/account-update {:extensions new-extensions} {})) + (when hooks (add-to-registry url extension-data true)) + (when on-installation (on-installation)) + (when on-activation (on-activation)))))) (fx/defn uninstall [{:keys [db] :as cofx} extension-key] (let [{:account/keys [account]} db + extension (get-in cofx [:db :account/account :extensions extension-key]) + active? (get extension :active?) + on-deinstallation (get-in extension [:lifecycle :on-deinstallation]) + on-deactivation (get-in extension [:lifecycle :on-deactivation]) new-extensions (dissoc (:extensions account) extension-key)] (fx/merge cofx {:utils/show-popup {:title (i18n/label :t/success) :content (i18n/label :t/extension-uninstalled)}} + (when (and active? on-deactivation) (on-deactivation)) + (when on-deinstallation (on-deinstallation)) (remove-from-registry extension-key) (accounts.update/account-update {:extensions new-extensions} {}))))