Forráskód Böngészése

Add support for sync storage

jherve 1 éve
szülő
commit
2766afc40e

+ 6 - 0
src/Background.purs

@@ -7,10 +7,12 @@ import Browser.WebExt.Listener (mkListener)
 import Browser.WebExt.Runtime (onMessageAddListener)
 import Browser.WebExt.Tabs (Tab)
 import Effect (Effect)
+import Effect.Aff (launchAff_)
 import Effect.Class (class MonadEffect)
 import Effect.Class.Console (log, logShow)
 import ExampleWebExt.NativeMessage (NativeMessage(..), connectToNativeApplication, onNativeMessageAddListener, sendMessageToNative)
 import ExampleWebExt.RuntimeMessage (RuntimeMessage(..), mkRuntimeMessageHandler, sendMessageToContent)
+import ExampleWebExt.Storage (getJobsPath, setJobsPath)
 
 main :: Effect Unit
 main = do
@@ -19,6 +21,10 @@ main = do
   onNativeMessageAddListener port nativeMessageHandler
 
   sendMessageToNative port $ NativeMessageBackground "hello"
+  setJobsPath "/path/to/jobs"
+  launchAff_ do
+    path <- getJobsPath
+    log $ "Read value of jobsPath : " <> show path
 
   onClickedAddListener $ mkListener browserActionOnClickedHandler
   onMessageAddListener $ mkRuntimeMessageHandler contentScriptMessageHandler

+ 7 - 0
src/Browser/WebExt/Storage/Sync.js

@@ -0,0 +1,7 @@
+export function setImpl (obj) {
+  return browser.storage.sync.set(obj);
+}
+
+export function getImpl (key) {
+  return browser.storage.sync.get(key);
+}

+ 21 - 0
src/Browser/WebExt/Storage/Sync.purs

@@ -0,0 +1,21 @@
+module Browser.WebExt.Storage.Sync where
+
+import Prelude
+
+import Data.Argonaut.Core (Json)
+import Effect (Effect)
+import Effect.Aff (Aff)
+import Effect.Uncurried (EffectFn1, runEffectFn1)
+import Promise (Promise)
+import Promise.Aff (toAffE)
+
+type Key = String
+
+foreign import setImpl :: EffectFn1 Json Unit
+foreign import getImpl :: EffectFn1 Key (Promise Json)
+
+set ∷ Json → Effect Unit
+set = runEffectFn1 setImpl
+
+get :: Key -> Aff Json
+get k = toAffE $ runEffectFn1 getImpl k

+ 24 - 0
src/Storage.purs

@@ -0,0 +1,24 @@
+module ExampleWebExt.Storage where
+
+import Prelude
+
+import Browser.WebExt.Storage.Sync as Sync
+import Data.Argonaut.Decode (JsonDecodeError, decodeJson)
+import Data.Argonaut.Encode (encodeJson)
+import Data.Either (Either)
+import Effect (Effect)
+import Effect.Aff (Aff)
+
+type SyncStorage = { jobsPath :: String }
+
+setJobsPath ∷ String → Effect Unit
+setJobsPath path = Sync.set $ encodeJson {jobsPath: path}
+
+getJobsPath ∷ Aff (Either JsonDecodeError String)
+getJobsPath = do
+  s <- Sync.get "jobsPath"
+  let 
+    asStorage :: Either JsonDecodeError SyncStorage
+    asStorage = decodeJson s
+
+  pure $ map (\{jobsPath} -> jobsPath) asStorage