NativeMessage.purs 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  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, printJsonDecodeError)
  9. import Data.Argonaut.Decode.Generic (genericDecodeJson)
  10. import Data.Argonaut.Encode (class EncodeJson)
  11. import Data.Argonaut.Encode.Generic (genericEncodeJson)
  12. import Data.Either (Either(..))
  13. import Data.Generic.Rep (class Generic)
  14. import Data.Maybe (Maybe)
  15. import Data.Show.Generic (genericShow)
  16. import Effect (Effect)
  17. import Effect.Class.Console (log)
  18. data NativeMessage =
  19. NativeMessageBackground String
  20. | NativeMessageLog {level :: String, content :: String}
  21. | NativeMessageInitialConfiguration {jobsPath :: String}
  22. | NativeMessageVisitedJobPage {
  23. url :: String,
  24. jobTitle :: String,
  25. pageTitle :: String,
  26. company :: String,
  27. companyDomain :: Maybe String,
  28. companyUrl :: String,
  29. location :: String,
  30. hasSimplifiedProcess :: Boolean,
  31. flexibility :: String
  32. }
  33. | NativeMessageJobAlreadyExists {job_id :: String}
  34. | NativeMessageJobAdded {job :: NativePythonJobOffer}
  35. | NativeMessageJobOfferList (Array NativePythonJobOffer)
  36. type NativePythonJobOffer = {
  37. id :: String,
  38. title :: String,
  39. url :: String,
  40. application_date :: Maybe String,
  41. application_rejection_date :: Maybe String
  42. }
  43. derive instance Generic NativeMessage _
  44. instance Show NativeMessage where show = genericShow
  45. instance EncodeJson NativeMessage where encodeJson a = genericEncodeJson a
  46. instance DecodeJson NativeMessage where
  47. decodeJson json = genericDecodeJson json
  48. connectToNativeApplication ∷ Application → Effect Port
  49. connectToNativeApplication = connectNative
  50. decodeNativeMessage ∷ Message → Either String NativeMessage
  51. decodeNativeMessage m =
  52. case unwrapMessage m of
  53. Left err -> Left $ printJsonDecodeError err
  54. Right m' -> Right m'
  55. onNativeMessageAddListener ∷ Port → (NativeMessage → Effect Unit) → Effect Unit
  56. onNativeMessageAddListener port f = onMessageAddListener port $ runtimeMessageHandler
  57. where
  58. runtimeMessageHandler = mkListener \m -> do
  59. case decodeNativeMessage m of
  60. Left err -> log err
  61. Right m' -> f m'
  62. onNativeDisconnectAddListener :: Port -> (Port -> Effect Unit) -> Effect Unit
  63. onNativeDisconnectAddListener port f = onDisconnectAddListener port $ mkListener f
  64. sendMessageToNative :: Port -> NativeMessage -> Effect Unit
  65. sendMessageToNative port msg = do
  66. _ <- Port.postMessage port $ mkMessage msg
  67. pure unit