@@ -22,13 +22,16 @@ import { useTranslations } from "next-intl";
2222import { useLanguage } from "@/hooks/useLanguage" ;
2323import { khitHaungg } from "@/fonts/fonts" ;
2424
25+ import { useBlogList } from "@/hooks/blog/useBlogList" ;
26+
2527/* ── Types ── */
2628type BlogItem = {
2729 _id : string ;
2830 title : string ;
2931 description ?: string ;
3032 date : string ;
3133 slug : string ;
34+ source ?: "static" | "firestore" ;
3235} ;
3336
3437/* ── Floating ambient orbs ── */
@@ -421,7 +424,7 @@ const EmptyState = ({ isInView, mmFont, t }: { isInView: boolean; mmFont: string
421424) ;
422425
423426/* ── Main Blog Page Client ── */
424- const BlogPageClient = ( { blogs } : { blogs : BlogItem [ ] } ) => {
427+ const BlogPageClient = ( { blogs : staticBlogs } : { blogs : BlogItem [ ] } ) => {
425428 const heroRef = useRef ( null ) ;
426429 const gridRef = useRef ( null ) ;
427430 const heroInView = useInView ( heroRef , { amount : 0.3 , once : true } ) ;
@@ -430,6 +433,19 @@ const BlogPageClient = ({ blogs }: { blogs: BlogItem[] }) => {
430433 const { isMyanmar } = useLanguage ( ) ;
431434 const mmFont = isMyanmar ? khitHaungg . className : "" ;
432435
436+ // Merge static + Firestore blogs with pagination
437+ const { firestoreBlogs, loading : firestoreLoading , hasMore, loadMore, loadingMore } = useBlogList ( 10 ) ;
438+ const firestoreItems : BlogItem [ ] = firestoreBlogs . map ( ( p ) => ( {
439+ _id : p . id ,
440+ title : p . title ,
441+ description : p . description ,
442+ date : ( p . publishedAt ?? p . createdAt ) . toISOString ( ) ,
443+ slug : `/blog/post?slug=${ p . slug } ` ,
444+ source : "firestore" as const ,
445+ } ) ) ;
446+ const blogs = [ ...staticBlogs . map ( ( b ) => ( { ...b , source : "static" as const } ) ) , ...firestoreItems ]
447+ . sort ( ( a , b ) => new Date ( b . date ) . getTime ( ) - new Date ( a . date ) . getTime ( ) ) ;
448+
433449 const hasPosts = blogs . length > 0 ;
434450 const [ featured , ...rest ] = blogs ;
435451
@@ -595,7 +611,20 @@ const BlogPageClient = ({ blogs }: { blogs: BlogItem[] }) => {
595611 { /* Blog grid */ }
596612 < div ref = { gridRef } className = "relative z-10 pb-16" >
597613 < Container withPadding >
598- { ! hasPosts ? (
614+ { firestoreLoading && staticBlogs . length === 0 ? (
615+ < motion . div
616+ className = "flex items-center justify-center py-20"
617+ initial = { { opacity : 0 } }
618+ animate = { { opacity : 1 } }
619+ >
620+ < div className = "flex flex-col items-center gap-3" >
621+ < div className = "w-6 h-6 border-2 border-prism-violet/30 border-t-prism-violet rounded-full animate-spin" />
622+ < span className = { cn ( "text-[11px] font-mono text-zinc-600" , mmFont ) } >
623+ Loading blogs...
624+ </ span >
625+ </ div >
626+ </ motion . div >
627+ ) : ! hasPosts ? (
599628 < EmptyState isInView = { gridInView } mmFont = { mmFont } t = { t } />
600629 ) : (
601630 < div className = "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-5" >
@@ -618,6 +647,38 @@ const BlogPageClient = ({ blogs }: { blogs: BlogItem[] }) => {
618647 ) ) }
619648 </ div >
620649 ) }
650+
651+ { /* Load More */ }
652+ { hasMore && (
653+ < motion . div
654+ className = "flex justify-center mt-10"
655+ initial = { { opacity : 0 } }
656+ animate = { gridInView ? { opacity : 1 } : { opacity : 0 } }
657+ transition = { { delay : 0.5 } }
658+ >
659+ < button
660+ type = "button"
661+ onClick = { loadMore }
662+ disabled = { loadingMore }
663+ className = { cn (
664+ "inline-flex items-center gap-2 px-6 py-3 rounded-xl text-sm font-medium" ,
665+ "bg-white/[0.04] border border-white/[0.08]" ,
666+ "text-zinc-400 hover:text-white hover:bg-white/[0.08] hover:border-white/[0.12]" ,
667+ "transition-all duration-300" ,
668+ "disabled:opacity-40 disabled:cursor-not-allowed"
669+ ) }
670+ >
671+ { loadingMore ? (
672+ < >
673+ < div className = "w-4 h-4 border-2 border-zinc-600 border-t-zinc-300 rounded-full animate-spin" />
674+ Loading...
675+ </ >
676+ ) : (
677+ "Load more posts"
678+ ) }
679+ </ button >
680+ </ motion . div >
681+ ) }
621682 </ Container >
622683 </ div >
623684 </ div >
0 commit comments