(ns uxbox.data.load (:require [hodgepodge.core :refer [local-storage]] [uxbox.rstore :as rs] [uxbox.router :as r] [uxbox.state :as st] [uxbox.schema :as sc] [uxbox.data.projects :as dp] [bouncer.validators :as v])) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Helpers ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defn assoc-color "A reduce function for assoc the project to the state map." [state color-coll] (let [uuid (:id color-coll)] (update state :colors-by-id assoc uuid color-coll))) (defn assoc-shape [state shape] (let [id (:id shape)] (update state :shapes-by-id assoc id shape))) (defn persist-state [state] (let [pages (into #{} (vals (:pages-by-id state))) projects (into #{} (vals (:projects-by-id state))) shapes (into #{} (vals (:shapes-by-id state))) color-colls (into #{} (vals (:colors-by-id state)))] (assoc! local-storage :data {:pages pages :shapes shapes :projects projects :color-collections color-colls}))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Events ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defn load-data "Load data from local storage." [] (reify rs/UpdateEvent (-apply-update [_ state] (if-let [data (get local-storage :data nil)] (as-> state $ (reduce dp/assoc-project $ (:projects data)) (reduce dp/assoc-page $ (:pages data)) (reduce assoc-color $ (:color-collections data)) (reduce assoc-shape $ (:shapes data))) state))))