diff --git a/external/lang b/external/lang index 5af7326c..58a9fb69 160000 --- a/external/lang +++ b/external/lang @@ -1 +1 @@ -Subproject commit 5af7326c286f729ac6dd4cabff9dfdf7c480b631 +Subproject commit 58a9fb697de00f570d445be4d12e3ce4a5e3522e diff --git a/package.json b/package.json index 25afb96b..16a74c74 100644 --- a/package.json +++ b/package.json @@ -141,7 +141,7 @@ "remark-math": "^5.1.1", "remark-parse": "^10.0.1", "remark-rehype": "^10.1.0", - "revolt.js": "^6.0.6", + "revolt.js": "6.0.9", "rimraf": "^3.0.2", "sass": "^1.35.1", "semver": "^7.3.7", diff --git a/src/components/common/messaging/SystemMessage.tsx b/src/components/common/messaging/SystemMessage.tsx index 00a940c3..43e04d57 100644 --- a/src/components/common/messaging/SystemMessage.tsx +++ b/src/components/common/messaging/SystemMessage.tsx @@ -9,6 +9,7 @@ import { EditAlt, Edit, MessageSquareEdit, + Key, } from "@styled-icons/boxicons-solid"; import { observer } from "mobx-react-lite"; import { Message, API } from "revolt.js"; @@ -18,6 +19,7 @@ import { useTriggerEvents } from "preact-context-menu"; import { TextReact } from "../../../lib/i18n"; +import Markdown from "../../markdown/Markdown"; import UserShort from "../user/UserShort"; import MessageBase, { MessageDetail, MessageInfo } from "./MessageBase"; @@ -67,12 +69,15 @@ const iconDictionary = { channel_renamed: EditAlt, channel_description_changed: Edit, channel_icon_changed: MessageSquareEdit, + channel_ownership_changed: Key, text: InfoCircle, }; export const SystemMessage = observer( ({ attachContext, message, highlight, hideInfo }: Props) => { const data = message.asSystemMessage; + if (!data) return null; + const SystemMessageIcon = iconDictionary[data.type as API.SystemMessage["type"]] ?? InfoCircle; @@ -130,6 +135,22 @@ export const SystemMessage = observer( /> ); break; + case "channel_ownership_changed": + children = ( + , + to: , + }} + /> + ); + break; + case "text": + if (message.system?.type === "text") { + children = ; + } + break; } return ( diff --git a/src/components/common/user/UserShort.tsx b/src/components/common/user/UserShort.tsx index bbe3670a..b2ca22b2 100644 --- a/src/components/common/user/UserShort.tsx +++ b/src/components/common/user/UserShort.tsx @@ -26,7 +26,10 @@ const BotBadge = styled.div` border-radius: calc(var(--border-radius) / 2); `; -type UsernameProps = JSX.HTMLAttributes & { +type UsernameProps = Omit< + JSX.HTMLAttributes, + "children" | "as" +> & { user?: User; prefixAt?: boolean; masquerade?: API.Masquerade; @@ -35,6 +38,13 @@ type UsernameProps = JSX.HTMLAttributes & { innerRef?: Ref; }; +const Name = styled.span<{ colour?: string | null }>` + background: ${(props) => props.colour ?? "var(--foreground)"}; + background-clip: text; + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; +`; + export const Username = observer( ({ user, @@ -45,7 +55,7 @@ export const Username = observer( ...otherProps }: UsernameProps) => { let username = user?.username; - let color; + let color = masquerade?.colour; if (user && showServerIdentity) { const { server } = useParams<{ server?: string }>(); @@ -65,15 +75,10 @@ export const Username = observer( } } - if (member.roles && member.roles.length > 0) { - const srv = client.servers.get(member._id.server); - if (srv?.roles) { - for (const role of member.roles) { - const c = srv.roles[role]?.colour; - if (c) { - color = c; - continue; - } + if (!color) { + for (const [_, { colour }] of member.orderedRoles) { + if (colour) { + color = colour; } } } @@ -81,14 +86,19 @@ export const Username = observer( } } + const el = ( + + {prefixAt ? "@" : undefined} + {masquerade?.name ?? username ?? ( + + )} + + ); + if (user?.bot) { return ( <> - - {masquerade?.name ?? username ?? ( - - )} - + {el} {masquerade ? ( @@ -100,14 +110,7 @@ export const Username = observer( ); } - return ( - - {prefixAt ? "@" : undefined} - {masquerade?.name ?? username ?? ( - - )} - - ); + return el; }, ); diff --git a/src/controllers/modals/components/MFARecovery.tsx b/src/controllers/modals/components/MFARecovery.tsx index 33a11809..b7bcf8de 100644 --- a/src/controllers/modals/components/MFARecovery.tsx +++ b/src/controllers/modals/components/MFARecovery.tsx @@ -23,6 +23,11 @@ const List = styled.div` span { user-select: text; } + + i { + opacity: 0; + position: absolute; + } `; /** @@ -73,8 +78,10 @@ export default function MFARecovery({ onClose={onClose} signal={signal}> - {known.map((code) => ( - {code} + {known.map((code, index) => ( + + {code} {index !== known.length && {","}} + ))} diff --git a/src/lib/ContextMenus.tsx b/src/lib/ContextMenus.tsx index de991c21..6aeb7c41 100644 --- a/src/lib/ContextMenus.tsx +++ b/src/lib/ContextMenus.tsx @@ -69,6 +69,7 @@ type Action = | { action: "copy_file_link"; attachment: API.File } | { action: "open_link"; link: string } | { action: "copy_link"; link: string } + | { action: "make_owner"; channel: Channel; user: User } | { action: "remove_member"; channel: Channel; user: User } | { action: "kick_member"; target: Member } | { action: "ban_member"; target: Member } @@ -307,6 +308,15 @@ export default function ContextMenus() { } break; + case "make_owner": + { + // FIXME: add a modal for this + data.channel.edit({ + owner: data.user._id, + }); + } + break; + case "remove_member": { data.channel.removeMember(data.user._id); @@ -667,11 +677,29 @@ export default function ContextMenus() { contextualChannel.owner_id === userId && userId !== uid ) { - generateAction({ - action: "remove_member", - channel: contextualChannel, - user: user!, - }); + generateAction( + { + action: "make_owner", + channel: contextualChannel, + user: user!, + }, + undefined, + false, + undefined, + "var(--error)", + ); + + generateAction( + { + action: "remove_member", + channel: contextualChannel, + user: user!, + }, + undefined, + false, + undefined, + "var(--error)", + ); } } diff --git a/yarn.lock b/yarn.lock index 799719ba..dc947708 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3696,7 +3696,7 @@ __metadata: remark-math: ^5.1.1 remark-parse: ^10.0.1 remark-rehype: ^10.1.0 - revolt.js: ^6.0.6 + revolt.js: 6.0.9 rimraf: ^3.0.2 sass: ^1.35.1 semver: ^7.3.7 @@ -7879,20 +7879,20 @@ __metadata: languageName: node linkType: hard -"revolt-api@npm:0.5.4": - version: 0.5.4 - resolution: "revolt-api@npm:0.5.4" +"revolt-api@npm:0.5.5": + version: 0.5.5 + resolution: "revolt-api@npm:0.5.5" dependencies: "@insertish/oapi": 0.1.16 axios: ^0.26.1 lodash.defaultsdeep: ^4.6.1 - checksum: bd40acabac1b6c5848b1d6e555297de5aa3e0950a4de67523c4cf986a8037380e3addc5e16babebc8dfa6570cd1d1957efe9a3aaa6a206b9286e5b7f5941d699 + checksum: 38fa78e3f731a8753916da58347ac930ff911f7a45d67f9d3e55bdaf56be5eb11c8568803209a76d9a40e6d5faa4a5adfc80aa6377528df499080f5e3b75cd2d languageName: node linkType: hard -"revolt.js@npm:^6.0.6": - version: 6.0.6 - resolution: "revolt.js@npm:6.0.6" +"revolt.js@npm:6.0.9": + version: 6.0.9 + resolution: "revolt.js@npm:6.0.9" dependencies: "@insertish/exponential-backoff": 3.1.0-patch.2 "@insertish/isomorphic-ws": ^4.0.1 @@ -7903,10 +7903,10 @@ __metadata: lodash.isequal: ^4.5.0 long: ^5.2.0 mobx: ^6.3.2 - revolt-api: 0.5.4 + revolt-api: 0.5.5 ulid: ^2.3.0 ws: ^8.2.2 - checksum: 079bdb983c650233378a617b771d7ff64396ce96fbd822fea20e9897fa14c2e589869e4a66f749dc74ce08218af425f97ab42fcaca7a3ab0f68f38f163484260 + checksum: a3ea924a6793f6a4aa5f62e660b249bd76bbe2f0048d9b374a449f064ee6d65df1b8e4e3af1d15267707ea6d35b6a3101349b0bf41fa323cb5c298ab98de8d45 languageName: node linkType: hard