about summary refs log tree commit diff
path: root/users/aspen/bbbg/src/bbbg/views/flash.clj
blob: a44b21d4cb24c84b2459e27db03db6d96adf5589 (plain) (blame)
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
(ns bbbg.views.flash
  (:require [clojure.spec.alpha :as s]))

(s/def :flash/type #{:success :error :warning :info})
(s/def :flash/message string?)
(s/def ::flash (s/keys :req [:flash/type :flash/message]))
(s/fdef add-flash :args (s/cat :resp map? :flash ::flash) :ret map?)

;;;

(def ^:dynamic *flash* nil)

(defn wrap-page-flash [handler]
  (fn
    ([request]
     (binding [*flash* (:flash request)]
       (handler request)))
    ([request respond raise]
     (binding [*flash* (:flash request)]
       (handler request respond raise)))))

(defn add-flash [resp flash]
  (update-in resp [:flash :flash/messages] conj flash))

(defn render-flash
  ([] (render-flash *flash*))
  ([flash]
   (when-some [messages (not-empty (:flash/messages flash))]
     [:ul.flash-messages
      (for [message messages]
        [:li.flash-message
         {:class (str "flash-" (-> message :flash/type name))}
         (:flash/message message)])])))

(def test-flash
  {:flash/messages
   (for [type [:success :error :warning :info]]
     {:flash/type type
      :flash/message (str "Sample " type " message")})})