@@ -21,48 +21,52 @@ export default function BlogIndexPage() {
21
21
const router = useRouter ( ) ;
22
22
const { navItems } = useContext ( BlogContext ) ;
23
23
24
- const [ posts , setPosts ] = useState < IBlogPost [ ] > (
25
- navItems
26
- ? navItems . sort ( ( i1 : IBlogPost , i2 : IBlogPost ) => {
27
- const i1Date = new Date ( i1 . date ) ;
28
- const i2Date = new Date ( i2 . date ) ;
24
+ const [ posts , setPosts ] = useState < IBlogPost [ ] > ( [ ] ) ;
25
+ const [ isClient , setIsClient ] = useState ( false ) ;
26
+ const [ visiblePosts , setVisiblePosts ] = useState ( 9 ) ; // Number of posts initially visible
29
27
30
- if ( i1 . featured && ! i2 . featured ) return - 1 ;
31
- if ( ! i1 . featured && i2 . featured ) return 1 ;
28
+ useEffect ( ( ) => {
29
+ if ( navItems ) {
30
+ const sortedPosts = navItems . sort ( ( i1 : IBlogPost , i2 : IBlogPost ) => {
31
+ const i1Date = new Date ( i1 . date ) ;
32
+ const i2Date = new Date ( i2 . date ) ;
32
33
33
- return i2Date . getTime ( ) - i1Date . getTime ( ) ;
34
- } )
35
- : [ ]
36
- ) ;
37
- const [ isClient , setIsClient ] = useState ( false ) ;
34
+ if ( i1 . featured && ! i2 . featured ) return - 1 ;
35
+ if ( ! i1 . featured && i2 . featured ) return 1 ;
36
+
37
+ return i2Date . getTime ( ) - i1Date . getTime ( ) ;
38
+ } ) ;
38
39
39
- const onFilter = ( data : IBlogPost [ ] ) => setPosts ( data ) ;
40
- const toFilter = [
41
- {
42
- name : 'type'
43
- } ,
44
- {
45
- name : 'authors' ,
46
- unique : 'name'
47
- } ,
48
- {
49
- name : 'tags'
40
+ setPosts ( sortedPosts ) ;
50
41
}
51
- ] ;
42
+ } , [ navItems ] ) ;
43
+
44
+ useEffect ( ( ) => {
45
+ setIsClient ( true ) ;
46
+ } , [ ] ) ;
47
+
48
+ const loadMore = ( ) => {
49
+ setVisiblePosts ( ( prev ) => prev + 9 ) ; // Load additional 9 posts
50
+ } ;
51
+
52
+ const onFilter = ( data : IBlogPost [ ] ) => {
53
+ setPosts ( data ) ;
54
+ setVisiblePosts ( 9 ) ; // Reset visible posts on filter change
55
+ } ;
56
+
57
+ const toFilter = [ { name : 'type' } , { name : 'authors' , unique : 'name' } , { name : 'tags' } ] ;
58
+
52
59
const clearFilters = ( ) => {
53
60
router . push ( `${ router . pathname } ` , undefined , {
54
61
shallow : true
55
62
} ) ;
56
63
} ;
64
+
57
65
const showClearFilters = Object . keys ( router . query ) . length > 0 ;
58
66
59
67
const description = 'Find the latest and greatest stories from our community' ;
60
68
const image = '/img/social/blog.webp' ;
61
69
62
- useEffect ( ( ) => {
63
- setIsClient ( true ) ;
64
- } , [ ] ) ;
65
-
66
70
return (
67
71
< GenericLayout title = 'Blog' description = { description } image = { image } wide >
68
72
< div className = 'relative px-4 pb-20 pt-8 sm:px-6 lg:px-8 lg:pb-28 lg:pt-12' id = 'main-content' >
@@ -122,7 +126,7 @@ export default function BlogIndexPage() {
122
126
) }
123
127
{ Object . keys ( posts ) . length > 0 && isClient && (
124
128
< ul className = 'mx-auto mt-12 grid max-w-lg gap-5 lg:max-w-none lg:grid-cols-3' >
125
- { posts . map ( ( post , index ) => (
129
+ { posts . slice ( 0 , visiblePosts ) . map ( ( post , index ) => (
126
130
< BlogPostItem key = { index } post = { post } />
127
131
) ) }
128
132
</ ul >
@@ -132,6 +136,17 @@ export default function BlogIndexPage() {
132
136
< Loader loaderText = 'Loading Blogs' className = 'mx-auto my-60' pulsating />
133
137
</ div >
134
138
) }
139
+ { visiblePosts < posts . length && isClient && (
140
+ < div className = 'mt-8 flex justify-center' >
141
+ < button
142
+ type = 'button'
143
+ className = 'rounded-md bg-primary-500 px-6 py-3 text-white shadow-md transition duration-300 hover:bg-primary-600'
144
+ onClick = { loadMore }
145
+ >
146
+ Load More
147
+ </ button >
148
+ </ div >
149
+ ) }
135
150
</ div >
136
151
</ div >
137
152
</ div >
0 commit comments