49 lines
1.3 KiB
Text
49 lines
1.3 KiB
Text
|
module Component.BList where
|
||
|
|
||
|
import Prelude
|
||
|
|
||
|
import Component.BMark (BMessage(..), BQuery, bmark)
|
||
|
import Model (Bookmark, BookmarkId)
|
||
|
|
||
|
import Data.Array (filter)
|
||
|
import Data.Maybe (Maybe(..))
|
||
|
import Effect.Aff (Aff)
|
||
|
import Halogen as H
|
||
|
import Halogen.HTML as HH
|
||
|
import Halogen.HTML.Events as HE
|
||
|
|
||
|
type BSlot = BookmarkId
|
||
|
|
||
|
data LQuery a =
|
||
|
HandleBMessage BSlot BMessage a
|
||
|
|
||
|
blist :: Array Bookmark -> H.Component HH.HTML LQuery Unit Void Aff
|
||
|
blist st =
|
||
|
H.parentComponent
|
||
|
{ initialState: const st
|
||
|
, render
|
||
|
, eval
|
||
|
, receiver: const Nothing
|
||
|
}
|
||
|
where
|
||
|
|
||
|
render :: Array Bookmark -> H.ParentHTML LQuery BQuery BSlot Aff
|
||
|
render bms =
|
||
|
HH.div_ (map renderBookmark bms)
|
||
|
where
|
||
|
renderBookmark :: Bookmark -> H.ParentHTML LQuery BQuery BSlot Aff
|
||
|
renderBookmark b =
|
||
|
HH.slot
|
||
|
b.bid
|
||
|
(bmark b)
|
||
|
unit
|
||
|
(HE.input (HandleBMessage b.bid))
|
||
|
|
||
|
eval :: LQuery ~> H.ParentDSL (Array Bookmark) LQuery BQuery BSlot Void Aff
|
||
|
eval (HandleBMessage p BNotifyRemove next) = do
|
||
|
H.modify_ (removeBookmark p)
|
||
|
pure next
|
||
|
where
|
||
|
removeBookmark :: BookmarkId -> Array Bookmark -> Array Bookmark
|
||
|
removeBookmark bookmarkId = filter (\b -> b.bid /= bookmarkId)
|