From 163624868683f0378deb76ae91c2b1325c92c8b3 Mon Sep 17 00:00:00 2001 From: Artus Date: Tue, 17 Dec 2019 16:11:16 +0100 Subject: [PATCH] adds conflicts information on claims --- src/Api.elm | 66 +++++++++++++++++++++++++++++++++++++++++++-------- src/Bulma.elm | 4 ++++ src/Chest.elm | 40 +++++++++++++++++++++---------- 3 files changed, 88 insertions(+), 22 deletions(-) diff --git a/src/Api.elm b/src/Api.elm index a0ada38..e12cb36 100644 --- a/src/Api.elm +++ b/src/Api.elm @@ -139,14 +139,16 @@ type alias Claim = { id : Int , player_id : Int , loot_id : Int + , conflicts : Bool } claimDecoder = - D.map3 Claim + D.map4 Claim (D.field "id" int) (D.field "player_id" int) (D.field "loot_id" int) + (D.succeed False) @@ -432,20 +434,64 @@ getLoot id = } -getClaims id = - let - path = - if id == 0 then - "api/claims" - else - "api/players/" ++ String.fromInt id ++ "/claims" - in +-- Updates the conflicts field on every claims + + +groupByLoot : List Claims -> Claims -> List Claims +groupByLoot acc claims = + case claims of + last :: [] -> + groupByLoot ([ last ] :: acc) [] + + first :: rest -> + let + ( newGroup, left ) = + List.partition (\c -> c.loot_id == first.loot_id) rest + in + groupByLoot ((first :: newGroup) :: acc) left + + [] -> + acc + + +updateConflicts : Claims -> Claims +updateConflicts claims = + groupByLoot [] claims + |> List.concatMap + (\group -> + let + _ = + Debug.log "updating group" group + in + case group of + [] -> + [] + + [ c ] -> + [ { c | conflicts = False } ] + + xs -> + List.map (\c -> { c | conflicts = True }) xs + ) + + +parseClaims : Int -> Claims -> Task x Claims +parseClaims id claims = + -- Filter claims relevant to player + Task.succeed <| + List.filter (\claim -> id == 0 || claim.player_id == id) <| + updateConflicts claims + + +getClaims : Int -> Task Http.Error Claims +getClaims id = send { method = "GET" - , path = path + , path = "api/claims" , decoder = valueDecoder (D.list claimDecoder) } + |> Task.andThen (parseClaims id) diff --git a/src/Bulma.elm b/src/Bulma.elm index 6d5384f..a4cca56 100644 --- a/src/Bulma.elm +++ b/src/Bulma.elm @@ -94,3 +94,7 @@ levelItem = isInfo = class "is-info" + + +isError = + class "is-error" diff --git a/src/Chest.elm b/src/Chest.elm index e410e41..487a4f6 100644 --- a/src/Chest.elm +++ b/src/Chest.elm @@ -167,22 +167,38 @@ update msg model = IntoViewWithClaims claims -> let isClaimed item = - List.any (\claim_ -> claim_.loot_id == item.id) claims + case List.filter (\c -> c.loot_id == item.id) claims of + [ c ] -> + Just c + + [] -> + Nothing + + _ -> + Debug.log "Warning ! Duplicated claim found" Nothing renderItem item = [ p [ B.levelItem ] [ text item.name ] - , if isClaimed item then - B.tag [ B.levelItem, B.isInfo ] - [ B.icon - { icon = "fas fa-praying-hands" - , size = Just "is-small" - , ratio = Just "fa-1x" - } - , text "time left..." - ] + , case isClaimed item of + Just c -> + B.tag + [ B.levelItem + , if c.conflicts then + B.isError - else - text "" + else + B.isInfo + ] + [ B.icon + { icon = "fas fa-praying-hands" + , size = Just "is-small" + , ratio = Just "fa-1x" + } + , p [] [ text "en attente..." ] + ] + + Nothing -> + text "" ] in ( View <| Table.renderRowLevel renderItem (\_ -> []), Cmd.none )