feat(grfn/bbbg): Display flash messages

Get flash working via a functioning cookie-store session middleware, and
display flash messages if present at the top of every page.

Change-Id: If5f267dee3f41ef7954ea82667822c596e1b0474
This commit is contained in:
Griffin Smith 2021-12-13 22:43:05 -05:00
parent e7899e6c0b
commit 0286d63df7
5 changed files with 98 additions and 18 deletions

View file

@ -0,0 +1,33 @@
(ns bbbg.views.flash
(:require [clojure.spec.alpha :as s]))
(s/def :flash/type #{:success :error :warning})
(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)])])))