restores Admin sessions

This commit is contained in:
2019-12-05 16:16:34 +01:00
parent ced3f5763c
commit 2ec3e28f59
7 changed files with 119 additions and 86 deletions

View File

@@ -16,6 +16,7 @@ module Api exposing
, getLoot
, printError
, replaceShopItems
, send
)
import Api.Player exposing (Player, Wealth)

View File

@@ -90,7 +90,7 @@ view page =
Session.Player data ->
data.player.name
Session.Admin ->
Session.Admin _ ->
"Administration"
Nothing ->
@@ -109,7 +109,7 @@ view page =
text ""
]
Session.Admin ->
Session.Admin _ ->
[ navLink "fas fa-store-alt" Route.Merchant page ]
Nothing ->
@@ -173,7 +173,7 @@ viewSessionBar session controls =
)
|> List.map (Html.map Wealth)
Just Session.Admin ->
Just (Session.Admin _) ->
[ text "Admin" ]
notifications =
@@ -471,7 +471,7 @@ applyUpdate u user =
Api.ClaimRemoved claim ->
Session.Player { data | claims = List.filter (\c -> c.id /= claim.id) data.claims }
Session.Admin ->
Session.Admin _ ->
user

View File

@@ -211,6 +211,8 @@ updateChest toMsg toChest ( model, cmd ) =
-- Helpers
--
-- Api actions
--

View File

@@ -43,15 +43,15 @@ type PlayerConfig
type AdminConfig
= AdminConfig Session (List Player) NewPlayerForm
= AdminConfig Session (List Player) (Maybe NewPlayerForm)
init : Session -> ( Model, Cmd Msg )
init session =
case Session.user session of
Session.Admin ->
( Admin <| AdminConfig session [] initForm
, Player.list (AdminViewer << GotPlayers)
Session.Admin data ->
( Admin <| AdminConfig session data.players Nothing
, Cmd.none
)
Session.Player data ->
@@ -69,10 +69,6 @@ init session =
)
initForm =
NewPlayerForm "" 0.0
modeButton t msg =
button [ class "button", onClick msg ] [ text t ]
@@ -84,6 +80,7 @@ buttons bs =
view : Model -> ( Html Msg, List (Html Msg) )
view model =
case model of
-- PLAYER DASHBOARD
Player (PlayerConfig session chest) ->
case Session.user session of
Session.Player data ->
@@ -124,22 +121,28 @@ view model =
in
( text "", [] )
Admin (AdminConfig session players newPlayer) ->
( text ""
, [ div [ class "container" ]
[ p [ class "title" ] [ text "Administration" ]
, div [ class "section" ]
[ table [ class "table is-fullwidth is-striped" ]
-- ADMIN DASHBOARD
Admin (AdminConfig session players playerForm) ->
( case playerForm of
Nothing ->
modeButton "Ajouter un joueur" (AdminViewer EditPlayer)
Just _ ->
buttons [ modeButton "Ok" ConfirmNewPlayer, modeButton "Annuler" CloseEdit ]
|> Html.map AdminViewer
, [ div [ class "section" ]
[ case playerForm of
Nothing ->
text ""
Just form ->
editNewPlayer form
, table [ class "table is-fullwidth is-striped" ]
[ thead [ class "table-header" ]
[ th [] [ text "Joueurs" ] ]
, tbody [] <|
editNewPlayer newPlayer
:: List.map viewPlayer players
, tbody [] <| List.map viewPlayer players
]
]
, div [ class "section" ]
[ p [] [ text "Campagnes" ] ]
]
]
)
@@ -151,12 +154,12 @@ viewPlayer player =
editNewPlayer : NewPlayerForm -> Html Msg
editNewPlayer newPlayer =
tr []
[ td []
div [ class "box" ]
[ div [ class "field is-horizontal" ]
[ div [ class "field-body" ]
[ div [ class "field" ]
[ input
[ label [ class "label" ] [ text "Nom" ]
, input
[ class "input"
, type_ "text"
, value newPlayer.name
@@ -165,7 +168,8 @@ editNewPlayer newPlayer =
[]
]
, div [ class "field" ]
[ input
[ label [ class "label" ] [ text "Argent de départ" ]
, input
[ class "input"
, type_ "text"
, value <| String.fromFloat newPlayer.wealth
@@ -176,7 +180,6 @@ editNewPlayer newPlayer =
]
]
]
]
|> Html.map (AdminViewer << GotFormMsg)
@@ -187,7 +190,9 @@ type Msg
type AdminMsg
= GotPlayers (List Player)
= EditPlayer
| CloseEdit
| ConfirmNewPlayer
| GotFormMsg FormMsg
@@ -204,16 +209,25 @@ type PlayerMsg
update msg model =
case ( msg, model ) of
( AdminViewer aMsg, Admin (AdminConfig session players form) ) ->
(case aMsg of
GotPlayers newPlayers ->
( Admin (AdminConfig session newPlayers form)
(case ( aMsg, form ) of
( EditPlayer, Nothing ) ->
( Admin (AdminConfig session players (Just <| NewPlayerForm "" 0.0))
, Cmd.none
)
GotFormMsg subMsg ->
( Admin (AdminConfig session players (updateForm subMsg form))
( GotFormMsg subMsg, Just f ) ->
( Admin (AdminConfig session players <| Just (updateForm subMsg f))
, Cmd.none
)
( ConfirmNewPlayer, Just f ) ->
( model, Cmd.none )
( CloseEdit, _ ) ->
( Admin (AdminConfig session players Nothing), Cmd.none )
_ ->
( model, Cmd.none )
)
|> Tuple.mapSecond (Cmd.map AdminViewer)

View File

@@ -34,7 +34,7 @@ getClaimsFromSession session =
else
[]
Session.Admin ->
Session.Admin _ ->
[]
@@ -66,7 +66,7 @@ view model =
let
( isPlayer, isGroup ) =
case Session.user model.session of
Session.Admin ->
Session.Admin _ ->
( False, False )
Session.Player data ->

View File

@@ -6,7 +6,7 @@ import Html exposing (..)
import Html.Attributes exposing (..)
import Html.Events exposing (..)
import Page.Chest as Chest exposing (Chest)
import Page.Chest.Selection as Selection
import Page.Chest.NewFromInventory as NewChest
import Session exposing (Session, getSession)
import Set exposing (Set)
import Table
@@ -62,7 +62,7 @@ view model =
controls =
Html.map Internal <|
case ( model.chest, Session.user model.session ) of
( Chest.View _, Session.Admin ) ->
( Chest.View _, Session.Admin _ ) ->
btn "Remplacer" (GotChestMsg Chest.new)
( Chest.View _, Session.Player _ ) ->
@@ -71,7 +71,7 @@ view model =
( Chest.Buy _, Session.Player _ ) ->
buttons [ btn "Ok" ConfirmBuy, btn "Annuler" (GotChestMsg Chest.show) ]
( Chest.New _, Session.Admin ) ->
( Chest.New _, Session.Admin _ ) ->
buttons [ btn "Ok" ConfirmRefresh, btn "Annuler" (GotChestMsg Chest.show) ]
_ ->
@@ -148,9 +148,14 @@ update msg model =
ConfirmRefresh ->
case Session.user (getSession model) of
Session.Admin ->
Session.Admin _ ->
let
loot =
case model.chest of
Chest.New chest ->
NewChest.allLoot chest
_ ->
[]
in
( model, Api.replaceShopItems GotRefreshResult loot )

View File

@@ -16,7 +16,7 @@ type User
, loot : Loot
, claims : Claims
}
| Admin
| Admin { players : List Player }
type alias Notifications =
@@ -30,22 +30,16 @@ type Session
init : (Result String Session -> msg) -> Nav.Key -> Cmd msg
init toMsg navKey =
let
toSession : Result String ( Player, Loot, Claims ) -> msg
toSession : Result String User -> msg
toSession result =
case result of
Ok ( player, loot, claims ) ->
Ok logged ->
toMsg <|
Ok
(Session
navKey
( Nothing, Nothing )
(Player
{ player = player
, wealth = Wealth.init
, loot = loot
, claims = claims
}
)
logged
)
Err e ->
@@ -54,24 +48,41 @@ init toMsg navKey =
Task.attempt toSession initFullSession
initFullSession : Task String ( Player, Loot, Claims )
initFullSession : Task String User
initFullSession =
Api.fetchSession
let
userDecoder =
D.oneOf
[ Player.playerDecoder |> D.andThen (\p -> D.succeed <| Player { player = p, wealth = Wealth.init, loot = [], claims = [] })
, D.list Player.playerDecoder |> D.andThen (\ps -> D.succeed <| Admin { players = ps })
]
in
Api.send { method = "GET", path = "session", decoder = userDecoder }
|> Task.andThen wrapLoot
|> Task.andThen wrapClaims
|> Task.mapError Api.printError
wrapLoot : Player -> Task Http.Error ( Player, Loot )
wrapLoot player =
Api.getLoot player.id
|> Task.andThen (\loot -> Task.succeed ( player, loot ))
wrapLoot : User -> Task Http.Error User
wrapLoot logged =
case logged of
Player data ->
Api.getLoot data.player.id
|> Task.andThen (\loot -> Task.succeed (Player { data | loot = loot }))
Admin _ ->
Task.succeed logged
wrapClaims : ( Player, Loot ) -> Task Http.Error ( Player, Loot, Claims )
wrapClaims ( player, loot ) =
Api.getClaims player.id
|> Task.andThen (\claims -> Task.succeed ( player, loot, claims ))
wrapClaims : User -> Task Http.Error User
wrapClaims logged =
case logged of
Player data ->
Api.getClaims data.player.id
|> Task.andThen (\claims -> Task.succeed (Player { data | claims = claims }))
Admin _ ->
Task.succeed logged
getSession : { r | session : Session } -> Session
@@ -112,7 +123,7 @@ wealth session =
Player data ->
Just data.wealth
Admin ->
Admin _ ->
Nothing
@@ -125,22 +136,22 @@ setWealth wealthModel session =
Player data ->
Session navKey notifications (Player { data | wealth = wealthModel })
Admin ->
Session navKey notifications Admin
Admin _ ->
session
updateWealth : Wealth.Model -> Session -> Session
updateWealth newWealthModel model =
updateWealth newWealthModel session =
let
(Session navKey notifications loggedUser) =
model
session
in
case loggedUser of
Player data ->
Session navKey notifications (Player { data | wealth = newWealthModel })
Admin ->
Session navKey notifications Admin
Admin _ ->
session