Current section
Files
Jump to
Current section
Files
src/Upload.elm
module Upload exposing (Upload, UploadExport, UploadId, UploadStatus(..), UploadTarget, createUpload, export, updateUploadProgress)
import File exposing (File)
import Http exposing (Progress(..))
import Task exposing (Task)
import Time exposing (Posix)
type alias UploadId =
String
type UploadStatus
= InProgress
| Done
| Error
type alias UploadExport =
{ id : UploadId
, name : String
, progress : Int
, sent : Int
, size : Int
, status : String
}
type alias Upload =
{ file : File
, id : UploadId
, name : String
, progress : Int
, sent : Int
, size : Int
, status : UploadStatus
}
type alias UploadTarget =
{ id : UploadId
, url : String
}
createUpload : (Upload -> msg) -> File -> Cmd msg
createUpload msg file =
let
idFromTime : Posix -> UploadId
idFromTime posix =
Time.posixToMillis posix |> String.fromInt
generateId : Posix -> Task x UploadId
generateId =
Task.succeed << idFromTime
setIdInUpload : UploadId -> Task x Upload
setIdInUpload =
Task.succeed << makeUpload file
in
Time.now |> Task.andThen generateId |> Task.andThen setIdInUpload |> Task.perform msg
export : Upload -> UploadExport
export upload =
let
status : String
status =
case upload.status of
InProgress ->
"InProgress"
Done ->
"Done"
Error ->
"Error"
in
{ id = upload.id, name = upload.name, progress = upload.progress, sent = upload.sent, size = upload.size, status = status }
makeUpload : File -> String -> Upload
makeUpload file id =
let
name : String
name =
File.name file
size : Int
size =
File.size file
in
{ file = file, id = id, name = name, progress = 0, sent = 0, size = size, status = InProgress }
updateUploadProgress : Upload -> Progress -> Upload
updateUploadProgress upload progress =
case progress of
Sending data ->
let
percentage : Int
percentage =
ceiling ((toFloat data.sent / toFloat upload.size) * 100)
in
{ upload | progress = percentage, sent = data.sent }
_ ->
upload