diff --git a/external/lang b/external/lang index 755f35fcdd769f15a68512403074a584441f3fc6..099fb74131c60955e8226ce0a290cb22e959d7d6 160000 --- a/external/lang +++ b/external/lang @@ -1 +1 @@ -Subproject commit 755f35fcdd769f15a68512403074a584441f3fc6 +Subproject commit 099fb74131c60955e8226ce0a290cb22e959d7d6 diff --git a/src/components/common/messaging/Message.tsx b/src/components/common/messaging/Message.tsx index 781c4e9508ec614a4f531280a72d62e3e363eb24..8c71ae63efb9d179085ccc53e04fa696d12fa078 100644 --- a/src/components/common/messaging/Message.tsx +++ b/src/components/common/messaging/Message.tsx @@ -32,6 +32,8 @@ function Message({ attachContext, message, contrast, content: replacement, head: const content = message.content as string; const head = preferHead || (message.replies && message.replies.length > 0); + const userContext = attachContext ? attachContextMenu('Menu', { user: message.author, contextualChannel: message.channel }) : undefined as any; // ! FIXME: tell fatal to make this type generic + return ( <> { message.replies?.map((message_id, index) => <MessageReply index={index} id={message_id} channel={message.channel} />) } @@ -44,12 +46,14 @@ function Message({ attachContext, message, contrast, content: replacement, head: onContextMenu={attachContext ? attachContextMenu('Menu', { message, contextualChannel: message.channel, queued }) : undefined}> <MessageInfo> { head ? - <UserIcon target={user} size={36} /> : + <UserIcon target={user} size={36} onContextMenu={userContext} /> : <MessageDetail message={message} position="left" /> } </MessageInfo> <MessageContent> - { head && <span className="author"> - <Username user={user} /> + { head && <span className="detail"> + <span className="author"> + <Username user={user} onContextMenu={userContext} /> + </span> <MessageDetail message={message} position="top" /> </span> } { replacement ?? <Markdown content={content} /> } diff --git a/src/components/common/messaging/MessageBase.tsx b/src/components/common/messaging/MessageBase.tsx index 435c2f11f54da76e4552c13c1478901cb4cb9096..de70edcee463e64f3c1d7638c01461285805eefe 100644 --- a/src/components/common/messaging/MessageBase.tsx +++ b/src/components/common/messaging/MessageBase.tsx @@ -53,11 +53,19 @@ export default styled.div<BaseMessageProps>` color: var(--error); ` } - .author { + .detail { gap: 8px; display: flex; align-items: center; } + + .author { + cursor: pointer; + + &:hover { + text-decoration: underline; + } + } .copy { width: 0; @@ -89,6 +97,10 @@ export const MessageInfo = styled.div` color: var(--tertiary-foreground); } + svg { + cursor: pointer; + } + time { opacity: 0; } diff --git a/src/components/common/user/UserShort.tsx b/src/components/common/user/UserShort.tsx index 0dda8d3c6ac7ea22df5e63318b082ae604563fe2..69a15fd39581ea694fad83e16f716f919cf7ff0c 100644 --- a/src/components/common/user/UserShort.tsx +++ b/src/components/common/user/UserShort.tsx @@ -2,8 +2,8 @@ import { User } from "revolt.js"; import UserIcon from "./UserIcon"; import { Text } from "preact-i18n"; -export function Username({ user }: { user?: User }) { - return <b>{ user?.username ?? <Text id="app.main.channel.unknown_user" /> }</b>; +export function Username({ user, ...otherProps }: { user?: User } & JSX.HTMLAttributes<HTMLElement>) { + return <b {...otherProps}>{ user?.username ?? <Text id="app.main.channel.unknown_user" /> }</b>; } export default function UserShort({ user, size }: { user?: User, size?: number }) { diff --git a/src/components/markdown/Markdown.module.scss b/src/components/markdown/Markdown.module.scss index 2f13352ac76327c43502fe57282be35a08fb1568..de439a3482daa4d065c74cf02744edb2f2700766 100644 --- a/src/components/markdown/Markdown.module.scss +++ b/src/components/markdown/Markdown.module.scss @@ -115,15 +115,23 @@ padding: 0 2px; cursor: pointer; user-select: none; - color: transparent; border-radius: 4px; + color: transparent; background: #151515; + > * { + opacity: 0; + } + &:global(.shown) { cursor: auto; user-select: all; color: var(--foreground); background: var(--secondary-background); + + > * { + opacity: 1; + } } } diff --git a/src/components/navigation/items/ButtonItem.tsx b/src/components/navigation/items/ButtonItem.tsx index 31c29fbe072af59f0e0c220d8bef664fcf04caa5..42792b7b46cfdcd27261cb57e77566c1bed14ef4 100644 --- a/src/components/navigation/items/ButtonItem.tsx +++ b/src/components/navigation/items/ButtonItem.tsx @@ -97,8 +97,7 @@ export function ChannelButton({ active, alert, alertCount, channel, user, compac const { openScreen } = useIntermediate(); return ( - <div - data-active={active} + <div data-active={active} data-alert={typeof alert === 'string'} className={classNames(styles.item, { [styles.compact]: compact })} onContextMenu={attachContextMenu('Menu', { channel: channel._id, unread: typeof channel.unread !== 'undefined' })}> diff --git a/src/lib/ContextMenus.tsx b/src/lib/ContextMenus.tsx index 358ed937f1356d927b8a25b7c9621baac5f461ee..89bdf8f49b38b678625b6b1bc320639f11f64610 100644 --- a/src/lib/ContextMenus.tsx +++ b/src/lib/ContextMenus.tsx @@ -562,7 +562,7 @@ function ContextMenus(props: WithDispatcher) { } } - let id = server?._id ?? channel?._id ?? user?._id ?? message?._id; + let id = sid ?? cid ?? uid ?? message?._id; if (id) { pushDivider();