Group rooms by homeserver.
This commit is contained in:
parent
1d3b0febde
commit
3c91be9fb6
|
@ -273,6 +273,15 @@ historyResponseDecoder =
|
||||||
|> required "chunk" (list roomEventDecoder)
|
|> required "chunk" (list roomEventDecoder)
|
||||||
|
|
||||||
-- Business Logic: Helper Functions
|
-- Business Logic: Helper Functions
|
||||||
|
groupBy : (a -> comparable) -> List a -> Dict comparable (List a)
|
||||||
|
groupBy f xs =
|
||||||
|
let
|
||||||
|
update v ml = case ml of
|
||||||
|
Just l -> Just (v::l)
|
||||||
|
Nothing -> Just [ v ]
|
||||||
|
in
|
||||||
|
List.foldl (\v acc -> Dict.update (f v) (update v) acc) Dict.empty xs
|
||||||
|
|
||||||
uniqueByRecursive : (a -> comparable) -> List a -> Set comparable -> List a
|
uniqueByRecursive : (a -> comparable) -> List a -> Set comparable -> List a
|
||||||
uniqueByRecursive f l s = case l of
|
uniqueByRecursive f l s = case l of
|
||||||
x::tail -> if Set.member (f x) s
|
x::tail -> if Set.member (f x) s
|
||||||
|
@ -432,6 +441,16 @@ senderName s =
|
||||||
in
|
in
|
||||||
String.slice 1 colonIndex s
|
String.slice 1 colonIndex s
|
||||||
|
|
||||||
|
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 : JoinedRoom -> List StateEvent
|
||||||
allRoomStateEvents jr =
|
allRoomStateEvents jr =
|
||||||
|
|
|
@ -12,10 +12,11 @@ import Svg
|
||||||
import Svg.Attributes
|
import Svg.Attributes
|
||||||
import Url.Builder
|
import Url.Builder
|
||||||
import Json.Decode as Decode
|
import Json.Decode as Decode
|
||||||
import Html exposing (Html, Attribute, div, input, text, button, div, span, a, h2, table, td, tr, img, textarea, video, source)
|
import Html exposing (Html, Attribute, div, input, text, button, div, span, a, h2, h3, table, td, tr, img, textarea, video, source)
|
||||||
import Html.Attributes exposing (type_, value, href, class, style, src, id, rows, controls, src)
|
import Html.Attributes exposing (type_, value, href, class, style, src, id, rows, controls, src)
|
||||||
import Html.Events exposing (onInput, onClick, preventDefaultOn)
|
import Html.Events exposing (onInput, onClick, preventDefaultOn)
|
||||||
import Dict
|
import Dict exposing (Dict)
|
||||||
|
import Tuple
|
||||||
|
|
||||||
contentRepositoryDownloadUrl : ApiUrl -> String -> String
|
contentRepositoryDownloadUrl : ApiUrl -> String -> String
|
||||||
contentRepositoryDownloadUrl apiUrl s =
|
contentRepositoryDownloadUrl apiUrl s =
|
||||||
|
@ -70,14 +71,30 @@ baseView m jr =
|
||||||
roomListView : Model -> Html Msg
|
roomListView : Model -> Html Msg
|
||||||
roomListView m =
|
roomListView m =
|
||||||
let
|
let
|
||||||
rooms = Maybe.withDefault (Dict.empty) <| Maybe.andThen .join <| m.sync.rooms
|
rooms = Maybe.withDefault (Dict.empty)
|
||||||
roomList = div [ class "rooms-list" ] <| Dict.values <| Dict.map roomListElementView rooms
|
<| Maybe.andThen .join
|
||||||
|
<| m.sync.rooms
|
||||||
|
groups = roomGroups
|
||||||
|
<| Dict.toList rooms
|
||||||
|
homeserverList = div [ class "homeservers-list" ]
|
||||||
|
<| List.map (\(k, v) -> homeserverView k v)
|
||||||
|
<| Dict.toList groups
|
||||||
in
|
in
|
||||||
div [ class "rooms-wrapper" ]
|
div [ class "rooms-wrapper" ]
|
||||||
[ h2 [] [ text "Rooms" ]
|
[ h2 [] [ text "Rooms" ]
|
||||||
, roomList
|
, homeserverList
|
||||||
]
|
]
|
||||||
|
|
||||||
|
roomGroups : List (String, JoinedRoom) -> Dict String (List (String, JoinedRoom))
|
||||||
|
roomGroups jrs = groupBy (homeserver << Tuple.first) jrs
|
||||||
|
|
||||||
|
homeserverView : String -> List (String, JoinedRoom) -> Html Msg
|
||||||
|
homeserverView hs rs =
|
||||||
|
let
|
||||||
|
roomList = div [ class "rooms-list" ] <| List.map (\(rid, r) -> roomListElementView rid r) rs
|
||||||
|
in
|
||||||
|
div [ class "homeserver-wrapper" ] [ h3 [] [ text hs ], roomList ]
|
||||||
|
|
||||||
roomListElementView : String -> JoinedRoom -> Html Msg
|
roomListElementView : String -> JoinedRoom -> Html Msg
|
||||||
roomListElementView s jr =
|
roomListElementView s jr =
|
||||||
let
|
let
|
||||||
|
|
|
@ -67,7 +67,7 @@ a {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
h2 {
|
h2, h3 {
|
||||||
margin: 0px;
|
margin: 0px;
|
||||||
margin-bottom: 3px;
|
margin-bottom: 3px;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user