16 changed files with 98 additions and 78 deletions
@ -1,5 +1,29 @@ |
|||||||
import Username from '../Username' |
import Username from '../Username' |
||||||
|
import { TEmbeddedRenderer } from './types' |
||||||
|
|
||||||
export function EmbeddedMention({ userId }: { userId: string }) { |
export function EmbeddedMention({ userId }: { userId: string }) { |
||||||
return <Username userId={userId} showAt className="text-highlight font-normal inline-block" /> |
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 @@ |
|||||||
|
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 @@ |
|||||||
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 @@ |
|||||||
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 @@ |
|||||||
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 @@ |
|||||||
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 @@ |
|||||||
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 @@ |
|||||||
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