From d2a9d9193c6611ba5d37b0840c075f5db8fe395a Mon Sep 17 00:00:00 2001 From: Stefan Imhoff Date: Fri, 9 Jun 2023 18:35:09 +0200 Subject: [PATCH] feat: add helper to sort journal posts --- src/utils/format-posts.ts | 55 +++++++++++++++++++++++++++++++++++ src/utils/index.ts | 2 ++ src/utils/sort-by-alphabet.ts | 3 ++ 3 files changed, 60 insertions(+) create mode 100644 src/utils/format-posts.ts create mode 100644 src/utils/sort-by-alphabet.ts diff --git a/src/utils/format-posts.ts b/src/utils/format-posts.ts new file mode 100644 index 0000000..121917d --- /dev/null +++ b/src/utils/format-posts.ts @@ -0,0 +1,55 @@ +import { sortByAlphabet, sortByDate } from '.'; + +import type { CollectionEntry } from 'astro:content'; + +export const formatPosts = ( + posts: CollectionEntry<'journal'>[], + { + removeDrafts = true, + removeFuture = true, + sortBy = 'date', + sortOrder = 'desc', + limit, + }: { + removeDrafts?: boolean; + removeFuture?: boolean; + sortBy?: 'date' | 'alphabet' | 'random'; + sortOrder?: 'asc' | 'desc'; + limit?: number; + } +): CollectionEntry<'journal'>[] => { + const filteredPosts = posts.reduce((acc: CollectionEntry<'journal'>[], post) => { + const { date, draft } = post.data; + + // Remove draft content + if (removeDrafts && draft) return acc; + + // Remove future content + if (removeFuture && new Date(date) > new Date()) return acc; + + acc.push(post); + + return acc; + }, []); + + // Sort posts + if (sortBy === 'date') { + filteredPosts.sort(sortByDate); + } else if (sortBy === 'alphabet') { + filteredPosts.sort(sortByAlphabet); + } else { + filteredPosts.sort(() => Math.random() - 0.5); + } + + // Sort order + if (sortOrder === 'asc') { + filteredPosts.reverse(); + } + + // Limit number of posts + if (typeof limit === 'number') { + return filteredPosts.slice(0, limit); + } + + return filteredPosts; +}; diff --git a/src/utils/index.ts b/src/utils/index.ts index 24f4eeb..5b68f26 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -1,6 +1,8 @@ export * from './date'; +export * from './format-posts'; export * from './pick-two-random-colors'; export * from './remark-reading-time'; +export * from './sort-by-alphabet'; export * from './sort-by-date'; export * from './sort-by-sortkey'; export * from './word-count'; diff --git a/src/utils/sort-by-alphabet.ts b/src/utils/sort-by-alphabet.ts new file mode 100644 index 0000000..7978c7e --- /dev/null +++ b/src/utils/sort-by-alphabet.ts @@ -0,0 +1,3 @@ +export const sortByAlphabet = (a: any, b: any) => { + return a.data.title.localeCompare(b.data.title); +};