feat(blog): extract and display Open Graph link previews in global ShareModal
Some checks failed
Build & Deploy / 🔍 Prepare (push) Successful in 21s
Build & Deploy / 🏗️ Build (push) Failing after 15s
Build & Deploy / 🧪 QA (push) Failing after 2m6s
Build & Deploy / 🚀 Deploy (push) Has been skipped
Build & Deploy / 🩺 Health Check (push) Has been skipped
Build & Deploy / 🔔 Notify (push) Successful in 2s
Some checks failed
Build & Deploy / 🔍 Prepare (push) Successful in 21s
Build & Deploy / 🏗️ Build (push) Failing after 15s
Build & Deploy / 🧪 QA (push) Failing after 2m6s
Build & Deploy / 🚀 Deploy (push) Has been skipped
Build & Deploy / 🩺 Health Check (push) Has been skipped
Build & Deploy / 🔔 Notify (push) Successful in 2s
This commit is contained in:
@@ -25,6 +25,10 @@ export function ShareModal({
|
|||||||
}: ShareModalProps) {
|
}: ShareModalProps) {
|
||||||
const [copied, setCopied] = useState(false);
|
const [copied, setCopied] = useState(false);
|
||||||
const [imagePreview, setImagePreview] = useState<string | null>(null);
|
const [imagePreview, setImagePreview] = useState<string | null>(null);
|
||||||
|
|
||||||
|
// Open Graph data for global article sharing
|
||||||
|
const [ogData, setOgData] = useState<{ image?: string, title?: string, description?: string } | null>(null);
|
||||||
|
|
||||||
const [timestamp] = useState(
|
const [timestamp] = useState(
|
||||||
new Date().toLocaleTimeString("de-DE", {
|
new Date().toLocaleTimeString("de-DE", {
|
||||||
hour: "2-digit",
|
hour: "2-digit",
|
||||||
@@ -33,6 +37,19 @@ export function ShareModal({
|
|||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
// Only extract OG data if we are sharing the global page (no specific diagram or QR)
|
||||||
|
if (isOpen && !diagramImage && !qrCodeData && typeof document !== "undefined") {
|
||||||
|
const ogImage = document.querySelector('meta[property="og:image"]')?.getAttribute("content") || undefined;
|
||||||
|
const ogTitle = document.querySelector('meta[property="og:title"]')?.getAttribute("content") || title;
|
||||||
|
const ogDesc = document.querySelector('meta[property="og:description"]')?.getAttribute("content") || undefined;
|
||||||
|
|
||||||
|
if (ogImage || ogTitle || ogDesc) {
|
||||||
|
setOgData({ image: ogImage, title: ogTitle, description: ogDesc });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, [isOpen, diagramImage, qrCodeData, title]);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (diagramImage && isOpen) {
|
if (diagramImage && isOpen) {
|
||||||
const isDataUrl = diagramImage.startsWith("data:image/");
|
const isDataUrl = diagramImage.startsWith("data:image/");
|
||||||
@@ -194,7 +211,7 @@ export function ShareModal({
|
|||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
) : (
|
) : (
|
||||||
title && (
|
title && !ogData ? (
|
||||||
<div className="space-y-3">
|
<div className="space-y-3">
|
||||||
<label className="text-[10px] font-bold uppercase tracking-widest text-slate-400 ml-1">
|
<label className="text-[10px] font-bold uppercase tracking-widest text-slate-400 ml-1">
|
||||||
Artikel Titel
|
Artikel Titel
|
||||||
@@ -203,6 +220,36 @@ export function ShareModal({
|
|||||||
"{title}"
|
"{title}"
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
) : ogData && (
|
||||||
|
<div className="space-y-3">
|
||||||
|
<label className="text-[10px] font-bold uppercase tracking-widest text-slate-400 ml-1">
|
||||||
|
Link Vorschau
|
||||||
|
</label>
|
||||||
|
<div className="bg-white rounded-2xl border border-slate-200 overflow-hidden shadow-sm hover:shadow-md transition-shadow group">
|
||||||
|
{ogData.image && (
|
||||||
|
<div className="w-full aspect-video bg-slate-100 overflow-hidden relative">
|
||||||
|
<img
|
||||||
|
src={ogData.image}
|
||||||
|
alt={ogData.title || title || "Vorschau"}
|
||||||
|
className="w-full h-full object-cover group-hover:scale-105 transition-transform duration-700"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
<div className="p-5 flex flex-col gap-2">
|
||||||
|
<h3 className="font-bold text-slate-900 leading-snug line-clamp-2 text-[15px]">
|
||||||
|
{ogData.title || title}
|
||||||
|
</h3>
|
||||||
|
{ogData.description && (
|
||||||
|
<p className="text-slate-500 text-xs leading-relaxed line-clamp-2">
|
||||||
|
{ogData.description}
|
||||||
|
</p>
|
||||||
|
)}
|
||||||
|
<div className="mt-2 text-[10px] font-mono uppercase tracking-widest text-slate-400">
|
||||||
|
MINTEL.ME
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
)
|
)
|
||||||
)}
|
)}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user