16 changed files with 98 additions and 78 deletions
@ -1,5 +1,29 @@
@@ -1,5 +1,29 @@
|
||||
import Username from '../Username' |
||||
import { TEmbeddedRenderer } from './types' |
||||
|
||||
export function EmbeddedMention({ userId }: { userId: string }) { |
||||
return <Username userId={userId} showAt className="text-highlight font-normal inline-block" /> |
||||
} |
||||
|
||||
export const embeddedNostrNpubRenderer: TEmbeddedRenderer = { |
||||
regex: /(nostr:npub1[a-z0-9]{58})/g, |
||||
render: (id: string, index: number) => { |
||||
const npub1 = id.split(':')[1] |
||||
return <EmbeddedMention key={`embedded-nostr-npub-${index}-${npub1}`} userId={npub1} /> |
||||
} |
||||
} |
||||
|
||||
export const embeddedNostrProfileRenderer: TEmbeddedRenderer = { |
||||
regex: /(nostr:nprofile1[a-z0-9]+)/g, |
||||
render: (id: string, index: number) => { |
||||
const nprofile = id.split(':')[1] |
||||
return <EmbeddedMention key={`embedded-nostr-profile-${index}-${nprofile}`} userId={nprofile} /> |
||||
} |
||||
} |
||||
|
||||
export const embeddedNpubRenderer: TEmbeddedRenderer = { |
||||
regex: /(npub1[a-z0-9]{58})/g, |
||||
render: (npub1: string, index: number) => { |
||||
return <EmbeddedMention key={`embedded-npub-${index}-${npub1}`} userId={npub1} /> |
||||
} |
||||
} |
||||
|
||||
@ -0,0 +1,24 @@
@@ -0,0 +1,24 @@
|
||||
import { useRelaySettings } from '@renderer/providers/RelaySettingsProvider' |
||||
import { TEmbeddedRenderer } from './types' |
||||
|
||||
export function EmbeddedWebsocketUrl({ url }: { url: string }) { |
||||
const { setTemporaryRelayUrls } = useRelaySettings() |
||||
return ( |
||||
<span |
||||
className="cursor-pointer px-1 rounded-md text-highlight border border-highlight/60 hover:border-highlight hover:bg-muted/60" |
||||
onClick={(e) => { |
||||
e.stopPropagation() |
||||
setTemporaryRelayUrls([url]) |
||||
}} |
||||
> |
||||
{url} |
||||
</span> |
||||
) |
||||
} |
||||
|
||||
export const embeddedWebsocketUrlRenderer: TEmbeddedRenderer = { |
||||
regex: /(wss?:\/\/[^\s]+)/g, |
||||
render: (url: string, index: number) => { |
||||
return <EmbeddedWebsocketUrl key={`websocket-url-${index}-${url}`} url={url} /> |
||||
} |
||||
} |
||||
@ -1,9 +0,0 @@
@@ -1,9 +0,0 @@
|
||||
import { EmbeddedHashtag } from '../components/Embedded' |
||||
import { TEmbeddedRenderer } from './types' |
||||
|
||||
export const embeddedHashtagRenderer: TEmbeddedRenderer = { |
||||
regex: /#([\p{L}\p{N}\p{M}]+)/gu, |
||||
render: (hashtag: string, index: number) => { |
||||
return <EmbeddedHashtag key={`hashtag-${index}-${hashtag}`} hashtag={hashtag} /> |
||||
} |
||||
} |
||||
@ -1,9 +0,0 @@
@@ -1,9 +0,0 @@
|
||||
import { EmbeddedNormalUrl } from '../components/Embedded' |
||||
import { TEmbeddedRenderer } from './types' |
||||
|
||||
export const embeddedNormalUrlRenderer: TEmbeddedRenderer = { |
||||
regex: /(https?:\/\/[^\s]+|wss?:\/\/[^\s]+)/g, |
||||
render: (url: string, index: number) => { |
||||
return <EmbeddedNormalUrl key={`normal-url-${index}-${url}`} url={url} /> |
||||
} |
||||
} |
||||
@ -1,10 +0,0 @@
@@ -1,10 +0,0 @@
|
||||
import { EmbeddedMention } from '../components/Embedded' |
||||
import { TEmbeddedRenderer } from './types' |
||||
|
||||
export const embeddedNostrNpubRenderer: TEmbeddedRenderer = { |
||||
regex: /(nostr:npub1[a-z0-9]{58})/g, |
||||
render: (id: string, index: number) => { |
||||
const npub1 = id.split(':')[1] |
||||
return <EmbeddedMention key={`embedded-nostr-npub-${index}-${npub1}`} userId={npub1} /> |
||||
} |
||||
} |
||||
@ -1,10 +0,0 @@
@@ -1,10 +0,0 @@
|
||||
import { EmbeddedMention } from '../components/Embedded' |
||||
import { TEmbeddedRenderer } from './types' |
||||
|
||||
export const embeddedNostrProfileRenderer: TEmbeddedRenderer = { |
||||
regex: /(nostr:nprofile1[a-z0-9]+)/g, |
||||
render: (id: string, index: number) => { |
||||
const nprofile = id.split(':')[1] |
||||
return <EmbeddedMention key={`embedded-nostr-profile-${index}-${nprofile}`} userId={nprofile} /> |
||||
} |
||||
} |
||||
@ -1,9 +0,0 @@
@@ -1,9 +0,0 @@
|
||||
import { EmbeddedMention } from '../components/Embedded' |
||||
import { TEmbeddedRenderer } from './types' |
||||
|
||||
export const embeddedNpubRenderer: TEmbeddedRenderer = { |
||||
regex: /(npub1[a-z0-9]{58})/g, |
||||
render: (npub1: string, index: number) => { |
||||
return <EmbeddedMention key={`embedded-npub-${index}-${npub1}`} userId={npub1} /> |
||||
} |
||||
} |
||||
@ -1,17 +0,0 @@
@@ -1,17 +0,0 @@
|
||||
import reactStringReplace from 'react-string-replace' |
||||
import { TEmbeddedRenderer } from './types' |
||||
|
||||
export * from './EmbeddedHashtag' |
||||
export * from './EmbeddedNormalUrl' |
||||
export * from './EmbeddedNostrNpub' |
||||
export * from './EmbeddedNostrProfile' |
||||
|
||||
export function embedded(content: string, renderers: TEmbeddedRenderer[]) { |
||||
let nodes: React.ReactNode[] = [content] |
||||
|
||||
renderers.forEach((renderer) => { |
||||
nodes = reactStringReplace(nodes, renderer.regex, renderer.render) |
||||
}) |
||||
|
||||
return nodes |
||||
} |
||||
Loading…
Reference in new issue