From 9570525f98b79c79399fe30a227f6025de1fe999 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Fri, 24 Jan 2025 01:36:49 +0200 Subject: [PATCH] Fix code and include ?via parameters --- web/src/api/statestore/room.ts | 31 ++++++++++++++++++- web/src/ui/timeline/menu/ShareModal.tsx | 4 +-- web/src/ui/timeline/menu/index.css | 11 +++++++ .../ui/timeline/menu/useSecondaryItems.tsx | 31 +++++++++++-------- 4 files changed, 61 insertions(+), 16 deletions(-) diff --git a/web/src/api/statestore/room.ts b/web/src/api/statestore/room.ts index 5252a3c..f0f5a0f 100644 --- a/web/src/api/statestore/room.ts +++ b/web/src/api/statestore/room.ts @@ -18,7 +18,7 @@ import { CustomEmojiPack, parseCustomEmojiPack } from "@/util/emoji" import { NonNullCachedEventDispatcher } from "@/util/eventdispatcher.ts" import toSearchableString from "@/util/searchablestring.ts" import Subscribable, { MultiSubscribable, NoDataSubscribable } from "@/util/subscribable.ts" -import { getDisplayname } from "@/util/validation.ts" +import { getDisplayname, getServerName } from "@/util/validation.ts" import { ContentURI, DBReceipt, @@ -246,6 +246,35 @@ export class RoomStateStore { return this.#membersCache ?? [] } + getViaServers(): string[] { + const ownServerName = getServerName(this.parent.userID) + const vias = [ownServerName] + const members = this.getMembers() + const memberCount = new Map() + const powerLevels: PowerLevelEventContent = this.getStateEvent("m.room.power_levels", "")?.content ?? {} + const usersDefault = powerLevels.users_default ?? 0 + let powerServer: string | undefined = undefined + for (const member of members) { + const serverName = getServerName(member.userID) + if (serverName !== ownServerName) { + if (!powerServer && (powerLevels?.users?.[member.userID] ?? usersDefault) > usersDefault) { + powerServer = serverName + vias.push(powerServer) + } + memberCount.set(serverName, (memberCount.get(serverName) ?? 0) + 1) + } + } + const servers = Array.from(memberCount.entries()) + servers.sort(([, a], [, b]) => b - a) + for (const [serverName] of servers) { + if (serverName !== ownServerName && serverName !== powerServer) { + vias.push(serverName) + break + } + } + return vias + } + getPinnedEvents(): EventID[] { const pinnedList = this.getStateEvent("m.room.pinned_events", "")?.content?.pinned if (Array.isArray(pinnedList)) { diff --git a/web/src/ui/timeline/menu/ShareModal.tsx b/web/src/ui/timeline/menu/ShareModal.tsx index b30c802..9e531cc 100644 --- a/web/src/ui/timeline/menu/ShareModal.tsx +++ b/web/src/ui/timeline/menu/ShareModal.tsx @@ -52,8 +52,8 @@ const ShareModal = ({ evt, title, confirmButton, onConfirm, generateLink }: Conf -
- Share: {link} +
+ Preview: {link}
diff --git a/web/src/ui/timeline/menu/index.css b/web/src/ui/timeline/menu/index.css index a78c222..b9f8bcc 100644 --- a/web/src/ui/timeline/menu/index.css +++ b/web/src/ui/timeline/menu/index.css @@ -101,6 +101,7 @@ div.confirm-message-modal > form { > div.timeline-event { margin: 0; + padding: 0; } } @@ -118,4 +119,14 @@ div.confirm-message-modal > form { padding: .5rem 1rem; } } + + > div.output-preview { + > span.no-select { + user-select: none; + } + + > code { + word-break: break-word; + } + } } diff --git a/web/src/ui/timeline/menu/useSecondaryItems.tsx b/web/src/ui/timeline/menu/useSecondaryItems.tsx index 1679e43..3c077bd 100644 --- a/web/src/ui/timeline/menu/useSecondaryItems.tsx +++ b/web/src/ui/timeline/menu/useSecondaryItems.tsx @@ -17,11 +17,11 @@ import { use } from "react" import Client from "@/api/client.ts" import { useRoomState } from "@/api/statestore" import { MemDBEvent } from "@/api/types" -import ShareModal from "@/ui/timeline/menu/ShareModal.tsx" import { ModalCloseContext, ModalContext } from "../../modal" import { RoomContext, RoomContextData } from "../../roomview/roomcontext.ts" import JSONView from "../../util/JSONView.tsx" import ConfirmWithMessageModal from "./ConfirmWithMessageModal.tsx" +import ShareModal from "./ShareModal.tsx" import { getPending, getPowerLevels } from "./util.ts" import ViewSourceIcon from "@/icons/code.svg?react" import DeleteIcon from "@/icons/delete.svg?react" @@ -42,7 +42,7 @@ export const useSecondaryItems = ( openModal({ dimmed: true, boxed: true, - content: , + content: , }) } const onClickReport = () => { @@ -93,21 +93,26 @@ export const useSecondaryItems = ( const onClickShareEvent = () => { const generateLink = (useMatrixTo: boolean, includeEvent: boolean) => { - let generatedUrl = useMatrixTo ? "https://matrix.to/#/" : "matrix:roomid/" - if(useMatrixTo) { - generatedUrl += evt.room_id + const isRoomIDLink = true + let generatedURL = useMatrixTo ? "https://matrix.to/#/" : "matrix:roomid/" + if (useMatrixTo) { + generatedURL += evt.room_id } else { - generatedUrl += `${evt.room_id.slice(1)}` + generatedURL += `${evt.room_id.slice(1)}` } - if(includeEvent) { - if(useMatrixTo) { - generatedUrl += `/${evt.event_id}` - } - else { - generatedUrl += `/e/${evt.event_id.slice(1)}` + if (includeEvent) { + if (useMatrixTo) { + generatedURL += `/${evt.event_id}` + } else { + generatedURL += `/e/${evt.event_id.slice(1)}` } } - return generatedUrl + if (isRoomIDLink) { + generatedURL += "?" + new URLSearchParams( + roomCtx.store.getViaServers().map(server => ["via", server]), + ).toString() + } + return generatedURL } openModal({ dimmed: true,