Add RSS feeds for ~bitcoin and ~nostr

This commit is contained in:
ekzyis 2023-05-04 20:17:02 +02:00 committed by Keyan
parent 236ee552c6
commit d98421d9cd
4 changed files with 55 additions and 21 deletions

View File

@ -78,6 +78,24 @@ const handleThemeChange = (dark) => {
}) })
} }
const RssPopover = (
<Popover>
<Popover.Content style={{ fontWeight: 500, fontSize: '.9rem' }}>
<a href='/rss' className='text-dark d-inline-flex'>
home
</a>
<span className='mx-2 text-dark'> \ </span>
<a href='/~bitcoin/rss' className='text-dark d-inline-flex'>
bitcoin
</a>
<span className='mx-2 text-dark'> \ </span>
<a href='/~nostr/rss' className='text-dark d-inline-flex'>
nostr
</a>
</Popover.Content>
</Popover>
)
const ChatPopover = ( const ChatPopover = (
<Popover> <Popover>
<Popover.Content style={{ fontWeight: 500, fontSize: '.9rem' }}> <Popover.Content style={{ fontWeight: 500, fontSize: '.9rem' }}>
@ -181,9 +199,11 @@ export default function Footer ({ noLinks }) {
</div> </div>
</OverlayTrigger> </OverlayTrigger>
<span className='mx-2 text-muted'> \ </span> <span className='mx-2 text-muted'> \ </span>
<a href='/rss' className='nav-link p-0 d-inline-flex' target='_blank'> <OverlayTrigger trigger='click' placement='top' overlay={RssPopover} rootClose>
rss <div className='nav-link p-0 d-inline-flex' style={{ cursor: 'pointer' }}>
</a> rss
</div>
</OverlayTrigger>
</div> </div>
<div className='mb-2' style={{ fontWeight: 500 }}> <div className='mb-2' style={{ fontWeight: 500 }}>
<Link href='/faq' passHref> <Link href='/faq' passHref>

View File

@ -1,3 +1,5 @@
import getSSRApolloClient from '../api/ssrApollo'
const SITE_URL = 'https://stacker.news' const SITE_URL = 'https://stacker.news'
const SITE_TITLE = 'Stacker News' const SITE_TITLE = 'Stacker News'
const SITE_SUBTITLE = 'Like Hacker News, but we pay you Bitcoin.' const SITE_SUBTITLE = 'Like Hacker News, but we pay you Bitcoin.'
@ -29,7 +31,7 @@ const generateRssItem = (item) => {
` `
} }
export default function generateRssFeed (items) { function generateRssFeed (items) {
const itemsList = items.map(generateRssItem) const itemsList = items.map(generateRssItem)
return `<?xml version="1.0" encoding="UTF-8" ?> return `<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"> <rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
@ -45,3 +47,21 @@ export default function generateRssFeed (items) {
</rss> </rss>
` `
} }
export default function getGetRssServerSideProps(query, variables = null) {
return async function ({ req, res }) {
const emptyProps = { props: {} } // to avoid server side warnings
const client = await getSSRApolloClient(req)
const { error, data: { items: { items } } } = await client.query({
query, variables
})
if (!items || error) return emptyProps
res.setHeader('Content-Type', 'text/xml; charset=utf-8')
res.write(generateRssFeed(items))
res.end()
return emptyProps
}
}

View File

@ -1,24 +1,9 @@
import getSSRApolloClient from '../api/ssrApollo' import getGetRssServerSideProps from '../lib/rss'
import generateRssFeed from '../lib/rss'
import { ITEMS } from '../fragments/items' import { ITEMS } from '../fragments/items'
export default function RssFeed () { export default function RssFeed () {
return null return null
} }
export async function getServerSideProps ({ req, res }) { export const getServerSideProps = getGetRssServerSideProps(ITEMS);
const emptyProps = { props: {} } // to avoid server side warnings
const client = await getSSRApolloClient(req)
const { error, data: { items: { items } } } = await client.query({
query: ITEMS
})
if (!items || error) return emptyProps
res.setHeader('Content-Type', 'text/xml; charset=utf-8')
res.write(generateRssFeed(items))
res.end()
return emptyProps
}

9
pages/~/[sub]/rss.js Normal file
View File

@ -0,0 +1,9 @@
import getGetRssServerSideProps from '../../../lib/rss'
import { ITEMS } from '../../../fragments/items'
export default function RssFeed () {
return null
}
export const getServerSideProps = ({ req, res, params }) => getGetRssServerSideProps(ITEMS, { sub: params.sub })({ req, res });