mirror of
https://github.com/dergigi/boris.git
synced 2025-12-24 01:54:19 +01:00
feat: add Share and Share Original options to article menu
This commit is contained in:
@@ -218,9 +218,15 @@ const ContentPanel: React.FC<ContentPanelProps> = ({
|
|||||||
relays: relayHints
|
relays: relayHints
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// Check for source URL in 'r' tags
|
||||||
|
const sourceUrl = currentArticle.tags.find(t => t[0] === 'r')?.[1]
|
||||||
|
|
||||||
return {
|
return {
|
||||||
portal: getNostrUrl(naddr),
|
portal: getNostrUrl(naddr),
|
||||||
native: `nostr:${naddr}`
|
native: `nostr:${naddr}`,
|
||||||
|
naddr,
|
||||||
|
sourceUrl,
|
||||||
|
borisUrl: `${window.location.origin}/a/${naddr}`
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -245,6 +251,44 @@ const ContentPanel: React.FC<ContentPanelProps> = ({
|
|||||||
}
|
}
|
||||||
setShowArticleMenu(false)
|
setShowArticleMenu(false)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const handleShareBoris = async () => {
|
||||||
|
try {
|
||||||
|
if (!articleLinks) return
|
||||||
|
|
||||||
|
if ((navigator as { share?: (d: { title?: string; url?: string }) => Promise<void> }).share) {
|
||||||
|
await (navigator as { share: (d: { title?: string; url?: string }) => Promise<void> }).share({
|
||||||
|
title: title || 'Article',
|
||||||
|
url: articleLinks.borisUrl
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
await navigator.clipboard.writeText(articleLinks.borisUrl)
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
console.warn('Share failed', e)
|
||||||
|
} finally {
|
||||||
|
setShowArticleMenu(false)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const handleShareOriginal = async () => {
|
||||||
|
try {
|
||||||
|
if (!articleLinks?.sourceUrl) return
|
||||||
|
|
||||||
|
if ((navigator as { share?: (d: { title?: string; url?: string }) => Promise<void> }).share) {
|
||||||
|
await (navigator as { share: (d: { title?: string; url?: string }) => Promise<void> }).share({
|
||||||
|
title: title || 'Article',
|
||||||
|
url: articleLinks.sourceUrl
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
await navigator.clipboard.writeText(articleLinks.sourceUrl)
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
console.warn('Share failed', e)
|
||||||
|
} finally {
|
||||||
|
setShowArticleMenu(false)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Video actions
|
// Video actions
|
||||||
const handleOpenVideoExternal = () => {
|
const handleOpenVideoExternal = () => {
|
||||||
@@ -624,6 +668,22 @@ const ContentPanel: React.FC<ContentPanelProps> = ({
|
|||||||
|
|
||||||
{showArticleMenu && (
|
{showArticleMenu && (
|
||||||
<div className="article-menu">
|
<div className="article-menu">
|
||||||
|
<button
|
||||||
|
className="article-menu-item"
|
||||||
|
onClick={handleShareBoris}
|
||||||
|
>
|
||||||
|
<FontAwesomeIcon icon={faShare} />
|
||||||
|
<span>Share</span>
|
||||||
|
</button>
|
||||||
|
{articleLinks.sourceUrl && (
|
||||||
|
<button
|
||||||
|
className="article-menu-item"
|
||||||
|
onClick={handleShareOriginal}
|
||||||
|
>
|
||||||
|
<FontAwesomeIcon icon={faShare} />
|
||||||
|
<span>Share Original</span>
|
||||||
|
</button>
|
||||||
|
)}
|
||||||
<button
|
<button
|
||||||
className="article-menu-item"
|
className="article-menu-item"
|
||||||
onClick={handleOpenPortal}
|
onClick={handleOpenPortal}
|
||||||
|
|||||||
Reference in New Issue
Block a user