Add facepile to homepage
This commit is contained in:
parent
8da7031b9e
commit
6f2870340a
4 changed files with 64 additions and 2 deletions
|
|
@ -285,15 +285,26 @@ export function useGroupCallRooms(client) {
|
||||||
const groupCalls = client.groupCallEventHandler.groupCalls.values();
|
const groupCalls = client.groupCallEventHandler.groupCalls.values();
|
||||||
const rooms = Array.from(groupCalls).map((groupCall) => groupCall.room);
|
const rooms = Array.from(groupCalls).map((groupCall) => groupCall.room);
|
||||||
const sortedRooms = sortRooms(client, rooms);
|
const sortedRooms = sortRooms(client, rooms);
|
||||||
setRooms(sortedRooms);
|
const items = sortedRooms.map((room) => {
|
||||||
|
const groupCall = client.getGroupCallForRoom(room.roomId);
|
||||||
|
|
||||||
|
return {
|
||||||
|
room,
|
||||||
|
groupCall,
|
||||||
|
participants: [...groupCall.participants],
|
||||||
|
};
|
||||||
|
});
|
||||||
|
setRooms(items);
|
||||||
}
|
}
|
||||||
|
|
||||||
updateRooms();
|
updateRooms();
|
||||||
|
|
||||||
client.on("GroupCall.incoming", updateRooms);
|
client.on("GroupCall.incoming", updateRooms);
|
||||||
|
client.on("GroupCall.participants", updateRooms);
|
||||||
|
|
||||||
return () => {
|
return () => {
|
||||||
client.removeListener("GroupCall.incoming", updateRooms);
|
client.removeListener("GroupCall.incoming", updateRooms);
|
||||||
|
client.removeListener("GroupCall.participants", updateRooms);
|
||||||
};
|
};
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
|
|
|
||||||
24
src/Facepile.jsx
Normal file
24
src/Facepile.jsx
Normal file
|
|
@ -0,0 +1,24 @@
|
||||||
|
import React from "react";
|
||||||
|
import styles from "./Facepile.module.css";
|
||||||
|
import ColorHash from "color-hash";
|
||||||
|
|
||||||
|
const colorHash = new ColorHash({ lightness: 0.3 });
|
||||||
|
|
||||||
|
export function Facepile({ participants }) {
|
||||||
|
console.log(participants);
|
||||||
|
return (
|
||||||
|
<div
|
||||||
|
className={styles.facepile}
|
||||||
|
title={participants.map((member) => member.name).join(", ")}
|
||||||
|
>
|
||||||
|
{participants.map((member) => (
|
||||||
|
<div
|
||||||
|
className={styles.avatar}
|
||||||
|
style={{ backgroundColor: colorHash.hex(member.name) }}
|
||||||
|
>
|
||||||
|
<span>{member.name.slice(0, 1).toUpperCase()}</span>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
25
src/Facepile.module.css
Normal file
25
src/Facepile.module.css
Normal file
|
|
@ -0,0 +1,25 @@
|
||||||
|
.facepile {
|
||||||
|
margin: 0 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.facepile .avatar {
|
||||||
|
position: relative;
|
||||||
|
width: 20px;
|
||||||
|
height: 20px;
|
||||||
|
border-radius: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.facepile .avatar > * {
|
||||||
|
position: absolute;
|
||||||
|
left: 0;
|
||||||
|
color: #fff;
|
||||||
|
text-align: center;
|
||||||
|
pointer-events: none;
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
|
||||||
|
.facepile .avatar span {
|
||||||
|
font-size: 14px;
|
||||||
|
width: 20px;
|
||||||
|
line-height: 20px;
|
||||||
|
}
|
||||||
|
|
@ -29,6 +29,7 @@ import {
|
||||||
GroupCallIntent,
|
GroupCallIntent,
|
||||||
GroupCallType,
|
GroupCallType,
|
||||||
} from "matrix-js-sdk/src/browser-index";
|
} from "matrix-js-sdk/src/browser-index";
|
||||||
|
import { Facepile } from "./Facepile";
|
||||||
|
|
||||||
const colorHash = new ColorHash({ lightness: 0.3 });
|
const colorHash = new ColorHash({ lightness: 0.3 });
|
||||||
|
|
||||||
|
|
@ -171,7 +172,7 @@ export function Home({ client, onLogout }) {
|
||||||
<section>
|
<section>
|
||||||
<h3>Recent Rooms</h3>
|
<h3>Recent Rooms</h3>
|
||||||
<div className={styles.roomList}>
|
<div className={styles.roomList}>
|
||||||
{rooms.map((room) => (
|
{rooms.map(({ room, participants }) => (
|
||||||
<Link
|
<Link
|
||||||
className={styles.roomListItem}
|
className={styles.roomListItem}
|
||||||
key={room.roomId}
|
key={room.roomId}
|
||||||
|
|
@ -184,6 +185,7 @@ export function Home({ client, onLogout }) {
|
||||||
<span>{room.name.slice(0, 1)}</span>
|
<span>{room.name.slice(0, 1)}</span>
|
||||||
</div>
|
</div>
|
||||||
<div className={styles.roomName}>{room.name}</div>
|
<div className={styles.roomName}>{room.name}</div>
|
||||||
|
<Facepile participants={participants} />
|
||||||
</Link>
|
</Link>
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue