app-sleepy-manatee-skip/lib/blog.ts

74 lines
2.3 KiB
TypeScript

import glob from "fast-glob";
interface Blog {
title: string;
description: string;
author: {
name: string;
src: string;
};
date: string;
image?: string;
}
export interface BlogWithSlug extends Blog {
slug: string;
}
// Hardcoded blog data to avoid MDX export issues at build time
// This prevents "createContext only works in Client Components" errors
const blogData: Record<string, Blog> = {
"refactoring-ui-book-review": {
author: { name: "Alice Johnson", src: "/avatar.webp" },
date: "2023-11-15",
title: "Refactoring UI Book Review",
description: "A comprehensive review of the popular design book 'Refactoring UI' and its practical applications in modern web development.",
image: "https://images.unsplash.com/photo-1506880018603-83d5b814b5a6?w=800&h=400&fit=crop"
},
"rust-vs-go-for-backend": {
author: { name: "Bob Smith", src: "/avatar.webp" },
date: "2023-11-10",
title: "Rust vs Go for Backend Development",
description: "An in-depth comparison of Rust and Go for building scalable backend services.",
image: "https://images.unsplash.com/photo-1461749280684-dccba630e2f6?w=800&h=400&fit=crop"
},
"best-react-libraries-2024": {
author: { name: "Charlie Davis", src: "/avatar.webp" },
date: "2023-11-05",
title: "Best React Libraries in 2024",
description: "Discover the most useful React libraries and tools that will boost your productivity in 2024.",
image: "https://images.unsplash.com/photo-1633356122544-f134324a6cee?w=800&h=400&fit=crop"
}
};
export async function getAllBlogs() {
// Still use glob to find existing blog files
let blogFilenames = await glob("*/page.mdx", {
cwd: "./app/blog",
});
// Map filenames to blog data
const blogs = blogFilenames.map(filename => {
const slug = filename.replace(/(\/page)?\.mdx$/, "");
const blog = blogData[slug];
if (!blog) {
// Fallback data if blog not found in hardcoded data
return {
slug,
title: slug.replace(/-/g, " ").replace(/\b\w/g, l => l.toUpperCase()),
description: "Blog article",
author: { name: "Author", src: "/avatar.webp" },
date: new Date().toISOString().split('T')[0],
image: ""
};
}
return {
slug,
...blog
};
});
return blogs.sort((a, z) => +new Date(z.date) - +new Date(a.date));
}