fix: P0 post-deploy bug fixes from live testing
- EditHistoryModal: use raw fetch with /_matrix/client/v1/ path for relations API — Synapse only supports relations at v1, not v3 (fixes Sentry JAVASCRIPT-REACT-K / 404 error) - RoomViewHeader: remove useReportRoomSupported spec-version gate — Synapse 1.114+ has the endpoint but only advertises spec v1.12; button now always shows for non-creator, non-server-notice rooms - ReportRoomModal: handle M_UNRECOGNIZED/404 with "not supported by your homeserver" message - RoomNavItem: add isServerNotice guard to Room Settings in sidebar context menu (was only guarded in header three-dots menu) - initMatrix: bump setMaxListeners from 50 → 150 to prevent MaxListenersExceededWarning with large room lists - RoomProfile: save topic with formatted_body + format when markdown syntax is detected; add markdown hint below topic textarea Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -41,6 +41,32 @@ import { AsyncStatus, useAsyncCallback } from '../../../hooks/useAsyncCallback';
|
||||
import { useAlive } from '../../../hooks/useAlive';
|
||||
import { RoomPermissionsAPI } from '../../../hooks/useRoomPermissions';
|
||||
|
||||
const MARKDOWN_PATTERN = /(\*\*|__|\*|_|~~|`|\[.+?\]\(.+?\))/;
|
||||
|
||||
function topicMarkdownToHtml(text: string): string {
|
||||
return text
|
||||
.replace(/&/g, '&')
|
||||
.replace(/</g, '<')
|
||||
.replace(/>/g, '>')
|
||||
.replace(/\*\*(.+?)\*\*/g, '<strong>$1</strong>')
|
||||
.replace(/__(.+?)__/g, '<strong>$1</strong>')
|
||||
.replace(/\*(.+?)\*/g, '<em>$1</em>')
|
||||
.replace(/_(.+?)_/g, '<em>$1</em>')
|
||||
.replace(/~~(.+?)~~/g, '<del>$1</del>')
|
||||
.replace(/`(.+?)`/g, '<code>$1</code>')
|
||||
.replace(/\[(.+?)\]\((.+?)\)/g, '<a href="$2">$1</a>')
|
||||
.replace(/\n/g, '<br>');
|
||||
}
|
||||
|
||||
function buildTopicContent(topic: string): Record<string, string> {
|
||||
if (!MARKDOWN_PATTERN.test(topic)) return { topic };
|
||||
return {
|
||||
topic,
|
||||
format: 'org.matrix.custom.html',
|
||||
formatted_body: topicMarkdownToHtml(topic),
|
||||
};
|
||||
}
|
||||
|
||||
type RoomProfileEditProps = {
|
||||
canEditAvatar: boolean;
|
||||
canEditName: boolean;
|
||||
@@ -101,7 +127,8 @@ export function RoomProfileEdit({
|
||||
await mx.sendStateEvent(room.roomId, StateEvent.RoomName as any, { name: roomName });
|
||||
}
|
||||
if (roomTopic !== undefined) {
|
||||
await mx.sendStateEvent(room.roomId, StateEvent.RoomTopic as any, { topic: roomTopic });
|
||||
const topicContent = buildTopicContent(roomTopic);
|
||||
await mx.sendStateEvent(room.roomId, StateEvent.RoomTopic as any, topicContent);
|
||||
}
|
||||
},
|
||||
[mx, room.roomId],
|
||||
@@ -224,10 +251,16 @@ export function RoomProfileEdit({
|
||||
<TextArea
|
||||
name="topicTextArea"
|
||||
defaultValue={topic}
|
||||
placeholder="Describe this room. Markdown supported: **bold**, *italic*, [link](url)"
|
||||
variant="Secondary"
|
||||
radii="300"
|
||||
readOnly={!canEditTopic || submitting}
|
||||
/>
|
||||
{canEditTopic && (
|
||||
<Text size="T200" priority="300">
|
||||
Supports markdown: **bold**, *italic*, ~~strikethrough~~, `code`, [text](url)
|
||||
</Text>
|
||||
)}
|
||||
</Box>
|
||||
{submitState.status === AsyncStatus.Error && (
|
||||
<Text size="T200" style={{ color: color.Critical.Main }}>
|
||||
|
||||
Reference in New Issue
Block a user