Ultimate dest and messages
This commit is contained in:
parent
2067d5d687
commit
c3f236ce9c
@ -50,6 +50,14 @@ module Yesod.Handler
|
|||||||
-- * Session
|
-- * Session
|
||||||
, setSession
|
, setSession
|
||||||
, clearSession
|
, clearSession
|
||||||
|
-- ** Ultimate destination
|
||||||
|
, setUltDest
|
||||||
|
, setUltDestString
|
||||||
|
, setUltDest'
|
||||||
|
, redirectUltDest
|
||||||
|
-- ** Messages
|
||||||
|
, setMessage
|
||||||
|
, getMessage
|
||||||
-- * Internal Yesod
|
-- * Internal Yesod
|
||||||
, runHandler
|
, runHandler
|
||||||
, YesodApp (..)
|
, YesodApp (..)
|
||||||
@ -83,6 +91,9 @@ import qualified Data.ByteString.Lazy as BL
|
|||||||
import qualified Network.Wai as W
|
import qualified Network.Wai as W
|
||||||
|
|
||||||
import Data.Convertible.Text (cs)
|
import Data.Convertible.Text (cs)
|
||||||
|
import Text.Hamlet
|
||||||
|
import Data.Text (Text)
|
||||||
|
import Web.Encodings (encodeHtml)
|
||||||
|
|
||||||
data HandlerData sub master = HandlerData
|
data HandlerData sub master = HandlerData
|
||||||
{ handlerRequest :: Request
|
{ handlerRequest :: Request
|
||||||
@ -255,6 +266,67 @@ redirectParams rt url params = do
|
|||||||
redirectString :: RedirectType -> String -> GHandler sub master a
|
redirectString :: RedirectType -> String -> GHandler sub master a
|
||||||
redirectString rt url = Handler $ \_ -> return ([], [], HCRedirect rt url)
|
redirectString rt url = Handler $ \_ -> return ([], [], HCRedirect rt url)
|
||||||
|
|
||||||
|
ultDestKey :: String
|
||||||
|
ultDestKey = "_ULT"
|
||||||
|
|
||||||
|
-- | Sets the ultimate destination variable to the given route.
|
||||||
|
--
|
||||||
|
-- An ultimate destination is stored in the user session and can be loaded
|
||||||
|
-- later by 'redirectUltDest'.
|
||||||
|
setUltDest :: Routes master -> GHandler sub master ()
|
||||||
|
setUltDest dest = do
|
||||||
|
render <- getUrlRender
|
||||||
|
setUltDestString $ render dest
|
||||||
|
|
||||||
|
-- | Same as 'setUltDest', but use the given string.
|
||||||
|
setUltDestString :: String -> GHandler sub master ()
|
||||||
|
setUltDestString = setSession ultDestKey
|
||||||
|
|
||||||
|
-- | Same as 'setUltDest', but uses the current page.
|
||||||
|
--
|
||||||
|
-- If this is a 404 handler, there is no current page, and then this call does
|
||||||
|
-- nothing.
|
||||||
|
setUltDest' :: GHandler sub master ()
|
||||||
|
setUltDest' = do
|
||||||
|
route <- getRoute
|
||||||
|
tm <- getRouteToMaster
|
||||||
|
maybe (return ()) setUltDest $ tm <$> route
|
||||||
|
|
||||||
|
-- | Redirect to the ultimate destination in the user's session. Clear the
|
||||||
|
-- value from the session.
|
||||||
|
--
|
||||||
|
-- The ultimate destination is set with 'setUltDest'.
|
||||||
|
redirectUltDest :: RedirectType
|
||||||
|
-> Routes master -- ^ default destination if nothing in session
|
||||||
|
-> GHandler sub master ()
|
||||||
|
redirectUltDest rt def = do
|
||||||
|
mdest <- lookupSession ultDestKey
|
||||||
|
clearSession ultDestKey
|
||||||
|
maybe (redirect rt def) (redirectString rt) mdest
|
||||||
|
|
||||||
|
msgKey :: String
|
||||||
|
msgKey = "_MSG"
|
||||||
|
|
||||||
|
-- | Sets a message in the user's session.
|
||||||
|
--
|
||||||
|
-- See 'getMessage'.
|
||||||
|
setMessage :: HtmlContent -> GHandler sub master ()
|
||||||
|
setMessage = setSession msgKey . cs . htmlContentToText
|
||||||
|
|
||||||
|
-- | Gets the message in the user's session, if available, and then clears the
|
||||||
|
-- variable.
|
||||||
|
--
|
||||||
|
-- See 'setMessage'.
|
||||||
|
getMessage :: GHandler sub master (Maybe HtmlContent)
|
||||||
|
getMessage = do
|
||||||
|
clearSession msgKey
|
||||||
|
(fmap $ fmap $ Encoded . cs) $ lookupSession msgKey
|
||||||
|
|
||||||
|
-- | FIXME move this definition into hamlet
|
||||||
|
htmlContentToText :: HtmlContent -> Text
|
||||||
|
htmlContentToText (Encoded t) = t
|
||||||
|
htmlContentToText (Unencoded t) = encodeHtml t
|
||||||
|
|
||||||
-- | Bypass remaining handler code and output the given file.
|
-- | Bypass remaining handler code and output the given file.
|
||||||
--
|
--
|
||||||
-- For some backends, this is more efficient than reading in the file to
|
-- For some backends, this is more efficient than reading in the file to
|
||||||
|
|||||||
@ -116,18 +116,6 @@ getVerifyR lid key = do
|
|||||||
%p I'm sorry, but that was an invalid verification key.
|
%p I'm sorry, but that was an invalid verification key.
|
||||||
|]
|
|]
|
||||||
|
|
||||||
messageKey :: String
|
|
||||||
messageKey = "MESSAGE"
|
|
||||||
|
|
||||||
getMessage :: GHandler sub master (Maybe HtmlContent)
|
|
||||||
getMessage = do
|
|
||||||
s <- session
|
|
||||||
clearSession messageKey
|
|
||||||
return $ listToMaybe $ map (Encoded . cs) $ s messageKey
|
|
||||||
|
|
||||||
setMessage :: String -> GHandler sub master ()
|
|
||||||
setMessage = setSession messageKey . cs
|
|
||||||
|
|
||||||
getLoginR :: Yesod master => GHandler EmailAuth master RepHtml
|
getLoginR :: Yesod master => GHandler EmailAuth master RepHtml
|
||||||
getLoginR = do
|
getLoginR = do
|
||||||
toMaster <- getRouteToMaster
|
toMaster <- getRouteToMaster
|
||||||
@ -170,7 +158,7 @@ postLoginR = do
|
|||||||
setLoginSession email lid
|
setLoginSession email lid
|
||||||
redirect RedirectTemporary $ onSuccessfulLogin y
|
redirect RedirectTemporary $ onSuccessfulLogin y
|
||||||
Nothing -> do
|
Nothing -> do
|
||||||
setMessage "Invalid email/password combination"
|
setMessage $ cs "Invalid email/password combination"
|
||||||
toMaster <- getRouteToMaster
|
toMaster <- getRouteToMaster
|
||||||
redirect RedirectTemporary $ toMaster LoginR
|
redirect RedirectTemporary $ toMaster LoginR
|
||||||
|
|
||||||
@ -179,7 +167,7 @@ getPasswordR = do
|
|||||||
l <- isJust <$> isLoggedIn
|
l <- isJust <$> isLoggedIn
|
||||||
toMaster <- getRouteToMaster
|
toMaster <- getRouteToMaster
|
||||||
unless l $ do
|
unless l $ do
|
||||||
setMessage "You must be logged in to set a password"
|
setMessage $ cs "You must be logged in to set a password"
|
||||||
redirect RedirectTemporary $ toMaster LoginR
|
redirect RedirectTemporary $ toMaster LoginR
|
||||||
msg <- getMessage
|
msg <- getMessage
|
||||||
applyLayout "Set password" (return ()) [$hamlet|
|
applyLayout "Set password" (return ()) [$hamlet|
|
||||||
@ -208,18 +196,18 @@ postPasswordR = do
|
|||||||
<*> notEmpty (required $ input "confirm")
|
<*> notEmpty (required $ input "confirm")
|
||||||
toMaster <- getRouteToMaster
|
toMaster <- getRouteToMaster
|
||||||
when (new /= confirm) $ do
|
when (new /= confirm) $ do
|
||||||
setMessage "Passwords did not match, please try again"
|
setMessage $ cs "Passwords did not match, please try again"
|
||||||
redirect RedirectTemporary $ toMaster PasswordR
|
redirect RedirectTemporary $ toMaster PasswordR
|
||||||
mlid <- isLoggedIn
|
mlid <- isLoggedIn
|
||||||
lid <- case mlid of
|
lid <- case mlid of
|
||||||
Just lid -> return lid
|
Just lid -> return lid
|
||||||
Nothing -> do
|
Nothing -> do
|
||||||
setMessage "You must be logged in to set a password"
|
setMessage $ cs "You must be logged in to set a password"
|
||||||
redirect RedirectTemporary $ toMaster LoginR
|
redirect RedirectTemporary $ toMaster LoginR
|
||||||
salted <- liftIO $ saltPass new
|
salted <- liftIO $ saltPass new
|
||||||
y <- getYesod
|
y <- getYesod
|
||||||
liftIO $ setPassword y lid salted
|
liftIO $ setPassword y lid salted
|
||||||
setMessage "Password updated"
|
setMessage $ cs "Password updated"
|
||||||
redirect RedirectTemporary $ toMaster LoginR
|
redirect RedirectTemporary $ toMaster LoginR
|
||||||
|
|
||||||
getLogoutR :: YesodEmailAuth master => GHandler EmailAuth master RepHtml
|
getLogoutR :: YesodEmailAuth master => GHandler EmailAuth master RepHtml
|
||||||
|
|||||||
@ -28,6 +28,7 @@ module Yesod.Request
|
|||||||
, postParams
|
, postParams
|
||||||
, cookies
|
, cookies
|
||||||
, session
|
, session
|
||||||
|
, lookupSession
|
||||||
-- * Parameter type synonyms
|
-- * Parameter type synonyms
|
||||||
, ParamName
|
, ParamName
|
||||||
, ParamValue
|
, ParamValue
|
||||||
@ -113,3 +114,9 @@ session :: RequestReader m => m (ParamName -> [ParamValue])
|
|||||||
session = do
|
session = do
|
||||||
rr <- getRequest
|
rr <- getRequest
|
||||||
return $ multiLookup $ reqSession rr
|
return $ multiLookup $ reqSession rr
|
||||||
|
|
||||||
|
-- | Lookup for session data.
|
||||||
|
lookupSession :: RequestReader m => ParamName -> m (Maybe ParamValue)
|
||||||
|
lookupSession pn = do
|
||||||
|
rr <- getRequest
|
||||||
|
return $ lookup pn $ reqSession rr
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user