/* Company Stock Price — News (in-site reading + Finnhub feeds). */ const NEWS_CATS = ['All', 'Markets', 'Global', 'Economy', 'Sector']; function formatArticleDate(item) { if (!item || !item.datetime) return item && item.time ? item.time : ''; return new Date(item.datetime * 1000).toLocaleString('en-IN', { weekday: 'short', day: 'numeric', month: 'short', year: 'numeric', hour: '2-digit', minute: '2-digit', }); } function NewsArticleScreen({ articleId, onBack, onOpenArticle }) { const L = useLive(); const [article, setArticle] = useState(() => (window.NewsCache && window.NewsCache.get(articleId)) || null); const [body, setBody] = useState(null); const [loading, setLoading] = useState(!article); const [bodyLoading, setBodyLoading] = useState(false); const [err, setErr] = useState(''); const [bodyErr, setBodyErr] = useState(''); useEffect(() => { if (!L.hasKey) return; let cancelled = false; async function loadMeta() { const cached = window.NewsCache && window.NewsCache.get(articleId); if (cached) { setArticle(cached); setLoading(false); return cached; } setLoading(true); setErr(''); try { const a = await L.market.getNewsArticle(articleId); if (!cancelled) { setArticle(a); setLoading(false); } return a; } catch (e) { if (!cancelled) { setArticle(null); setErr(apiErrorMessage(e)); setLoading(false); } return null; } } async function loadBody(meta) { if (!meta || !meta.url) return; setBodyLoading(true); setBodyErr(''); try { const full = await L.market.getNewsArticleBody(meta.url); if (!cancelled) setBody(full); } catch (e) { if (!cancelled) setBodyErr(apiErrorMessage(e)); } finally { if (!cancelled) setBodyLoading(false); } } loadMeta().then((meta) => { if (!cancelled && meta) loadBody(meta); }); return () => { cancelled = true; }; }, [articleId, L.hasKey]); if (!L.hasKey) { return ( Connect API} /> ); } if (loading && !article) return ; if (err || !article) { return ( Back to News} /> ); } const related = window.NewsCache ? window.NewsCache.list(article.id, 5) : []; const HT = window.HtmlText; function cleanParas(list) { return (list || []) .map((p) => (HT ? HT.cleanParagraph(p) : String(p || '').replace(/<[^>]+>/g, ' ').trim())) .filter((p) => p && p.length > 40); } let paragraphs = []; if (body && body.paragraphs && body.paragraphs.length) { paragraphs = cleanParas(body.paragraphs); } if (!paragraphs.length && article.summaryParagraphs && article.summaryParagraphs.length) { paragraphs = article.summaryParagraphs; } if (!paragraphs.length && article.summary) { paragraphs = HT ? HT.htmlToParagraphs(article.summary) : [article.summary]; } if (!paragraphs.length && body && body.excerpt) { paragraphs = HT ? HT.htmlToParagraphs(body.excerpt) : [body.excerpt]; } const heroImage = article.image || (body && body.image) || ''; const leadText = body && body.excerpt ? (HT ? HT.stripHtml(body.excerpt) : body.excerpt) : ''; return (
{heroImage && ( )}
{article.source}

{article.headline}

{formatArticleDate(article)}{article.read ? ' · ' + article.read + ' read' : ''}
{bodyLoading && (
{[0, 1, 2, 3].map((i) => (
))}

Loading full article…

)} {!bodyLoading && paragraphs.length > 0 && (
{leadText && (

{leadText}

)} {paragraphs.map((para, i) => (

{para}

))}
)} {!bodyLoading && !paragraphs.length && (

{bodyErr || 'Full article text could not be loaded. Try again later.'}

)}
Published by {article.source || article.author || 'Newswire'} {body && body.wordCount ? ' · ' + body.wordCount.toLocaleString() + ' words' : ''} {body && body.partial ? ' · partial extract' : ''}
{related.length > 0 && onOpenArticle && (

More headlines

)}
); } function IndicesSidebar() { const L = useLive(); const MD = useMarketData(); const [region, setRegion] = useState('IN'); const india = MD.indices || []; const global = MD.globalIndices || []; const indices = region === 'US' ? global : india; useEffect(() => { if (region === 'US' && L.hasKey && !global.length && !MD.globalLoading) { MD.loadGlobal(); } }, [region, L.hasKey, global.length, MD.globalLoading, MD.loadGlobal]); return (

Indices

{region === 'US' && !L.hasKey && (

Connect API key for US indices.

)} {region === 'US' && MD.globalLoading && !indices.length && (

Loading US indices…

)} {indices.slice(0, 5).map((ix) => (
{ix.label} {ix.cur === 'INR' ? '₹' : '$'}{fmt.price(ix.value)}
))}
); } function NewsScreen({ onOpenArticle }) { const L = useLive(); const MD = useMarketData(); const [cat, setCat] = useState('All'); const [news, setNews] = useState(MD.news || []); const [earnings, setEarnings] = useState([]); const [loading, setLoading] = useState(false); const [loadingMore, setLoadingMore] = useState(false); const [pages, setPages] = useState(2); const [err, setErr] = useState(''); async function loadLive(pageCount = 2) { if (!L.hasKey) return; setLoading(true); setErr(''); try { const [feed, earn] = await Promise.all([ L.market.getMarketNewsFeed(cat, { pages: pageCount }), L.market.getEarningsCalendar(2, 0).catch(() => []), ]); setNews(feed); if (window.NewsCache) window.NewsCache.putMany(feed); setPages(pageCount); setEarnings(earn); L.refreshRateLimit(); } catch (e) { setErr(apiErrorMessage(e)); } finally { setLoading(false); } } async function loadMore() { if (!L.hasKey || loadingMore) return; setLoadingMore(true); setErr(''); try { const nextPages = pages + 1; const feed = await L.market.getMarketNewsFeed(cat, { pages: nextPages }); setNews(feed); if (window.NewsCache) window.NewsCache.putMany(feed); setPages(nextPages); L.refreshRateLimit(); } catch (e) { setErr(apiErrorMessage(e)); } finally { setLoadingMore(false); } } useEffect(() => { if (MD.news && MD.news.length) setNews(MD.news); }, [MD.news]); useEffect(() => { if (!L.hasKey) return; loadLive(2); const id = setInterval(() => loadLive(2), MD.refreshMs || 5 * 60 * 1000); return () => clearInterval(id); }, [L.hasKey, cat]); const trending = news.slice(0, 6).map((n) => ({ tag: (n.headline || '').split(' ').slice(0, 4).join(' '), posts: n.source || 'News', })); if (!L.hasKey) { return (

News & Insights

Connect API} />
); } if ((!news.length && loading) || (MD.loading && !MD.ready && !news.length)) { return ; } const filtered = cat === 'All' ? news : news.filter((n) => n.cat === cat); const featured = filtered[0] || news[0]; const isFeatured = featured && featured.featured && cat === 'All'; const rest = isFeatured ? filtered.slice(1) : filtered.slice(1); return (

News & Insights

n.live)} />
Finnhub feeds: general · forex · crypto · merger
{L.hasKey && }
{err &&
{err}
}
{NEWS_CATS.map((c) => ( ))}
{featured && (
onOpenArticle && onOpenArticle(featured)} onKeyDown={(e) => { if ((e.key === 'Enter' || e.key === ' ') && onOpenArticle) { e.preventDefault(); onOpenArticle(featured); } }}> {featured.image &&
}
{featured.cat}

{featured.headline}

{featured.summary &&

{window.HtmlText ? window.HtmlText.stripHtml(featured.summary) : featured.summary}

}
{featured.source} · {featured.time}{featured.read ? ' · ' + featured.read : ''}
)}
{rest.map((n) => (
onOpenArticle && onOpenArticle(n)} onKeyDown={(e) => { if ((e.key === 'Enter' || e.key === ' ') && onOpenArticle) { e.preventDefault(); onOpenArticle(n); } }}> {n.cat}

{n.headline}

{n.source} · {n.time}
))}
{L.hasKey && rest.length > 0 && (
{news.length} articles · {pages} API page{pages === 1 ? '' : 's'}
)}
); } Object.assign(window, { NewsScreen, NewsArticleScreen });