61 lines
2.0 KiB
Haskell
61 lines
2.0 KiB
Haskell
module Utils.Message
|
|
( MessageClass(..)
|
|
, addMessage, addMessageI, addMessageIHamlet, addMessageFile, addMessageWidget
|
|
) where
|
|
|
|
|
|
import Data.Universe
|
|
import Utils.PathPiece
|
|
import Data.Aeson
|
|
import Data.Aeson.TH
|
|
|
|
import qualified ClassyPrelude.Yesod (addMessage, addMessageI)
|
|
import ClassyPrelude.Yesod hiding (addMessage, addMessageI)
|
|
|
|
import Text.Hamlet
|
|
|
|
import Language.Haskell.TH
|
|
import Language.Haskell.TH.Syntax (Lift)
|
|
|
|
|
|
data MessageClass = Error | Warning | Info | Success
|
|
deriving (Eq, Ord, Enum, Bounded, Show, Read, Lift)
|
|
|
|
instance Universe MessageClass
|
|
instance Finite MessageClass
|
|
|
|
deriveJSON defaultOptions
|
|
{ constructorTagModifier = camelToPathPiece
|
|
} ''MessageClass
|
|
|
|
nullaryPathPiece ''MessageClass camelToPathPiece
|
|
derivePersistField "MessageClass"
|
|
|
|
|
|
addMessage :: MonadHandler m => MessageClass-> Html -> m ()
|
|
addMessage mc = ClassyPrelude.Yesod.addMessage (toPathPiece mc)
|
|
|
|
addMessageI :: (MonadHandler m, RenderMessage (HandlerSite m) msg) => MessageClass -> msg -> m ()
|
|
addMessageI mc = ClassyPrelude.Yesod.addMessageI (toPathPiece mc)
|
|
|
|
addMessageIHamlet :: ( MonadHandler m
|
|
, RenderMessage (HandlerSite m) msg
|
|
, HandlerSite m ~ site
|
|
) => MessageClass -> HtmlUrlI18n msg (Route site) -> m ()
|
|
addMessageIHamlet mc iHamlet = do
|
|
mr <- getMessageRender
|
|
ClassyPrelude.Yesod.addMessage (toPathPiece mc) =<< withUrlRenderer (iHamlet $ toHtml . mr)
|
|
|
|
addMessageFile :: MessageClass -> FilePath -> ExpQ
|
|
addMessageFile mc tPath = [e|addMessageIHamlet mc $(ihamletFile tPath)|]
|
|
|
|
addMessageWidget :: forall m site.
|
|
( MonadHandler m
|
|
, HandlerSite m ~ site
|
|
, Yesod site
|
|
) => MessageClass -> WidgetT site IO () -> m ()
|
|
-- ^ _Note_: `addMessageWidget` ignores `pageTitle` and `pageHead`
|
|
addMessageWidget mc wgt = do
|
|
PageContent{pageBody} <- liftHandlerT $ widgetToPageContent wgt
|
|
addMessageIHamlet mc (const pageBody :: HtmlUrlI18n (SomeMessage site) (Route site))
|