Replace svelte components with node views
This commit is contained in:
@@ -1,20 +0,0 @@
|
|||||||
<script lang="ts">
|
|
||||||
import type {NodeViewProps} from "@tiptap/core"
|
|
||||||
import {NodeViewWrapper} from "svelte-tiptap"
|
|
||||||
import {deriveProfileDisplay} from "@welshman/app"
|
|
||||||
|
|
||||||
interface Props {
|
|
||||||
node: NodeViewProps["node"]
|
|
||||||
selected: NodeViewProps["selected"]
|
|
||||||
}
|
|
||||||
|
|
||||||
const {node, selected}: Props = $props()
|
|
||||||
|
|
||||||
const display = deriveProfileDisplay(node.attrs.pubkey)
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<NodeViewWrapper as="span">
|
|
||||||
<button class="tiptap-object {selected ? 'tiptap-active' : ''}">
|
|
||||||
@{$display}
|
|
||||||
</button>
|
|
||||||
</NodeViewWrapper>
|
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
import type {NodeViewProps} from '@tiptap/core'
|
||||||
|
import {deriveProfileDisplay} from "@welshman/app"
|
||||||
|
|
||||||
|
export const MentionNodeView = ({node}: NodeViewProps) => {
|
||||||
|
const dom = document.createElement('span')
|
||||||
|
const display = deriveProfileDisplay(node.attrs.pubkey)
|
||||||
|
|
||||||
|
dom.classList.add('tiptap-object')
|
||||||
|
|
||||||
|
const unsubDisplay = display.subscribe($display => {
|
||||||
|
dom.textContent = '@' + $display
|
||||||
|
})
|
||||||
|
|
||||||
|
return {
|
||||||
|
dom,
|
||||||
|
destroy: () => {
|
||||||
|
unsubDisplay()
|
||||||
|
},
|
||||||
|
selectNode() {
|
||||||
|
dom.classList.add('tiptap-active')
|
||||||
|
},
|
||||||
|
deselectNode() {
|
||||||
|
dom.classList.remove('tiptap-active')
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,15 +1,14 @@
|
|||||||
import {asClassComponent} from "svelte/legacy"
|
|
||||||
import {mount} from "svelte"
|
import {mount} from "svelte"
|
||||||
import type {Writable} from "svelte/store"
|
import type {Writable} from "svelte/store"
|
||||||
import {get} from "svelte/store"
|
import {get} from "svelte/store"
|
||||||
import {Editor, SvelteNodeViewRenderer} from "svelte-tiptap"
|
import {Editor} from "@tiptap/core"
|
||||||
import {ctx} from "@welshman/lib"
|
import {ctx} from "@welshman/lib"
|
||||||
import type {StampedEvent} from "@welshman/util"
|
import type {StampedEvent} from "@welshman/util"
|
||||||
import {signer, profileSearch} from "@welshman/app"
|
import {signer, profileSearch} from "@welshman/app"
|
||||||
import {MentionSuggestion, WelshmanExtension} from "@lib/editor"
|
import {MentionSuggestion, WelshmanExtension} from "@lib/editor"
|
||||||
import {getSetting, userSettingValues} from "@app/state"
|
import {getSetting, userSettingValues} from "@app/state"
|
||||||
|
import {MentionNodeView} from "./MentionNodeView"
|
||||||
import ProfileSuggestion from "./ProfileSuggestion.svelte"
|
import ProfileSuggestion from "./ProfileSuggestion.svelte"
|
||||||
import EditMention from "./EditMention.svelte"
|
|
||||||
|
|
||||||
export const getUploadType = () => getSetting<"nip96" | "blossom">("upload_type")
|
export const getUploadType = () => getSetting<"nip96" | "blossom">("upload_type")
|
||||||
|
|
||||||
@@ -78,7 +77,7 @@ export const makeEditor = ({
|
|||||||
},
|
},
|
||||||
nprofile: {
|
nprofile: {
|
||||||
extend: {
|
extend: {
|
||||||
addNodeView: () => SvelteNodeViewRenderer(asClassComponent(EditMention)),
|
addNodeView: () => MentionNodeView,
|
||||||
addProseMirrorPlugins() {
|
addProseMirrorPlugins() {
|
||||||
return [
|
return [
|
||||||
MentionSuggestion({
|
MentionSuggestion({
|
||||||
|
|||||||
@@ -1,13 +0,0 @@
|
|||||||
<script lang="ts">
|
|
||||||
import type {NodeViewProps} from "@tiptap/core"
|
|
||||||
import {NodeViewWrapper} from "svelte-tiptap"
|
|
||||||
|
|
||||||
export let node: NodeViewProps["node"]
|
|
||||||
export let selected: NodeViewProps["selected"]
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<NodeViewWrapper as="span">
|
|
||||||
<button class="tiptap-object {selected ? 'tiptap-active' : ''}">
|
|
||||||
{node.attrs.lnbc.slice(0, 16)}...
|
|
||||||
</button>
|
|
||||||
</NodeViewWrapper>
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
<script lang="ts">
|
|
||||||
import {fromNostrURI} from "@welshman/util"
|
|
||||||
import type {NodeViewProps} from "@tiptap/core"
|
|
||||||
import {NodeViewWrapper} from "svelte-tiptap"
|
|
||||||
|
|
||||||
export let node: NodeViewProps["node"]
|
|
||||||
export let selected: NodeViewProps["selected"]
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<NodeViewWrapper as="span">
|
|
||||||
<button class="tiptap-object {selected ? 'tiptap-active' : ''}">
|
|
||||||
{fromNostrURI(node.attrs.bech32).slice(0, 16)}...
|
|
||||||
</button>
|
|
||||||
</NodeViewWrapper>
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
<script lang="ts">
|
|
||||||
import type {NodeViewProps} from "@tiptap/core"
|
|
||||||
import {NodeViewWrapper} from "svelte-tiptap"
|
|
||||||
|
|
||||||
export let node: NodeViewProps["node"]
|
|
||||||
export let selected: NodeViewProps["selected"]
|
|
||||||
|
|
||||||
$: selectedClass = selected ? "tiptap-active" : ""
|
|
||||||
$: uploadingClass = node.attrs.uploading ? "tiptap-uploading" : ""
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<NodeViewWrapper as="span" class="tiptap-object {selectedClass} {uploadingClass}">
|
|
||||||
{node.attrs.file?.name || node.attrs.src}
|
|
||||||
</NodeViewWrapper>
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
<script lang="ts">
|
|
||||||
import type {NodeViewProps} from "@tiptap/core"
|
|
||||||
import {NodeViewWrapper} from "svelte-tiptap"
|
|
||||||
|
|
||||||
export let node: NodeViewProps["node"]
|
|
||||||
export let selected: NodeViewProps["selected"]
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<NodeViewWrapper as="span">
|
|
||||||
<button class="tiptap-object {selected ? 'tiptap-active' : ''}">
|
|
||||||
@{node.attrs.bech32.slice(0, 16)}...
|
|
||||||
</button>
|
|
||||||
</NodeViewWrapper>
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
export {default as EditBolt11} from "./EditBolt11.svelte"
|
|
||||||
export {default as EditMedia} from "./EditMedia.svelte"
|
|
||||||
export {default as EditEvent} from "./EditEvent.svelte"
|
|
||||||
export {default as EditMention} from "./EditMention.svelte"
|
|
||||||
@@ -1,6 +1,5 @@
|
|||||||
import type {StampedEvent, SignedEvent} from "@welshman/util"
|
import type {StampedEvent, SignedEvent} from "@welshman/util"
|
||||||
import {deepMergeLeft} from "@welshman/lib"
|
import {deepMergeLeft} from "@welshman/lib"
|
||||||
import {SvelteNodeViewRenderer} from "svelte-tiptap"
|
|
||||||
import type {Extensions, AnyExtension} from "@tiptap/core"
|
import type {Extensions, AnyExtension} from "@tiptap/core"
|
||||||
import {CodeBlock} from "@tiptap/extension-code-block"
|
import {CodeBlock} from "@tiptap/extension-code-block"
|
||||||
import type {CodeBlockOptions} from "@tiptap/extension-code-block"
|
import type {CodeBlockOptions} from "@tiptap/extension-code-block"
|
||||||
@@ -38,7 +37,7 @@ import {
|
|||||||
import {WordCount} from "./WordCount.js"
|
import {WordCount} from "./WordCount.js"
|
||||||
import {CodeInline, type CodeInlineOptions} from "./CodeInline.js"
|
import {CodeInline, type CodeInlineOptions} from "./CodeInline.js"
|
||||||
import {BreakOrSubmit, type BreakOrSubmitOptions} from "./BreakOrSubmit.js"
|
import {BreakOrSubmit, type BreakOrSubmitOptions} from "./BreakOrSubmit.js"
|
||||||
import {EditBolt11, EditMedia, EditEvent, EditMention} from "../components/index.js"
|
import {MentionNodeView, Bolt11NodeView, MediaNodeView, EventNodeView} from "../nodeviews/index.js"
|
||||||
|
|
||||||
export type ChildExtensionOptions<C = any, E = any> =
|
export type ChildExtensionOptions<C = any, E = any> =
|
||||||
| false
|
| false
|
||||||
@@ -115,7 +114,7 @@ export const WelshmanExtension = NostrExtension.extend<WelshmanOptions>({
|
|||||||
group: "inline",
|
group: "inline",
|
||||||
},
|
},
|
||||||
extend: {
|
extend: {
|
||||||
addNodeView: () => SvelteNodeViewRenderer(EditBolt11),
|
addNodeView: () => Bolt11NodeView,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
image: {
|
image: {
|
||||||
@@ -126,7 +125,7 @@ export const WelshmanExtension = NostrExtension.extend<WelshmanOptions>({
|
|||||||
defaultUploadType,
|
defaultUploadType,
|
||||||
},
|
},
|
||||||
extend: {
|
extend: {
|
||||||
addNodeView: () => SvelteNodeViewRenderer(EditMedia),
|
addNodeView: () => MediaNodeView,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
video: {
|
video: {
|
||||||
@@ -137,7 +136,7 @@ export const WelshmanExtension = NostrExtension.extend<WelshmanOptions>({
|
|||||||
defaultUploadType,
|
defaultUploadType,
|
||||||
},
|
},
|
||||||
extend: {
|
extend: {
|
||||||
addNodeView: () => SvelteNodeViewRenderer(EditMedia),
|
addNodeView: () => MediaNodeView,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
nevent: {
|
nevent: {
|
||||||
@@ -146,7 +145,7 @@ export const WelshmanExtension = NostrExtension.extend<WelshmanOptions>({
|
|||||||
group: "inline",
|
group: "inline",
|
||||||
},
|
},
|
||||||
extend: {
|
extend: {
|
||||||
addNodeView: () => SvelteNodeViewRenderer(EditEvent),
|
addNodeView: () => EventNodeView,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
naddr: {
|
naddr: {
|
||||||
@@ -155,12 +154,12 @@ export const WelshmanExtension = NostrExtension.extend<WelshmanOptions>({
|
|||||||
group: "inline",
|
group: "inline",
|
||||||
},
|
},
|
||||||
extend: {
|
extend: {
|
||||||
addNodeView: () => SvelteNodeViewRenderer(EditEvent),
|
addNodeView: () => EventNodeView,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
nprofile: {
|
nprofile: {
|
||||||
extend: {
|
extend: {
|
||||||
addNodeView: () => SvelteNodeViewRenderer(EditMention),
|
addNodeView: () => MentionNodeView,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
breakOrSubmit: {
|
breakOrSubmit: {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import "./index.css"
|
import "./index.css"
|
||||||
|
|
||||||
export * from "./components/index.js"
|
export * from "./nodeviews/index.js"
|
||||||
export * from "./extensions/index.js"
|
export * from "./extensions/index.js"
|
||||||
export * from "./plugins/index.js"
|
export * from "./plugins/index.js"
|
||||||
|
|||||||
@@ -0,0 +1,18 @@
|
|||||||
|
import type {NodeViewProps} from '@tiptap/core'
|
||||||
|
|
||||||
|
export const Bolt11NodeView = ({node}: NodeViewProps) => {
|
||||||
|
const dom = document.createElement('span')
|
||||||
|
|
||||||
|
dom.classList.add('tiptap-object')
|
||||||
|
dom.innerText = `${node.attrs.lnbc.slice(0, 16)}...`
|
||||||
|
|
||||||
|
return {
|
||||||
|
dom,
|
||||||
|
selectNode() {
|
||||||
|
dom.classList.add('tiptap-active')
|
||||||
|
},
|
||||||
|
deselectNode() {
|
||||||
|
dom.classList.remove('tiptap-active')
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
import type {NodeViewProps} from '@tiptap/core'
|
||||||
|
import {fromNostrURI} from "@welshman/util"
|
||||||
|
|
||||||
|
export const EventNodeView = ({node}: NodeViewProps) => {
|
||||||
|
const dom = document.createElement('span')
|
||||||
|
|
||||||
|
dom.classList.add('tiptap-object')
|
||||||
|
dom.innerText = `${fromNostrURI(node.attrs.bech32).slice(0, 16)}...`
|
||||||
|
|
||||||
|
return {
|
||||||
|
dom,
|
||||||
|
selectNode() {
|
||||||
|
dom.classList.add('tiptap-active')
|
||||||
|
},
|
||||||
|
deselectNode() {
|
||||||
|
dom.classList.remove('tiptap-active')
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
import type {Node, NodeViewProps} from '@tiptap/core'
|
||||||
|
import {fromNostrURI} from "@welshman/util"
|
||||||
|
|
||||||
|
export const MediaNodeView = ({node}: NodeViewProps) => {
|
||||||
|
const dom = document.createElement('span')
|
||||||
|
|
||||||
|
const syncUploading = (node: NodeViewProps['node']) => {
|
||||||
|
if (node.attrs.uploading) {
|
||||||
|
dom.classList.add('tiptap-uploading')
|
||||||
|
} else {
|
||||||
|
dom.classList.remove('tiptap-uploading')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dom.classList.add('tiptap-object')
|
||||||
|
dom.innerText = node.attrs.file?.name || node.attrs.src
|
||||||
|
|
||||||
|
syncUploading(node)
|
||||||
|
|
||||||
|
return {
|
||||||
|
dom,
|
||||||
|
update(node: NodeViewProps['node']) {
|
||||||
|
syncUploading(node)
|
||||||
|
},
|
||||||
|
selectNode() {
|
||||||
|
dom.classList.add('tiptap-active')
|
||||||
|
},
|
||||||
|
deselectNode() {
|
||||||
|
dom.classList.remove('tiptap-active')
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
import type {NodeViewProps} from '@tiptap/core'
|
||||||
|
|
||||||
|
export const MentionNodeView = ({node}: NodeViewProps) => {
|
||||||
|
const dom = document.createElement('span')
|
||||||
|
|
||||||
|
dom.classList.add('tiptap-object')
|
||||||
|
dom.textContent = `@${node.attrs.bech32.slice(0, 16)}...`
|
||||||
|
|
||||||
|
return {
|
||||||
|
dom,
|
||||||
|
selectNode() {
|
||||||
|
dom.classList.add('tiptap-active')
|
||||||
|
},
|
||||||
|
deselectNode() {
|
||||||
|
dom.classList.remove('tiptap-active')
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
export * from './MentionNodeView.js'
|
||||||
|
export * from './Bolt11NodeView.js'
|
||||||
|
export * from './EventNodeView.js'
|
||||||
|
export * from './MediaNodeView.js'
|
||||||
@@ -127,6 +127,7 @@ export class DefaultSuggestionsWrapper implements ISuggestionsWrapper {
|
|||||||
|
|
||||||
setProps(props: SuggestionsWrapperProps) {
|
setProps(props: SuggestionsWrapperProps) {
|
||||||
this.props = props
|
this.props = props
|
||||||
|
this.search()
|
||||||
this.render()
|
this.render()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user