|
|
@@ -65,9 +65,7 @@ type SetLoadStatus
|
|
|
|
|
|
type alias ChooseSetModel =
|
|
|
{ draftData : String
|
|
|
- , cardRatings : String
|
|
|
- , setData : String
|
|
|
- , sets : Maybe (Dict String SetLoadStatus)
|
|
|
+ , sets : Dict String SetLoadStatus
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -89,15 +87,26 @@ type alias ErrorModel =
|
|
|
}
|
|
|
|
|
|
|
|
|
-init : { setData : String, draftData : String, cardRatings : String } -> ( Model, Cmd Msg )
|
|
|
+init : { sets : List String, draftData : String } -> ( Model, Cmd Msg )
|
|
|
init flags =
|
|
|
+ let
|
|
|
+ setStatus : Dict String SetLoadStatus
|
|
|
+ setStatus =
|
|
|
+ flags.sets
|
|
|
+ |> List.map (\s -> ( s, CheckingLocalData ))
|
|
|
+ |> Dict.fromList
|
|
|
+
|
|
|
+ setCmds : List (Cmd Msg)
|
|
|
+ setCmds =
|
|
|
+ List.map
|
|
|
+ (\s -> sendDoesSetHaveLocalData s)
|
|
|
+ flags.sets
|
|
|
+ in
|
|
|
( ChooseSet
|
|
|
- { setData = flags.setData
|
|
|
- , draftData = flags.draftData
|
|
|
- , cardRatings = flags.cardRatings
|
|
|
- , sets = Nothing
|
|
|
+ { draftData = flags.draftData
|
|
|
+ , sets = setStatus
|
|
|
}
|
|
|
- , API.getSets IOGotSets
|
|
|
+ , Cmd.batch (API.getSets IOGotSets :: setCmds)
|
|
|
)
|
|
|
|
|
|
|
|
|
@@ -121,7 +130,7 @@ type Msg
|
|
|
|
|
|
startDraft : ChooseSetModel -> String -> ( Model, Cmd Msg )
|
|
|
startDraft initFlags setCode =
|
|
|
- case ( Maybe.andThen (Dict.get setCode) initFlags.sets, Draft.decode initFlags.draftData ) of
|
|
|
+ case ( Dict.get setCode initFlags.sets, Draft.decode initFlags.draftData ) of
|
|
|
( Just (HasLocalData database), Ok draftData ) ->
|
|
|
( Ready
|
|
|
{ draft = draftData
|
|
|
@@ -154,22 +163,31 @@ update msg model =
|
|
|
case model of
|
|
|
ChooseSet mdl ->
|
|
|
case msg of
|
|
|
- IOGotSets (Ok sets) ->
|
|
|
+ IOGotSets (Ok remoteData) ->
|
|
|
+ -- Merge any new sets into the local sets
|
|
|
let
|
|
|
- setStatus : Dict String SetLoadStatus
|
|
|
- setStatus =
|
|
|
- sets
|
|
|
+ remoteSets =
|
|
|
+ remoteData
|
|
|
|> List.map (\s -> ( s, CheckingLocalData ))
|
|
|
|> Dict.fromList
|
|
|
|
|
|
- setCmds : List (Cmd Msg)
|
|
|
- setCmds =
|
|
|
+ newRemoteSets =
|
|
|
+ Dict.diff remoteSets mdl.sets
|
|
|
+
|
|
|
+ setStatus : Dict String SetLoadStatus
|
|
|
+ setStatus =
|
|
|
+ Dict.union
|
|
|
+ mdl.sets
|
|
|
+ newRemoteSets
|
|
|
+
|
|
|
+ remoteSetCmds : List (Cmd Msg)
|
|
|
+ remoteSetCmds =
|
|
|
List.map
|
|
|
(\s -> sendDoesSetHaveLocalData s)
|
|
|
- sets
|
|
|
+ (Dict.keys newRemoteSets)
|
|
|
in
|
|
|
- ( ChooseSet { mdl | sets = Just setStatus }
|
|
|
- , Cmd.batch setCmds
|
|
|
+ ( ChooseSet { mdl | sets = setStatus }
|
|
|
+ , Cmd.batch remoteSetCmds
|
|
|
)
|
|
|
|
|
|
IOGotSets (Err e) ->
|
|
|
@@ -191,10 +209,10 @@ update msg model =
|
|
|
in
|
|
|
case Database.decode unparsedData of
|
|
|
Ok ( setCode, Just db ) ->
|
|
|
- ( ChooseSet { mdl | sets = Maybe.map (markSetDataLoaded setCode db) mdl.sets }, Cmd.none )
|
|
|
+ ( ChooseSet { mdl | sets = markSetDataLoaded setCode db mdl.sets }, Cmd.none )
|
|
|
|
|
|
Ok ( setCode, Nothing ) ->
|
|
|
- ( ChooseSet { mdl | sets = Maybe.map (markSetDataNotAvailable setCode) mdl.sets }
|
|
|
+ ( ChooseSet { mdl | sets = markSetDataNotAvailable setCode mdl.sets }
|
|
|
, Cmd.none
|
|
|
)
|
|
|
|
|
|
@@ -202,12 +220,12 @@ update msg model =
|
|
|
( Error { error = "Error decoding local set data (" ++ e ++ ")" }, Cmd.none )
|
|
|
|
|
|
IOFetchSetData setCode ->
|
|
|
- ( ChooseSet { mdl | sets = Maybe.map (Dict.insert setCode FetchingRemoteData) mdl.sets }
|
|
|
+ ( ChooseSet { mdl | sets = Dict.insert setCode FetchingRemoteData mdl.sets }
|
|
|
, API.getSetData setCode IOGotSetData
|
|
|
)
|
|
|
|
|
|
IOGotSetData (Ok ( setCode, Just database )) ->
|
|
|
- ( ChooseSet { mdl | sets = Maybe.map (Dict.insert setCode (HasLocalData database)) mdl.sets }
|
|
|
+ ( ChooseSet { mdl | sets = Dict.insert setCode (HasLocalData database) mdl.sets }
|
|
|
, sendSaveLocalData (Database.encode ( setCode, database ))
|
|
|
)
|
|
|
|
|
|
@@ -327,23 +345,18 @@ viewChooseSet model =
|
|
|
in
|
|
|
div [ class "w-full h-full bg-slate-100 flex justify-center items-center" ]
|
|
|
[ div [ class "max-w-2xl max-h-2xl" ]
|
|
|
- [ case model.sets of
|
|
|
- Just sets ->
|
|
|
- ul []
|
|
|
- (List.map
|
|
|
- (\s ->
|
|
|
- case Dict.get s sets of
|
|
|
- Just setStatus ->
|
|
|
- li [] [ text s, viewLoadStatus s setStatus ]
|
|
|
-
|
|
|
- Nothing ->
|
|
|
- p [] [ text "Loading..." ]
|
|
|
- )
|
|
|
- (Dict.keys sets)
|
|
|
- )
|
|
|
-
|
|
|
- Nothing ->
|
|
|
- p [] [ text "Loading..." ]
|
|
|
+ [ ul []
|
|
|
+ (List.map
|
|
|
+ (\s ->
|
|
|
+ case Dict.get s model.sets of
|
|
|
+ Just setStatus ->
|
|
|
+ li [] [ text s, viewLoadStatus s setStatus ]
|
|
|
+
|
|
|
+ Nothing ->
|
|
|
+ p [] [ text "Loading..." ]
|
|
|
+ )
|
|
|
+ (Dict.keys model.sets)
|
|
|
+ )
|
|
|
]
|
|
|
]
|
|
|
|