0
Fork 0
mirror of https://github.com/penpot/penpot.git synced 2025-02-22 23:06:08 -05:00
penpot/frontend/src/uxbox/util/storage.cljs
2016-11-20 20:03:17 +01:00

61 lines
1.4 KiB
Clojure

;; This Source Code Form is subject to the terms of the Mozilla Public
;; License, v. 2.0. If a copy of the MPL was not distributed with this
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
;;
;; Copyright (c) 2016 Andrey Antukh <niwi@niwi.nz>
(ns uxbox.util.storage
(:require [uxbox.util.transit :as t]))
(enable-console-print!)
(defn- persist
[alias value]
(let [key (name alias)
value (t/encode value)]
(.setItem js/localStorage key value)))
(defn- load
[alias]
(if (= *target* "nodejs")
{}
(let [data (.getItem js/localStorage (name alias))]
(if data
(t/decode data)
{}))))
(defn make-storage
[alias]
(let [data (atom (load alias))]
(when (not= *target* "nodejs")
(add-watch data :sub #(persist alias %4)))
(reify
ICounted
(-count [_]
(count @data))
ISeqable
(-seq [_]
(seq @data))
IReset
(-reset! [self newval]
(-reset! data newval))
ISwap
(-swap! [self f]
(swap! data f))
(-swap! [self f x]
(swap! data f x))
(-swap! [self f x y]
(swap! data f x y))
(-swap! [self f x y more]
(apply swap! data f x y more))
ILookup
(-lookup [_ key]
(-lookup @data key nil))
(-lookup [_ key not-found]
(-lookup @data key not-found)))))
(def storage (make-storage "uxbox"))