From d08487d61c540573eede594c36d07e25c9832a23 Mon Sep 17 00:00:00 2001 From: Yorhel Date: Mon, 3 Aug 2020 09:47:34 +0200 Subject: reviews: Add up/down voting on reviews --- elm/Reviews/Vote.elm | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 elm/Reviews/Vote.elm (limited to 'elm') diff --git a/elm/Reviews/Vote.elm b/elm/Reviews/Vote.elm new file mode 100644 index 00000000..cf63fe71 --- /dev/null +++ b/elm/Reviews/Vote.elm @@ -0,0 +1,78 @@ +module Reviews.Vote exposing (main) + +import Html exposing (..) +import Html.Attributes exposing (..) +import Html.Events exposing (..) +import Browser +import Lib.Util exposing (..) +import Lib.Html exposing (..) +import Lib.Api as Api +import Gen.Api as GApi +import Gen.ReviewsVote as GRV + + +main : Program GRV.Recv Model Msg +main = Browser.element + { init = \d -> (init d, Cmd.none) + , subscriptions = always Sub.none + , view = view + , update = update + } + +type alias Model = + { state : Api.State + , id : String + , my : Maybe Bool + , can : Bool + , up : Int + , down : Int + } + +init : GRV.Recv -> Model +init d = + { state = Api.Normal + , id = d.id + , my = d.my + , can = d.can + , up = d.up + , down = d.down + } + +type Msg + = Vote Bool + | Saved GApi.Response + + +update : Msg -> Model -> (Model, Cmd Msg) +update msg model = + case msg of + Vote b -> + let nm = case (model.my, b) of + (Nothing, True) -> { model | my = Just b, up = model.up+1 } + (Nothing, False) -> { model | my = Just b , down = model.down+1 } + (Just True, False) -> { model | my = Just b, up = model.up-1, down = model.down+1 } + (Just False, True) -> { model | my = Just b, up = model.up+1, down = model.down-1 } + (Just True, True) -> { model | my = Nothing, up = model.up-1 } + (Just False, False) -> { model | my = Nothing , down = model.down-1 } + in ({ nm | state = Api.Loading }, GRV.send { id = nm.id, my = nm.my } Saved) + + Saved GApi.Success -> ({ model | state = Api.Normal }, Cmd.none) + Saved e -> ({ model | state = Api.Error e }, Cmd.none) + + +view : Model -> Html Msg +view model = + let but opt lbl = + if not model.can + then span [] [ text lbl ] + else a [ href "#", onClickD (Vote opt), classList [("votebut", True), ("myvote", model.my == Just opt)] ] [ text lbl ] + in + span [] + [ case model.state of + Api.Loading -> span [ class "spinner" ] [] + Api.Error e -> b [ class "standout" ] [ text (Api.showResponse e) ] + Api.Normal -> if model.can && model.my == Nothing then text "Was this review helpful? " else text "" + , but True ("👍 " ++ String.fromInt model.up) + , text " " + , but False ("👎 " ++ String.fromInt model.down) + ] -- cgit v1.2.3