42 lines
1.1 KiB
Haskell
42 lines
1.1 KiB
Haskell
module Utils.Modal
|
|
( Modal(..)
|
|
, customModal
|
|
, modal
|
|
) where
|
|
|
|
import ClassyPrelude.Yesod
|
|
|
|
import Control.Lens
|
|
import Control.Lens.Extras (is)
|
|
import Utils.Route
|
|
|
|
import Settings (widgetFile)
|
|
|
|
|
|
data Modal site = Modal
|
|
{ modalTriggerId
|
|
, modalId :: Maybe Text
|
|
, modalTrigger :: Maybe Text {- Dynamic URL -} -> Text {- TriggerId -} -> WidgetT site IO ()
|
|
, modalContent :: Either (SomeRoute site) (WidgetT site IO ())
|
|
}
|
|
|
|
customModal :: Modal site -> WidgetT site IO ()
|
|
customModal Modal{..} = do
|
|
let isDynamic = is _Left modalContent
|
|
triggerId' <- maybe newIdent return modalTriggerId
|
|
|
|
$(widgetFile "widgets/modal/modal")
|
|
|
|
route <- for (modalContent ^? _Left) toTextUrl
|
|
modalTrigger route triggerId'
|
|
|
|
-- | Create a link to a modal
|
|
modal :: WidgetT site IO () -- ^ Widget that represents the link
|
|
-> Either (SomeRoute site) (WidgetT site IO ()) -- ^ Modal contant: either dynamic link or static widget
|
|
-> WidgetT site IO () -- ^ result widget
|
|
modal modalTrigger' modalContent = customModal Modal{..}
|
|
where
|
|
modalTriggerId = Nothing
|
|
modalId = Nothing
|
|
modalTrigger mRoute triggerId = $(widgetFile "widgets/modal/trigger")
|