Skip to content

Instantly share code, notes, and snippets.

@jeans11

jeans11/app.cljc Secret

Last active March 7, 2023 10:15
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jeans11/c758a40842b30b11c1e324c99ab39620 to your computer and use it in GitHub Desktop.
Save jeans11/c758a40842b30b11c1e324c99ab39620 to your computer and use it in GitHub Desktop.
(ns web.app
(:require [hyperfiddle.electric :as e]
[hyperfiddle.electric-dom2 :as dom]
[hyperfiddle.electric-ui4 :as ui]
#?(:clj [datalevin.core :as d]))
(:import (hyperfiddle.electric Pending)))
#?(:clj
(defonce !conn (d/get-conn "/tmp/foo" {:item/visits {:db/cardinality :db.cardinality/many}})))
(comment
(d/close !conn)
(alter-var-root #'!conn (constantly (d/get-conn "/tmp/foo" {:item/visits {:db/cardinality :db.cardinality/many}})))
nil)
(e/def db)
#?(:clj
(defn add-item []
(d/transact! !conn [{:db/id -1 :item/id (random-uuid)}])))
#?(:clj
(defn list-items [db]
(d/q '[:find [(pull ?e [:item/id :item/visits]) ...]
:where [?e :item/id]]
db)))
#?(:clj
(defn get-item [db id]
(ffirst (d/q '[:find (pull ?e [:db/id :item/id])
:in $ ?id
:where [?e :item/id ?id]]
db id))))
#?(:clj
(defn update-item-visits [eid n]
(d/transact! !conn [{:db/id eid
:item/visits [n]}])))
#?(:clj
(defn retract-item-visits [eid visiter]
(d/transact! !conn [[:db/retract eid :item/visits visiter]])))
#?(:clj
(defn get-item-visiters [db item-id]
(first (d/q '[:find ?visits
:in $ ?id
:where [?e :item/id ?id]
[?e :item/visits ?visits]]
db item-id))))
(e/defn ListItems [!state]
(e/client
(ui/button
(e/fn [] (e/server (e/offload #(add-item)) nil))
(dom/text "+ Add an item"))
(dom/ul
(try
(e/server
(e/for-by :item/id [{:keys [item/id item/visits]} (e/offload #(list-items db))]
(e/client (dom/li (dom/on "click" (e/fn [_] (swap! !state assoc
:route :item
:id id)))
(dom/div
(dom/span (dom/text id))
(dom/span (dom/text " | "))
(dom/span (dom/text (count visits) " visiters")))))))
(catch Pending _ (dom/props {:style {:background-color "yellow"}}))))))
(e/defn Item [!state state]
(e/client
(dom/p (dom/on "click" (e/fn [_] (swap! !state assoc :route :list)))
(dom/text "< Back"))
(let [item (e/server (e/offload #(get-item db (:id state))))
item-eid (:db/id item)]
(e/server
(e/offload #(update-item-visits item-eid (:user state)))
(e/on-unmount #(do (prn "FOO") (retract-item-visits item-eid (:user state)))))
(dom/h1 (dom/text (str "Item: " (:item/id item))))
(dom/p (dom/text "Visiters: "))
(dom/ul
(e/server
(e/for [user-id (e/offload #(get-item-visiters db (:id state)))]
(e/client (dom/li (dom/text user-id)))))))))
(e/def state)
(e/defn App []
(e/server
(binding [db (e/watch !conn)]
(e/client
(let [!state (atom {:user (random-uuid)
:route :list})]
(binding [state (e/watch !state)]
(case (:route state)
:list (ListItems. !state)
:item (Item. !state state))))))))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment