2025-07-21 09:05:42 -09:00

68 lines
1.7 KiB
Clojure

(ns example.core
(:require
[example.utils :refer [html->str defpage defaction defaction-async keep-open] :as u]
[starfederation.datastar.clojure.expressions :refer [->expr]]
[reitit.ring :as rr]
[ring.util.response :as ruresp]))
(declare home-page page-2 hello-world)
(def message "Hello, world!")
(def msg-count (count message))
;; actions
(defaction hello-world [sse]
(dotimes [i msg-count]
(u/patch-signals-edn! sse {:msg (subs message 0 (inc i))})
(Thread/sleep 500)))
(defaction say-hi [sse_]
(u/broadcast-signals! {:msg "hello from the great beyond!"}))
;; pages
(defpage home-page
(html->str
[:main
[:div
[:input {:data-bind "msg"}]
[:div {:data-text "$msg"}]
[:button {:data-on-click (->expr (@post ~hello-world ~keep-open))}
"click for text animation"]]
[:button {:data-on-click (->expr (@post ~page-2))}
"go to page 2"]]))
(defpage page-2
(html->str
[:main
[: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"]]))
;; http app server
(def routes
(concat
(u/app-routes home-page)
;; todo frameworkify the aysnc & broadcast stuffs then all the http things
(defaction-async "/connect" u/connect-sse! u/disconnect-sse!)))
(def router (rr/router routes))
(def handler (rr/ring-handler router))
;; repl it up ;P
(comment
routes
(u/broadcast-signals! {:msg "hi franz"})
(u/broadcast-signals! {:msg "hi ty"})
(u/broadcast! d*/console-log! "hi franz")
(u/broadcast-js! "console.log('test')")
(u/broadcast-reload!)
(u/kill-broadcast!)
(clojure.repl/dir d*)
(clojure.repl/doc d*/patch-signals!))