|
1 | 1 | import { queryContent } from '#imports' |
2 | 2 | import type { BlogArticle, BlogAlternateLanguageLink, BlogAlternateHeader } from '~/types/blog' |
| 3 | +import { createError } from '#imports' |
3 | 4 |
|
4 | 5 | export interface BlogOverviewOptions { |
5 | 6 | /** |
@@ -32,13 +33,28 @@ export function useBlogOverview(options: BlogOverviewOptions = {}) { |
32 | 33 | { watch: [locale] } |
33 | 34 | ) |
34 | 35 |
|
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 | + } |
38 | 42 |
|
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)) |
42 | 58 |
|
43 | 59 | const page = ref(options.page ?? 1) |
44 | 60 | const pageSize = options.pageSize |
@@ -105,6 +121,17 @@ export function useBlogArticle() { |
105 | 121 | .where('_path', '=', contentPath.value) |
106 | 122 | .findOne() |
107 | 123 |
|
| 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 | + |
108 | 135 | return (doc as BlogArticle | null) || null |
109 | 136 | }, |
110 | 137 | { watch: [locale, slug] } |
|
0 commit comments