export type SharePlatform = 'facebook' | 'twitter' | 'instagram' | 'tiktok' | 'telegram' | 'link'; export interface ShareData { title: string; url: string; excerpt?: string; image?: string; tags?: string[]; } export const getShareUrl = ( platform: Exclude, data: ShareData ): string => { const { title, url } = data; const encodedUrl = encodeURIComponent(url); const encodedTitle = encodeURIComponent(title); switch (platform) { case 'facebook': return `https://www.facebook.com/sharer/sharer.php?u=${encodedUrl}`; case 'twitter': return `https://twitter.com/intent/tweet?url=${encodedUrl}&text=${encodedTitle}`; case 'instagram': // Instagram doesn't have a web share URL, will use Web Share API in component return url; case 'tiktok': // TikTok has limited web share support, will use Web Share API in component return url; case 'telegram': return `https://t.me/share/url?url=${encodedUrl}&text=${encodedTitle}`; default: return url; } }; export const copyToClipboard = async (text: string): Promise => { try { if (navigator.clipboard && window.isSecureContext) { await navigator.clipboard.writeText(text); return true; } else { // Fallback for older browsers const textArea = document.createElement('textarea'); textArea.value = text; textArea.style.position = 'fixed'; textArea.style.left = '-999999px'; textArea.style.top = '-999999px'; document.body.appendChild(textArea); textArea.focus(); textArea.select(); const success = document.execCommand('copy'); document.body.removeChild(textArea); return success; } } catch (error) { console.error('Failed to copy to clipboard:', error); return false; } }; export const getPlatformIcon = (platform: SharePlatform): string => { switch (platform) { case 'facebook': return 'Facebook'; case 'twitter': return 'Twitter'; case 'instagram': return 'Instagram'; case 'tiktok': return 'TikTok'; case 'telegram': return 'Send'; case 'link': return 'Link'; default: return 'Share2'; } }; export const getPlatformLabel = (platform: SharePlatform): string => { switch (platform) { case 'facebook': return 'Facebook'; case 'twitter': return 'Twitter'; case 'instagram': return 'Instagram'; case 'tiktok': return 'TikTok'; case 'telegram': return 'Telegram'; case 'link': return 'Copy Link'; default: return 'Share'; } }; export const generateSocialMetaTags = (data: ShareData & { articleId: string }) => { const { title, excerpt, image, url } = data; // Default values if not provided const ogTitle = title || 'Placebo.mk - Sarcastic News from Macedonia'; const ogDescription = excerpt || 'Latest news and articles from Macedonia with a sarcastic twist'; const ogImage = image || '/placeholder-image.jpg'; const ogUrl = url || (typeof window !== 'undefined' ? window.location.href : ''); return { ogTitle, ogDescription, ogImage, ogUrl, ogType: 'article' as const, twitterCard: 'summary_large_image' as const, twitterTitle: ogTitle, twitterDescription: ogDescription, twitterImage: ogImage, }; }; export const truncateForTwitter = (text: string, maxLength: number = 280): string => { if (text.length <= maxLength) return text; return text.substring(0, maxLength - 3) + '...'; };