Jelajahi Sumber

Add support for storage of jobs in local storage

jherve 1 tahun lalu
induk
melakukan
e74a0c168c

+ 9 - 3
src/Background.purs

@@ -9,14 +9,15 @@ import Browser.WebExt.Runtime (MessageSender(..))
 import Browser.WebExt.Tabs (Tab)
 import Data.Argonaut.Decode (printJsonDecodeError)
 import Data.Either (Either(..))
+import Data.Foldable (for_)
 import Data.Maybe (Maybe(..))
 import Effect (Effect)
 import Effect.Aff (launchAff_)
-import Effect.Class (class MonadEffect, liftEffect)
+import Effect.Class (liftEffect)
 import Effect.Class.Console (error, log, logShow)
 import ExampleWebExt.NativeMessage (NativeMessage(..), connectToNativeApplication, onNativeDisconnectAddListener, onNativeMessageAddListener, sendMessageToNative)
 import ExampleWebExt.RuntimeMessage (RuntimeMessage(..), onRuntimeMessageAddListener, sendMessageToContent)
-import ExampleWebExt.Storage (getJobsPath)
+import ExampleWebExt.Storage (clearAllJobs, getJobsPath, storeJob)
 import LinkedIn.Jobs.JobOffer (JobOffer(..))
 import LinkedIn.Output.Types (Output(..))
 import LinkedIn.UI.Basic.Types (JobFlexibility(..))
@@ -73,7 +74,12 @@ contentScriptMessageHandler _ m sender = do
   logShow m
   logShow sender
 
-nativeMessageHandler ∷ ∀ m. MonadEffect m ⇒ NativeMessage → m Unit
+nativeMessageHandler ∷ NativeMessage → Effect Unit
+nativeMessageHandler (NativeMessageJobOfferList {job_offers}) = do
+  clearAllJobs
+  for_ job_offers \jo -> do
+    storeJob jo
+
 nativeMessageHandler m = logShow m
 
 sendConfigurationToNative ∷ Port → Effect Unit

+ 11 - 0
src/Browser/WebExt/Storage/Local.js

@@ -0,0 +1,11 @@
+export function setImpl (obj) {
+  return browser.storage.local.set(obj);
+}
+
+export function getImpl (key) {
+  return browser.storage.local.get(key);
+}
+
+export function clearImpl () {
+  return browser.storage.local.clear();
+}

+ 25 - 0
src/Browser/WebExt/Storage/Local.purs

@@ -0,0 +1,25 @@
+module Browser.WebExt.Storage.Local 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)
+foreign import clearImpl :: Effect Unit
+
+set ∷ Json → Effect Unit
+set = runEffectFn1 setImpl
+
+get :: Key -> Aff Json
+get k = toAffE $ runEffectFn1 getImpl k
+
+clear :: Effect Unit
+clear = clearImpl

+ 9 - 0
src/Storage.purs

@@ -2,12 +2,15 @@ module ExampleWebExt.Storage where
 
 import Prelude
 
+import Browser.WebExt.Storage.Local as Local
 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)
+import ExampleWebExt.NativeMessage (NativePythonJobOffer)
+import Foreign.Object (singleton)
 
 type SyncStorage = { jobsPath :: String }
 
@@ -22,3 +25,9 @@ getJobsPath = do
     asStorage = decodeJson s
 
   pure $ map (\{jobsPath} -> jobsPath) asStorage
+
+clearAllJobs :: Effect Unit
+clearAllJobs = Local.clear
+
+storeJob :: NativePythonJobOffer -> Effect Unit
+storeJob jo@{id} = Local.set $ encodeJson $ singleton id jo