221 lines
12 KiB
JavaScript
221 lines
12 KiB
JavaScript
import React, { useState, useEffect } from "react";
|
|
import { marked } from 'marked';
|
|
|
|
export default function TopicDetail(props) {
|
|
const [showCopied, setShowCopied] = useState(false);
|
|
|
|
if (!props.topic) {
|
|
return <div>Topic not found</div>;
|
|
}
|
|
|
|
const shareUrl = typeof window !== 'undefined' ? window.location.href : '';
|
|
const title = props.topic.title;
|
|
const text = `Check out this article: ${title}`;
|
|
|
|
// const shareOnFacebook = () => {
|
|
// window.open(`https://www.facebook.com/sharer/sharer.php?u=${encodeURIComponent(shareUrl)}`, '_blank');
|
|
// };
|
|
|
|
// const shareOnTwitter = () => {
|
|
// window.open(`https://twitter.com/intent/tweet?url=${encodeURIComponent(shareUrl)}&text=${encodeURIComponent(text)}`, '_blank');
|
|
// };
|
|
|
|
// const shareOnLinkedIn = () => {
|
|
// window.open(`https://www.linkedin.com/shareArticle?mini=true&url=${encodeURIComponent(shareUrl)}&title=${encodeURIComponent(title)}`, '_blank');
|
|
// };
|
|
|
|
// const shareOnReddit = () => {
|
|
// window.open(`https://www.reddit.com/submit?url=${encodeURIComponent(shareUrl)}&title=${encodeURIComponent(title)}`, '_blank');
|
|
// };
|
|
|
|
// const shareOnWhatsApp = () => {
|
|
// window.open(`https://wa.me/?text=${encodeURIComponent(`${text} ${shareUrl}`)}`, '_blank');
|
|
// };
|
|
|
|
// const shareViaEmail = () => {
|
|
// window.open(`mailto:?subject=${encodeURIComponent(title)}&body=${encodeURIComponent(`${text}\n\n${shareUrl}`)}`);
|
|
// };
|
|
|
|
|
|
const shareOnSocialMedia = (platform) => {
|
|
switch (platform){
|
|
case 'facebook':
|
|
window.open(`https://www.facebook.com/sharer/sharer.php?u=${encodeURIComponent(shareUrl)}`, '_blank');
|
|
break;
|
|
|
|
case 'twitter':
|
|
window.open(`https://twitter.com/intent/tweet?url=${encodeURIComponent(shareUrl)}&text=${encodeURIComponent(text)}`, '_blank');
|
|
break;
|
|
|
|
case 'linkedin':
|
|
window.open(`https://www.linkedin.com/shareArticle?mini=true&url=${encodeURIComponent(shareUrl)}&title=${encodeURIComponent(title)}`, '_blank');
|
|
break;
|
|
|
|
case 'reddit':
|
|
window.open(`https://www.reddit.com/submit?url=${encodeURIComponent(shareUrl)}&title=${encodeURIComponent(title)}`, '_blank');
|
|
break;
|
|
|
|
case 'whatsapp':
|
|
window.open(`https://wa.me/?text=${encodeURIComponent(`${text} ${shareUrl}`)}`, '_blank');
|
|
break;
|
|
|
|
case 'email':
|
|
window.open(`mailto:?subject=${encodeURIComponent(title)}&body=${encodeURIComponent(`${text}\n\n${shareUrl}`)}`);
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
const copyToClipboard = () => {
|
|
navigator.clipboard.writeText(shareUrl);
|
|
setShowCopied(true);
|
|
setTimeout(() => setShowCopied(false), 2000);
|
|
};
|
|
|
|
// SVG Icons with improved styling
|
|
const SocialIcon = ({ children, className = "" }) => (
|
|
<span className={`w-5 h-5 flex items-center justify-center ${className}`}>
|
|
{children}
|
|
</span>
|
|
);
|
|
|
|
const FacebookIcon = () => (
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
|
|
<path d="M22 12c0-5.523-4.477-10-10-10S2 6.477 2 12c0 4.991 3.657 9.128 8.438 9.878v-6.987h-2.54V12h2.54V9.797c0-2.506 1.492-3.89 3.777-3.89 1.094 0 2.238.195 2.238.195v2.46h-1.26c-1.243 0-1.63.771-1.63 1.562V12h2.773l-.443 2.89h-2.33v6.988C18.343 21.128 22 16.991 22 12z"/>
|
|
</svg>
|
|
);
|
|
|
|
const TwitterIcon = () => (
|
|
<svg xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" width="100" height="100" viewBox="0 0 30 30" fill="currentColor">
|
|
<path d="M26.37,26l-8.795-12.822l0.015,0.012L25.52,4h-2.65l-6.46,7.48L11.28,4H4.33l8.211,11.971L12.54,15.97L3.88,26h2.65 l7.182-8.322L19.42,26H26.37z M10.23,6l12.34,18h-2.1L8.12,6H10.23z"></path>
|
|
</svg>
|
|
);
|
|
|
|
const LinkedInIcon = () => (
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
|
|
<path d="M19 0h-14c-2.761 0-5 2.239-5 5v14c0 2.761 2.239 5 5 5h14c2.762 0 5-2.239 5-5v-14c0-2.761-2.238-5-5-5zm-11 19h-3v-11h3v11zm-1.5-12.268c-.966 0-1.75-.79-1.75-1.764s.784-1.764 1.75-1.764 1.75.79 1.75 1.764-.783 1.764-1.75 1.764zm13.5 12.268h-3v-5.604c0-3.368-4-3.113-4 0v5.604h-3v-11h3v1.765c1.396-2.586 7-2.777 7 2.476v6.759z"/>
|
|
</svg>
|
|
);
|
|
|
|
const RedditIcon = () => (
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
|
|
<path d="M12 0A12 12 0 0 0 0 12a12 12 0 0 0 12 12 12 12 0 0 0 12-12A12 12 0 0 0 12 0zm5.01 4.744c.688 0 1.25.561 1.25 1.249a1.25 1.25 0 0 1-2.5.056l-2.597-.547-.8 3.747c1.824.07 3.48.632 4.674 1.488.308-.309.73-.491 1.207-.491.968 0 1.754.786 1.754 1.754 0 .716-.435 1.333-1.01 1.614a3.111 3.111 0 0 1 .042.52c0 2.694-3.13 4.87-7.004 4.87-3.874 0-7.004-2.176-7.004-4.87 0-.183.015-.366.043-.534A1.748 1.748 0 0 1 4.028 12c0-.968.786-1.754 1.754-1.754.463 0 .898.196 1.207.49 1.207-.883 2.878-1.43 4.744-1.487l.885-4.182a.342.342 0 0 1 .14-.197.35.35 0 0 1 .238-.042l2.906.617a1.214 1.214 0 0 1 1.108-.701zM9.25 12C8.561 12 8 12.562 8 13.25c0 .687.561 1.248 1.25 1.248.687 0 1.248-.561 1.248-1.249 0-.688-.561-1.249-1.249-1.249zm5.5 0c-.687 0-1.248.561-1.248 1.25 0 .687.561 1.248 1.249 1.248.688 0 1.249-.561 1.249-1.249 0-.687-.562-1.249-1.25-1.249zm-5.466 3.99a.327.327 0 0 0-.231.094.33.33 0 0 0 0 .463c.842.842 2.484.913 2.961.913.477 0 2.12-.07 2.961-.913a.361.361 0 0 0 .029-.463.33.33 0 0 0-.464 0c-.547.533-1.684.73-2.512.73-.828 0-1.963-.196-2.512-.73a.326.326 0 0 0-.232-.095z"/>
|
|
</svg>
|
|
);
|
|
|
|
const WhatsAppIcon = () => (
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
|
|
<path d="M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51-.173-.008-.371-.01-.57-.01-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413.248-.694.248-1.289.173-1.413-.074-.124-.272-.198-.57-.347m-5.421 7.403h-.004a9.87 9.87 0 01-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 01-1.51-5.26c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.825 9.825 0 012.893 6.994c-.003 5.45-4.437 9.884-9.885 9.884m8.413-18.297A11.815 11.815 0 0012.05 0C5.495 0 .16 5.335.157 11.892c0 2.096.547 4.142 1.588 5.945L.057 24l6.305-1.654a11.882 11.882 0 005.683 1.448h.005c6.554 0 11.89-5.335 11.893-11.893a11.821 11.821 0 00-3.48-8.413z"/>
|
|
</svg>
|
|
);
|
|
|
|
const MailIcon = () => (
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
|
|
<path d="M0 3v18h24v-18h-24zm6.623 7.929l-4.623 5.712v-9.458l4.623 3.746zm-4.141-5.929h19.035l-9.517 7.713-9.518-7.713zm5.694 7.188l3.824 3.099 3.83-3.104 5.612 6.817h-18.779l5.513-6.812zm9.208-1.264l4.616-3.741v9.348l-4.616-5.607z"/>
|
|
</svg>
|
|
);
|
|
|
|
const LinkIcon = () => (
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
|
|
<path d="M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.689.736 1.011.748.98 1.804 1.644 2.993 1.907 1.535.368 3.159.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z"/>
|
|
</svg>
|
|
);
|
|
|
|
return (
|
|
<div className="container mx-auto px-4 py-12">
|
|
<article className="max-w-4xl mx-auto">
|
|
<img src={props.topic.img ? props.topic.img : '/assets/images/thumb-place.jpg'} alt={props.topic.title} className="w-full h-[400px] aspect-video object-cover rounded-lg mb-8 shadow-md" />
|
|
<h1 className="text-4xl font-bold text-[#6d9e37] mb-6">{props.topic.title}</h1>
|
|
|
|
{/* Enhanced Social Share Buttons */}
|
|
<div className="mb-8">
|
|
<p className="text-sm text-gray-500 mb-3 font-medium">Share this article:</p>
|
|
<div className="flex flex-wrap gap-2">
|
|
<button
|
|
onClick={() => shareOnSocialMedia('facebook')}
|
|
className="flex items-center gap-1 px-2 py-2 bg-[#3b5998] hover:bg-[#2d4373] text-white rounded-lg transition-all shadow-sm hover:shadow-md active:scale-95"
|
|
aria-label="Share on Facebook"
|
|
title="Share on Facebook"
|
|
>
|
|
<SocialIcon className="text-white"><FacebookIcon /></SocialIcon>
|
|
<span className="text-sm font-medium">Facebook</span>
|
|
</button>
|
|
|
|
<button
|
|
onClick={() => shareOnSocialMedia('whatsapp')}
|
|
className="flex items-center gap-1 px-2 py-2 bg-[#25D366] hover:bg-[#1da851] text-white rounded-lg transition-all shadow-sm hover:shadow-md active:scale-95"
|
|
aria-label="Share on WhatsApp"
|
|
title="Share on WhatsApp"
|
|
>
|
|
<SocialIcon className="text-white"><WhatsAppIcon /></SocialIcon>
|
|
<span className="text-sm font-medium">WhatsApp</span>
|
|
</button>
|
|
|
|
<button
|
|
onClick={() => shareOnSocialMedia('twitter')}
|
|
className="flex items-center gap-1 px-2 py-2 bg-[#000000] hover:bg-[#000000] text-white rounded-lg transition-all shadow-sm hover:shadow-md active:scale-95"
|
|
aria-label="Share on Twitter"
|
|
title="Share on Twitter"
|
|
>
|
|
<SocialIcon className="text-white"><TwitterIcon /></SocialIcon>
|
|
<span className="text-sm font-medium">Twitter</span>
|
|
</button>
|
|
|
|
<button
|
|
onClick={() => shareOnSocialMedia('linkedin')}
|
|
className="flex items-center gap-1 px-2 py-2 bg-[#0077b5] hover:bg-[#005582] text-white rounded-lg transition-all shadow-sm hover:shadow-md active:scale-95"
|
|
aria-label="Share on LinkedIn"
|
|
title="Share on LinkedIn"
|
|
>
|
|
<SocialIcon className="text-white"><LinkedInIcon /></SocialIcon>
|
|
<span className="text-sm font-medium">LinkedIn</span>
|
|
</button>
|
|
|
|
<button
|
|
onClick={() => shareOnSocialMedia('reddit')}
|
|
className="flex items-center gap-1 px-2 py-2 bg-[#FF5700] hover:bg-[#e04e00] text-white rounded-lg transition-all shadow-sm hover:shadow-md active:scale-95"
|
|
aria-label="Share on Reddit"
|
|
title="Share on Reddit"
|
|
>
|
|
<SocialIcon className="text-white"><RedditIcon /></SocialIcon>
|
|
<span className="text-sm font-medium">Reddit</span>
|
|
</button>
|
|
|
|
<button
|
|
onClick={() => shareOnSocialMedia('reddit')}
|
|
className="flex items-center gap-1 px-2 py-2 bg-gray-600 hover:bg-gray-700 text-white rounded-lg transition-all shadow-sm hover:shadow-md active:scale-95"
|
|
aria-label="Share via Email"
|
|
title="Share via Email"
|
|
>
|
|
<SocialIcon className="text-white"><MailIcon /></SocialIcon>
|
|
<span className="text-sm font-medium">Email</span>
|
|
</button>
|
|
|
|
<div className="relative">
|
|
<button
|
|
onClick={copyToClipboard}
|
|
className="flex items-center gap-1 px-2 py-2 bg-gray-800 hover:bg-gray-900 text-white rounded-lg transition-all shadow-sm hover:shadow-md active:scale-95"
|
|
aria-label="Copy link"
|
|
title="Copy link to share"
|
|
>
|
|
<SocialIcon className="text-white"><LinkIcon /></SocialIcon>
|
|
<span className="text-sm font-medium">Copy Link</span>
|
|
</button>
|
|
{showCopied && (
|
|
<div className="absolute -bottom-8 left-1/2 transform -translate-x-1/2 bg-gray-800 text-white text-xs px-2 py-1 rounded whitespace-nowrap shadow-md">
|
|
Link copied!
|
|
</div>
|
|
)}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div
|
|
className="font-light mb-8 text-justify prose max-w-none"
|
|
dangerouslySetInnerHTML={{ __html: marked.parse(props.topic.content || '') }}
|
|
></div>
|
|
</article>
|
|
</div>
|
|
);
|
|
} |