From 7b0b0673b47c8fac3d038dc284cf56841361926b Mon Sep 17 00:00:00 2001 From: ajet Date: Wed, 23 Jul 2025 10:07:06 -0900 Subject: [PATCH] add front end interval stuff --- deps.edn | 8 ++++++-- src/main/example/core.clj | 37 ++++++++++++++++++++++++++----------- src/main/example/server.clj | 5 +++-- src/main/example/utils.clj | 10 +++++++++- 4 files changed, 44 insertions(+), 16 deletions(-) diff --git a/deps.edn b/deps.edn index d158ffc..49d77cd 100644 --- a/deps.edn +++ b/deps.edn @@ -8,12 +8,16 @@ :git/sha "376c4e2411706b942ea0ab937e4c6218d24fb30f" :deps/root "sdk/clojure/adapter-ring"} datastar/expressions {:git/url "https://github.com/ramblurr/datastar-expressions/" - :git/sha "8db9d4bf5a178912ca173f67671fd9dba6b14f90"} + :git/sha "79027495e385a92ce968494b748adbdc65a780a1"} ring/ring-jetty-adapter {:mvn/version "1.13.0"} metosin/reitit {:mvn/version "0.7.2"} dev.onionpancakes/chassis {:mvn/version "1.0.365"} com.cnuernber/charred {:mvn/version "1.034"} - org.clojure/data.json {:mvn/version "2.5.1"}} + org.clojure/data.json {:mvn/version "2.5.1"} + ring-logger/ring-logger {:mvn/version "1.1.1"} + org.slf4j/slf4j-api {:mvn/version "2.0.17"} + org.slf4j/slf4j-simple {:mvn/version "2.0.17"} + } :aliases {:repl {:extra-paths ["src/dev"] diff --git a/src/main/example/core.clj b/src/main/example/core.clj index 4d2ad48..d7084fb 100644 --- a/src/main/example/core.clj +++ b/src/main/example/core.clj @@ -1,6 +1,10 @@ (ns example.core (:require - [example.utils :refer [html->str defpage defaction defaction-async keep-open] :as u] + [example.utils + :refer [html->str defpage defaction defaction-async + keep-open action-on-click navigate-on-click] + :as u] + [starfederation.datastar.clojure.api :as d*] [starfederation.datastar.clojure.expressions :refer [->expr]] [reitit.ring :as rr] [ring.util.response :as ruresp])) @@ -23,23 +27,34 @@ (defpage home-page (html->str [:main + [:pre {:data-json-signals true}] [:div - [:input {:data-bind "msg"}] - [:div {:data-text "$msg"}] - [:button {:data-on-click (->expr (@post ~hello-world ~keep-open))} + [:h2 "server side fun:"] + [:div {:data-signal "msg"}] + [:p {:data-text "$msg"}] + [:button (action-on-click hello-world) "click for text animation"]] - [:button {:data-on-click (->expr (@post ~page-2))} - "go to page 2"]])) + [:div + [:button (action-on-click say-hi) + "say hi to everyone"]] + [:a {:href page-2} + "go to back page 2"]])) (defpage page-2 (html->str [:main + [:pre {:data-json-signals true}] + [:div {:data-signals (->expr {:count 0})}] + [:div {:data-on-interval__duration.500ms + (->expr (set! $count (inc (int $count))))}] + [:div {:data-computed-msg2 (->expr (.substring "hello, world!" 0 $count))}] [:div - [:p "this is page2"] - [:button {:data-on-click (->expr (@post ~say-hi))} - "say hi to everyone"]] - [:button {:data-on-click (->expr (@post ~home-page))} - "go back to home"]])) + [:h2 "client side fun:"] + [:p {:data-text "$msg2"}] + [:button {:data-on-click (->expr (set! $count 0))} + "click for text animation"]] + [:a {:href home-page} + "go back home"]])) ;; http app server (def routes diff --git a/src/main/example/server.clj b/src/main/example/server.clj index 1d3bcd5..b6f9e90 100644 --- a/src/main/example/server.clj +++ b/src/main/example/server.clj @@ -1,7 +1,8 @@ (ns example.server (:require [example.core :as c] - [ring.adapter.jetty :as jetty]) + [ring.adapter.jetty :as jetty] + [ring.logger :as logger]) (:import org.eclipse.jetty.server.Server)) @@ -11,7 +12,7 @@ (let [opts (merge {:port 80 :join? false} opts)] (println "Starting server on port:" (:port opts)) - (jetty/run-jetty handler opts))) + (jetty/run-jetty (logger/wrap-with-logger handler) opts))) (defn stop! [server] (println "Stopping server") diff --git a/src/main/example/utils.clj b/src/main/example/utils.clj index fdaf424..1d5afe6 100644 --- a/src/main/example/utils.clj +++ b/src/main/example/utils.clj @@ -9,7 +9,9 @@ [ring.util.response :as ruresp] [starfederation.datastar.clojure.api :as d*] [starfederation.datastar.clojure.adapter.ring :refer [->sse-response on-open on-close] :as dr] - [clojure.data.json :as json])) + [clojure.data.json :as json] + [starfederation.datastar.clojure.expressions :refer [->expr]] + )) (declare conns add-elements! sse-navigate! disconnect-sse!) @@ -38,6 +40,12 @@ (def keep-open {:openWhenHidden true}) +(defn navigate-on-click [url] + {:data-on-click (->expr (@get ~url))}) + +(defn action-on-click [url] + {:data-on-click (->expr (@post ~url ~keep-open))}) + ;; 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')"