(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!))