|
|
@@ -1,22 +1,47 @@
|
|
|
module Main exposing (..)
|
|
|
|
|
|
-import Browser
|
|
|
-import Html exposing (Html, button, div, text)
|
|
|
-import Html.Attributes exposing (class)
|
|
|
+import Browser exposing (Document)
|
|
|
+import Draft exposing (Draft)
|
|
|
+import Html exposing (Html, button, div, img, span, text)
|
|
|
+import Html.Attributes exposing (alt, attribute, class, classList, disabled, src)
|
|
|
import Html.Events exposing (onClick)
|
|
|
+import Html.Keyed as Keyed
|
|
|
+import Json.Decode exposing (decodeString)
|
|
|
+import Zipper
|
|
|
|
|
|
|
|
|
main =
|
|
|
- Browser.sandbox { init = init, update = update, view = view }
|
|
|
+ Browser.document
|
|
|
+ { init = init
|
|
|
+ , update = update
|
|
|
+ , view = view
|
|
|
+ , subscriptions = \_ -> Sub.none
|
|
|
+ }
|
|
|
|
|
|
|
|
|
-type alias Model =
|
|
|
- Int
|
|
|
+type Model
|
|
|
+ = Ready ReadyModel
|
|
|
+ | Error ErrorModel
|
|
|
|
|
|
|
|
|
-init : Model
|
|
|
-init =
|
|
|
- 0
|
|
|
+type alias ReadyModel =
|
|
|
+ { draft : Draft
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+type alias ErrorModel =
|
|
|
+ { error : String
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+init : { setData : String, draftData : String } -> ( Model, Cmd Msg )
|
|
|
+init flags =
|
|
|
+ case decodeString Draft.decode flags.draftData of
|
|
|
+ Ok draftData ->
|
|
|
+ ( Ready { draft = draftData }, Cmd.none )
|
|
|
+
|
|
|
+ Err _ ->
|
|
|
+ ( Error { error = "Error decoding draft data" }, Cmd.none )
|
|
|
|
|
|
|
|
|
type Msg
|
|
|
@@ -24,20 +49,81 @@ type Msg
|
|
|
| Decrement
|
|
|
|
|
|
|
|
|
-update : Msg -> Model -> Model
|
|
|
+update : Msg -> Model -> ( Model, Cmd Msg )
|
|
|
update msg model =
|
|
|
- case msg of
|
|
|
- Increment ->
|
|
|
- model + 1
|
|
|
+ case model of
|
|
|
+ Ready mdl ->
|
|
|
+ case msg of
|
|
|
+ Increment ->
|
|
|
+ ( Ready { mdl | draft = Zipper.moveRight mdl.draft }, Cmd.none )
|
|
|
|
|
|
- Decrement ->
|
|
|
- model - 1
|
|
|
+ Decrement ->
|
|
|
+ ( Ready { mdl | draft = Zipper.moveLeft mdl.draft }, Cmd.none )
|
|
|
|
|
|
+ Error mdl ->
|
|
|
+ ( Error mdl, Cmd.none )
|
|
|
|
|
|
-view : Model -> Html Msg
|
|
|
+
|
|
|
+view : Model -> Document Msg
|
|
|
view model =
|
|
|
- div [ class "m-10 text-4xl" ]
|
|
|
- [ button [ onClick Decrement ] [ text "-" ]
|
|
|
- , div [ class "text-green-400" ] [ text (String.fromInt model) ]
|
|
|
- , button [ onClick Increment ] [ text "+" ]
|
|
|
+ { title = "Drafter"
|
|
|
+ , body =
|
|
|
+ [ case model of
|
|
|
+ Ready mdl ->
|
|
|
+ viewReady mdl
|
|
|
+
|
|
|
+ Error mdl ->
|
|
|
+ viewError mdl
|
|
|
+ ]
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+viewReady : ReadyModel -> Html Msg
|
|
|
+viewReady model =
|
|
|
+ div []
|
|
|
+ [ div []
|
|
|
+ [ button
|
|
|
+ [ onClick Decrement
|
|
|
+ , disabled (not (Zipper.hasLeft model.draft))
|
|
|
+ ]
|
|
|
+ [ text "Previous" ]
|
|
|
+ , span [] [ text ("Pick " ++ String.fromInt (Zipper.position model.draft)) ]
|
|
|
+ , button
|
|
|
+ [ onClick Increment
|
|
|
+ , disabled (not (Zipper.hasRight model.draft))
|
|
|
+ ]
|
|
|
+ [ text "Next" ]
|
|
|
+ ]
|
|
|
+ , viewDraft model.draft
|
|
|
+ ]
|
|
|
+
|
|
|
+
|
|
|
+viewError : ErrorModel -> Html Msg
|
|
|
+viewError model =
|
|
|
+ div [ class "error" ]
|
|
|
+ [ text model.error ]
|
|
|
+
|
|
|
+
|
|
|
+viewDraft : Draft -> Html Msg
|
|
|
+viewDraft draft =
|
|
|
+ let
|
|
|
+ chosen =
|
|
|
+ (Zipper.focus draft).chosen
|
|
|
+
|
|
|
+ picks =
|
|
|
+ List.map (\c -> viewKeyedCard (chosen.name == c.name) c)
|
|
|
+ (Zipper.focus draft).available
|
|
|
+ in
|
|
|
+ Keyed.node "div"
|
|
|
+ [ class "grid grid-cols-8 w-100 gap-6" ]
|
|
|
+ picks
|
|
|
+
|
|
|
+
|
|
|
+viewKeyedCard : Bool -> Draft.PickCard -> ( String, Html Msg )
|
|
|
+viewKeyedCard wasChosen { name, frontImage, backImage } =
|
|
|
+ ( name
|
|
|
+ , div
|
|
|
+ [ classList [ ( "border-4 border-green-500", wasChosen ) ]
|
|
|
]
|
|
|
+ [ img [ src frontImage, alt name ] [] ]
|
|
|
+ )
|