Add room message sending.
This commit is contained in:
@@ -4,7 +4,7 @@ import Scylla.Api exposing (..)
|
||||
import Scylla.Sync exposing (syncResponseDecoder)
|
||||
import Scylla.Login exposing (loginResponseDecoder, Username, Password)
|
||||
import Json.Encode exposing (object, string, int)
|
||||
import Http exposing (request, emptyBody, jsonBody, expectJson)
|
||||
import Http exposing (request, emptyBody, jsonBody, expectJson, expectWhatever)
|
||||
|
||||
fullUrl : ApiUrl -> ApiUrl
|
||||
fullUrl s = s ++ "/_matrix/client/r0"
|
||||
@@ -32,6 +32,23 @@ sync nextBatch apiUrl token = request
|
||||
, tracker = Nothing
|
||||
}
|
||||
|
||||
sendTextMessage : ApiUrl -> ApiToken -> Int -> String -> String -> Cmd Msg
|
||||
sendTextMessage apiUrl token transactionId room message = request
|
||||
{ method = "PUT"
|
||||
, headers = authenticatedHeaders token
|
||||
, url = (fullUrl apiUrl)
|
||||
++ "/rooms/" ++ room
|
||||
++ "/send/" ++ "m.room.message"
|
||||
++ "/" ++ (String.fromInt transactionId)
|
||||
, body = jsonBody <| object
|
||||
[ ("msgtype", string "m.text")
|
||||
, ("body", string message)
|
||||
]
|
||||
, expect = expectWhatever SendRoomTextResponse
|
||||
, timeout = Nothing
|
||||
, tracker = Nothing
|
||||
}
|
||||
|
||||
login : ApiUrl -> Username -> Password -> Cmd Msg
|
||||
login apiUrl username password = request
|
||||
{ method = "POST"
|
||||
|
||||
@@ -18,6 +18,8 @@ type alias Model =
|
||||
, apiUrl : ApiUrl
|
||||
, sync : SyncResponse
|
||||
, errors : List String
|
||||
, roomText : Dict String String
|
||||
, transactionId : Int
|
||||
}
|
||||
|
||||
type Msg =
|
||||
@@ -27,6 +29,9 @@ type Msg =
|
||||
| AttemptLogin -- During login screen, login button presed
|
||||
| TryUrl Browser.UrlRequest -- User attempts to change URL
|
||||
| ChangeRoute Route -- URL changes
|
||||
| ChangeRoomText String String -- Change to a room's input text
|
||||
| SendRoomText String -- Sends a message typed into a given room's input
|
||||
| SendRoomTextResponse (Result Http.Error ()) -- A send message response finished
|
||||
| ReceiveSyncResponse (Result Http.Error SyncResponse) -- HTTP, Sync has finished
|
||||
| ReceiveLoginResponse (Result Http.Error LoginResponse) -- HTTP, Login has finished
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@ viewFull model =
|
||||
Login -> loginView model
|
||||
Base -> baseView model
|
||||
Room r -> Maybe.withDefault (div [] [])
|
||||
<| Maybe.map (joinedRoomView model)
|
||||
<| Maybe.map (joinedRoomView model r)
|
||||
<| Maybe.andThen (Dict.get r)
|
||||
<| Maybe.andThen .join model.sync.rooms
|
||||
_ -> div [] []
|
||||
@@ -52,14 +52,22 @@ loginView m = div []
|
||||
, button [ onClick AttemptLogin ] [ text "Log In" ]
|
||||
]
|
||||
|
||||
joinedRoomView : Model -> JoinedRoom -> Html Msg
|
||||
joinedRoomView m jr =
|
||||
joinedRoomView : Model -> String -> JoinedRoom -> Html Msg
|
||||
joinedRoomView m roomId jr =
|
||||
let
|
||||
events = Maybe.withDefault [] <| Maybe.andThen .events jr.timeline
|
||||
renderedEvents = List.filterMap (eventView m) events
|
||||
eventContainer = eventContainerView m renderedEvents
|
||||
messageInput = div []
|
||||
[ input
|
||||
[ type_ "text"
|
||||
, onInput <| ChangeRoomText roomId
|
||||
, value <| Maybe.withDefault "" <| Dict.get roomId m.roomText
|
||||
] []
|
||||
, button [ onClick <| SendRoomText roomId ] [ text "Send" ]
|
||||
]
|
||||
in
|
||||
div [] [ eventContainer ]
|
||||
div [] [ eventContainer, messageInput ]
|
||||
|
||||
eventContainerView : Model -> List (Html Msg) -> Html Msg
|
||||
eventContainerView m = div []
|
||||
|
||||
Reference in New Issue
Block a user