Content.purs 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. module JobSearchExtension.Content where
  2. import Prelude
  3. import Browser.DOM (getBrowserDom)
  4. import Browser.WebExt.Runtime (MessageSender)
  5. import Data.Either (Either(..))
  6. import Effect (Effect)
  7. import Effect.Aff (Aff, launchAff_)
  8. import Effect.Class (liftEffect)
  9. import Effect.Class.Console (logShow)
  10. import Effect.Console (log)
  11. import JobSearchExtension.RuntimeMessage (RuntimeMessage(..), onRuntimeMessageAddListener, sendMessageToBackground)
  12. import LinkedIn (extractFromDocument, getContext)
  13. import LinkedIn.Loadable (waitFor)
  14. import LinkedIn.PageUrl (PageUrl(..))
  15. -- TODO: This function should be implemented in PS as well
  16. foreign import colorVisitedJobsLoopImpl :: Effect Unit
  17. main :: Effect Unit
  18. main = do
  19. log "[content] starting up"
  20. dom <- getBrowserDom
  21. ctx <- getContext dom
  22. onRuntimeMessageAddListener backgroundMessageHandler
  23. _ <- sendMessageToBackground RuntimeMessageContentInit
  24. case ctx of
  25. Right (UrlJobOffer _) -> launchAff_ waitForDataAndSend
  26. Right (UrlListRecommendedJobOffers) -> colorVisitedJobsLoopImpl
  27. Right (UrlSearchJobOffers) -> colorVisitedJobsLoopImpl
  28. _ -> log "[content] Nothing to do"
  29. backgroundMessageHandler ∷ RuntimeMessage -> MessageSender → Effect Unit
  30. backgroundMessageHandler msg _ = case msg of
  31. RuntimeMessageRequestPageContent -> launchAff_ waitForDataAndSend
  32. m -> logShow m
  33. waitForDataAndSend ∷ Aff Unit
  34. waitForDataAndSend = do
  35. dom <- liftEffect getBrowserDom
  36. -- If we are here we know that we are looking for a job offer.
  37. -- TODO: Remove this dirty hack once "Loadable" typeclass is integrated
  38. _ <- waitFor 200 50 ".job-details-jobs-unified-top-card__job-insight span[aria-hidden]" dom
  39. liftEffect extractDataAndSendToBackground
  40. extractDataAndSendToBackground ∷ Effect Unit
  41. extractDataAndSendToBackground = do
  42. dom <- getBrowserDom
  43. ctx <- getContext dom
  44. data_ <- extractFromDocument dom
  45. let
  46. msg = case data_, ctx of
  47. Left err, _ -> RuntimeMessageError err
  48. _, Left err -> RuntimeMessageError err
  49. Right data_', Right ctx' -> RuntimeMessagePageContent ctx' data_'
  50. sendMessageToBackground msg