NativeMessage.purs 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  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. | NativeMessageAddJob NativePythonJobOffer
  25. | NativeMessageVisitedJobPage {
  26. url :: String,
  27. jobTitle :: String,
  28. pageTitle :: String,
  29. company :: String,
  30. companyDomain :: Maybe String,
  31. companyUrl :: String,
  32. location :: String,
  33. hasSimplifiedProcess :: Boolean,
  34. flexibility :: Maybe JobFlexibility
  35. }
  36. | NativeMessageJobAlreadyExists {job_id :: String}
  37. | NativeMessageJobAdded {job :: NativePythonJobOffer}
  38. | NativeMessageJobOfferList (Array NativePythonJobOffer)
  39. data ApplicationProcess
  40. = ApplicationProcessLinkedInSimplified
  41. | ApplicationProcessRegular
  42. | ApplicationProcessCareerSite
  43. | ApplicationProcessSpurious
  44. derive instance Generic ApplicationProcess _
  45. instance Show ApplicationProcess where show = genericShow
  46. instance EncodeJson ApplicationProcess where
  47. encodeJson = case _ of
  48. ApplicationProcessLinkedInSimplified -> encodeJson "linked_in_simplified"
  49. ApplicationProcessRegular -> encodeJson "regular"
  50. ApplicationProcessCareerSite -> encodeJson "career_site"
  51. ApplicationProcessSpurious -> encodeJson "spurious"
  52. instance DecodeJson ApplicationProcess where
  53. decodeJson json = case decodeString json of
  54. Right "linked_in_simplified" -> Right ApplicationProcessLinkedInSimplified
  55. Right "regular" -> Right ApplicationProcessRegular
  56. Right "career_site" -> Right ApplicationProcessCareerSite
  57. Right "spurious" -> Right ApplicationProcessSpurious
  58. _ -> Left $ UnexpectedValue json
  59. type NativePythonJobOffer = {
  60. id :: String,
  61. origin :: String,
  62. title :: String,
  63. url :: String,
  64. company :: String,
  65. location :: Maybe String,
  66. company_domain :: Maybe String,
  67. company_url :: Maybe String,
  68. flexibility :: Maybe JobFlexibility,
  69. application_process :: Maybe ApplicationProcess,
  70. application_considered :: Maybe Boolean,
  71. application_date :: Maybe String,
  72. application_rejection_date :: Maybe String
  73. }
  74. derive instance Generic NativeMessage _
  75. instance Show NativeMessage where show = genericShow
  76. instance EncodeJson NativeMessage where encodeJson a = genericEncodeJson a
  77. instance DecodeJson NativeMessage where
  78. decodeJson json = genericDecodeJson json
  79. connectToNativeApplication ∷ Application → Effect Port
  80. connectToNativeApplication = connectNative
  81. decodeNativeMessage ∷ Message → Either String NativeMessage
  82. decodeNativeMessage m =
  83. case unwrapMessage m of
  84. Left err -> Left $ printJsonDecodeError err
  85. Right m' -> Right m'
  86. onNativeMessageAddListener ∷ Port → (NativeMessage → Effect Unit) → Effect Unit
  87. onNativeMessageAddListener port f = onMessageAddListener port $ runtimeMessageHandler
  88. where
  89. runtimeMessageHandler = mkListener \m -> do
  90. case decodeNativeMessage m of
  91. Left err -> log err
  92. Right m' -> f m'
  93. onNativeDisconnectAddListener :: Port -> (Port -> Effect Unit) -> Effect Unit
  94. onNativeDisconnectAddListener port f = onDisconnectAddListener port $ mkListener f
  95. sendMessageToNative :: Port -> NativeMessage -> Effect Unit
  96. sendMessageToNative port msg = do
  97. _ <- Port.postMessage port $ mkMessage msg
  98. pure unit