Perform further cleanup to Sync
This commit is contained in:
parent
8627123143
commit
71e0b3f64e
|
@ -1,6 +1,6 @@
|
||||||
module Scylla.Model exposing (..)
|
module Scylla.Model exposing (..)
|
||||||
import Scylla.Api exposing (..)
|
import Scylla.Api exposing (..)
|
||||||
import Scylla.Sync exposing (SyncResponse, HistoryResponse, roomJoinedUsers)
|
import Scylla.Sync exposing (SyncResponse, HistoryResponse)
|
||||||
import Scylla.ListUtils exposing (findFirst)
|
import Scylla.ListUtils exposing (findFirst)
|
||||||
import Scylla.Room exposing (OpenRooms)
|
import Scylla.Room exposing (OpenRooms)
|
||||||
import Scylla.Sync.Rooms exposing (JoinedRoom)
|
import Scylla.Sync.Rooms exposing (JoinedRoom)
|
||||||
|
|
|
@ -166,3 +166,14 @@ getTotalNotificationCountString or =
|
||||||
case n of
|
case n of
|
||||||
0 -> Nothing
|
0 -> Nothing
|
||||||
_ -> Just <| "(" ++ String.fromInt n ++ suffix ++ ")"
|
_ -> Just <| "(" ++ String.fromInt n ++ suffix ++ ")"
|
||||||
|
|
||||||
|
getHomeserver : String -> String
|
||||||
|
getHomeserver s =
|
||||||
|
let
|
||||||
|
colonIndex = Maybe.withDefault 0
|
||||||
|
<| Maybe.map ((+) 1)
|
||||||
|
<| List.head
|
||||||
|
<| String.indexes ":" s
|
||||||
|
in
|
||||||
|
String.dropLeft colonIndex s
|
||||||
|
|
||||||
|
|
|
@ -58,27 +58,7 @@ findFirstEvent = findFirstBy .originServerTs
|
||||||
findLastEvent : ({ a | originServerTs : Int } -> Bool) -> List { a | originServerTs : Int } -> Maybe { a | originServerTs : Int }
|
findLastEvent : ({ a | originServerTs : Int } -> Bool) -> List { a | originServerTs : Int } -> Maybe { a | originServerTs : Int }
|
||||||
findLastEvent = findLastBy .originServerTs
|
findLastEvent = findLastBy .originServerTs
|
||||||
|
|
||||||
-- Business Logic: Names
|
|
||||||
homeserver : String -> String
|
|
||||||
homeserver s =
|
|
||||||
let
|
|
||||||
colonIndex = Maybe.withDefault 0
|
|
||||||
<| Maybe.map ((+) 1)
|
|
||||||
<| List.head
|
|
||||||
<| String.indexes ":" s
|
|
||||||
in
|
|
||||||
String.dropLeft colonIndex s
|
|
||||||
|
|
||||||
-- Business Logic: Events
|
-- Business Logic: Events
|
||||||
allRoomStateEvents : JoinedRoom -> List StateEvent
|
|
||||||
allRoomStateEvents jr =
|
|
||||||
let
|
|
||||||
stateEvents = Maybe.withDefault [] <| Maybe.andThen .events jr.state
|
|
||||||
timelineEvents = Maybe.withDefault [] <| Maybe.andThen .events jr.timeline
|
|
||||||
allStateEvents = uniqueBy .eventId (stateEvents ++ (List.filterMap toStateEvent timelineEvents))
|
|
||||||
in
|
|
||||||
allStateEvents
|
|
||||||
|
|
||||||
allRoomDictTimelineEvents : Dict String { a | timeline : Maybe Timeline } -> List RoomEvent
|
allRoomDictTimelineEvents : Dict String { a | timeline : Maybe Timeline } -> List RoomEvent
|
||||||
allRoomDictTimelineEvents dict = List.concatMap (Maybe.withDefault [] << .events)
|
allRoomDictTimelineEvents dict = List.concatMap (Maybe.withDefault [] << .events)
|
||||||
<| List.filterMap .timeline
|
<| List.filterMap .timeline
|
||||||
|
@ -104,65 +84,6 @@ joinedRoomsTimelineEvents s =
|
||||||
<| Maybe.map (Dict.map (\k v -> Maybe.withDefault [] <| Maybe.andThen .events v.timeline))
|
<| Maybe.map (Dict.map (\k v -> Maybe.withDefault [] <| Maybe.andThen .events v.timeline))
|
||||||
<| Maybe.andThen .join s.rooms
|
<| Maybe.andThen .join s.rooms
|
||||||
|
|
||||||
totalNotificationCountString : SyncResponse -> Maybe String
|
|
||||||
totalNotificationCountString sr =
|
|
||||||
let
|
|
||||||
(h, n) = totalNotificationCounts sr
|
|
||||||
suffix = case h of
|
|
||||||
0 -> ""
|
|
||||||
_ -> "!"
|
|
||||||
in
|
|
||||||
case n of
|
|
||||||
0 -> Nothing
|
|
||||||
_ -> Just <| "(" ++ String.fromInt n ++ suffix ++ ")"
|
|
||||||
|
|
||||||
totalNotificationCounts : SyncResponse -> (Int, Int)
|
|
||||||
totalNotificationCounts sr =
|
|
||||||
let
|
|
||||||
rooms = Maybe.withDefault []
|
|
||||||
<| Maybe.map (Dict.values)
|
|
||||||
<| Maybe.andThen (.join) sr.rooms
|
|
||||||
zeroDefault = Maybe.withDefault 0
|
|
||||||
getCounts = Maybe.map (\cs -> (zeroDefault cs.highlightCount, zeroDefault cs.notificationCount))
|
|
||||||
<< .unreadNotifications
|
|
||||||
sumCounts (h1, n1) (h2, n2) = (h1 + h2, n1 + n2)
|
|
||||||
in
|
|
||||||
List.foldl sumCounts (0, 0)
|
|
||||||
<| List.filterMap getCounts rooms
|
|
||||||
|
|
||||||
-- Business Logic: Room Info
|
|
||||||
roomAccountData : JoinedRoom -> String -> Maybe Decode.Value
|
|
||||||
roomAccountData jr et =
|
|
||||||
Maybe.map .content
|
|
||||||
<| Maybe.andThen (List.head << List.filter (((==) et) << .type_))
|
|
||||||
<| Maybe.andThen .events jr.accountData
|
|
||||||
|
|
||||||
roomName : JoinedRoom -> Maybe String
|
|
||||||
roomName jr =
|
|
||||||
let
|
|
||||||
name c = Result.toMaybe <| Decode.decodeValue (field "name" string) c
|
|
||||||
nameEvent = findLastEvent (((==) "m.room.name") << .type_) <| allRoomStateEvents jr
|
|
||||||
in
|
|
||||||
Maybe.andThen (name << .content) nameEvent
|
|
||||||
|
|
||||||
roomTypingUsers : JoinedRoom -> List Username
|
|
||||||
roomTypingUsers jr = Maybe.withDefault []
|
|
||||||
<| Maybe.andThen (Result.toMaybe << Decode.decodeValue (Decode.field "user_ids" (list string)))
|
|
||||||
<| Maybe.map .content
|
|
||||||
<| Maybe.andThen (findLast (((==) "m.typing") << .type_))
|
|
||||||
<| Maybe.andThen .events jr.ephemeral
|
|
||||||
|
|
||||||
-- Business Logic: Users
|
-- Business Logic: Users
|
||||||
allUsers : SyncResponse -> List Username
|
allUsers : SyncResponse -> List Username
|
||||||
allUsers s = uniqueBy (\u -> u) <| List.map getSender <| allTimelineEvents s
|
allUsers s = uniqueBy (\u -> u) <| List.map getSender <| allTimelineEvents s
|
||||||
|
|
||||||
roomJoinedUsers : JoinedRoom -> List Username
|
|
||||||
roomJoinedUsers r =
|
|
||||||
let
|
|
||||||
contentDecoder = Decode.field "membership" Decode.string
|
|
||||||
isJoin e = Ok "join" == (Decode.decodeValue contentDecoder e.content)
|
|
||||||
in
|
|
||||||
List.map .sender
|
|
||||||
<| List.filter isJoin
|
|
||||||
<| List.filter (((==) "m.room.member") << .type_)
|
|
||||||
<| allRoomStateEvents r
|
|
||||||
|
|
|
@ -3,7 +3,7 @@ import Scylla.Model exposing (..)
|
||||||
import Scylla.Sync exposing (..)
|
import Scylla.Sync exposing (..)
|
||||||
import Scylla.Sync.Events exposing (..)
|
import Scylla.Sync.Events exposing (..)
|
||||||
import Scylla.Sync.Rooms exposing (..)
|
import Scylla.Sync.Rooms exposing (..)
|
||||||
import Scylla.Room exposing (RoomData, emptyOpenRooms, getRoomName, getRoomTypingUsers)
|
import Scylla.Room exposing (RoomData, emptyOpenRooms, getHomeserver, getRoomName, getRoomTypingUsers)
|
||||||
import Scylla.Route exposing (..)
|
import Scylla.Route exposing (..)
|
||||||
import Scylla.Fnv as Fnv
|
import Scylla.Fnv as Fnv
|
||||||
import Scylla.Messages exposing (..)
|
import Scylla.Messages exposing (..)
|
||||||
|
@ -104,7 +104,7 @@ roomListView m =
|
||||||
]
|
]
|
||||||
|
|
||||||
roomGroups : List (String, RoomData) -> Dict String (List (String, RoomData))
|
roomGroups : List (String, RoomData) -> Dict String (List (String, RoomData))
|
||||||
roomGroups jrs = groupBy (homeserver << Tuple.first) jrs
|
roomGroups jrs = groupBy (getHomeserver << Tuple.first) jrs
|
||||||
|
|
||||||
homeserverView : Model -> String -> List (String, RoomData) -> Html Msg
|
homeserverView : Model -> String -> List (String, RoomData) -> Html Msg
|
||||||
homeserverView m hs rs =
|
homeserverView m hs rs =
|
||||||
|
|
Loading…
Reference in New Issue
Block a user