import { h, 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 { 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}`, }); })(); } 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) => { const feedContainer = document.getElementById('homepage-feed'); const { currentUser } = await getUserDataAndCsrfToken(); const currentUserId = currentUser && currentUser.id; render( { if (feedItems.length === 0) { // Fancy loading ✨ return ; } const commonProps = { bookmarkClick, }; const feedStyle = JSON.parse(document.body.dataset.user).feed_style; const [featuredStory, ...subStories] = feedItems; if (featuredStory) { sendFeaturedArticleGoogleAnalytics(featuredStory.id); sendFeaturedArticleAnalyticsGA4(featuredStory.id); } // 1. Show the pinned article first // 2. Show the featured story next // 3. Podcast episodes out today // 4. Rest of the stories for the feed // For "saveable", "!=" is used instead of "!==" to compare user_id // and currentUserId because currentUserId is a String while user_id is an Integer return (
{timeFrame === '' && pinnedArticle && (
)} {featuredStory && (
)} {podcastEpisodes.length > 0 && ( )} {(subStories || []).map((story) => (
))}
); }} />, feedContainer, feedContainer.firstElementChild, ); };