diff --git a/src/status_im/accounts/handlers.cljs b/src/status_im/accounts/handlers.cljs index 37e25a8134..3345325e54 100644 --- a/src/status_im/accounts/handlers.cljs +++ b/src/status_im/accounts/handlers.cljs @@ -16,7 +16,8 @@ [status-im.utils.handlers :as u :refer [get-hashtags]] [status-im.accounts.statuses :as statuses] [status-im.utils.gfycat.core :refer [generate-gfy]] - [status-im.constants :refer [console-chat-id]])) + [status-im.constants :refer [console-chat-id]] + [status-im.utils.scheduler :as s])) (defn save-account [_ [_ account]] @@ -29,29 +30,29 @@ (update db :accounts assoc address account)))) (defn account-created [result password] - (let [data (json->clj result) + (let [data (json->clj result) public-key (:pubkey data) - address (:address data) - mnemonic (:mnemonic data) + address (:address data) + mnemonic (:mnemonic data) {:keys [public private]} (protocol/new-keypair!) - account {:public-key public-key - :address address - :name (generate-gfy) - :status (rand-nth statuses/data) - :signed-up? true - :updates-public-key public - :updates-private-key private - :photo-path (identicon public-key)}] + account {:public-key public-key + :address address + :name (generate-gfy) + :status (rand-nth statuses/data) + :signed-up? true + :updates-public-key public + :updates-private-key private + :photo-path (identicon public-key)}] (log/debug "account-created") (when-not (str/blank? public-key) - (do - (dispatch [:add-account account]) - (dispatch [:show-mnemonic mnemonic]) - (dispatch [:login-account address password]))))) + (dispatch [:show-mnemonic mnemonic]) + (dispatch [:add-account account]) + (dispatch [:login-account address password true])))) (register-handler :create-account (u/side-effect! (fn [_ [_ password]] + (s/execute-later #(dispatch [:account-generation-message]) 400) (status/create-account password #(account-created % password))))) @@ -89,7 +90,7 @@ (register-handler :account-update (-> (fn [{:keys [current-account-id accounts] :as db} [_ data]] - (let [data (assoc data :last-updated (time/now-ms)) + (let [data (assoc data :last-updated (time/now-ms)) account (merge (get accounts current-account-id) data)] (assoc-in db [:accounts current-account-id] account))) ((after save-account!)) @@ -100,7 +101,7 @@ (u/side-effect! (fn [{:keys [current-account-id accounts]} _] (let [{:keys [last-updated]} (get accounts current-account-id) - now (time/now-ms) + now (time/now-ms) needs-update? (> (- now last-updated) time/week)] (log/info "Need to send account-update: " needs-update?) (when needs-update? diff --git a/src/status_im/accounts/login/handlers.cljs b/src/status_im/accounts/login/handlers.cljs index 2def56bfc1..1288d8fa37 100644 --- a/src/status_im/accounts/login/handlers.cljs +++ b/src/status_im/accounts/login/handlers.cljs @@ -49,7 +49,7 @@ (register-handler :login-account - (u/side-effect! + (after (fn [db [_ address password]] (status/login address password (fn [result] @@ -59,4 +59,6 @@ (log/debug "Logged in account: ") (if success (logged-in db address) - (dispatch [:set-in [:login :error] error])))))))) + (dispatch [:set-in [:login :error] error]))))))) + (fn [db [_ _ _ account-creation?]] + (assoc db :account-creation? account-creation?))) diff --git a/src/status_im/chat/handlers.cljs b/src/status_im/chat/handlers.cljs index 7fff61210c..82d676d4c1 100644 --- a/src/status_im/chat/handlers.cljs +++ b/src/status_im/chat/handlers.cljs @@ -205,6 +205,7 @@ (if (chats console-chat-id) db (do + (dispatch [:add-contacts [sign-up-service/console-contact]]) (chats/save new-chat) (contacts/save-all [sign-up-service/console-contact]) (sign-up-service/intro) @@ -220,10 +221,17 @@ (fn [db _] (init-console-chat db false))) +(register-handler :account-generation-message + (u/side-effect! + (fn [{:keys [chats]}] + (when (> 4 (count (get-in chats [console-chat-id :messages]))) + (sign-up-service/account-generation-message))))) + (register-handler :show-mnemonic (u/side-effect! - (fn [_ [_ mnemonic]] - (sign-up-service/passpharse-messages mnemonic)))) + (fn [{:keys [chats]} [_ mnemonic]] + (let [messages-count (count (get-in chats [console-chat-id :messages]))] + (sign-up-service/passpharse-messages mnemonic messages-count))))) (register-handler :sign-up (after (fn [_ [_ phone-number]] @@ -277,23 +285,27 @@ ((after load-commands!)))) (defn initialize-chats - [{:keys [loaded-chats] :as db} _] - (let [chats (->> loaded-chats - (map (fn [{:keys [chat-id] :as chat}] - (let [last-message (messages/get-last-message chat-id)] - [chat-id (assoc chat :last-message last-message)]))) - (into {})) - ids (set (keys chats))] + [{:keys [loaded-chats account-creation? chats] :as db} _] + (let [chats' (if account-creation? + chats + (->> loaded-chats + (map (fn [{:keys [chat-id] :as chat}] + (let [last-message (messages/get-last-message db chat-id)] + [chat-id (assoc chat :last-message last-message)]))) + (into {}))) + ids (set (keys chats'))] (-> db - (assoc :chats chats) + (assoc :chats chats') (assoc :chats-ids ids) (dissoc :loaded-chats) (init-console-chat true)))) (defn load-chats! - [db _] - (assoc db :loaded-chats (chats/get-all))) + [{:keys [account-creation?] :as db} _] + (if account-creation? + db + (assoc db :loaded-chats (chats/get-all)))) ;TODO: check if its new account / signup status / create console chat (register-handler :initialize-chats diff --git a/src/status_im/chat/handlers/receive_message.cljs b/src/status_im/chat/handlers/receive_message.cljs index ae84d19b01..9d74bd754c 100644 --- a/src/status_im/chat/handlers/receive_message.cljs +++ b/src/status_im/chat/handlers/receive_message.cljs @@ -9,7 +9,8 @@ content-type-command-request]] [cljs.reader :refer [read-string]] [status-im.data-store.chats :as chats] - [taoensso.timbre :as log])) + [taoensso.timbre :as log] + [status-im.utils.scheduler :as s])) (defn check-preview [{:keys [content] :as message}] (if-let [preview (:preview content)] @@ -44,7 +45,7 @@ (not= from current-identity) (or (not exists?) active?)) (let [group-chat? (not (nil? group-id)) - previous-message (messages/get-last-message chat-id') + previous-message (messages/get-last-message db chat-id') message' (assoc (->> message (cu/check-author-direction previous-message) (check-preview)) @@ -73,9 +74,9 @@ (u/side-effect! (fn [_ [_ {:keys [from to payload]}]] (dispatch [:received-message (merge payload - {:from from - :to to - :chat-id from})])))) + {:from from + :to to + :chat-id from})])))) (register-handler :received-message (u/side-effect! @@ -85,3 +86,17 @@ (register-handler ::add-message (fn [db [_ add-to-chat-id {:keys [chat-id new?] :as message}]] (cu/add-message-to-db db add-to-chat-id chat-id message new?))) + +(defn commands-loaded? [db chat-id] + (get-in db [:chats chat-id :commands-loaded])) + +(def timeout 50) + +(register-handler :received-message-when-commands-loaded + (u/side-effect! + (fn [db [_ chat-id message]] + (if (commands-loaded? db chat-id) + (dispatch [:received-message message]) + (s/execute-later + #(dispatch [:received-message-when-commands-loaded chat-id message]) + timeout))))) diff --git a/src/status_im/chat/sign_up.cljs b/src/status_im/chat/sign_up.cljs index 94ba4db267..5249fe5130 100644 --- a/src/status_im/chat/sign_up.cljs +++ b/src/status_im/chat/sign_up.cljs @@ -105,16 +105,27 @@ :to "me"}]))) ;; -- Saving password ---------------------------------------- -(defn passpharse-messages [mnemonic] +(defn account-generation-message [] (dispatch [:received-message {:message-id (random/id) - :content (label :t/here-is-your-passphrase) + :content (label :t/account-generation-message) :content-type text-content-type :outgoing false :chat-id console-chat-id :from console-chat-id - :to "me" - :new? false}]) + :to "me"}])) + +(defn passpharse-messages [mnemonic messages-count] + (dispatch [:received-message + {:message-id (random/id) + :content (if (> messages-count 3) + (label :t/phew-here-is-your-passphrase) + (label :t/here-is-your-passphrase)) + :content-type text-content-type + :outgoing false + :chat-id console-chat-id + :from console-chat-id + :to "me"}]) (dispatch [:received-message {:message-id (random/id) :content mnemonic @@ -122,8 +133,7 @@ :outgoing false :chat-id console-chat-id :from console-chat-id - :to "me" - :new? false}]) + :to "me"}]) ;; TODO highlight '!phone' (start-signup)) @@ -138,7 +148,8 @@ (defn intro [] (dispatch [:received-message intro-status]) - (dispatch [:received-message + (dispatch [:received-message-when-commands-loaded + console-chat-id {:chat-id console-chat-id :message-id "intro-message1" :content (command-content diff --git a/src/status_im/chat/styles/message.cljs b/src/status_im/chat/styles/message.cljs index 4a1a1379b2..1437dba3ac 100644 --- a/src/status_im/chat/styles/message.cljs +++ b/src/status_im/chat/styles/message.cljs @@ -266,4 +266,4 @@ (defn new-message-container [margin on-top?] {:background-color color-white :margin-bottom margin - :elevation (if on-top? 6 5)}) \ No newline at end of file + :elevation (if on-top? 6 5)}) diff --git a/src/status_im/chat/views/request_message.cljs b/src/status_im/chat/views/request_message.cljs index 36b3d556a6..e77cca3035 100644 --- a/src/status_im/chat/views/request_message.cljs +++ b/src/status_im/chat/views/request_message.cljs @@ -53,7 +53,7 @@ :loop? loop?}] (r/create-class {:component-did-mount - (if @answered? #(request-button-animation-logic context) (fn [])) + (if @answered? (fn []) #(request-button-animation-logic context)) :component-will-unmount #(reset! loop? false) :reagent-render diff --git a/src/status_im/data_store/messages.cljs b/src/status_im/data_store/messages.cljs index 502e0c7b1d..67a472dced 100644 --- a/src/status_im/data_store/messages.cljs +++ b/src/status_im/data_store/messages.cljs @@ -80,10 +80,12 @@ message)))))) (defn get-last-message - [chat-id] - (let [{:keys [content-type] :as message} (data-store/get-last-message chat-id)] - (when (and message (command-type? content-type)) - (clojure.core/update message :content str-to-map)))) + [{:keys [chats] :as db} chat-id] + (if-let [message (first (get-in db [:chats chat-id :messages]))] + message + (let [{:keys [content-type] :as message} (data-store/get-last-message chat-id)] + (when (and message (command-type? content-type)) + (clojure.core/update message :content str-to-map))))) (defn get-unviewed [] diff --git a/src/status_im/handlers.cljs b/src/status_im/handlers.cljs index 9af4d6877b..152e8f1de0 100644 --- a/src/status_im/handlers.cljs +++ b/src/status_im/handlers.cljs @@ -42,15 +42,16 @@ (assoc-in db [:animations k] v))) (register-handler :initialize-db - (fn [_ _] + (fn [{:keys [status-module-initialized?]} _] (data-store/init) - (assoc app-db :current-account-id nil))) + (let [db' (assoc app-db :current-account-id nil)] + (if status-module-initialized? + (assoc db' :status-module-initialized? true) + db')))) (register-handler :initialize-account-db (fn [db _] - (assoc db - :chats {} - :current-chat-id console-chat-id))) + (assoc db :current-chat-id console-chat-id))) (register-handler :initialize-account (u/side-effect! diff --git a/src/status_im/translations/en.cljs b/src/status_im/translations/en.cljs index b02e68d269..59a8ca8979 100644 --- a/src/status_im/translations/en.cljs +++ b/src/status_im/translations/en.cljs @@ -85,11 +85,13 @@ :incorrect-code (str "Sorry the code was incorrect, please enter again") :generate-passphrase (str "I'll generate a passphrase for you so you can restore your " "access or log in from another device") + :phew-here-is-your-passphrase "*Phew* that was hard, here is your passphrase, *write this down and keep this safe!* You will need it to recover your account." :here-is-your-passphrase "Here is your passphrase, *write this down and keep this safe!* You will need it to recover your account." :written-down "Make sure you had securely written it down" :phone-number-required "Tap here to enter your phone number & I'll find your friends" :intro-status "Chat with me to setup your account and change your settings!" :intro-message1 "Welcome to Status\nTap this message to set your password & get started!" + :account-generation-message "Gimmie a sec, I gotta do some crazy math to generate your account!" ;chats :chats "Chats"