/** * FeedPage - Shows latest episodes across all subscribed shows * Reverse chronological order, like an inbox/timeline */ import { createSignal, For, Show } from "solid-js"; import { useFeedStore } from "@/stores/feed"; import { format } from "date-fns"; import type { Episode } from "@/types/episode"; import type { Feed } from "@/types/feed"; import { useTheme } from "@/context/ThemeContext"; import { PageProps } from "@/App"; import { SelectableBox, SelectableText } from "@/components/Selectable"; enum FeedPaneType { FEED = 1, } export const FeedPaneCount = 1; export function FeedPage(props: PageProps) { const feedStore = useFeedStore(); const [selectedIndex, setSelectedIndex] = createSignal(0); const [isRefreshing, setIsRefreshing] = createSignal(false); const allEpisodes = () => feedStore.getAllEpisodesChronological(); const formatDate = (date: Date): string => { return format(date, "MMM d, yyyy"); }; const episodesByDate = () => { const groups: Record = {}; const sortedEpisodes = allEpisodes(); for (const episode of sortedEpisodes) { const dateKey = formatDate(new Date(episode.episode.pubDate)); groups[dateKey] = episode; } return groups; }; const formatDuration = (seconds: number): string => { const mins = Math.floor(seconds / 60); const hrs = Math.floor(mins / 60); if (hrs > 0) return `${hrs}h ${mins % 60}m`; return `${mins}m`; }; const handleRefresh = async () => { setIsRefreshing(true); await feedStore.refreshAllFeeds(); setIsRefreshing(false); }; const { theme } = useTheme(); return ( {/* Status line */} Refreshing feeds... 0} fallback={ No episodes yet. Subscribe to shows from Discover or Search. } > b.localeCompare(a))}> {([date, episode], groupIndex) => ( <> false} primary>{date} groupIndex() === selectedIndex()} flexDirection="column" gap={0} paddingLeft={1} paddingRight={1} paddingTop={0} paddingBottom={0} onMouseDown={() => setSelectedIndex(groupIndex())} > groupIndex() === selectedIndex()} primary> {groupIndex() === selectedIndex() ? ">" : " "} groupIndex() === selectedIndex()} primary > {episode.episode.title} groupIndex() === selectedIndex()} primary> {episode.feed.podcast.title} groupIndex() === selectedIndex()} tertiary> {formatDate(episode.episode.pubDate)} groupIndex() === selectedIndex()} tertiary> {formatDuration(episode.episode.duration)} )} ); }