add front end interval stuff

This commit is contained in:
Adam Jeniski 2025-07-23 10:07:06 -09:00
parent 7eacce84c7
commit 7b0b0673b4
4 changed files with 44 additions and 16 deletions

View File

@ -8,12 +8,16 @@
:git/sha "376c4e2411706b942ea0ab937e4c6218d24fb30f" :git/sha "376c4e2411706b942ea0ab937e4c6218d24fb30f"
:deps/root "sdk/clojure/adapter-ring"} :deps/root "sdk/clojure/adapter-ring"}
datastar/expressions {:git/url "https://github.com/ramblurr/datastar-expressions/" 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"} ring/ring-jetty-adapter {:mvn/version "1.13.0"}
metosin/reitit {:mvn/version "0.7.2"} metosin/reitit {:mvn/version "0.7.2"}
dev.onionpancakes/chassis {:mvn/version "1.0.365"} dev.onionpancakes/chassis {:mvn/version "1.0.365"}
com.cnuernber/charred {:mvn/version "1.034"} 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 :aliases
{:repl {:extra-paths ["src/dev"] {:repl {:extra-paths ["src/dev"]

View File

@ -1,6 +1,10 @@
(ns example.core (ns example.core
(:require (: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]] [starfederation.datastar.clojure.expressions :refer [->expr]]
[reitit.ring :as rr] [reitit.ring :as rr]
[ring.util.response :as ruresp])) [ring.util.response :as ruresp]))
@ -23,23 +27,34 @@
(defpage home-page (defpage home-page
(html->str (html->str
[:main [:main
[:pre {:data-json-signals true}]
[:div [:div
[:input {:data-bind "msg"}] [:h2 "server side fun:"]
[:div {:data-text "$msg"}] [:div {:data-signal "msg"}]
[:button {:data-on-click (->expr (@post ~hello-world ~keep-open))} [:p {:data-text "$msg"}]
[:button (action-on-click hello-world)
"click for text animation"]] "click for text animation"]]
[:button {:data-on-click (->expr (@post ~page-2))} [:div
"go to page 2"]])) [:button (action-on-click say-hi)
"say hi to everyone"]]
[:a {:href page-2}
"go to back page 2"]]))
(defpage page-2 (defpage page-2
(html->str (html->str
[:main [: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 [:div
[:p "this is page2"] [:h2 "client side fun:"]
[:button {:data-on-click (->expr (@post ~say-hi))} [:p {:data-text "$msg2"}]
"say hi to everyone"]] [:button {:data-on-click (->expr (set! $count 0))}
[:button {:data-on-click (->expr (@post ~home-page))} "click for text animation"]]
"go back to home"]])) [:a {:href home-page}
"go back home"]]))
;; http app server ;; http app server
(def routes (def routes

View File

@ -1,7 +1,8 @@
(ns example.server (ns example.server
(:require (:require
[example.core :as c] [example.core :as c]
[ring.adapter.jetty :as jetty]) [ring.adapter.jetty :as jetty]
[ring.logger :as logger])
(:import (:import
org.eclipse.jetty.server.Server)) org.eclipse.jetty.server.Server))
@ -11,7 +12,7 @@
(let [opts (merge {:port 80 :join? false} (let [opts (merge {:port 80 :join? false}
opts)] opts)]
(println "Starting server on port:" (:port 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] (defn stop! [server]
(println "Stopping server") (println "Stopping server")

View File

@ -9,7 +9,9 @@
[ring.util.response :as ruresp] [ring.util.response :as ruresp]
[starfederation.datastar.clojure.api :as d*] [starfederation.datastar.clojure.api :as d*]
[starfederation.datastar.clojure.adapter.ring :refer [->sse-response on-open on-close] :as dr] [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!) (declare conns add-elements! sse-navigate! disconnect-sse!)
@ -38,6 +40,12 @@
(def keep-open {:openWhenHidden true}) (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 ;; 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')"