Add initial implementation of new room structure
This commit is contained in:
parent
595e28853e
commit
676d6c28a7
110
src/Scylla/Room.elm
Normal file
110
src/Scylla/Room.elm
Normal file
|
@ -0,0 +1,110 @@
|
||||||
|
module Scylla.Room exposing (..)
|
||||||
|
import Scylla.Route exposing (RoomId)
|
||||||
|
import Scylla.Sync exposing (SyncResponse)
|
||||||
|
import Scylla.Sync.Events exposing (MessageEvent, StateEvent, toStateEvent, toMessageEvent)
|
||||||
|
import Scylla.Sync.AccountData exposing (AccountData)
|
||||||
|
import Scylla.Sync.Rooms exposing (JoinedRoom, UnreadNotificationCounts, Ephemeral)
|
||||||
|
import Json.Decode as Decode exposing (Value)
|
||||||
|
import Dict exposing (Dict)
|
||||||
|
|
||||||
|
type alias RoomState = Dict (String, String) Value
|
||||||
|
|
||||||
|
type alias RoomData =
|
||||||
|
{ roomState : RoomState
|
||||||
|
, messages : List (MessageEvent)
|
||||||
|
, accountData : AccountData
|
||||||
|
, ephemeral : Ephemeral
|
||||||
|
, unreadNotifications : UnreadNotificationCounts
|
||||||
|
, text : String
|
||||||
|
}
|
||||||
|
|
||||||
|
type alias OpenRooms = Dict RoomId RoomData
|
||||||
|
|
||||||
|
emptyOpenRooms : OpenRooms
|
||||||
|
emptyOpenRooms = Dict.empty
|
||||||
|
|
||||||
|
emptyRoomData : RoomData
|
||||||
|
emptyRoomData =
|
||||||
|
{ roomState = Dict.empty
|
||||||
|
, messages = []
|
||||||
|
, accountData = { events = Just [] }
|
||||||
|
, ephemeral = { events = Just [] }
|
||||||
|
, unreadNotifications =
|
||||||
|
{ highlightCount = Just 0
|
||||||
|
, notificationCount = Just 0
|
||||||
|
}
|
||||||
|
, text = ""
|
||||||
|
}
|
||||||
|
|
||||||
|
changeRoomStateEvent : StateEvent -> RoomState -> RoomState
|
||||||
|
changeRoomStateEvent se = Dict.insert (se.type_, se.stateKey) se.content
|
||||||
|
|
||||||
|
changeRoomStateEvents : List StateEvent -> RoomState -> RoomState
|
||||||
|
changeRoomStateEvents es rs = List.foldr (changeRoomStateEvent) rs es
|
||||||
|
|
||||||
|
changeRoomState : JoinedRoom -> RoomState -> RoomState
|
||||||
|
changeRoomState jr rs =
|
||||||
|
let
|
||||||
|
stateDiff = jr.state
|
||||||
|
|> Maybe.andThen .events
|
||||||
|
|> Maybe.withDefault []
|
||||||
|
timelineDiff = jr.timeline
|
||||||
|
|> Maybe.andThen .events
|
||||||
|
|> Maybe.map (List.filterMap toStateEvent)
|
||||||
|
|> Maybe.withDefault []
|
||||||
|
in
|
||||||
|
rs
|
||||||
|
|> changeRoomStateEvents stateDiff
|
||||||
|
|> changeRoomStateEvents timelineDiff
|
||||||
|
|
||||||
|
changeAccountData : JoinedRoom -> AccountData -> AccountData
|
||||||
|
changeAccountData jr ad =
|
||||||
|
case jr.accountData of
|
||||||
|
Nothing -> ad
|
||||||
|
Just newAd ->
|
||||||
|
case (newAd.events, ad.events) of
|
||||||
|
(Just es, Nothing) -> newAd
|
||||||
|
(Just newEs, Just es) -> { events = Just (newEs ++ es) }
|
||||||
|
_ -> ad
|
||||||
|
|
||||||
|
changeTimeline : JoinedRoom -> List (MessageEvent) -> List (MessageEvent)
|
||||||
|
changeTimeline jr tl =
|
||||||
|
let
|
||||||
|
newMessages = jr.timeline
|
||||||
|
|> Maybe.andThen .events
|
||||||
|
|> Maybe.map (List.filterMap toMessageEvent)
|
||||||
|
|> Maybe.withDefault []
|
||||||
|
in
|
||||||
|
newMessages ++ tl
|
||||||
|
|
||||||
|
changeEphemeral : JoinedRoom -> Ephemeral -> Ephemeral
|
||||||
|
changeEphemeral jr e = Maybe.withDefault e jr.ephemeral
|
||||||
|
|
||||||
|
changeNotifications : JoinedRoom -> UnreadNotificationCounts -> UnreadNotificationCounts
|
||||||
|
changeNotifications jr un = Maybe.withDefault un jr.unreadNotifications
|
||||||
|
|
||||||
|
changeRoomData : JoinedRoom -> RoomData -> RoomData
|
||||||
|
changeRoomData jr rd =
|
||||||
|
{ rd | accountData = changeAccountData jr rd.accountData
|
||||||
|
, roomState = changeRoomState jr rd.roomState
|
||||||
|
, messages = changeTimeline jr rd.messages
|
||||||
|
, ephemeral = changeEphemeral jr rd.ephemeral
|
||||||
|
, unreadNotifications = changeNotifications jr rd.unreadNotifications
|
||||||
|
}
|
||||||
|
|
||||||
|
updateRoomData : JoinedRoom -> Maybe RoomData -> Maybe RoomData
|
||||||
|
updateRoomData jr mrd = Maybe.withDefault emptyRoomData mrd
|
||||||
|
|> changeRoomData jr
|
||||||
|
|> Just
|
||||||
|
|
||||||
|
applyJoinedRoom : RoomId -> JoinedRoom -> OpenRooms -> OpenRooms
|
||||||
|
applyJoinedRoom rid jr = Dict.update rid (updateRoomData jr)
|
||||||
|
|
||||||
|
applySync : SyncResponse -> OpenRooms -> OpenRooms
|
||||||
|
applySync sr or =
|
||||||
|
let
|
||||||
|
joinedRooms = sr.rooms
|
||||||
|
|> Maybe.andThen .join
|
||||||
|
|> Maybe.withDefault Dict.empty
|
||||||
|
in
|
||||||
|
Dict.foldl applyJoinedRoom or joinedRooms
|
Loading…
Reference in New Issue
Block a user