Quellcode durchsuchen

Load initial sets from local storage

Cadel Watson vor 1 Jahr
Ursprung
Commit
afe3fbb2db
2 geänderte Dateien mit 81 neuen und 56 gelöschten Zeilen
  1. 28 16
      js/app.js
  2. 53 40
      src/Main.elm

+ 28 - 16
js/app.js

@@ -33,6 +33,17 @@ function saveSetData(db, setData) {
     };
 }
 
+function getAllLocalSets(db, callback) {
+    const transaction = db.transaction(["sets"], "readwrite");
+
+    const objectStore = transaction.objectStore("sets");
+
+    objectStore.getAll().onsuccess = (event) => {
+        callback(event.target.result.map((set) => set.code));
+    };
+
+}
+
 const openDBRequest = indexedDB.open("set_database", 2);
 
 openDBRequest.onerror = (event) => {
@@ -48,25 +59,26 @@ openDBRequest.onupgradeneeded = (event) => {
 
 openDBRequest.onsuccess = (event) => {
     const database = event.target.result;
-    const app = Elm.Main.init({
-        node: document.getElementById('myapp'),
-        flags: {
-            setData: JSON.stringify(setData),
-            draftData: JSON.stringify(draftData),
-            cardRatings: JSON.stringify(cardRatings)
-        }
-    });
-    console.log(app);
-    console.log(app.ports)
 
-    app.ports.sendDoesSetHaveLocalData.subscribe((setCode) => {
-        getSetData(database, setCode, (data) => {
-            app.ports.receiveDoesSetHaveLocalData.send(JSON.stringify(data));
+    getAllLocalSets(database, (sets) => {
+        const app = Elm.Main.init({
+            node: document.getElementById('myapp'),
+            flags: {
+                sets: sets,
+                draftData: JSON.stringify(draftData),
+            }
+        });
+
+        app.ports.sendDoesSetHaveLocalData.subscribe((setCode) => {
+            getSetData(database, setCode, (data) => {
+                app.ports.receiveDoesSetHaveLocalData.send(JSON.stringify(data));
+            })
+        });
+
+        app.ports.sendSaveLocalData.subscribe((setData) => {
+            saveSetData(database, setData);
         })
-    });
 
-    app.ports.sendSaveLocalData.subscribe((setData) => {
-        saveSetData(database, setData);
     })
 };
 

+ 53 - 40
src/Main.elm

@@ -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)
+                )
             ]
         ]