|
|
@@ -1,4 +1,4 @@
|
|
|
-module Main exposing (..)
|
|
|
+port module Main exposing (..)
|
|
|
|
|
|
import API
|
|
|
import Browser exposing (Document)
|
|
|
@@ -7,12 +7,15 @@ import Chart as C
|
|
|
import Chart.Attributes as CA
|
|
|
import Database
|
|
|
import Deck
|
|
|
+import Dict exposing (Dict)
|
|
|
import Draft exposing (Draft)
|
|
|
import Html exposing (Html, a, button, div, img, li, p, span, text, ul)
|
|
|
import Html.Attributes exposing (alt, class, classList, disabled, src)
|
|
|
import Html.Events as Events exposing (onClick, onMouseEnter)
|
|
|
import Html.Keyed as Keyed
|
|
|
import Icon exposing (chevronDown, chevronUp)
|
|
|
+import Json.Decode exposing (decodeString)
|
|
|
+import Json.Encode as Encode
|
|
|
import List.Extra as List
|
|
|
import Round
|
|
|
import Signals
|
|
|
@@ -26,7 +29,7 @@ main =
|
|
|
{ init = init
|
|
|
, update = update
|
|
|
, view = view
|
|
|
- , subscriptions = \_ -> Sub.none
|
|
|
+ , subscriptions = subscriptions
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -53,11 +56,18 @@ type alias ToolboxAccordion =
|
|
|
{ cmc : Bool, signals : Bool, signalsDelta : Bool, deckList : Bool }
|
|
|
|
|
|
|
|
|
+type SetLoadStatus
|
|
|
+ = CheckingLocalData
|
|
|
+ | HasLocalData Database.Database
|
|
|
+ | FetchingRemoteData
|
|
|
+ | SavingRemoteData
|
|
|
+
|
|
|
+
|
|
|
type alias ChooseSetModel =
|
|
|
{ draftData : String
|
|
|
, cardRatings : String
|
|
|
, setData : String
|
|
|
- , sets : Maybe (List String)
|
|
|
+ , sets : Maybe (Dict String SetLoadStatus)
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -104,12 +114,13 @@ type Msg
|
|
|
| ToggleDeckList
|
|
|
| SetDeckSortMethod Deck.DeckSortMethod
|
|
|
| IOGotSets (Result String (List String))
|
|
|
+ | PortReceiveDoesSetHaveLocalData String
|
|
|
|
|
|
|
|
|
-startDraft : ChooseSetModel -> ( Model, Cmd Msg )
|
|
|
-startDraft initFlags =
|
|
|
- case ( Draft.decode initFlags.draftData, Database.decode initFlags.setData initFlags.cardRatings ) of
|
|
|
- ( Ok draftData, Ok database ) ->
|
|
|
+startDraft : ChooseSetModel -> String -> ( Model, Cmd Msg )
|
|
|
+startDraft initFlags setCode =
|
|
|
+ case ( Maybe.andThen (Dict.get setCode) initFlags.sets, Draft.decode initFlags.draftData ) of
|
|
|
+ ( Just (HasLocalData database), Ok draftData ) ->
|
|
|
( Ready
|
|
|
{ draft = draftData
|
|
|
, database = database
|
|
|
@@ -129,14 +140,11 @@ startDraft initFlags =
|
|
|
, Cmd.none
|
|
|
)
|
|
|
|
|
|
- ( Err err, Ok _ ) ->
|
|
|
- ( Error { error = "Error decoding draft data: " ++ err }, Cmd.none )
|
|
|
-
|
|
|
- ( Ok _, Err err ) ->
|
|
|
- ( Error { error = "Error decoding set data: " ++ err }, Cmd.none )
|
|
|
+ ( _, Ok _ ) ->
|
|
|
+ ( Error { error = "No set data in init flags" }, Cmd.none )
|
|
|
|
|
|
- ( Err draftError, Err databaseError ) ->
|
|
|
- ( Error { error = "Error decoding draft data: " ++ draftError ++ ", set data: " ++ databaseError }, Cmd.none )
|
|
|
+ ( _, Err err ) ->
|
|
|
+ ( Error { error = "Error decoding draft data: " ++ err }, Cmd.none )
|
|
|
|
|
|
|
|
|
update : Msg -> Model -> ( Model, Cmd Msg )
|
|
|
@@ -145,11 +153,50 @@ update msg model =
|
|
|
ChooseSet mdl ->
|
|
|
case msg of
|
|
|
IOGotSets (Ok sets) ->
|
|
|
- ( ChooseSet { mdl | sets = Just sets }, Cmd.none )
|
|
|
+ let
|
|
|
+ setStatus : Dict String SetLoadStatus
|
|
|
+ setStatus =
|
|
|
+ sets
|
|
|
+ |> List.map (\s -> ( s, CheckingLocalData ))
|
|
|
+ |> Dict.fromList
|
|
|
+
|
|
|
+ setCmds : List (Cmd Msg)
|
|
|
+ setCmds =
|
|
|
+ List.map
|
|
|
+ (\s -> sendDoesSetHaveLocalData s)
|
|
|
+ sets
|
|
|
+ in
|
|
|
+ ( ChooseSet { mdl | sets = Just setStatus }
|
|
|
+ , Cmd.batch setCmds
|
|
|
+ )
|
|
|
|
|
|
IOGotSets (Err e) ->
|
|
|
( Error { error = "Error fetching sets (" ++ e ++ ")" }, Cmd.none )
|
|
|
|
|
|
+ PortReceiveDoesSetHaveLocalData unparsedData ->
|
|
|
+ let
|
|
|
+ markSetDataLoaded :
|
|
|
+ String
|
|
|
+ -> Database.Database
|
|
|
+ -> Dict String SetLoadStatus
|
|
|
+ -> Dict String SetLoadStatus
|
|
|
+ markSetDataLoaded setCode db =
|
|
|
+ Dict.insert setCode (HasLocalData db)
|
|
|
+
|
|
|
+ markSetDataNotAvailable : String -> Dict String SetLoadStatus -> Dict String SetLoadStatus
|
|
|
+ markSetDataNotAvailable setCode =
|
|
|
+ Dict.insert setCode FetchingRemoteData
|
|
|
+ in
|
|
|
+ case Database.decode unparsedData of
|
|
|
+ Ok ( setCode, Just db ) ->
|
|
|
+ ( ChooseSet { mdl | sets = Maybe.map (markSetDataLoaded setCode db) mdl.sets }, Cmd.none )
|
|
|
+
|
|
|
+ Ok ( setCode, Nothing ) ->
|
|
|
+ ( ChooseSet { mdl | sets = Maybe.map (markSetDataNotAvailable setCode) mdl.sets }, Cmd.none )
|
|
|
+
|
|
|
+ Err e ->
|
|
|
+ ( Error { error = "Error decoding local set data (" ++ e ++ ")" }, Cmd.none )
|
|
|
+
|
|
|
_ ->
|
|
|
( ChooseSet mdl, Cmd.none )
|
|
|
|
|
|
@@ -213,6 +260,9 @@ update msg model =
|
|
|
IOGotSets _ ->
|
|
|
( Ready mdl, Cmd.none )
|
|
|
|
|
|
+ PortReceiveDoesSetHaveLocalData _ ->
|
|
|
+ ( Ready mdl, Cmd.none )
|
|
|
+
|
|
|
Error mdl ->
|
|
|
( Error mdl, Cmd.none )
|
|
|
|
|
|
@@ -240,7 +290,7 @@ viewChooseSet model =
|
|
|
[ div [ class "max-w-2xl max-h-2xl" ]
|
|
|
[ case model.sets of
|
|
|
Just sets ->
|
|
|
- ul [] (List.map (\s -> li [] [ text s ]) sets)
|
|
|
+ ul [] (List.map (\s -> li [] [ text s ]) (Dict.keys sets))
|
|
|
|
|
|
Nothing ->
|
|
|
p [] [ text "Loading..." ]
|
|
|
@@ -752,3 +802,21 @@ viewKeyedCard model wasChosen { name, frontImage, backImage } =
|
|
|
, viewFocusStat focusStat
|
|
|
]
|
|
|
)
|
|
|
+
|
|
|
+
|
|
|
+subscriptions : Model -> Sub Msg
|
|
|
+subscriptions _ =
|
|
|
+ receiveDoesSetHaveLocalData PortReceiveDoesSetHaveLocalData
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+-- PORTS
|
|
|
+
|
|
|
+
|
|
|
+port sendDoesSetHaveLocalData : String -> Cmd msg
|
|
|
+
|
|
|
+
|
|
|
+port receiveDoesSetHaveLocalData : (String -> msg) -> Sub msg
|
|
|
+
|
|
|
+
|
|
|
+port sendSaveLocalData : Encode.Value -> Cmd msg
|