-
-
Save jeans11/c758a40842b30b11c1e324c99ab39620 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(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