From 09822e142bd4a3e8c182f53b54367773a32453ea Mon Sep 17 00:00:00 2001 From: Gheorghe Pinzaru Date: Wed, 9 Dec 2020 11:17:28 +0300 Subject: [PATCH] Add async storage wrapper Signed-off-by: Gheorghe Pinzaru --- src/status_im/async_storage/core.cljs | 46 ++++++++++++++++++++++++ src/status_im/async_storage/transit.cljs | 11 ++++++ 2 files changed, 57 insertions(+) create mode 100644 src/status_im/async_storage/core.cljs create mode 100644 src/status_im/async_storage/transit.cljs diff --git a/src/status_im/async_storage/core.cljs b/src/status_im/async_storage/core.cljs new file mode 100644 index 0000000000..21860c2fe2 --- /dev/null +++ b/src/status_im/async_storage/core.cljs @@ -0,0 +1,46 @@ +(ns status-im.async-storage.core + (:require [re-frame.core :as re-frame] + [taoensso.timbre :as log] + [goog.functions :as f] + [status-im.async-storage.transit :refer [clj->transit transit->clj]] + ["@react-native-community/async-storage" :default async-storage])) + +(def ^:private debounce-ms 250) + +(def key->string str) + +(defn- set-item! [key value] + (-> ^js async-storage + (.setItem (key->string key) + (clj->transit value)) + (.catch (fn [error] + (log/error "[async-storage]" error))))) + +(defn- set-item-factory + [] + (let [tmp-storage (atom {}) + debounced (f/debounce (fn [] + (doseq [[k v] @tmp-storage] + (swap! tmp-storage dissoc k) + (set-item! k v))) debounce-ms)] + (fn [items] + (swap! tmp-storage merge items) + (debounced)))) + +(defn- get-items [keys cb] + (-> ^js async-storage + (.multiGet (to-array (map key->string keys))) + (.then (fn [^js data] + (cb (->> (js->clj data) + (map (comp transit->clj second)) + (zipmap keys))))) + (.catch (fn [error] + (cb nil) + (log/error "[async-storage]" error))))) + +(re-frame/reg-fx ::set! (set-item-factory)) + +(re-frame/reg-fx + ::get + (fn [{:keys [keys cb]}] + (get-items keys cb))) diff --git a/src/status_im/async_storage/transit.cljs b/src/status_im/async_storage/transit.cljs new file mode 100644 index 0000000000..b4aba593f2 --- /dev/null +++ b/src/status_im/async_storage/transit.cljs @@ -0,0 +1,11 @@ +(ns status-im.async-storage.transit + (:require [cognitect.transit :as transit] + [taoensso.timbre :as timbre])) + +(def reader (transit/reader :json)) +(def writer (transit/writer :json)) + +(defn clj->transit [o] (transit/write writer o)) +(defn transit->clj [o] (try (transit/read reader o) + (catch :default e + (timbre/error e))))