-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathcore.cljs
81 lines (70 loc) · 3.09 KB
/
core.cljs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
(ns clj-stack.core
(:require-macros [cljs.core.async.macros :refer [go]])
(:require [om.core :as om]
[om.dom :as dom]
[cljs.core.async :refer [chan put! <!]]))
(enable-console-print!)
(def app-model (atom {:videos
[{:id 1 :title "Intro to Datomic" :url "http://www.youtube.com/embed/RKcqYZZ9RDY"}
{:id 2 :title "The Functional Final Frontier" :url "http://www.youtube.com/embed/DMtwq3QtddY"}]}))
(defn add-video [videos owner]
(let [title (-> (om/get-node owner "new-video-title") .-value)
url (-> (om/get-node owner "new-video-url") .-value)]
(om/transact! videos #(conj % {:id (rand-int 1000) :title title :url url}))
(println "app-model: " @app-model)
(om/set-state! owner :new-video-name "")
(om/set-state! owner :new-video-url "")))
(defn new-video-view [videos owner]
(reify
om/IInitState
(init-state [_] {:new-video-name "" :new-video-url ""})
om/IRenderState
(render-state [_ state]
(dom/div nil
(dom/input #js {:ref "new-video-title" :type "text" :placeholder "Title"
:value (:new-video-name state)
:onChange #(om/set-state! owner :new-video-name (.. % -target -value))})
(dom/input #js {:ref "new-video-url" :type "text" :placeholder "URL"
:value (:new-video-url state)
:onChange #(om/set-state! owner :new-video-url (.. % -target -value))})
(dom/button #js {:onClick #(add-video videos owner)} "Add")))))
(defn video-view [video owner]
(reify om/IRenderState
(render-state [_ {:keys [delete_channel]}]
(dom/li #js {:className "col-sm-4"}
;(dom/a #js {:href (:url video)} (:title video))
(dom/div #js {:className "embed-responsive embed-responsive-4by3"}
(dom/iframe #js {:className "embed-responsive-item"
:src (:url video)}))
(dom/button #js {:className "btn btn-danger btn-xs pull-right"
:onClick #(put! delete_channel @video)} "Remove" )))))
(defn videos-view [videos owner]
(reify
om/IInitState
(init-state [_] {:delete_channel (chan)})
om/IWillMount
(will-mount [_]
(let [delete_channel (om/get-state owner :delete_channel)]
(go (loop []
(let [del-video (<! delete_channel)]
(om/transact! videos
(fn [vs] (vec (remove #(= % del-video) vs))))
(recur))))))
om/IRenderState
(render-state [_ {:keys [delete_channel]}]
(apply dom/ul #js {:className "row"}
(om/build-all video-view videos
{:init-state {:delete_channel delete_channel}})))))
(defn app-view [model owner]
(reify om/IRender
(render [_]
(dom/div nil
(dom/div #js {:className "page-header"}
(dom/h2 nil "Poor man's YouTube"))
(om/build videos-view (:videos model))
(dom/hr nil)
(om/build new-video-view (:videos model))))))
(om/root
app-view
app-model
{:target (. js/document (getElementById "app"))})