Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
55 changes: 55 additions & 0 deletions _api/retrieveFromRss.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
import { parseAtomFeed } from 'feedsmith'

export default async (req) => {
try {
const REQUEST_URL = new URL(req.url)
if (REQUEST_URL.searchParams.get("page")) {
pageParam = REQUEST_URL.searchParams.get("page")
} else {
pageParam = 1
}

const MAX_PAGE_SIZE = 6

const result = await fetch('https://tilda.bearblog.dev/feed/', {
headers: {
'User-Agent': 'flourite (github.com/tilda/web, mailto:me@til.pm)',
'Accept': 'application/atom+xml'
}
})
if (!result.ok) {
throw new Error(`Caught HTTP error code ${result.status} while requesting from Bear`)
}
const BEAR_RESPONSE = await result.text()
const feed = parseAtomFeed(BEAR_RESPONSE)

if (feed.entries) {
const PAGE_LIMIT = Number.parseInt((feed.entries.length / MAX_PAGE_SIZE + 1).toFixed(0), 10)

if (pageParam > PAGE_LIMIT) {
throw new Error(`Requested page ${pageParam} does not currently exist`)
}

return Response.json({
'current_page': pageParam,
'max_pages': PAGE_LIMIT,
'items': feed.entries.slice((pageParam - 1) * MAX_PAGE_SIZE, pageParam * MAX_PAGE_SIZE)
}, {
headers: {
'Netlify-Vary': 'query=page',
'Netlify-CDN-Cache-Control': 'public, max-age=300, stale-while-revalidate=30, durable',
}
})
} else {
return Response(null, { status: 204 })
}
} catch (err) {
console.log(err)

return Response.json({
'error': err.toString()
}, {
status: 400
})
}
}
46 changes: 34 additions & 12 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

15 changes: 15 additions & 0 deletions src/components/BlogCard.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<template>
<a :href="link">
<div class="w-96 h-36 bg-">
<div class="text-sm">{{ date }}</div>
<h3 class="text-md">{{ title }}</h3>
<div class="text-sm">{{ description }}</div>
</div>
</a>
</template>

<script setup>
import { defineProps } from 'vue'

const props = defineProps(['title', 'description', 'link', 'date'])
</script>
2 changes: 2 additions & 0 deletions src/views/BlogView.vue
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
<template>
<p>blog hosting kindly provided by <a href="https://tilda.bearblog.dev">bear</a>; <a href="https://tilda.bearblog.dev/feed">RSS feed available here</a>.</p>

<p class="italic">displaying n posts on page x/x</p>
</template>

<script setup>
Expand Down