Fix editing messages with html tags

This commit is contained in:
Jon Staab
2026-02-16 08:16:03 -08:00
parent d5e91ce874
commit 7823e1d803
6 changed files with 98 additions and 72 deletions
+2 -1
View File
@@ -2,6 +2,7 @@
import {PublishStatus} from "@welshman/net" import {PublishStatus} from "@welshman/net"
import {displayRelayUrl} from "@welshman/util" import {displayRelayUrl} from "@welshman/util"
import Button from "@lib/components/Button.svelte" import Button from "@lib/components/Button.svelte"
import {addPeriod} from "@lib/util"
interface Props { interface Props {
url: string url: string
@@ -25,7 +26,7 @@
<div class="card2 bg-alt col-2 shadow-lg"> <div class="card2 bg-alt col-2 shadow-lg">
<p> <p>
Failed to publish to {displayRelayUrl(url)}: {message}. Failed to publish to {displayRelayUrl(url)}: {addPeriod(message)}
</p> </p>
<Button class="link" onclick={retry}>Retry</Button> <Button class="link" onclick={retry}>Retry</Button>
</div> </div>
+2 -1
View File
@@ -15,6 +15,7 @@ import {
} from "@welshman/app" } from "@welshman/app"
import type {FileAttributes} from "@welshman/editor" import type {FileAttributes} from "@welshman/editor"
import {Editor, MentionSuggestion, WelshmanExtension, editorProps} from "@welshman/editor" import {Editor, MentionSuggestion, WelshmanExtension, editorProps} from "@welshman/editor"
import {escapeHtml} from "@lib/html"
import {makeMentionNodeView} from "@app/editor/MentionNodeView" import {makeMentionNodeView} from "@app/editor/MentionNodeView"
import ProfileSuggestion from "@app/editor/ProfileSuggestion.svelte" import ProfileSuggestion from "@app/editor/ProfileSuggestion.svelte"
import {uploadFile} from "@app/core/commands" import {uploadFile} from "@app/core/commands"
@@ -82,7 +83,7 @@ export const makeEditor = async ({
) )
return new Editor({ return new Editor({
content, content: escapeHtml(content),
autofocus, autofocus,
editorProps, editorProps,
element: document.createElement("div"), element: document.createElement("div"),
+8
View File
@@ -164,3 +164,11 @@ export const compressFile = async (
}) })
}) })
} }
export const escapeHtml = (html: string) => {
const element = document.createElement("div")
element.innerText = html
return element.innerHTML
}
+2
View File
@@ -26,3 +26,5 @@ export const buildUrl = (base: string | URL, ...pathname: string[]) => {
return url.toString() return url.toString()
} }
export const addPeriod = (s: string) => (s + ".").replace(/\.+$/, ".")
+8 -1
View File
@@ -110,6 +110,7 @@
} }
const onSubmit = async ({content, tags}: EventContent) => { const onSubmit = async ({content, tags}: EventContent) => {
try {
tags.push(["h", h]) tags.push(["h", h])
if (await shouldProtect) { if (await shouldProtect) {
@@ -119,6 +120,11 @@
let template: EventContent & {created_at?: number} = {content, tags} let template: EventContent & {created_at?: number} = {content, tags}
if (eventToEdit) { if (eventToEdit) {
// Don't do anything if message hasn't changed
if (eventToEdit.content === content) {
return
}
// Delete previous message, to be republished with same timestamp // Delete previous message, to be republished with same timestamp
template.created_at = eventToEdit.created_at template.created_at = eventToEdit.created_at
publishDelete({ publishDelete({
@@ -151,11 +157,12 @@
}, },
}) })
} }
} finally {
clearParent() clearParent()
clearShare() clearShare()
clearEventToEdit() clearEventToEdit()
} }
}
const onScroll = () => { const onScroll = () => {
showScrollButton = Math.abs(element?.scrollTop || 0) > 1500 showScrollButton = Math.abs(element?.scrollTop || 0) > 1500
+8 -1
View File
@@ -54,9 +54,15 @@
} }
const onSubmit = async ({content, tags}: EventContent) => { const onSubmit = async ({content, tags}: EventContent) => {
try {
let template: EventContent & {created_at?: number} = {content, tags} let template: EventContent & {created_at?: number} = {content, tags}
if (eventToEdit) { if (eventToEdit) {
// Don't do anything if message hasn't changed
if (eventToEdit.content === content) {
return
}
// Delete previous message, to be republished with same timestamp // Delete previous message, to be republished with same timestamp
template.created_at = eventToEdit.created_at template.created_at = eventToEdit.created_at
publishDelete({relays: [url], event: eventToEdit, protect: await shouldProtect}) publishDelete({relays: [url], event: eventToEdit, protect: await shouldProtect})
@@ -89,11 +95,12 @@
}, },
}) })
} }
} finally {
clearParent() clearParent()
clearShare() clearShare()
clearEventToEdit() clearEventToEdit()
} }
}
const onScroll = () => { const onScroll = () => {
showScrollButton = Math.abs(element?.scrollTop || 0) > 1500 showScrollButton = Math.abs(element?.scrollTop || 0) > 1500