elm-pages-v3-beta/examples/pokedex/app/Route/FileUpload.elm

108 lines
2.5 KiB
Elm
Raw Normal View History

module Route.FileUpload exposing (Data, Model, Msg, route)
2021-12-30 02:57:04 +03:00
import DataSource exposing (DataSource)
import Head
import Head.Seo as Seo
import Html
import Html.Attributes as Attr
import Pages.PageUrl exposing (PageUrl)
import Pages.Url
2022-03-05 20:50:01 +03:00
import RouteBuilder exposing (StatelessRoute, StaticPayload)
2021-12-30 02:57:04 +03:00
import Server.Request as Request
import Server.Response
2021-12-30 02:57:04 +03:00
import Shared
import View exposing (View)
type alias Model =
{}
type alias Msg =
()
2021-12-30 02:57:04 +03:00
type alias RouteParams =
{}
route : StatelessRoute RouteParams Data
route =
2022-03-05 20:50:01 +03:00
RouteBuilder.serverRender
2021-12-30 02:57:04 +03:00
{ head = head
, data = data
}
2022-03-05 20:50:01 +03:00
|> RouteBuilder.buildNoState { view = view }
2021-12-30 02:57:04 +03:00
type alias Data =
Maybe Request.File
data : RouteParams -> Request.Parser (DataSource (Server.Response.Response Data))
2021-12-30 02:57:04 +03:00
data routeParams =
Request.oneOf
2021-12-30 02:57:04 +03:00
[ Request.expectMultiPartFormPost
(\{ field, optionalField, fileField } ->
fileField "file"
)
|> Request.map
2021-12-30 02:57:04 +03:00
(\file ->
DataSource.succeed (Server.Response.render (Just file))
2021-12-30 02:57:04 +03:00
)
, Request.succeed
(DataSource.succeed (Server.Response.render Nothing))
2021-12-30 02:57:04 +03:00
]
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
view :
Maybe PageUrl
-> Shared.Model
-> StaticPayload Data RouteParams
-> View Msg
view maybeUrl sharedModel static =
{ title = "File Upload"
, body =
[ static.data
|> Maybe.map
(\file ->
Html.div []
[ Html.h1 [] [ Html.text "Got file" ]
, Html.p [] [ Html.text file.name ]
]
)
|> Maybe.withDefault (Html.text "No file uploaded. Choose a file to get started.")
, Html.form [ Attr.method "POST", Attr.enctype "multipart/form-data" ]
[ Html.input
[ Attr.type_ "file"
, Attr.name "file"
]
[]
, Html.input
[ Attr.type_ "submit"
]
[]
]
]
}