Tabs.purs 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. module Browser.Tabs (
  2. WindowId
  3. , TabId(..)
  4. , Tab(..)
  5. , MoveProperties
  6. , CreateProperties
  7. , browserQuery
  8. , browserRemove
  9. , browserRemoveOne
  10. , browserUpdate
  11. , browserActivateTab
  12. , browserMoveTab
  13. , browserCreateTab
  14. , browserHideTabs
  15. , browserShowTabs
  16. , showTabId
  17. ) where
  18. import Browser.Utils (unwrapForeign)
  19. import Control.Alt (map)
  20. import Control.Promise (Promise, toAffE)
  21. import Data.Eq (class Eq)
  22. import Data.Function (($))
  23. import Data.Generic.Rep (class Generic)
  24. import Data.Generic.Rep.Show (genericShow)
  25. import Data.Maybe (Maybe)
  26. import Data.Newtype (class Newtype)
  27. import Data.Number.Format (toString)
  28. import Data.Ord (class Ord)
  29. import Data.Show (class Show, show)
  30. import Data.Traversable (traverse)
  31. import Data.Unit (Unit)
  32. import Effect (Effect)
  33. import Effect.Aff (Aff)
  34. import Effect.Class (liftEffect)
  35. import Foreign (Foreign)
  36. import Foreign.Class (class Decode, class Encode)
  37. import Foreign.Generic (defaultOptions, genericDecode, genericEncode)
  38. import Prelude (bind, pure)
  39. import Prim.Row (class Union)
  40. newtype WindowId
  41. = WindowId Number
  42. derive instance newtypeWindowId :: Newtype WindowId _
  43. derive instance eqWindowId :: Eq WindowId
  44. derive instance ordWindowId :: Ord WindowId
  45. instance showWindowId :: Show WindowId where
  46. show (WindowId wid) = toString wid
  47. derive instance genWindowId :: Generic WindowId _
  48. instance encodeWindowId :: Encode WindowId where
  49. encode x = genericEncode (defaultOptions { unwrapSingleConstructors = true }) x
  50. instance decodeWindowId :: Decode WindowId where
  51. decode x = genericDecode (defaultOptions { unwrapSingleConstructors = true }) x
  52. newtype TabId
  53. = TabId Number
  54. derive instance eqTabId :: Eq TabId
  55. derive instance ordTabId :: Ord TabId
  56. instance showTabIdInstance :: Show TabId where
  57. show (TabId wid) = toString wid
  58. derive instance genTabId :: Generic TabId _
  59. instance encodeTabId :: Encode TabId where
  60. encode x = genericEncode (defaultOptions { unwrapSingleConstructors = true }) x
  61. instance decodeTabId :: Decode TabId where
  62. decode x = genericDecode (defaultOptions { unwrapSingleConstructors = true }) x
  63. newtype Tab
  64. = Tab
  65. { active :: Boolean
  66. , attention :: Maybe Boolean
  67. , audible :: Maybe Boolean
  68. , autoDiscardable :: Maybe Boolean
  69. , cookieStoreId :: Maybe String
  70. , discarded :: Maybe Boolean
  71. , favIconUrl :: Maybe String
  72. , height :: Maybe Number
  73. , hidden :: Boolean
  74. , highlighted :: Boolean
  75. -- should be optional
  76. , id :: TabId
  77. , incognito :: Boolean
  78. , index :: Int
  79. , isArticle :: Maybe Boolean
  80. , isInReaderMode :: Boolean
  81. , lastAccessed :: Number
  82. , openerTabId :: Maybe TabId
  83. , pinned :: Boolean
  84. , sessionId :: Maybe String
  85. , status :: Maybe String
  86. -- create an enum for that successorTabId :: Maybe Number
  87. , title :: String
  88. , url :: Maybe String
  89. , width :: Maybe Number
  90. , windowId :: WindowId
  91. }
  92. derive instance newtypeTab :: Newtype Tab _
  93. derive instance genTab :: Generic Tab _
  94. instance showTab :: Show Tab where
  95. show = genericShow
  96. showTabId :: Tab -> String
  97. showTabId (Tab t) = show t.id
  98. instance encodeTab :: Encode Tab where
  99. encode x = genericEncode (defaultOptions { unwrapSingleConstructors = true }) x
  100. instance decodeTab :: Decode Tab where
  101. decode x = genericDecode (defaultOptions { unwrapSingleConstructors = true }) x
  102. type QueryRecord =
  103. ( active :: Boolean
  104. , audible :: Boolean
  105. , autoDiscardable :: Boolean
  106. , cookieStoreId :: String
  107. , currentWindow :: Boolean
  108. , discarded :: Boolean
  109. , hidden :: Boolean
  110. , highlighted :: Boolean
  111. , index :: Int
  112. , muted :: Boolean
  113. , lastFocusedWindow :: Boolean
  114. , pinned :: Boolean
  115. , title :: String
  116. , url :: String
  117. , windowId :: Number
  118. )
  119. foreign import queryImpl
  120. :: forall r
  121. . { | r }
  122. -> Effect (Promise (Array Foreign))
  123. browserQuery
  124. :: forall r r2
  125. . Union r r2 QueryRecord
  126. => Record r
  127. -> Aff (Array Tab)
  128. browserQuery query = do
  129. tabsArray <- toAffE $ queryImpl query
  130. parsed <- liftEffect $ traverse unwrapForeign tabsArray
  131. pure parsed
  132. foreign import browserRemove' :: (Array Number) -> Effect (Promise Unit)
  133. browserRemove :: (Array TabId) -> Aff Unit
  134. browserRemove tabs =
  135. let
  136. tabIdsArray = map unwrap tabs
  137. in
  138. toAffE $ browserRemove' tabIdsArray
  139. where
  140. unwrap (TabId n) = n
  141. browserRemoveOne :: TabId -> Aff Unit
  142. browserRemoveOne tabId = browserRemove [tabId]
  143. type RowUpdateProperties
  144. = ( active :: Boolean
  145. , autoDiscardable :: Boolean
  146. , highlighted :: Boolean
  147. , loadReplace :: Boolean
  148. , muted :: Boolean
  149. , openerTabId :: TabId
  150. , pinned :: Boolean
  151. , successorTabId :: TabId
  152. , url :: String
  153. )
  154. foreign import browserUpdate' :: forall given trash. Union given trash RowUpdateProperties => { | given } -> TabId -> Effect (Promise Tab)
  155. browserUpdate :: forall prop b. Union prop b RowUpdateProperties => { | prop } -> TabId -> Aff Tab
  156. browserUpdate props tabId = toAffE $ browserUpdate' props tabId
  157. browserActivateTab :: TabId -> Aff Tab
  158. browserActivateTab tabId = browserUpdate { active: true } tabId
  159. type MoveProperties = {
  160. -- windowId :: Maybe WindowId
  161. index :: Int
  162. }
  163. foreign import browserMoveTab :: TabId -> MoveProperties -> Effect Unit
  164. type CreateProperties = (
  165. active :: Boolean,
  166. cookieStoreId :: String,
  167. discarded :: Boolean,
  168. index :: Int,
  169. openerTabId :: TabId,
  170. openInReaderMode :: Boolean,
  171. pinned :: Boolean,
  172. title :: String,
  173. url :: String,
  174. windowId :: WindowId
  175. )
  176. foreign import browserCreateTab :: forall props trash. Union props trash CreateProperties => { | props } -> Effect Unit
  177. foreign import browserHideTabs :: Array TabId -> Effect Unit
  178. foreign import browserShowTabs :: Array TabId -> Effect Unit