Files
QR-master/src/lib/content.ts
Timo Knuth 76bde71585 fix: correct metadata dates, remove draft note, remove duplicate section
- Fixed all 'undefined NaN, NaN' dates in metadata divs across all 22 posts
- Removed draft instruction from qr-code-scan-statistics-2026
- Removed duplicate 'Trackable / dynamic QR code' section from trackable-qr-codes
- All posts now have proper 'Last updated' dates showing January 26, 2026
2026-03-06 16:01:01 +01:00

60 lines
2.2 KiB
TypeScript

import { blogPosts } from "./blog-data";
import { authors } from "./author-data";
import type { BlogPost, PillarKey, AuthorProfile } from "./types";
export function getPublishedPosts(): BlogPost[] {
const currentDate = new Date();
return blogPosts.filter(p => {
if (!p.published) return false;
const publishDate = p.datePublished ? new Date(p.datePublished) : new Date(p.date);
return publishDate <= currentDate;
});
}
export function getPostBySlug(slug: string): BlogPost | undefined {
return blogPosts.find(p => p.slug === slug);
}
export function getPublishedPostBySlug(slug: string): BlogPost | undefined {
const p = getPostBySlug(slug);
if (!p?.published) return undefined;
const currentDate = new Date();
const publishDate = p.datePublished ? new Date(p.datePublished) : new Date(p.date);
return publishDate <= currentDate ? p : undefined;
}
export function getPostsByPillar(pillar: PillarKey): BlogPost[] {
return getPublishedPosts()
.filter(p => p.pillar === pillar)
.sort((a, b) => (new Date(a.datePublished).getTime() < new Date(b.datePublished).getTime() ? 1 : -1));
}
export function getAuthorBySlug(slug: string): AuthorProfile | undefined {
return authors.find(a => a.slug === slug);
}
export function getPostsByAuthor(slug: string): BlogPost[] {
return getPublishedPosts()
.filter(p => p.authorSlug === slug)
.sort((a, b) => (new Date(a.datePublished).getTime() < new Date(b.datePublished).getTime() ? 1 : -1));
}
export function getRelatedPosts(post: BlogPost, limit = 4): BlogPost[] {
const published = getPublishedPosts();
// explicit relatedSlugs first
const explicit = (post.relatedSlugs ?? [])
.map(s => published.find(p => p.slug === s))
.filter((p): p is BlogPost => !!p);
if (explicit.length >= limit) return explicit.slice(0, limit);
// fallback: same pillar, not itself, newest
const fallback = published
.filter(p => p.slug !== post.slug && p.pillar === post.pillar)
.slice(0, limit - explicit.length);
return [...explicit, ...fallback];
}