"use client"; import React, { useState, useEffect } from 'react'; import Link from 'next/link'; import { Package } from 'lucide-react'; import { parseMetadata } from '@/lib/layoutConfig'; import { DEFAULT_ANNOUNCEMENT_LINKS } from '@/lib/homepageDefaults'; import { useAuthStore } from '@/store/authStore'; interface AnnouncementLink { label: string; url: string; icon?: string; } interface AnnouncementBarProps { config?: any; isActive?: boolean; } function isTrackOrderLink(link: AnnouncementLink): boolean { const label = link.label.toLowerCase(); const path = (link.url || '').split('?')[0]; return ( label.includes('track') || /\/track-order\/?$/i.test(path) || /\/services\/tracking/i.test(path) ); } function mapLinks(raw: any[]): AnnouncementLink[] { return raw .filter((l: any) => l?.label && l?.url) .map((l: any) => { const link: AnnouncementLink = { label: String(l.label), url: String(l.url), icon: l.icon ? String(l.icon) : undefined, }; if (isTrackOrderLink(link)) { return { ...link, url: '/services/tracking' }; } return link; }); } export const AnnouncementBar: React.FC = ({ config, isActive = true, }) => { const { isAuthenticated, authReady } = useAuthStore(); const [links, setLinks] = useState(DEFAULT_ANNOUNCEMENT_LINKS); const [visible, setVisible] = useState(isActive); useEffect(() => { setVisible(isActive); if (!isActive) { setLinks([]); return; } if (config) { const meta = parseMetadata(config); const rawLinks = meta.links; if (Array.isArray(rawLinks) && rawLinks.length > 0) { setLinks(mapLinks(rawLinks)); } else { setLinks(DEFAULT_ANNOUNCEMENT_LINKS); } return; } fetch('/api/v1/storefront/layout/home?region=announcement_bar', { cache: 'no-store', }) .then((r) => (r.ok ? r.json() : null)) .then((data: any[]) => { if (data && data.length > 0) { const meta = parseMetadata(data[0]); const rawLinks = meta.links; if (Array.isArray(rawLinks) && rawLinks.length > 0) { setLinks(mapLinks(rawLinks)); return; } } setLinks(DEFAULT_ANNOUNCEMENT_LINKS); }) .catch(() => setLinks(DEFAULT_ANNOUNCEMENT_LINKS)); }, [config, isActive]); const visibleLinks = links.filter((link) => { if (!isTrackOrderLink(link)) return true; return authReady && isAuthenticated; }); if (!visible || visibleLinks.length === 0) return null; return (
{visibleLinks.map((link, idx) => ( {link.icon === 'package' && ( )} {link.label} ))}
); };