1
0
Fork 0
freesewing/sites/org/pages/blog/page/[page].mjs

134 lines
3.7 KiB
JavaScript
Raw Normal View History

2023-04-09 15:57:25 +02:00
// Dependencies
import { serverSideTranslations } from 'next-i18next/serverSideTranslations'
// Hooks
import { useTranslation } from 'next-i18next'
2023-04-09 15:57:25 +02:00
// Components
import Link from 'next/link'
import { TimeAgo } from 'shared/components/mdx/meta.mjs'
2023-04-09 15:57:25 +02:00
import { PageWrapper, ns as pageNs } from 'shared/components/wrappers/page.mjs'
import { Pagination } from 'shared/components/navigation/pagination.mjs'
import { postInfo, order } from 'site/prebuild/blog-paths.mjs'
2023-04-09 15:57:25 +02:00
// Translation namespaces used on this page
const namespaces = [...new Set(['designs', 'sections', ...pageNs])]
2023-04-09 15:57:25 +02:00
export const numPerPage = 12
const textShadow = {
style: {
textShadow:
'1px 1px 1px #000000, -1px -1px 1px #000000, 1px -1px 1px #000000, -1px 1px 1px #000000, 2px 2px 1px #000000',
},
}
const Preview = ({ post, t }) => (
<div className="shadow rounded-lg">
<Link href={`/${post.s}`} className="hover:underline">
<div
className="bg-base-100 w-full h-full overflow-hidden shadow flex flex-column items-center rounded-lg"
style={{
backgroundImage: `url(${post.i})`,
backgroundSize: 'cover',
}}
>
<div className="text-right my-2 w-full">
<div
className={`
bg-neutral text-neutral-content bg-opacity-40 text-right
px-4 py-1
lg:px-8 lg:py-4
`}
>
<h5
className={`
text-neutral-content
text-xl font-bold
md:text-2xl md:font-normal
xl:text-3xl
`}
{...textShadow}
>
{post.t}
</h5>
<p
className={`
hidden md:block
m-0 p-1 -mt-2
text-neutral-content
leading-normal text-sm font-normal
opacity-70
`}
{...textShadow}
>
<TimeAgo date={post.d} t={t} /> by <strong>{post.a}</strong>
</p>
</div>
</div>
</div>
</Link>
</div>
)
/*
* Each page MUST be wrapped in the PageWrapper component.
* You also MUST spread props.page into this wrapper component
* when path and locale come from static props (as here)
* or set them manually.
*/
2023-06-22 16:27:08 -05:00
const BlogIndexPage = ({ posts, page, current, total }) => {
const { t } = useTranslation()
return (
<PageWrapper {...page} t={t('sections:blog')}>
<div className="grid grid-cols-1 gap-4 lg:grid-cols-2 xl:grid-cols-3 max-w-7xl lg:pr-4 xl:pr-6">
{posts.map((post) => (
<Preview post={post} t={t} key={post.s} />
))}
</div>
2023-06-22 16:27:08 -05:00
<Pagination {...{ current, total }} />
</PageWrapper>
)
}
2023-04-09 15:57:25 +02:00
export default BlogIndexPage
2023-04-09 15:57:25 +02:00
2023-06-22 16:27:08 -05:00
export async function getStaticProps({ locale, params }) {
const pageNum = parseInt(params.page)
const postSlugs = order[locale].slice(numPerPage * (pageNum - 1), numPerPage * pageNum)
const posts = postSlugs.map((s) => ({ ...postInfo[locale][s], s }))
const numLocPages = Math.ceil(order[locale].length / numPerPage)
if (pageNum > numLocPages) {
return {
notFound: true,
}
}
2023-06-22 16:27:08 -05:00
2023-04-09 15:57:25 +02:00
return {
props: {
// designs,
posts,
2023-06-22 16:27:08 -05:00
current: pageNum,
total: numLocPages,
2023-04-09 15:57:25 +02:00
...(await serverSideTranslations(locale, namespaces)),
page: {
locale,
path: ['blog'],
2023-04-09 15:57:25 +02:00
},
},
}
}
2023-06-22 16:27:08 -05:00
export const getStaticPaths = async () => {
const paths = []
for (const language in order) {
const lPath = language === 'en' ? '' : `/${language}`
paths.push(`${lPath}/blog/page/1`)
paths.push(`${lPath}/blog/page/2`)
2023-06-22 16:27:08 -05:00
}
return {
paths,
fallback: 'blocking',
2023-06-22 16:27:08 -05:00
}
}