elm-pages-v3-beta/examples/pokedex/src/Page/Greet.elm
2021-12-28 08:32:25 -08:00

121 lines
2.9 KiB
Elm

module Page.Greet exposing (Data, Model, Msg, page)
import CookieParser
import DataSource exposing (DataSource)
import Dict
import Head
import Head.Seo as Seo
import Html
import Html.Attributes as Attr
import Page exposing (Page, PageWithState, StaticPayload)
import PageServerResponse exposing (PageServerResponse)
import Pages.PageUrl exposing (PageUrl)
import Pages.Url
import Server.Request as Request
import ServerResponse
import Shared
import Time
import View exposing (View)
type alias Model =
{}
type alias Msg =
Never
type alias RouteParams =
{}
page : Page RouteParams Data
page =
Page.serverRender
{ head = head
, data = data
}
|> Page.buildNoState { view = view }
data : RouteParams -> Request.Handler (PageServerResponse Data)
data routeParams =
Request.oneOfHandler
[ Request.map2 Data
(Request.expectQueryParam "name")
Request.requestTime
|> Request.thenRespond
(\requestData ->
requestData
|> PageServerResponse.RenderPage
|> DataSource.succeed
)
, Request.map2 Data
(Request.expectCookie "username")
Request.requestTime
|> Request.thenRespond
(\requestData ->
requestData
|> PageServerResponse.RenderPage
|> DataSource.succeed
)
, Request.succeed ()
|> Request.thenRespond
(\() ->
DataSource.succeed
(PageServerResponse.ServerResponse (ServerResponse.temporaryRedirect "/login"))
)
]
head :
StaticPayload Data RouteParams
-> List Head.Tag
head static =
Seo.summary
{ canonicalUrlOverride = Nothing
, siteName = "elm-pages"
, image =
{ url = Pages.Url.external "TODO"
, alt = "elm-pages logo"
, dimensions = Nothing
, mimeType = Nothing
}
, description = "TODO"
, locale = Nothing
, title = "TODO title" -- metadata.title -- TODO
}
|> Seo.website
type alias Data =
{ username : String
, requestTime : Time.Posix
}
view :
Maybe PageUrl
-> Shared.Model
-> StaticPayload Data RouteParams
-> View Msg
view maybeUrl sharedModel static =
{ title = "Hello!"
, body =
[ Html.text <| "Hello " ++ static.data.username ++ "!"
, Html.text <| "Requested page at " ++ String.fromInt (Time.posixToMillis static.data.requestTime)
, Html.div []
[ Html.form
[ Attr.method "post"
, Attr.action "/api/logout"
]
[ Html.button
[ Attr.type_ "submit"
]
[ Html.text "Logout" ]
]
]
]
}