Sidebar.purs 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. module PureTabs.Sidebar where
  2. import Browser.Runtime as Runtime
  3. import Browser.Tabs (Tab, TabId, WindowId)
  4. import Browser.Tabs.OnUpdated (ChangeInfo(..))
  5. import Browser.Windows (getCurrent)
  6. import Control.Alternative (pure, (*>))
  7. import Control.Bind ((>=>))
  8. import Data.Foldable (traverse_)
  9. import Data.Function (flip)
  10. import Data.Maybe (Maybe(..), maybe)
  11. import Data.Monoid ((<>))
  12. import Data.Newtype (unwrap)
  13. import Data.Show (show)
  14. import Data.Unit (unit)
  15. import Debug.Trace (traceM)
  16. import Effect (Effect)
  17. import Effect.Aff (Aff, launchAff_)
  18. import Effect.Class (liftEffect)
  19. import Effect.Console (log)
  20. import JQuery (JQuery, append, create, css, remove, select, setAttr, setText)
  21. import Prelude (Unit, bind, ($), discard)
  22. import PureTabs.Model (BackgroundEvent(..), SidebarEvent(..))
  23. main :: Effect Unit
  24. main = do
  25. log "started sidebar"
  26. port <- Runtime.connect
  27. launchAff_ $ runSidebar port
  28. where
  29. runSidebar :: Runtime.Port -> Aff Unit
  30. runSidebar port = do
  31. currentWindow <- getCurrent
  32. liftEffect $ initSidebar port currentWindow.id
  33. initSidebar :: Runtime.Port -> WindowId -> Effect Unit
  34. initSidebar port winId = do
  35. log $ "windowId " <> (show winId)
  36. Runtime.postMessageJson port $ SbHasWindowId winId
  37. tabsDiv <- select "#tabs"
  38. _ <- Runtime.onMessageJsonAddListener port $ onMsg tabsDiv
  39. pure unit
  40. where
  41. onMsg :: JQuery -> BackgroundEvent -> Effect Unit
  42. onMsg contentDiv event = case event of
  43. BgTabCreated tab -> do
  44. tabElem <- createTabElement tab
  45. append tabElem contentDiv
  46. pure unit
  47. BgTabDeleted tabId -> deleteTabElement tabId
  48. BgInitialTabList tabs -> traverse_ (createTabElement >=> (flip append) contentDiv) tabs
  49. BgTabUpdated tid cinfo tab -> updateTabInfo tid cinfo tab
  50. _ -> log "received unsupported message type"
  51. createTabElement :: Tab -> Effect JQuery
  52. createTabElement tab' = do
  53. let
  54. tab = unwrap tab'
  55. tabDiv <- create "<div>"
  56. setAttr "class" "tab" tabDiv
  57. setAttr "id" tab.id tabDiv
  58. -- favicon
  59. faviconDiv <- create "<div class=\"tab-favicon\">"
  60. setFaviconUrl tab.favIconUrl faviconDiv
  61. append faviconDiv tabDiv
  62. -- title
  63. tabTitle <- create "<div class=\"tab-title\">"
  64. setText tab.title tabTitle
  65. append tabTitle tabDiv
  66. pure tabDiv
  67. setFaviconUrl :: Maybe String -> JQuery -> Effect Unit
  68. setFaviconUrl Nothing div = pure unit
  69. setFaviconUrl (Just favData) div = css {"background-image": favUrl} div
  70. where favUrl = "url(" <> favData <> ")"
  71. deleteTabElement :: TabId -> Effect Unit
  72. deleteTabElement tabId = do
  73. div <- select ("#" <> show tabId)
  74. remove div
  75. updateTabInfo :: TabId -> ChangeInfo -> Tab -> Effect Unit
  76. updateTabInfo tid cinfo' tab' = do
  77. let
  78. tab = unwrap tab'
  79. cinfo = unwrap cinfo'
  80. tabTitleDiv <- select ("#" <> (show tid) <> " > .tab-title")
  81. let
  82. newTitle = case cinfo.status of
  83. Just "loading" -> Just "Loading ..."
  84. _ -> Just tab.title
  85. maybe (pure unit) (\t -> setText t tabTitleDiv) newTitle
  86. tabFaviconDiv <- select ("#" <> (show tid) <> " > .tab-favicon")
  87. setFaviconUrl cinfo.favIconUrl tabFaviconDiv