1- import Image from "next/image" ;
21
3- export default function Home ( ) {
4- return (
5- < div className = "grid grid-rows-[20px_1fr_20px] items-center justify-items-center min-h-screen p-8 pb-20 gap-16 sm:p-20 font-[family-name:var(--font-geist-sans)]" >
6- < main className = "flex flex-col gap-8 row-start-2 items-center sm:items-start" >
7- < Image
8- className = "dark:invert"
9- src = "/bookmarks/next.svg"
10- alt = "Next.js logo"
11- width = { 180 }
12- height = { 38 }
13- priority
14- />
15- < ol className = "list-inside list-decimal text-sm text-center sm:text-left font-[family-name:var(--font-geist-mono)]" >
16- < li className = "mb-2" >
17- Get started by editing{ " " }
18- < code className = "bg-black/[.05] dark:bg-white/[.06] px-1 py-0.5 rounded font-semibold" >
19- app/page.tsx
20- </ code >
21- .
22- </ li >
23- < li > Save and see your changes instantly.</ li >
24- </ ol >
2+ import { GetStaticProps , InferGetStaticPropsType } from 'next' ;
3+ import { RSSFeed } from '../types/rss' ;
4+ import { parseRSSFeed } from '../lib/rssParser' ;
5+
6+ interface BlogPageProps {
7+ feed : RSSFeed ;
8+ lastUpdated : string ;
9+ }
2510
26- < div className = "flex gap-4 items-center flex-col sm:flex-row" >
27- < a
28- className = "rounded-full border border-solid border-transparent transition-colors flex items-center justify-center bg-foreground text-background gap-2 hover:bg-[#383838] dark:hover:bg-[#ccc] text-sm sm:text-base h-10 sm:h-12 px-4 sm:px-5"
29- href = "https://vercel.com/new?utm_source=create-next-app& utm_medium = appdir - template - tw & utm_campaign = create - next - app "
30- target = "_blank"
31- rel = "noopener noreferrer"
32- >
33- < Image
34- className = "dark:invert"
35- src = "/nextjs-github-pages/vercel.svg"
36- alt = "Vercel logomark"
37- width = { 20 }
38- height = { 20 }
11+ export default async function Page ( ) {
12+ let myBlog : BlogPageProps ;
13+ try {
14+ // Replace with your RSS feed URL
15+ const RSS_FEED_URL = 'https://bg.raindrop.io/rss/public/58719856' ;
16+ const feed = await parseRSSFeed ( RSS_FEED_URL ) ;
17+ myBlog = {
18+ feed,
19+ lastUpdated : new Date ( ) . toISOString ( ) ,
20+ } ;
21+ } catch ( error ) {
22+ console . error ( 'Error fetching RSS feed:' , error ) ;
23+ // Return empty feed on error to prevent build failures
24+ myBlog = {
25+ feed : {
26+ title : 'Blog Feed' ,
27+ description : 'Unable to load feed' ,
28+ link : '' ,
29+ items : [ ] ,
30+ } ,
31+ lastUpdated : new Date ( ) . toISOString ( ) ,
32+ } ;
33+ }
34+ return (
35+ < div className = "container mx-auto px-4 py-8" >
36+ < h1 className = "text-3xl font-bold mb-6" > { myBlog . feed . title } </ h1 >
37+ < p className = "text-gray-600 mb-8" > { myBlog . feed . description } </ p >
38+ < p className = "text-sm text-gray-500 mb-8" > Last updated: { myBlog . lastUpdated } </ p >
39+ < div className = "space-y-6" >
40+ { myBlog . feed . items . map ( ( item , index ) => (
41+ < article key = { item . guid || index } className = "border-b pb-6" >
42+ < h2 className = "text-xl font-semibold mb-2" >
43+ < a
44+ href = { item . link }
45+ target = "_blank"
46+ rel = "noopener noreferrer"
47+ className = "text-blue-600 hover:text-blue-800"
48+ >
49+ { item . title }
50+ </ a >
51+ </ h2 >
52+ < div
53+ className = "text-gray-700 mb-2"
54+ dangerouslySetInnerHTML = { { __html : item . description } }
3955 />
40- Deploy now
41- </ a >
42- < a
43- className = "rounded-full border border-solid border-black/[.08] dark:border-white/[.145] transition-colors flex items-center justify-center hover:bg-[#f2f2f2] dark:hover:bg-[#1a1a1a] hover:border-transparent text-sm sm:text-base h-10 sm:h-12 px-4 sm:px-5 sm:min-w-44"
44- href = "https://nextjs.org/docs?utm_source=create-next-app& utm_medium = appdir - template - tw & utm_campaign = create - next - app "
45- target = "_blank"
46- rel = "noopener noreferrer"
47- >
48- Read our docs
49- </ a >
50- </ div >
51- </ main >
52- < footer className = "row-start-3 flex gap-6 flex-wrap items-center justify-center" >
53- < a
54- className = "flex items-center gap-2 hover:underline hover:underline-offset-4"
55- href = "https://nextjs.org/learn?utm_source=create-next-app& utm_medium = appdir - template - tw & utm_campaign = create - next - app "
56- target = "_blank"
57- rel = "noopener noreferrer"
58- >
59- < Image
60- aria-hidden
61- src = "/nextjs-github-pages/file.svg"
62- alt = "File icon"
63- width = { 16 }
64- height = { 16 }
65- />
66- Learn
67- </ a >
68- < a
69- className = "flex items-center gap-2 hover:underline hover:underline-offset-4"
70- href = "https://vercel.com/templates?framework=next.js& utm_source = create - next - app & utm_medium = appdir - template - tw & utm_campaign = create - next - app "
71- target = "_blank"
72- rel = "noopener noreferrer"
73- >
74- < Image
75- aria-hidden
76- src = "/nextjs-github-pages/window.svg"
77- alt = "Window icon"
78- width = { 16 }
79- height = { 16 }
80- />
81- Examples
82- </ a >
83- < a
84- className = "flex items-center gap-2 hover:underline hover:underline-offset-4"
85- href = "https://nextjs.org?utm_source=create-next-app& utm_medium = appdir - template - tw & utm_campaign = create - next - app "
86- target = "_blank"
87- rel = "noopener noreferrer"
88- >
89- < Image
90- aria-hidden
91- src = "/nextjs-github-pages/globe.svg"
92- alt = "Globe icon"
93- width = { 16 }
94- height = { 16 }
95- />
96- Go to nextjs.org →
97- </ a >
98- </ footer >
56+ < div className = "text-sm text-gray-500" >
57+ { item . pubDate && < span > Published: { new Date ( item . pubDate ) . toLocaleDateString ( ) } </ span > }
58+ { item . author && < span className = "ml-4" > By: { item . author } </ span > }
59+ </ div >
60+ { item . categories && item . categories . length > 0 && (
61+ < div className = "mt-2" >
62+ { item . categories . map ( category => (
63+ < span
64+ key = { category }
65+ className = "inline-block bg-gray-200 rounded-full px-3 py-1 text-sm font-semibold text-gray-700 mr-2"
66+ >
67+ { category }
68+ </ span >
69+ ) ) }
70+ </ div >
71+ ) }
72+ </ article >
73+ ) ) }
74+ </ div >
9975 </ div >
10076 ) ;
101- }
77+ }
0 commit comments