fix: display server identity (if present) in typing indicator (#703)

feat/custom-emoji-autocomplete
Leda 2022-09-20 17:22:25 +00:00 committed by GitHub
parent 0a27632f05
commit 2687f98952
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 39 additions and 14 deletions

View File

@ -1,5 +1,5 @@
import { observer } from "mobx-react-lite"; import { observer } from "mobx-react-lite";
import { Channel } from "revolt.js"; import { Channel, Member } from "revolt.js";
import styled from "styled-components/macro"; import styled from "styled-components/macro";
import { Text } from "preact-i18n"; import { Text } from "preact-i18n";
@ -60,6 +60,8 @@ const Base = styled.div`
`; `;
export default observer(({ channel }: Props) => { export default observer(({ channel }: Props) => {
const client = channel.client;
const users = channel.typing.filter( const users = channel.typing.filter(
(x) => (x) =>
typeof x !== "undefined" && typeof x !== "undefined" &&
@ -67,24 +69,47 @@ export default observer(({ channel }: Props) => {
x.relationship !== "Blocked", x.relationship !== "Blocked",
); );
if (users.length > 0) { const members = users.map((user) => {
users.sort((a, b) => return client.members.getKey({
a!._id.toUpperCase().localeCompare(b!._id.toUpperCase()), server: channel.server_id!,
user: user!._id,
});
});
const getName = (member: Member) => {
return member.nickname === null
? member.user?.username
: member.nickname;
};
const getAvatar = (member: Member) => {
const memberAvatarURL = member.generateAvatarURL({
max_side: 256,
});
return memberAvatarURL === undefined
? member.user?.generateAvatarURL({ max_side: 256 })
: memberAvatarURL;
};
if (members.length > 0) {
members.sort((a, b) =>
a!._id.user.toUpperCase().localeCompare(b!._id.user.toUpperCase()),
); );
let text; let text;
if (users.length >= 5) { if (members.length >= 5) {
text = <Text id="app.main.channel.typing.several" />; text = <Text id="app.main.channel.typing.several" />;
} else if (users.length > 1) { } else if (members.length > 1) {
const userlist = [...users].map((x) => x!.username); const memberlist = [...members].map((x) => getName(x!));
const user = userlist.pop(); const member = memberlist.pop();
text = ( text = (
<Text <Text
id="app.main.channel.typing.multiple" id="app.main.channel.typing.multiple"
fields={{ fields={{
user, user: member,
userlist: userlist.join(", "), userlist: memberlist.join(", "),
}} }}
/> />
); );
@ -92,7 +117,7 @@ export default observer(({ channel }: Props) => {
text = ( text = (
<Text <Text
id="app.main.channel.typing.single" id="app.main.channel.typing.single"
fields={{ user: users[0]!.username }} fields={{ user: getName(members[0]!) }}
/> />
); );
} }
@ -101,11 +126,11 @@ export default observer(({ channel }: Props) => {
<Base> <Base>
<div> <div>
<div className="avatars"> <div className="avatars">
{users.map((user) => ( {members.map((member) => (
<img <img
key={user!._id} key={member!._id.user}
loading="eager" loading="eager"
src={user!.generateAvatarURL({ max_side: 256 })} src={getAvatar(member!)}
/> />
))} ))}
</div> </div>