NativeMessage.purs 3.9 KB

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