This repository has been archived on 2023-07-11. You can view files and clone it, but cannot push or open issues or pull requests.
clj-browserchannel/chat-demo/src/chat_demo/client.cljs
Gered 0e76a0347c fix chat-demo
- dependencies updated
- removed old netty adapter code
- generally converted it into something more resembling a modern clojure
  web app
2016-05-07 16:20:54 -04:00

62 lines
1.7 KiB
Clojure

(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")))