diff --git a/src/status_im/ens/core.cljs b/src/status_im/ens/core.cljs index 41006cb160..eeedad5777 100644 --- a/src/status_im/ens/core.cljs +++ b/src/status_im/ens/core.cljs @@ -30,8 +30,12 @@ (fn [[registry name cb]] (resolver/pubkey registry name cb))) +(defn- final-state? [state] + (#{:saved :registered :registration-failed} state)) + (defn assoc-state-for [db username state] - (assoc-in db [:ens/registration :states username] state)) + (cond-> (assoc-in db [:ens/registration :states username] state) + (final-state? state) (update :ens/registration dissoc :registering?))) (defn assoc-details-for [db username k v] (assoc-in db [:ens/names :details username k] v)) @@ -122,36 +126,28 @@ (fx/defn save-preferred-name {:events [:ens/save-preferred-name]} [{:keys [db] :as cofx} name] - (fx/merge (assoc-in cofx [:db :multiaccount :preferred-name] name) - (multiaccounts.update/multiaccount-update cofx - {:preferred-name name}) - (multiaccounts.update/send-multiaccount-update))) - -(fx/defn save-preferred-name-when-first - [cofx names name] - (when (= 1 (count names)) - ;; First name, save it as default - (save-preferred-name cofx name))) + (multiaccounts.update/multiaccount-update cofx + {:preferred-name name} + {})) (fx/defn save-username {:events [:ens/save-username]} [{:keys [db] :as cofx} custom-domain? username] (let [name (fullname custom-domain? username) - new-db (update-in db [:multiaccount :usernames] #((fnil conj []) %1 %2) name) - names (get-in new-db [:multiaccount :usernames])] - (fx/merge {:db new-db} - (multiaccounts.update/multiaccount-update cofx - {:usernames names} - {:success-event [:ens/set-state username :saved]}) - (save-preferred-name-when-first names name)))) + names (get-in db [:multiaccount :usernames] []) + new-names (conj names name)] + (multiaccounts.update/multiaccount-update cofx + (cond-> {:usernames new-names} + (empty? names) (assoc :preferred-name name)) + {:on-success #(re-frame/dispatch [:ens/set-state username :saved])}))) (fx/defn switch-show-username {:events [:ens/switch-show-username]} [{:keys [db] :as cofx} _] - (let [new-db (update-in db [:multiaccount :show-name?] not)] - (fx/merge {:db new-db} - (multiaccounts.update/multiaccount-update cofx - {:show-name? (get-in new-db [:multiaccount :show-name?])})))) + (let [show-name? (not (get-in db [:multiaccount :show-name?]))] + (multiaccounts.update/multiaccount-update cofx + {:show-name? show-name?} + {}))) (fx/defn on-registration-failure {:events [:ens/on-registration-failure]} @@ -171,3 +167,10 @@ {:ens/resolve-address [registry name #(re-frame/dispatch [:ens/store-name-detail name :address %])] :ens/resolve-pubkey [registry name #(re-frame/dispatch [:ens/store-name-detail name :public-key %])]} (navigation/navigate-to-cofx :ens-name-details name)))) + +(fx/defn start-registration + {:events [::add-username-pressed ::get-started-pressed]} + [{:keys [db] :as cofx}] + (fx/merge cofx + {:db (assoc-in db [:ens/registration :registering?] true)} + (navigation/navigate-to-cofx :ens-register {}))) diff --git a/src/status_im/multiaccounts/update/core.cljs b/src/status_im/multiaccounts/update/core.cljs index 445e370196..82ccd6189a 100644 --- a/src/status_im/multiaccounts/update/core.cljs +++ b/src/status_im/multiaccounts/update/core.cljs @@ -52,8 +52,8 @@ [{:method "settings_saveConfig" :params ["multiaccount" (types/serialize new-multiaccount)] :on-success on-success}]} - {:keys [name photo-path]} new-multiaccount-fields] - (if (or name photo-path) + {:keys [name photo-path prefered-name]} new-multiaccount-fields] + (if (or name photo-path prefered-name) (fx/merge cofx fx (send-multiaccount-update)) diff --git a/src/status_im/subs.cljs b/src/status_im/subs.cljs index 7f252a2cc3..9923efc72f 100644 --- a/src/status_im/subs.cljs +++ b/src/status_im/subs.cljs @@ -1807,8 +1807,9 @@ :<- [:ens/registration] :<- [:ens.stateofus/registrar] :<- [:multiaccount] - (fn [[{:keys [custom-domain? username-candidate] :as ens} registrar {:keys [accounts public-key]}] _] - {:state (or (get-in ens [:states username-candidate]) :initial) + (fn [[{:keys [custom-domain? username-candidate registering?] :as ens} registrar {:keys [accounts public-key]}]] + {:state (get-in ens [:states username-candidate]) + :registering? registering? :username username-candidate :custom-domain? (or custom-domain? false) :contract registrar @@ -1819,7 +1820,7 @@ :ens.name/screen :<- [:get-screen-params :ens-name-details] :<- [:ens/names] - (fn [[name ens] _] + (fn [[name ens]] (let [{:keys [address public-key]} (get-in ens [:details name])] {:name name :address address @@ -1831,7 +1832,7 @@ :<- [:multiaccount] :<- [:ens/preferred-name] :<- [:ens/show?] - (fn [[names multiaccount preferred-name show?] _] + (fn [[names multiaccount preferred-name show?]] {:names names :multiaccount multiaccount :preferred-name preferred-name diff --git a/src/status_im/ui/screens/ens/views.cljs b/src/status_im/ui/screens/ens/views.cljs index 9aff8d0234..67fa9fbb67 100644 --- a/src/status_im/ui/screens/ens/views.cljs +++ b/src/status_im/ui/screens/ens/views.cljs @@ -132,7 +132,6 @@ :text-color colors/gray :text-style {:font-weight "500"} :subtext (i18n/label :t/ens-locked) - :action-fn #(re-frame/dispatch [:navigate-to :ens-register]) :icon :main-icons/delete :icon-color colors/gray :active? false @@ -193,9 +192,6 @@ (defn- valid-domain? [state] (#{:registrable :owned :connected} state)) -(defn- final-state? [state] - (#{:saved :registered :registration-failed} state)) - (defn- main-icon [state] (cond (valid-domain? state) :main-icons/check @@ -433,15 +429,20 @@ [toolbar/content-title (i18n/label :t/ens-your-username)]]) (views/defview register [] - (views/letsubs [{:keys [address state] :as props} [:ens.registration/screen]] + (views/letsubs [{:keys [address state registering?] :as props} [:ens.registration/screen]] (let [checked (reagent/atom false) props (merge props {:checked checked :address (ethereum/normalized-address address)})] [react/keyboard-avoiding-view {:flex 1} [status-bar/status-bar {:type :main}] [toolbar] - (if (final-state? state) - [registration-finalized props] - [registration-pending props])]))) + ;; NOTE: this view is used both for finalized and pending registration + ;; and when the registration data is cleared for a brief moment state + ;; is nil and registration-pending show which triggers the keyboard + ;; and it's ugly + ;; TODO: something less crazy with proper separated views and routes + (if registering? + [registration-pending props] + [registration-finalized props])]))) ;; Welcome @@ -487,7 +488,7 @@ [react/view {:align-items :center :background-color colors/white :position :absolute :left 0 :right 0 :bottom 0 :border-top-width 1 :border-top-color colors/gray-lighter} - [button {:on-press #(re-frame/dispatch [:navigate-to :ens-register]) + [button {:on-press #(re-frame/dispatch [::ens/get-started-pressed]) :label (i18n/label :t/get-started)}]]]) (defn- name-item [{:keys [name action hide-chevron?]}] @@ -525,7 +526,7 @@ [react/scroll-view [react/view {:style {:margin-top 8}} [list/big-list-item {:text (i18n/label :t/ens-add-username) - :action-fn #(re-frame/dispatch [:navigate-to :ens-register]) + :action-fn #(re-frame/dispatch [::ens/add-username-pressed]) :icon :main-icons/add}]] [react/view {:style {:margin-top 22 :margin-bottom 8}} [react/text {:style {:color colors/gray :margin-horizontal 16}} @@ -558,7 +559,7 @@ (views/defview main [] (views/letsubs [{:keys [names multiaccount preferred-name show?]} [:ens.main/screen]] - [react/view {:style {:flex 1}} + [react/keyboard-avoiding-view {:style {:flex 1}} [status-bar/status-bar {:type :main}] [toolbar/simple-toolbar (i18n/label :t/ens-usernames)]