Add basic viewing for rooms.

Tento commit je obsažen v:
Danila Fedorin 2018-12-08 17:15:35 -08:00
rodič e06c4a8772
revize 7d97fc1aba
4 změnil soubory, kde provedl 78 přidání a 13 odebrání

Zobrazit soubor

@ -22,6 +22,13 @@ init flags url key =
, loginUsername = ""
, loginPassword = ""
, apiUrl = "https://matrix.org"
, sync =
{ nextBatch = ""
, rooms = Nothing
, presence = Nothing
, accountData = Nothing
}
, errors = []
}
cmd = case flags.token of
Just _ -> Cmd.none
@ -32,7 +39,7 @@ init flags url key =
view : Model -> Browser.Document Msg
view m =
{ title = "Scylla"
, body = [ viewFull m ]
, body = viewFull m
}
update : Msg -> Model -> (Model, Cmd Msg)
@ -51,9 +58,9 @@ updateLoginResponse model r = case r of
Err e -> (model, Cmd.none)
updateSyncResponse : Model -> Result Http.Error SyncResponse -> (Model, Cmd Msg)
updateSyncResponse model r = case r of
Ok sr -> (model, Cmd.none)
Err e -> (model, Cmd.none)
updateSyncResponse model r = let sync = model.sync in case r of
Ok sr -> ({ model | sync = mergeSyncResponse model.sync sr }, Cmd.none)
_ -> (model, Cmd.none)
subscriptions : Model -> Sub Msg
subscriptions m = Sub.none

Zobrazit soubor

@ -1,8 +1,9 @@
module Scylla.Model exposing (..)
import Scylla.Api exposing (..)
import Scylla.Sync exposing (SyncResponse)
import Scylla.Sync exposing (SyncResponse, JoinedRoom)
import Scylla.Login exposing (LoginResponse, Username, Password)
import Browser.Navigation as Nav
import Dict exposing (Dict)
import Browser
import Http
import Url exposing (Url)
@ -13,6 +14,8 @@ type alias Model =
, loginUsername : Username
, loginPassword : Password
, apiUrl : ApiUrl
, sync : SyncResponse
, errors : List String
}
type Msg =

Zobrazit soubor

@ -80,14 +80,14 @@ type alias StateEvent =
stateEventDecoder : Decoder StateEvent
stateEventDecoder =
Decode.succeed StateEvent
|> required "required" value
|> required "content" value
|> required "type" string
|> required "event_id" string
|> required "sender" string
|> required "origin_server_ts" int
|> maybeDecode "unsigned" unsignedDataDecoder
|> maybeDecode "prev_content" eventContentDecoder
|> required "sate_key" string
|> required "state_key" string
-- Rooms
type alias Rooms =
@ -254,3 +254,7 @@ presenceDecoder : Decoder Presence
presenceDecoder =
Decode.succeed Presence
|> maybeDecode "events" (list eventDecoder)
-- Business Logic
mergeSyncResponse : SyncResponse -> SyncResponse -> SyncResponse
mergeSyncResponse l r = r

Zobrazit soubor

@ -1,16 +1,30 @@
module Scylla.Views exposing (..)
import Scylla.Model exposing (..)
import Html exposing (Html, div, input, text, button)
import Scylla.Sync exposing (..)
import Json.Decode as Decode
import Html exposing (Html, div, input, text, button, div, span)
import Html.Attributes exposing (type_, value)
import Html.Events exposing (onInput, onClick)
import Dict
viewFull : Model -> Html Msg
viewFull model = case model.token of
viewFull : Model -> List (Html Msg)
viewFull model =
let
core = case model.token of
Just _ -> normalView model
Nothing -> loginView model
errorList = errorsView model.errors
in
[ errorList ] ++ [ core ]
errorsView : List String -> Html Msg
errorsView = div [] << List.map errorView
errorView : String -> Html Msg
errorView s = div [] [ text s ]
normalView : Model -> Html Msg
normalView m = div [] [ text "You are logged in!" ]
normalView m = div [] []
loginView : Model -> Html Msg
loginView m = div []
@ -19,3 +33,40 @@ loginView m = div []
, input [ type_ "text", value m.apiUrl, onInput ChangeApiUrl ] []
, button [ onClick AttemptLogin ] [ text "Log In" ]
]
joinedRoomView : Model -> JoinedRoom -> Html Msg
joinedRoomView m jr =
let
events = Maybe.withDefault [] <| Maybe.andThen .events jr.timeline
renderedEvents = List.filterMap (eventView m) events
eventContainer = eventContainerView m renderedEvents
in
div [] [ eventContainer ]
eventContainerView : Model -> List (Html Msg) -> Html Msg
eventContainerView m = div []
eventView : Model -> RoomEvent -> Maybe (Html Msg)
eventView m re = case re.type_ of
"m.room.message" -> messageView m re
_ -> Nothing
messageView : Model -> RoomEvent -> Maybe (Html Msg)
messageView m re =
let
msgtype = Decode.decodeValue (Decode.field "msgtype" Decode.string) re.content
in
case msgtype of
Ok "m.text" -> messageTextView m re
_ -> Nothing
messageTextView : Model -> RoomEvent -> Maybe (Html Msg)
messageTextView m re =
let
body = Decode.decodeValue (Decode.field "body" Decode.string) re.content
wrap mtext = div []
[ span [] [ text re.sender ]
, span [] [ text mtext ]
]
in
Maybe.map wrap <| Result.toMaybe body