import { h, Fragment, render } from 'preact'; import PropTypes from 'prop-types'; import { Article, LoadingArticle } from '../articles'; import { Feed } from '../articles/Feed'; import { TodaysPodcasts, PodcastEpisode } from '../podcasts'; import { articlePropTypes } from '../common-prop-types'; import { createRootFragment } from '../shared/preact/preact-root-fragment'; import { getUserDataAndCsrfToken } from '@utilities/getUserDataAndCsrfToken'; /** * Sends analytics about the featured article. * * @param {number} articleId */ function sendFeaturedArticleGoogleAnalytics(articleId) { (function logFeaturedArticleImpressionGA() { if (!window.ga || !ga.create) { setTimeout(logFeaturedArticleImpressionGA, 20); return; } ga( 'send', 'event', 'view', 'featured-feed-impression', `articles-${articleId}`, null, ); })(); } function sendFeaturedArticleAnalyticsGA4(articleId) { (function logFeaturedArticleImpressionGA4() { if (!window.gtag) { setTimeout(logFeaturedArticleImpressionGA4, 20); return; } gtag('event', 'featured-feed-impression', { event_category: 'view', event_label: `articles-${articleId}`, }); })(); } function feedConstruct( pinnedItem, imageItem, feedItems, bookmarkedFeedItems, bookmarkClick, currentUserId, ) { const commonProps = { bookmarkClick, }; const feedStyle = JSON.parse(document.body.dataset.user).feed_style; if (imageItem) { sendFeaturedArticleGoogleAnalytics(imageItem.id); sendFeaturedArticleAnalyticsGA4(imageItem.id); } return feedItems.map((item) => { // billboard is an html string if (typeof item === 'string') { return (
); } if (Array.isArray(item) && item[0].podcast) { return ; } if (typeof item === 'object') { return (
); } }); } const FeedLoading = () => (
); const PodcastEpisodes = ({ episodes }) => ( {episodes.map((episode) => ( ))} ); PodcastEpisodes.defaultProps = { episodes: [], }; PodcastEpisodes.propTypes = { episodes: PropTypes.arrayOf(articlePropTypes), }; /** * Renders the main feed. */ export const renderFeed = async (timeFrame, afterRender) => { const feedContainer = document.getElementById('homepage-feed'); const { currentUser } = await getUserDataAndCsrfToken(); const currentUserId = currentUser && currentUser.id; const callback = ({ pinnedItem, imageItem, feedItems, bookmarkedFeedItems, bookmarkClick, }) => { if (feedItems.length === 0) { // Fancy loading ✨ return ; } return ( {feedConstruct( pinnedItem, imageItem, feedItems, bookmarkedFeedItems, bookmarkClick, currentUserId, )} ); }; render( , createRootFragment(feedContainer, feedContainer.firstElementChild), ); };