diff --git a/src/syng_im/components/chat/plain_message_input.cljs b/src/syng_im/components/chat/plain_message_input.cljs index 0e230bbcd8..0607da5f94 100644 --- a/src/syng_im/components/chat/plain_message_input.cljs +++ b/src/syng_im/components/chat/plain_message_input.cljs @@ -31,7 +31,8 @@ (defn plain-message-input-view [] (let [chat (subscribe [:get-current-chat]) - input-message-atom (subscribe [:get-chat-input-text])] + input-message-atom (subscribe [:get-chat-input-text]) + staged-commands-atom (subscribe [:get-chat-staged-commands])] (fn [] (let [input-message @input-message-atom] [view {:style {:flexDirection "column"}} @@ -67,7 +68,8 @@ :marginRight 18 :width 20 :height 20}}] - (when (< 0 (count input-message)) + (when (or (< 0 (count input-message)) + (< 0 (count @staged-commands-atom))) [touchable-highlight {:on-press (fn [] (send @chat input-message))} [view {:style {:marginTop 10 diff --git a/src/syng_im/handlers.cljs b/src/syng_im/handlers.cljs index 4d7d2caecb..b3d806cfdc 100644 --- a/src/syng_im/handlers.cljs +++ b/src/syng_im/handlers.cljs @@ -2,7 +2,7 @@ (:require [re-frame.core :refer [register-handler after dispatch]] [schema.core :as s :include-macros true] - [syng-im.db :refer [app-db schema]] + [syng-im.db :as db :refer [app-db schema]] [syng-im.protocol.api :refer [init-protocol]] [syng-im.protocol.protocol-handler :refer [make-handler]] [syng-im.models.protocol :refer [update-identity @@ -24,7 +24,8 @@ [syng-im.handlers.suggestions :refer [get-command handle-command get-command-handler - load-commands]] + load-commands + apply-staged-commands]] [syng-im.handlers.sign-up :as sign-up-service] [syng-im.models.chats :refer [create-chat]] @@ -36,7 +37,8 @@ set-chat-input-text]] [syng-im.utils.logging :as log] [syng-im.protocol.api :as api] - [syng-im.constants :refer [text-content-type]] + [syng-im.constants :refer [text-content-type + content-type-command]] [syng-im.navigation :refer [nav-push]] [syng-im.utils.crypt :refer [gen-random-bytes]])) @@ -143,25 +145,56 @@ (let [{:keys [chat-id]} (message-by-id msg-id)] (signal-chat-updated db chat-id)))) +(defn send-staged-commands [db chat-id] + (let [staged-commands (get-in db (db/chat-staged-commands-path chat-id))] + (dorun + (map + (fn [staged-command] + (let [command-key (get-in staged-command [:command :command]) + content (commands/format-command-msg-content command-key + (:content staged-command)) + msg (if (= chat-id "console") + (sign-up-service/send-console-command db command-key content) + ;; TODO handle command, now sends as plain message + (let [{msg-id :msg-id + {from :from + to :to} :msg} (api/send-user-msg {:to chat-id + :content content})] + {:msg-id msg-id + :from from + :to to + :content content + :content-type content-type-command + :outgoing true}))] + (save-message chat-id msg))) + staged-commands)) + db)) + (register-handler :send-chat-msg (fn [db [action chat-id text]] (log/debug action "chat-id" chat-id "text" text) (if-let [command (get-command db text)] - (dispatch [:set-chat-command (:command command)]) - (let [msg (if (= chat-id "console") - (sign-up-service/send-console-msg text) - (let [{msg-id :msg-id - {from :from - to :to} :msg} (api/send-user-msg {:to chat-id - :content text})] - {:msg-id msg-id - :from from - :to to - :content text - :content-type text-content-type - :outgoing true}))] - (save-message chat-id msg) - (signal-chat-updated db chat-id))))) + (do (dispatch [:set-chat-command (:command command)]) + db) + (let [msg (when (< 0 (count text)) + (if (= chat-id "console") + (sign-up-service/send-console-msg text) + (let [{msg-id :msg-id + {from :from + to :to} :msg} (api/send-user-msg {:to chat-id + :content text})] + {:msg-id msg-id + :from from + :to to + :content text + :content-type text-content-type + :outgoing true})))] + (when msg + (save-message chat-id msg)) + (-> db + (send-staged-commands chat-id) + (apply-staged-commands) + (signal-chat-updated chat-id)))))) (register-handler :send-chat-command (fn [db [action chat-id command content]] @@ -266,7 +299,7 @@ (let [db (set-chat-input-text db nil) command-info {:command command :content content - :handler (get-command-handler db command content)}] + :handler (get-command-handler db (:command command) content)}] (stage-command db command-info)))) (register-handler :unstage-command diff --git a/src/syng_im/handlers/sign_up.cljs b/src/syng_im/handlers/sign_up.cljs index 3231629394..8b366d08bf 100644 --- a/src/syng_im/handlers/sign_up.cljs +++ b/src/syng_im/handlers/sign_up.cljs @@ -188,7 +188,7 @@ {:msg-id (random/id) :from "me" :to "console" - :content (commands/format-command-msg-content command-key content) + :content content ;; (commands/format-command-msg-content command-key content) :content-type content-type-command :outgoing true}) diff --git a/src/syng_im/handlers/suggestions.cljs b/src/syng_im/handlers/suggestions.cljs index 0d4796df97..3fabb0dd2d 100644 --- a/src/syng_im/handlers/suggestions.cljs +++ b/src/syng_im/handlers/suggestions.cljs @@ -6,7 +6,8 @@ suggestions get-commands get-chat-command-request - get-chat-command-to-msg-id]] + get-chat-command-to-msg-id + clear-staged-commands]] [syng-im.utils.utils :refer [log on-error http-get]] [syng-im.utils.logging :as log])) @@ -33,6 +34,14 @@ (fn [] (command-handler to-msg-id command-key content))))) +(defn apply-staged-commands [db] + (let [staged-commands (get-in db (db/chat-staged-commands-path (current-chat-id db)))] + (dorun (map (fn [staged-command] + (when-let [handler (:handler staged-command)] + (handler))) + staged-commands)) + (clear-staged-commands db))) + (defn execute-commands-js [body] (.eval js/window body) (let [commands (.-commands js/window)] diff --git a/src/syng_im/models/commands.cljs b/src/syng_im/models/commands.cljs index 8db450b9ec..9944950ea1 100644 --- a/src/syng_im/models/commands.cljs +++ b/src/syng_im/models/commands.cljs @@ -114,6 +114,9 @@ (fn [staged-commands] (filterv #(not= % staged-command) staged-commands)))) +(defn clear-staged-commands [db] + (assoc-in db (db/chat-staged-commands-path (current-chat-id db)) [])) + (defn get-chat-command-request [db] (get-in db (db/chat-command-request-path (current-chat-id db) (get-chat-command-to-msg-id db))))