Skip to content

Commit 5e3f945

Browse files
committed
feat: allow scheduled blog releases
1 parent f1ad4df commit 5e3f945

File tree

2 files changed

+34
-6
lines changed

2 files changed

+34
-6
lines changed

composables/useBlogContent.ts

Lines changed: 33 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { queryContent } from '#imports'
22
import type { BlogArticle, BlogAlternateLanguageLink, BlogAlternateHeader } from '~/types/blog'
3+
import { createError } from '#imports'
34

45
export interface BlogOverviewOptions {
56
/**
@@ -32,13 +33,28 @@ export function useBlogOverview(options: BlogOverviewOptions = {}) {
3233
{ watch: [locale] }
3334
)
3435

35-
const top1Article = computed<BlogArticle | null>(
36-
() => (allPostsData.value || [])[0] || null
37-
)
36+
const isReleased = (entry: BlogArticle | null | undefined) => {
37+
if (!entry) return false
38+
const release = (entry as any).releaseDate || entry.pubDate
39+
if (!release) return true
40+
return new Date(release as any).getTime() <= Date.now()
41+
}
3842

39-
const remainingPosts = computed<BlogArticle[]>(() =>
40-
(allPostsData.value || []).slice(1)
41-
)
43+
const releaseDate = (entry: BlogArticle) =>
44+
(entry as any).releaseDate || entry.pubDate || new Date(0).toISOString()
45+
46+
const visiblePosts = computed<BlogArticle[]>(() => {
47+
const posts = (allPostsData.value || []).filter(isReleased)
48+
return posts.sort(
49+
(a, b) =>
50+
new Date(releaseDate(b) as any).getTime() -
51+
new Date(releaseDate(a) as any).getTime()
52+
)
53+
})
54+
55+
const top1Article = computed<BlogArticle | null>(() => visiblePosts.value[0] || null)
56+
57+
const remainingPosts = computed<BlogArticle[]>(() => visiblePosts.value.slice(1))
4258

4359
const page = ref(options.page ?? 1)
4460
const pageSize = options.pageSize
@@ -105,6 +121,17 @@ export function useBlogArticle() {
105121
.where('_path', '=', contentPath.value)
106122
.findOne()
107123

124+
const isReleased = (entry: BlogArticle | null | undefined) => {
125+
if (!entry) return false
126+
const release = (entry as any).releaseDate || entry.pubDate
127+
if (!release) return true
128+
return new Date(release as any).getTime() <= Date.now()
129+
}
130+
131+
if (doc && !isReleased(doc as BlogArticle)) {
132+
throw createError({ statusCode: 404, statusMessage: 'Article not released' })
133+
}
134+
108135
return (doc as BlogArticle | null) || null
109136
},
110137
{ watch: [locale, slug] }

types/blog.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ export type BlogArticle = (
2424
| BlogDeCollectionItem
2525
| BlogEnCollectionItem
2626
) & {
27+
releaseDate?: string | Date
2728
canonical?: string
2829
alternates?: BlogAlternateHeader[]
2930
seo?: BlogSEO

0 commit comments

Comments
 (0)