فهرست منبع

visited_linkedin_job_page message is now sent just like in Python

jherve 1 سال پیش
والد
کامیت
f5e96a1bed
3فایلهای تغییر یافته به همراه52 افزوده شده و 6 حذف شده
  1. 38 5
      src/Background.purs
  2. 1 1
      src/Browser/WebExt/Tabs.purs
  3. 13 0
      src/NativeMessage.purs

+ 38 - 5
src/Background.purs

@@ -5,17 +5,21 @@ import Prelude
 import Browser.WebExt.BrowserAction (onClickedAddListener)
 import Browser.WebExt.BrowserAction (onClickedAddListener)
 import Browser.WebExt.Listener (mkListener)
 import Browser.WebExt.Listener (mkListener)
 import Browser.WebExt.Port (Port)
 import Browser.WebExt.Port (Port)
-import Browser.WebExt.Runtime (MessageSender)
+import Browser.WebExt.Runtime (MessageSender(..))
 import Browser.WebExt.Tabs (Tab)
 import Browser.WebExt.Tabs (Tab)
 import Data.Argonaut.Decode (printJsonDecodeError)
 import Data.Argonaut.Decode (printJsonDecodeError)
 import Data.Either (Either(..))
 import Data.Either (Either(..))
+import Data.Maybe (Maybe(..))
 import Effect (Effect)
 import Effect (Effect)
 import Effect.Aff (launchAff_)
 import Effect.Aff (launchAff_)
 import Effect.Class (class MonadEffect, liftEffect)
 import Effect.Class (class MonadEffect, liftEffect)
-import Effect.Class.Console (log, logShow)
+import Effect.Class.Console (error, log, logShow)
 import ExampleWebExt.NativeMessage (NativeMessage(..), connectToNativeApplication, onNativeDisconnectAddListener, onNativeMessageAddListener, sendMessageToNative)
 import ExampleWebExt.NativeMessage (NativeMessage(..), connectToNativeApplication, onNativeDisconnectAddListener, onNativeMessageAddListener, sendMessageToNative)
 import ExampleWebExt.RuntimeMessage (RuntimeMessage(..), onRuntimeMessageAddListener, sendMessageToContent)
 import ExampleWebExt.RuntimeMessage (RuntimeMessage(..), onRuntimeMessageAddListener, sendMessageToContent)
 import ExampleWebExt.Storage (getJobsPath)
 import ExampleWebExt.Storage (getJobsPath)
+import LinkedIn.Jobs.JobOffer (JobOffer(..))
+import LinkedIn.Output.Types (Output(..))
+import LinkedIn.UI.Basic.Types (JobFlexibility(..))
 
 
 main :: Effect Unit
 main :: Effect Unit
 main = do
 main = do
@@ -27,7 +31,7 @@ main = do
   sendConfigurationToNative port
   sendConfigurationToNative port
 
 
   onClickedAddListener $ mkListener browserActionOnClickedHandler
   onClickedAddListener $ mkListener browserActionOnClickedHandler
-  onRuntimeMessageAddListener contentScriptMessageHandler
+  onRuntimeMessageAddListener $ contentScriptMessageHandler port
 
 
 browserActionOnClickedHandler :: Tab -> Effect Unit
 browserActionOnClickedHandler :: Tab -> Effect Unit
 browserActionOnClickedHandler tab = do
 browserActionOnClickedHandler tab = do
@@ -35,8 +39,37 @@ browserActionOnClickedHandler tab = do
   _ <- sendMessageToContent tab.id RuntimeMessageRequestPageContent
   _ <- sendMessageToContent tab.id RuntimeMessageRequestPageContent
   pure unit
   pure unit
 
 
-contentScriptMessageHandler ∷ ∀ m. MonadEffect m => RuntimeMessage -> MessageSender → m Unit
-contentScriptMessageHandler m sender = do
+contentScriptMessageHandler ∷ Port -> RuntimeMessage -> MessageSender → Effect Unit
+contentScriptMessageHandler
+  port
+  (RuntimeMessagePageContent _ (OutJobOffer offer))
+  (MessageSender {tab: Just {url, title}}) =
+    case maybeMsg offer of
+      Just msg -> sendMessageToNative port msg
+      Nothing -> error "Job offer sent by content script could not be sent"
+
+  where
+    maybeMsg (JobOffer jo) = ado
+      location <- jo.location
+      flexibility <- jo.flexibility
+      companyDomain <- jo.companyDomain
+      _companySize <- jo.companySize
+    in NativeMessageVisitedJobPage {
+      url: url,
+      jobTitle: jo.title,
+      pageTitle: title,
+      company: jo.companyName,
+      companyDomain,
+      companyUrl: jo.companyLink,
+      location,
+      hasSimplifiedProcess: jo.hasSimplifiedApplicationProcess,
+      flexibility: case flexibility of
+        JobFlexOnSite -> "on_site"
+        JobFlexHybrid -> "hybrid"
+        JobFlexFullRemote -> "full_remote"
+    }
+
+contentScriptMessageHandler _ m sender = do
   logShow m
   logShow m
   logShow sender
   logShow sender
 
 

+ 1 - 1
src/Browser/WebExt/Tabs.purs

@@ -9,7 +9,7 @@ import Effect (Effect)
 import Effect.Uncurried (EffectFn2,runEffectFn2)
 import Effect.Uncurried (EffectFn2,runEffectFn2)
 import Promise (Promise)
 import Promise (Promise)
 
 
-type Tab = { id :: Int, index :: Int }
+type Tab = { id :: Int, index :: Int, title :: String, url :: String }
 type TabId = Int
 type TabId = Int
 
 
 foreign import sendMessageImpl :: EffectFn2 TabId Message (Promise Message)
 foreign import sendMessageImpl :: EffectFn2 TabId Message (Promise Message)

+ 13 - 0
src/NativeMessage.purs

@@ -17,11 +17,23 @@ import Data.Generic.Rep (class Generic)
 import Data.Show.Generic (genericShow)
 import Data.Show.Generic (genericShow)
 import Effect (Effect)
 import Effect (Effect)
 import Effect.Class.Console (log)
 import Effect.Class.Console (log)
+import Record (union)
 
 
 data NativeMessage =
 data NativeMessage =
   NativeMessageBackground String
   NativeMessageBackground String
   | NativeMessageLog {level :: String, content :: String}
   | NativeMessageLog {level :: String, content :: String}
   | NativeMessageInitialConfiguration {jobsPath :: String}
   | NativeMessageInitialConfiguration {jobsPath :: String}
+  | NativeMessageVisitedJobPage {
+    url :: String,
+    jobTitle :: String,
+    pageTitle :: String,
+    company :: String,
+    companyDomain :: String,
+    companyUrl :: String,
+    location :: String,
+    hasSimplifiedProcess :: Boolean,
+    flexibility :: String
+  }
 
 
 type NativePythonMessage m = {tag :: String | m}
 type NativePythonMessage m = {tag :: String | m}
 type NativePythonMessageLog = NativePythonMessage (level :: String, content :: String)
 type NativePythonMessageLog = NativePythonMessage (level :: String, content :: String)
@@ -31,6 +43,7 @@ derive instance Generic NativeMessage _
 instance Show NativeMessage where show = genericShow
 instance Show NativeMessage where show = genericShow
 instance EncodeJson NativeMessage where
 instance EncodeJson NativeMessage where
   encodeJson (NativeMessageInitialConfiguration r) = encodeJson {tag: "initial_configuration", jobsPath: r.jobsPath}
   encodeJson (NativeMessageInitialConfiguration r) = encodeJson {tag: "initial_configuration", jobsPath: r.jobsPath}
+  encodeJson (NativeMessageVisitedJobPage r) = encodeJson $ union {tag: "visited_linkedin_job_page"} r
   encodeJson a = genericEncodeJson a
   encodeJson a = genericEncodeJson a
 
 
 instance DecodeJson NativeMessage where
 instance DecodeJson NativeMessage where