Tabs.purs 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. module Browser.Tabs (WindowId, TabId(..), Tab(..), query, remove, removeOne, update, activateTab) where
  2. import Browser.Utils (unwrapForeign)
  3. import Control.Alt (map)
  4. import Control.Bind ((>>=))
  5. import Control.Promise (Promise, toAffE)
  6. import Data.Argonaut (class DecodeJson, class EncodeJson)
  7. import Data.Eq (class Eq)
  8. import Data.Function (($))
  9. import Data.Generic.Rep (class Generic)
  10. import Data.Generic.Rep.Show (genericShow)
  11. import Data.List (List, fromFoldable, toUnfoldable, (!!), singleton)
  12. import Data.Maybe (Maybe)
  13. import Data.Newtype (class Newtype, unwrap)
  14. import Data.Number.Format (toString)
  15. import Data.Ord (class Ord)
  16. import Data.Show (class Show)
  17. import Data.Traversable (traverse)
  18. import Data.Unit (Unit)
  19. import Effect (Effect)
  20. import Effect.Aff (Aff)
  21. import Effect.Class (liftEffect)
  22. import Foreign (Foreign)
  23. import Foreign.Class (class Decode, class Encode)
  24. import Foreign.Generic (defaultOptions, genericDecode, genericEncode)
  25. import Prelude (bind, pure)
  26. import Prim.Row (class Union)
  27. newtype WindowId
  28. = WindowId Number
  29. derive instance eqWindowId :: Eq WindowId
  30. derive instance ordWindowId :: Ord WindowId
  31. instance showWindowId :: Show WindowId where
  32. show (WindowId wid) = toString wid
  33. derive instance genWindowId :: Generic WindowId _
  34. instance encodeWindowId :: Encode WindowId where
  35. encode x = genericEncode (defaultOptions { unwrapSingleConstructors = true }) x
  36. instance decodeWindowId :: Decode WindowId where
  37. decode x = genericDecode (defaultOptions { unwrapSingleConstructors = true }) x
  38. newtype TabId
  39. = TabId Number
  40. derive instance eqTabId :: Eq TabId
  41. derive instance ordTabId :: Ord TabId
  42. instance showTabId :: Show TabId where
  43. show (TabId wid) = toString wid
  44. derive instance genTabId :: Generic TabId _
  45. instance encodeTabId :: Encode TabId where
  46. encode x = genericEncode (defaultOptions { unwrapSingleConstructors = true }) x
  47. instance decodeTabId :: Decode TabId where
  48. decode x = genericDecode (defaultOptions { unwrapSingleConstructors = true }) x
  49. newtype Tab
  50. = Tab
  51. { active :: Boolean
  52. , attention :: Maybe Boolean
  53. , audible :: Maybe Boolean
  54. , autoDiscardable :: Maybe Boolean
  55. , cookieStoreId :: Maybe String
  56. , discarded :: Maybe Boolean
  57. , favIconUrl :: Maybe String
  58. , height :: Maybe Number
  59. , hidden :: Boolean
  60. , highlighted :: Boolean
  61. -- should be optional
  62. , id :: TabId
  63. , incognito :: Boolean
  64. , index :: Int
  65. , isArticle :: Maybe Boolean
  66. , isInReaderMode :: Boolean
  67. , lastAccessed :: Number
  68. , openerTabId :: Maybe TabId
  69. , pinned :: Boolean
  70. , sessionId :: Maybe String
  71. , status :: Maybe String
  72. -- create an enum for that successorTabId :: Maybe Number
  73. , title :: String
  74. , url :: Maybe String
  75. , width :: Maybe Number
  76. , windowId :: WindowId
  77. }
  78. derive instance newtypeTab :: Newtype Tab _
  79. derive instance genTab :: Generic Tab _
  80. instance showTab :: Show Tab where
  81. show = genericShow
  82. instance encodeTab :: Encode Tab where
  83. encode x = genericEncode (defaultOptions { unwrapSingleConstructors = true }) x
  84. instance decodeTab :: Decode Tab where
  85. decode x = genericDecode (defaultOptions { unwrapSingleConstructors = true }) x
  86. foreign import queryImpl :: Effect (Promise (Array Foreign))
  87. query :: Aff (List Tab)
  88. query = do
  89. tabsArray <- toAffE queryImpl
  90. let
  91. tabsList = fromFoldable tabsArray
  92. parsed <- liftEffect $ traverse unwrapForeign tabsList
  93. pure parsed
  94. foreign import remove' :: (Array Number) -> Effect (Promise Unit)
  95. remove :: (List TabId) -> Aff Unit
  96. remove tabs =
  97. let
  98. tabIdsArray = toUnfoldable $ map unwrap tabs
  99. in
  100. toAffE $ remove' tabIdsArray
  101. where
  102. unwrap (TabId n) = n
  103. removeOne :: TabId -> Aff Unit
  104. removeOne tabId = remove (singleton tabId)
  105. type RowUpdateProperties
  106. = ( active :: Boolean
  107. , autoDiscardable :: Boolean
  108. , highlighted :: Boolean
  109. , loadReplace :: Boolean
  110. , muted :: Boolean
  111. , openerTabId :: TabId
  112. , pinned :: Boolean
  113. , successorTabId :: TabId
  114. , url :: String
  115. )
  116. foreign import update' :: forall given trash. Union given trash RowUpdateProperties => { | given } -> TabId -> Effect (Promise Tab)
  117. update :: forall prop b. Union prop b RowUpdateProperties => { | prop } -> TabId -> Aff Tab
  118. update props tabId = toAffE $ update' props tabId
  119. activateTab :: TabId -> Aff Tab
  120. activateTab tabId = update { active: true } tabId