abstract @get('...')

This commit is contained in:
Adam Jeniski 2025-07-18 18:42:00 -09:00
parent bd6bd11519
commit a967de6d75
2 changed files with 62 additions and 42 deletions

View File

@ -4,39 +4,50 @@
[reitit.ring :as rr] [reitit.ring :as rr]
[ring.util.response :as ruresp])) [ring.util.response :as ruresp]))
(declare home-page page-2 hello-world)
;; views ;; views
(defn home-view [_] (def home-page
(html->str {:url "/"
[:main :view
[:div (fn home-view [_]
[:input {:data-bind "msg"}] (html->str
[:div {:data-text "$msg"}] [:main
[:button {:data-on-click "@get('/hello-world')"} "click for text animation"]] [:div
[:button {:data-on-click "@get('/page2')"} "go to page 2"]])) [:input {:data-bind "msg"}]
[:div {:data-text "$msg"}]
[:button {:data-on-click (u/at-get hello-world)}
"click for text animation"]]
[:button {:data-on-click (u/at-get page-2)} "go to page 2"]]))})
(def page-2
(defn page2-view [_] {:url "/page2"
(html->str :view
[:main (fn page2-view [_]
[:p "this is page2"] (html->str
[:button {:data-on-click "@get('/')"} "go back to home"]])) [:main
[:p "this is page2"]
[:button {:data-on-click (u/at-get home-page)}
"go back to home"]]))})
;; hello world animation ;; hello world animation
(def message "Hello, world!") (def message "Hello, world!")
(def msg-count (count message)) (def msg-count (count message))
(defn hello-world [sse] (def hello-world
(dotimes [i msg-count] {:url "/hello-world"
(u/patch-signals-edn! sse {:msg (subs message 0 (inc i))}) :fn (fn hello-world [sse]
(Thread/sleep 500))) (dotimes [i msg-count]
(u/patch-signals-edn! sse {:msg (subs message 0 (inc i))})
(Thread/sleep 500)))})
(def routes (def routes
(concat (concat
(defpage "/" home-view) (defpage home-page)
(defpage "/page2" page2-view) (defpage page-2)
(defaction "/hello-world" hello-world) (defaction hello-world)
(defaction-async "/connect" u/connect-sse! u/disconnect-sse!))) (defaction-async "/connect" u/connect-sse! u/disconnect-sse!)))
(def router (rr/router routes)) (def router (rr/router routes))

View File

@ -33,6 +33,9 @@
(str "<div data-on-load=\"@get('connect')\"></div>") (str "<div data-on-load=\"@get('connect')\"></div>")
(string/replace "%%content%%" content))) (string/replace "%%content%%" content)))
(defn at-get [page-or-action]
(format "@get('%s')" (:url page-or-action)))
;; fix. use replaceState api? or push some real state? back button doesn't work yet ;; fix. use replaceState api? or push some real state? back button doesn't work yet
(defn update-url-frag [url] (defn update-url-frag [url]
(html->str [:script (format "history.pushState({page:1}, 'Title', '%s')" (html->str [:script (format "history.pushState({page:1}, 'Title', '%s')"
@ -73,17 +76,6 @@
(d*/patch-elements! sse elems #:d*.elements{:patch-mode "replace" (d*/patch-elements! sse elems #:d*.elements{:patch-mode "replace"
:selector "main"})) :selector "main"}))
(defn defaction-async [url on-open-f on-close-f]
(let [sse-handler
(fn [request respond raise_]
(respond
(->sse-response
request
{on-open on-open-f
on-close on-close-f})))]
[[url sse-handler]
[(str "/sse" url) sse-handler]]))
;; broadcast utils ;; broadcast utils
(defn try! (defn try!
@ -127,21 +119,38 @@
(swap! conns disj conn))) (swap! conns disj conn)))
;; http stuffs ;; http stuffs
(defn defaction [url f] (defn defpage
([page]
(defpage (:url page) (:view page)))
([endpoint view]
[[endpoint
{:handler (fn [request respond _]
(page request respond endpoint view))}]
[(str "/sse" endpoint)
{:handler (fn [request respond _]
(page request respond endpoint view))}]]))
(defn defaction
([action]
(defaction (:url action) (:fn action)))
([url f]
(let [sse-handler
(fn [request respond raise_]
(respond
(->sse-response
request
{on-open #(d*/with-open-sse % (f %))})))]
[[url sse-handler]
[(str "/sse" url) sse-handler]])))
(defn defaction-async [url on-open-f on-close-f]
(let [sse-handler (let [sse-handler
(fn [request respond raise_] (fn [request respond raise_]
(respond (respond
(->sse-response (->sse-response
request request
{on-open #(d*/with-open-sse % (f %))})))] {on-open on-open-f
on-close on-close-f})))]
[[url sse-handler] [[url sse-handler]
[(str "/sse" url) sse-handler]])) [(str "/sse" url) sse-handler]]))
(defn defpage [endpoint view]
[[endpoint
{:handler (fn [request respond _]
(page request respond endpoint view))}]
[(str "/sse" endpoint)
{:handler (fn [request respond _]
(page request respond endpoint view))}]])