62 lines
1.7 KiB
Plaintext
62 lines
1.7 KiB
Plaintext
|
(ns chat-demo.client
|
||
|
(:require
|
||
|
[dommy.core :as dom :refer-macros [by-id]]
|
||
|
goog.net.BrowserChannel
|
||
|
goog.events.KeyHandler
|
||
|
[goog.events.KeyCodes :as key-codes]
|
||
|
[goog.events :as events]))
|
||
|
|
||
|
(defonce channel (goog.net.BrowserChannel.))
|
||
|
|
||
|
(defn say [text]
|
||
|
(.sendMap channel (clj->js {:msg text})))
|
||
|
|
||
|
(defn toggle-element [elem]
|
||
|
(if (dom/attr elem :disabled)
|
||
|
(dom/remove-attr! elem :disabled)
|
||
|
(dom/set-attr! elem :disabled)))
|
||
|
|
||
|
(defn enable-chat []
|
||
|
(let [msg-input (by-id "msg-input")
|
||
|
send-button (by-id "send-button")
|
||
|
send-message (fn [e]
|
||
|
(say (dom/value msg-input))
|
||
|
(dom/set-value! msg-input ""))]
|
||
|
(toggle-element msg-input)
|
||
|
(toggle-element send-button)
|
||
|
(events/listen
|
||
|
(goog.events.KeyHandler. msg-input)
|
||
|
"key"
|
||
|
(fn [e]
|
||
|
(when (= (.-keyCode e) key-codes/ENTER)
|
||
|
(send-message e))))
|
||
|
(events/listen
|
||
|
send-button
|
||
|
"click"
|
||
|
send-message)))
|
||
|
|
||
|
(defn handler []
|
||
|
(let [h (goog.net.BrowserChannel.Handler.)]
|
||
|
(set! (.-channelOpened h)
|
||
|
(fn [channel]
|
||
|
(enable-chat)))
|
||
|
(set! (.-channelHandleArray h)
|
||
|
(fn [channel data]
|
||
|
(let [data (js->clj data)
|
||
|
msg (get data "msg")]
|
||
|
(dom/append! (by-id "room")
|
||
|
(-> (dom/create-element "div")
|
||
|
(dom/set-text! (str "MSG::" msg)))))))
|
||
|
h))
|
||
|
|
||
|
(defn ^:export run []
|
||
|
(events/listen
|
||
|
js/window "unload"
|
||
|
(fn []
|
||
|
(.disconnect channel)
|
||
|
(events/removeAll)))
|
||
|
(doto (.. channel getChannelDebug getLogger)
|
||
|
(.setLevel goog.debug.Logger.Level.OFF))
|
||
|
(doto channel
|
||
|
(.setHandler (handler))
|
||
|
(.connect "/channel/test" "/channel/bind")))
|