NativeMessage.purs 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. module ExampleWebExt.NativeMessage where
  2. import Prelude
  3. import Browser.WebExt.Listener (mkListener)
  4. import Browser.WebExt.Message (Message, mkMessage, unwrapMessage)
  5. import Browser.WebExt.Port (Port, onDisconnectAddListener, onMessageAddListener)
  6. import Browser.WebExt.Port as Port
  7. import Browser.WebExt.Runtime (Application, connectNative)
  8. import Data.Argonaut.Decode (class DecodeJson, JsonDecodeError(..), printJsonDecodeError)
  9. import Data.Argonaut.Decode.Decoders (decodeString)
  10. import Data.Argonaut.Decode.Generic (genericDecodeJson)
  11. import Data.Argonaut.Encode (class EncodeJson, encodeJson)
  12. import Data.Argonaut.Encode.Generic (genericEncodeJson)
  13. import Data.Either (Either(..))
  14. import Data.Generic.Rep (class Generic)
  15. import Data.Maybe (Maybe)
  16. import Data.Show.Generic (genericShow)
  17. import Effect (Effect)
  18. import Effect.Class.Console (log)
  19. import LinkedIn.UI.Basic.Types (JobFlexibility)
  20. data NativeMessage =
  21. NativeMessageBackground String
  22. | NativeMessageLog {level :: String, content :: String}
  23. | NativeMessageInitialConfiguration {jobsPath :: String}
  24. | NativeMessageStorageReady
  25. | NativeMessageAddJob NativePythonJobOffer
  26. | NativeMessageVisitedJobPage {
  27. url :: String,
  28. jobTitle :: String,
  29. pageTitle :: String,
  30. company :: String,
  31. companyDomain :: Maybe String,
  32. companyUrl :: String,
  33. location :: String,
  34. hasSimplifiedProcess :: Boolean,
  35. flexibility :: Maybe JobFlexibility
  36. }
  37. | NativeMessageJobAlreadyExists {job_id :: String}
  38. | NativeMessageJobAdded {job :: NativePythonJobOffer}
  39. | NativeMessageJobOfferList (Array NativePythonJobOffer)
  40. data ApplicationProcess
  41. = ApplicationProcessLinkedInSimplified
  42. | ApplicationProcessRegular
  43. | ApplicationProcessCareerSite
  44. | ApplicationProcessSpurious
  45. derive instance Generic ApplicationProcess _
  46. instance Show ApplicationProcess where show = genericShow
  47. instance EncodeJson ApplicationProcess where
  48. encodeJson = case _ of
  49. ApplicationProcessLinkedInSimplified -> encodeJson "linked_in_simplified"
  50. ApplicationProcessRegular -> encodeJson "regular"
  51. ApplicationProcessCareerSite -> encodeJson "career_site"
  52. ApplicationProcessSpurious -> encodeJson "spurious"
  53. instance DecodeJson ApplicationProcess where
  54. decodeJson json = case decodeString json of
  55. Right "linked_in_simplified" -> Right ApplicationProcessLinkedInSimplified
  56. Right "regular" -> Right ApplicationProcessRegular
  57. Right "career_site" -> Right ApplicationProcessCareerSite
  58. Right "spurious" -> Right ApplicationProcessSpurious
  59. _ -> Left $ UnexpectedValue json
  60. type NativePythonJobOffer = {
  61. id :: String,
  62. origin :: String,
  63. title :: String,
  64. url :: String,
  65. company :: String,
  66. location :: Maybe String,
  67. company_domain :: Maybe String,
  68. company_url :: Maybe String,
  69. flexibility :: Maybe JobFlexibility,
  70. application_process :: Maybe ApplicationProcess,
  71. application_considered :: Maybe Boolean,
  72. application_date :: Maybe String,
  73. application_rejection_date :: Maybe String
  74. }
  75. derive instance Generic NativeMessage _
  76. instance Show NativeMessage where show = genericShow
  77. instance EncodeJson NativeMessage where encodeJson a = genericEncodeJson a
  78. instance DecodeJson NativeMessage where
  79. decodeJson json = genericDecodeJson json
  80. connectToNativeApplication ∷ Application → Effect Port
  81. connectToNativeApplication = connectNative
  82. decodeNativeMessage ∷ Message → Either String NativeMessage
  83. decodeNativeMessage m =
  84. case unwrapMessage m of
  85. Left err -> Left $ printJsonDecodeError err
  86. Right m' -> Right m'
  87. onNativeMessageAddListener ∷ Port → (NativeMessage → Effect Unit) → Effect Unit
  88. onNativeMessageAddListener port f = onMessageAddListener port $ runtimeMessageHandler
  89. where
  90. runtimeMessageHandler = mkListener \m -> do
  91. case decodeNativeMessage m of
  92. Left err -> log err
  93. Right m' -> f m'
  94. onNativeDisconnectAddListener :: Port -> (Port -> Effect Unit) -> Effect Unit
  95. onNativeDisconnectAddListener port f = onDisconnectAddListener port $ mkListener f
  96. sendMessageToNative :: Port -> NativeMessage -> Effect Unit
  97. sendMessageToNative port msg = do
  98. _ <- Port.postMessage port $ mkMessage msg
  99. pure unit