'use client'; import Link from 'next/link'; import Image from 'next/image'; import { useEffect, useRef, useState } from 'react'; import { FaGithub, FaMastodon, FaLinkedin } from 'react-icons/fa'; import { FiTrendingUp, FiArrowRight } from 'react-icons/fi'; import { siteConfig } from '@/lib/config'; import { getAllTagsWithCount } from '@/lib/posts'; import { allPages } from 'contentlayer2/generated'; import dynamic from 'next/dynamic'; // Lazy load MastodonFeed - only load when sidebar is visible const MastodonFeed = dynamic(() => import('./mastodon-feed').then(mod => ({ default: mod.MastodonFeed })), { ssr: false, }); export function RightSidebar() { const [shouldLoadFeed, setShouldLoadFeed] = useState(false); const feedRef = useRef(null); useEffect(() => { // Use Intersection Observer to lazy load MastodonFeed when sidebar is visible if (!feedRef.current) return; const observer = new IntersectionObserver( (entries) => { if (entries[0].isIntersecting) { setShouldLoadFeed(true); observer.disconnect(); } }, { rootMargin: '100px' } // Start loading 100px before it's visible ); observer.observe(feedRef.current); return () => observer.disconnect(); }, []); const tags = getAllTagsWithCount().slice(0, 5); const aboutPage = allPages.find((p) => p.title.includes('關於作者')) ?? allPages.find((p) => p.slug === 'about-me'); const avatarSrc = siteConfig.avatar; const socialItems = [ siteConfig.social.github && { key: 'github', href: siteConfig.social.github, icon: FaGithub, label: 'GitHub' }, siteConfig.social.mastodon && { key: 'mastodon', href: siteConfig.social.mastodon, icon: FaMastodon, label: 'Mastodon' }, siteConfig.social.linkedin && { key: 'linkedin', href: siteConfig.social.linkedin, icon: FaLinkedin, label: 'LinkedIn' } ].filter(Boolean) as { key: string; href: string; icon: any; label: string }[]; return ( ); }