diff --git a/deps.edn b/deps.edn index 282a208..c287e79 100644 --- a/deps.edn +++ b/deps.edn @@ -4,7 +4,8 @@ re-frame/re-frame {:mvn/version "1.4.2"} metosin/jsonista {:mvn/version "0.3.8"} day8.re-frame/re-frame-10x {:mvn/version "1.9.3"} - thheller/shadow-cljs {:mvn/version "2.26.2"}} + thheller/shadow-cljs {:mvn/version "2.26.2"} + io.github.nenadalm/clojure-utils {:git/sha "42cbaa203eff28afe99512164874c9b57d750ba0" :git/url "https://github.com/nenadalm/clojure-tools.git"}} :aliases {:dev {:extra-paths ["dev"]} :cljfmt {:extra-deps {cljfmt/cljfmt {:mvn/version "0.9.2"}} diff --git a/shadow-cljs.edn b/shadow-cljs.edn index 66cbff9..1c6bab1 100644 --- a/shadow-cljs.edn +++ b/shadow-cljs.edn @@ -9,8 +9,8 @@ :compiler-options {:source-map true} :dev {:closure-defines {"re_frame.trace.trace_enabled_QMARK_" true}} :release {:module-hash-names true} - :devtools {:preloads [day8.re-frame-10x.preload]} - :build-hooks [(build.hook/hook)] + :devtools {:preloads [day8.re-frame-10x.preload.react-18]} + :build-hooks [(build.hook/hook {:public-dir "resources/public"})] :target :browser} :test {:target :node-test :output-to "target/node-test.js" diff --git a/src/app/autosave.cljs b/src/app/autosave.cljs deleted file mode 100644 index 737e3ce..0000000 --- a/src/app/autosave.cljs +++ /dev/null @@ -1,51 +0,0 @@ -(ns app.autosave - (:require - [re-frame.core :as re-frame] - [clojure.edn :as edn])) - -(defn init [autosave-key] - (re-frame/reg-cofx - ::autosave - (fn [coeffects _] - (assoc coeffects - :autosave - (edn/read-string - (js/window.localStorage.getItem autosave-key))))) - - (re-frame/reg-fx - ::autosave - (fn [db] - (js/window.localStorage.setItem autosave-key (pr-str db)))) - - (re-frame/reg-fx - ::autosave-remove - (fn [_] - (js/window.localStorage.removeItem autosave-key))) - - (re-frame/reg-event-fx - ::autosave - (fn [{:keys [db]}] - {::autosave db})) - - (re-frame/reg-event-fx - ::autosave-remove - (fn [_] - {::autosave-remove nil})) - - (re-frame/reg-event-fx - ::autosave-load - [(re-frame/inject-cofx ::autosave)] - (fn [cofx] - (if-let [autosave (:autosave cofx)] - {:db autosave - ::autosave-remove nil} - {}))) - - (re-frame/dispatch [::autosave-load]) - (js/document.addEventListener - "visibilitychange" - (fn [] - (case (.-visibilityState js/document) - "visible" (re-frame/dispatch [::autosave-remove]) - "hidden" (re-frame/dispatch [::autosave]) - nil)))) diff --git a/src/app/core.cljs b/src/app/core.cljs index 605f659..df822cd 100644 --- a/src/app/core.cljs +++ b/src/app/core.cljs @@ -5,7 +5,8 @@ [app.config :as config] [app.views :as views] [app.events :as events] - [app.autosave :as autosave])) + [nenadalm.clojure-utils.re-frame.autosave :as autosave] + [nenadalm.clojure-utils.cljs :as cljs-utils])) (defn mount-root [] (re-frame/clear-subscription-cache!) @@ -25,24 +26,10 @@ (when-not config/debug? (register-worker))) -(defn- prevent-screen-lock [] - (when-some [wake-lock (.-wakeLock js/navigator)] - (-> wake-lock - (.request "screen") - (.then (fn [] - (js/document.addEventListener - "visibilitychange" - (fn [_] - (when (= "visible" (.-visibilityState js/document)) - (-> wake-lock - (.request "screen") - (.catch (fn [_] (js/alert "Cannot prevent screen from locking."))))))))) - (.catch (fn [_] (js/alert "Cannot prevent screen from locking.")))))) - (defn ^:export init [] (dev-setup) (prod-setup) - (prevent-screen-lock) + (cljs-utils/prevent-screen-lock) (autosave/init "nenadalm.life-counter/autosave") (re-frame/dispatch-sync [::events/init]) (mount-root)) diff --git a/src/app/events.cljs b/src/app/events.cljs index d5b61c3..c0578b5 100644 --- a/src/app/events.cljs +++ b/src/app/events.cljs @@ -4,7 +4,8 @@ [clojure.edn :as edn] [re-frame.core :as re-frame] [reagent.core :as reagent] - [app.util :as u])) + [app.util :as u] + [nenadalm.clojure-utils.cljs :as cljs-utils])) (defn- animation-interval "https://gist.github.com/jakearchibald/cb03f15670817001b1157e62a076fe95" @@ -41,12 +42,7 @@ (re-frame/reg-cofx :app-version (fn [coeffects _] - (assoc coeffects - :app-version - (or (some-> "meta[name=app-version]" - js/document.querySelector - (.getAttribute "content")) - "unknown")))) + (assoc coeffects :app-version (cljs-utils/app-version)))) (re-frame/reg-cofx :settings diff --git a/src/build/hook.clj b/src/build/hook.clj index ffc9d55..cad9bd3 100644 --- a/src/build/hook.clj +++ b/src/build/hook.clj @@ -4,50 +4,18 @@ [build.create-manifest] [build.create-index] [build.create-worker] - [build.util :as u])) - -(defn- file->output-name [build-state] - (-> (group-by (fn [m] - (str "js/" (m :module-name))) (:shadow.build.closure/modules build-state)) - (update-vals (fn [coll] - (str "js/" (-> coll first :output-name)))))) - -(defn- path [s] - (java.nio.file.Paths/get s (make-array java.lang.String 0))) - -(defn- symlink [link target] - (let [link-path (path link) - target-rel (.relativize (.getParent link-path) - (path target))] - (.mkdirs (.toFile (.getParent link-path))) - (java.nio.file.Files/createSymbolicLink link-path target-rel (make-array java.nio.file.attribute.FileAttribute 0)))) - -(defn- copy [src target] - (let [target-f (io/file target)] - (.mkdirs (.getParentFile target-f)) - (io/copy - (io/file src) - target-f))) - -(defn- create-styles [build-mode] - (let [src "resources/private/css/styles.css"] - (case build-mode - :release - (let [hash (u/file-hash src) - target (str "resources/public/css/styles." hash ".css")] - (copy src target) - {"css/styles.css" (str "css/styles." hash ".css")}) - (do - (symlink "resources/public/css/styles.css" src) - {})))) + [nenadalm.clojure-utils.assets :as assets])) (defn hook {:shadow.build/stage :flush} - [build-state & _args] + [build-state {:keys [public-dir]}] (when-not (.exists (io/file "resources/public/worker.js")) - (let [outputs (merge (file->output-name build-state) - (create-styles (:shadow.build/mode build-state)))] - (spit "resources/public/manifest.json" (build.create-manifest/render outputs)) - (spit "resources/public/index.html" (build.create-index/render outputs)) - (spit "resources/public/worker.js" (build.create-worker/render outputs)))) + (let [assets (merge (assets/from-modules build-state {:public-dir public-dir}) + (assets/create + build-state + {:public-dir public-dir + :assets {"css/styles.css" "resources/private/css/styles.css"}}))] + (spit "resources/public/manifest.json" (build.create-manifest/render assets)) + (spit "resources/public/index.html" (build.create-index/render assets)) + (spit "resources/public/worker.js" (build.create-worker/render assets)))) build-state)