64 lines
1.4 KiB
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 )
|