elm-twitch/src/Core.elm

64 lines
1.4 KiB
Elm

module Core exposing (FullModel(..), Model, Msg(..), Page(..), init, update)
import Browser.Navigation
import Json.Decode as Decode
import Task
import Time
import Twitch
import Url
type FullModel
= Unloaded
| Loaded Model
type alias Model =
{ playlists : List Twitch.Playlist
, zone : Time.Zone
, page : Page
}
type Page
= Home
| Playlist Twitch.Playlist
| Video Twitch.Playlist Twitch.Video
type Msg
= Noop
| PlaylistsReceived ( List Twitch.Playlist, Time.Zone )
| HomeClicked
| PlaylistClicked Twitch.Playlist
| VideoClicked Twitch.Playlist Twitch.Video
init : Decode.Value -> Url.Url -> Browser.Navigation.Key -> ( FullModel, Cmd Msg )
init _ _ _ =
( Unloaded
, Task.perform PlaylistsReceived Twitch.fetchPlaylists
)
update : Msg -> FullModel -> ( FullModel, Cmd Msg )
update msg model =
case ( msg, model ) of
( Noop, _ ) ->
( model, Cmd.none )
( PlaylistsReceived ( playlists, zone ), _ ) ->
( Loaded { playlists = playlists, zone = zone, page = Home }, Cmd.none )
( HomeClicked, Loaded m ) ->
( Loaded { m | page = Home }, Cmd.none )
( PlaylistClicked playlist, Loaded m ) ->
( Loaded { m | page = Playlist playlist }, Cmd.none )
( VideoClicked playlist video, Loaded m ) ->
( Loaded { m | page = Video playlist video }, Cmd.none )
_ ->
( model, Cmd.none )