RuntimeMessage.purs 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. module ExampleWebExt.RuntimeMessage where
  2. import Prelude
  3. import Browser.WebExt.Listener (mkListener2)
  4. import Browser.WebExt.Message (Message, mkMessage, unwrapMessage)
  5. import Browser.WebExt.Runtime (MessageSender, onMessageAddListener)
  6. import Browser.WebExt.Runtime as Runtime
  7. import Browser.WebExt.Tabs (TabId)
  8. import Browser.WebExt.Tabs as Tabs
  9. import Data.Argonaut.Decode (class DecodeJson, printJsonDecodeError)
  10. import Data.Argonaut.Decode.Generic (genericDecodeJson)
  11. import Data.Argonaut.Encode (class EncodeJson)
  12. import Data.Argonaut.Encode.Generic (genericEncodeJson)
  13. import Data.Either (Either(..))
  14. import Data.Generic.Rep (class Generic)
  15. import Data.Show.Generic (genericShow)
  16. import Effect (Effect)
  17. import Effect.Class.Console (log)
  18. import LinkedIn.Output (Output)
  19. import LinkedIn.PageUrl (PageUrl)
  20. data RuntimeMessage =
  21. RuntimeMessageContentInit
  22. | RuntimeMessageRequestPageContent
  23. | RuntimeMessagePageContent PageUrl Output
  24. derive instance Generic RuntimeMessage _
  25. instance Show RuntimeMessage where show = genericShow
  26. instance EncodeJson RuntimeMessage where encodeJson a = genericEncodeJson a
  27. instance DecodeJson RuntimeMessage where decodeJson a = genericDecodeJson a
  28. sendMessageToBackground ∷ RuntimeMessage → Effect Unit
  29. sendMessageToBackground msg = do
  30. _ <- Runtime.sendMessage $ mkMessage msg
  31. pure unit
  32. sendMessageToContent :: TabId -> RuntimeMessage -> Effect Unit
  33. sendMessageToContent tabId msg = do
  34. _ <- Tabs.sendMessage tabId $ mkMessage msg
  35. pure unit
  36. decodeRuntimeMessage ∷ Message → Either String RuntimeMessage
  37. decodeRuntimeMessage m =
  38. case unwrapMessage m of
  39. Left err -> Left $ printJsonDecodeError err
  40. Right m' -> Right m'
  41. onRuntimeMessageAddListener ∷ (RuntimeMessage -> MessageSender → Effect Unit) → Effect Unit
  42. onRuntimeMessageAddListener f = onMessageAddListener runtimeMessageHandler
  43. where
  44. runtimeMessageHandler = mkListener2 \m sender -> do
  45. case decodeRuntimeMessage m of
  46. Left err -> log err
  47. Right m' -> f m' sender