From a967de6d75d0c96e9f21ad32a6d34008a81994bd Mon Sep 17 00:00:00 2001 From: ajet Date: Fri, 18 Jul 2025 18:42:00 -0900 Subject: [PATCH] abstract @get('...') --- src/main/example/core.clj | 53 +++++++++++++++++++++++--------------- src/main/example/utils.clj | 51 +++++++++++++++++++++--------------- 2 files changed, 62 insertions(+), 42 deletions(-) diff --git a/src/main/example/core.clj b/src/main/example/core.clj index 0ddf867..3580785 100644 --- a/src/main/example/core.clj +++ b/src/main/example/core.clj @@ -4,39 +4,50 @@ [reitit.ring :as rr] [ring.util.response :as ruresp])) +(declare home-page page-2 hello-world) ;; views -(defn home-view [_] - (html->str - [:main - [:div - [:input {:data-bind "msg"}] - [:div {:data-text "$msg"}] - [:button {:data-on-click "@get('/hello-world')"} "click for text animation"]] - [:button {:data-on-click "@get('/page2')"} "go to page 2"]])) +(def home-page + {:url "/" + :view + (fn home-view [_] + (html->str + [:main + [:div + [: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"]]))}) - -(defn page2-view [_] - (html->str - [:main - [:p "this is page2"] - [:button {:data-on-click "@get('/')"} "go back to home"]])) +(def page-2 + {:url "/page2" + :view + (fn page2-view [_] + (html->str + [:main + [:p "this is page2"] + [:button {:data-on-click (u/at-get home-page)} + "go back to home"]]))}) ;; hello world animation (def message "Hello, world!") (def msg-count (count message)) -(defn hello-world [sse] - (dotimes [i msg-count] - (u/patch-signals-edn! sse {:msg (subs message 0 (inc i))}) - (Thread/sleep 500))) +(def hello-world + {:url "/hello-world" + :fn (fn hello-world [sse] + (dotimes [i msg-count] + (u/patch-signals-edn! sse {:msg (subs message 0 (inc i))}) + (Thread/sleep 500)))}) + (def routes (concat - (defpage "/" home-view) - (defpage "/page2" page2-view) - (defaction "/hello-world" hello-world) + (defpage home-page) + (defpage page-2) + (defaction hello-world) (defaction-async "/connect" u/connect-sse! u/disconnect-sse!))) (def router (rr/router routes)) diff --git a/src/main/example/utils.clj b/src/main/example/utils.clj index b010201..0402f57 100644 --- a/src/main/example/utils.clj +++ b/src/main/example/utils.clj @@ -33,6 +33,9 @@ (str "
") (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 (defn update-url-frag [url] (html->str [:script (format "history.pushState({page:1}, 'Title', '%s')" @@ -73,17 +76,6 @@ (d*/patch-elements! sse elems #:d*.elements{:patch-mode "replace" :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 (defn try! @@ -127,21 +119,38 @@ (swap! conns disj conn))) ;; 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 (fn [request respond raise_] (respond (->sse-response request - {on-open #(d*/with-open-sse % (f %))})))] + {on-open on-open-f + on-close on-close-f})))] [[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))}]])