@@ -17,7 +17,7 @@ import BlogFeed from 'containers/Contentful/BlogFeed';
1717import { errors } from 'topcoder-react-lib' ;
1818import LoadingIndicator from 'components/LoadingIndicator' ;
1919import PT from 'prop-types' ;
20- import React from 'react' ;
20+ import React , { useState } from 'react' ;
2121import Countdown from 'components/Contentful/Countdown' ;
2222import Tabs from 'components/Contentful/Tabs' ;
2323import AppComponentLoader from 'components/Contentful/AppComponent' ;
@@ -30,11 +30,13 @@ import Article from 'components/Contentful/Article';
3030import { isomorphy } from 'topcoder-react-utils' ;
3131import MemberTalkCloud from 'components/Contentful/MemberTalkCloud' ;
3232import Masonry from 'react-masonry-css' ;
33+ import { PrimaryButton } from 'topcoder-react-ui-kit' ;
3334
3435// AOS
3536import AOS from 'aos' ;
3637import 'aos/dist/aos.css' ;
3738
39+ import tc from 'components/buttons/themed/tc.scss' ;
3840import Viewport from './Viewport' ;
3941
4042import columnTheme from './themes/column.scss' ;
@@ -78,6 +80,10 @@ const THEMES = {
7880 Masonry : masonryTheme ,
7981} ;
8082
83+ const buttonThemes = {
84+ tc,
85+ } ;
86+
8187/* Loads viewport content assets. */
8288function ViewportContentLoader ( props ) {
8389 const {
@@ -91,12 +97,19 @@ function ViewportContentLoader(props) {
9197 viewportId,
9298 animationOnScroll,
9399 masonryConfig,
100+ itemsPerPage,
101+ loadMoreButtonText,
102+ loadMoreButtonTheme,
103+ loadMoreButtonContainerStyles,
94104 } = props ;
95105 let {
96106 extraStylesForContainer,
97107 } = props ;
108+ const [ page , setPage ] = useState ( 1 ) ;
98109
99- const getInner = data => contentIds . map ( ( id ) => {
110+ const getInner = data => contentIds . slice (
111+ 0 , ( itemsPerPage ? itemsPerPage * page : contentIds . length ) ,
112+ ) . map ( ( id ) => {
100113 const type = data . entries . items [ id ] . sys . contentType . sys . id ;
101114 const Component = COMPONENTS [ type ] ;
102115 if ( Component ) {
@@ -146,7 +159,44 @@ function ViewportContentLoader(props) {
146159 AOS . init ( ) ;
147160 }
148161 }
149- return (
162+ return itemsPerPage ? (
163+ < div className = { theme . loadMoreWrapper } >
164+ < Viewport
165+ viewportId = { viewportId }
166+ extraStylesForContainer = { fixStyle ( extraStylesForContainer ) }
167+ theme = { theme }
168+ animation = { animation }
169+ >
170+ {
171+ themeName === 'Masonry' && masonryConfig ? (
172+ < Masonry breakpointCols = { masonryConfig } className = "viewport-masonry-grid" columnClassName = "viewport-masonry-grid_column" >
173+ { getInner ( data ) }
174+ </ Masonry >
175+ ) : getInner ( data )
176+ }
177+ </ Viewport >
178+ {
179+ page * itemsPerPage < contentIds . length && (
180+ < div
181+ className = { theme . loadMoreButtonContainer }
182+ style = { fixStyle ( loadMoreButtonContainerStyles ) }
183+ >
184+ < PrimaryButton
185+ onClick = { ( ) => {
186+ setPage ( page + 1 ) ;
187+ } }
188+ theme = { {
189+ button : buttonThemes . tc [ loadMoreButtonTheme ] ,
190+ disabled : buttonThemes . tc . themedButtonDisabled ,
191+ } }
192+ >
193+ { loadMoreButtonText }
194+ </ PrimaryButton >
195+ </ div >
196+ )
197+ }
198+ </ div >
199+ ) : (
150200 < Viewport
151201 viewportId = { viewportId }
152202 extraStylesForContainer = { fixStyle ( extraStylesForContainer ) }
@@ -180,6 +230,10 @@ ViewportContentLoader.defaultProps = {
180230 } ) ,
181231 animationOnScroll : null ,
182232 masonryConfig : null ,
233+ itemsPerPage : null ,
234+ loadMoreButtonText : null ,
235+ loadMoreButtonTheme : null ,
236+ loadMoreButtonContainerStyles : null ,
183237} ;
184238
185239ViewportContentLoader . propTypes = {
@@ -194,6 +248,10 @@ ViewportContentLoader.propTypes = {
194248 baseUrl : PT . string . isRequired ,
195249 animationOnScroll : PT . shape ( ) ,
196250 masonryConfig : PT . shape ( ) ,
251+ itemsPerPage : PT . string ,
252+ loadMoreButtonText : PT . string ,
253+ loadMoreButtonTheme : PT . string ,
254+ loadMoreButtonContainerStyles : PT . shape ( ) ,
197255} ;
198256
199257/* Loads the main viewport entry. */
@@ -247,6 +305,10 @@ export function ViewportLoader(props) {
247305 baseUrl = { baseUrl }
248306 animationOnScroll = { viewport . fields . animationOnScroll }
249307 masonryConfig = { viewport . fields . masonryConfig }
308+ itemsPerPage = { viewport . fields . itemsPerPage }
309+ loadMoreButtonText = { viewport . fields . loadMoreButtonText }
310+ loadMoreButtonTheme = { viewport . fields . loadMoreButtonTheme }
311+ loadMoreButtonContainerStyles = { viewport . fields . loadMoreButtonContainerStyles }
250312 />
251313 ) ;
252314 } ) }
0 commit comments