Skip to content

Commit d050c5d

Browse files
committed
fix #5975
1 parent 8700564 commit d050c5d

File tree

4 files changed

+98
-3
lines changed

4 files changed

+98
-3
lines changed

src/shared/components/Contentful/Viewport/index.jsx

Lines changed: 65 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import BlogFeed from 'containers/Contentful/BlogFeed';
1717
import { errors } from 'topcoder-react-lib';
1818
import LoadingIndicator from 'components/LoadingIndicator';
1919
import PT from 'prop-types';
20-
import React from 'react';
20+
import React, { useState } from 'react';
2121
import Countdown from 'components/Contentful/Countdown';
2222
import Tabs from 'components/Contentful/Tabs';
2323
import AppComponentLoader from 'components/Contentful/AppComponent';
@@ -30,11 +30,13 @@ import Article from 'components/Contentful/Article';
3030
import { isomorphy } from 'topcoder-react-utils';
3131
import MemberTalkCloud from 'components/Contentful/MemberTalkCloud';
3232
import Masonry from 'react-masonry-css';
33+
import { PrimaryButton } from 'topcoder-react-ui-kit';
3334

3435
// AOS
3536
import AOS from 'aos';
3637
import 'aos/dist/aos.css';
3738

39+
import tc from 'components/buttons/themed/tc.scss';
3840
import Viewport from './Viewport';
3941

4042
import 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. */
8288
function 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

185239
ViewportContentLoader.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
})}

src/shared/components/Contentful/Viewport/themes/column.scss

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,14 @@
22
flex-direction: column;
33
width: 100%;
44
}
5+
6+
.loadMoreWrapper {
7+
display: flex;
8+
flex-direction: column;
9+
10+
.loadMoreButtonContainer {
11+
display: flex;
12+
justify-content: center;
13+
align-items: center;
14+
}
15+
}

src/shared/components/Contentful/Viewport/themes/grid.scss

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,3 +24,14 @@
2424
}
2525
}
2626
}
27+
28+
.loadMoreWrapper {
29+
display: flex;
30+
flex-direction: column;
31+
32+
.loadMoreButtonContainer {
33+
display: flex;
34+
justify-content: center;
35+
align-items: center;
36+
}
37+
}

src/shared/components/Contentful/Viewport/themes/masonry.scss

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,3 +21,14 @@ $gutterSize: 20px;
2121
}
2222
}
2323
}
24+
25+
.loadMoreWrapper {
26+
display: flex;
27+
flex-direction: column;
28+
29+
.loadMoreButtonContainer {
30+
display: flex;
31+
justify-content: center;
32+
align-items: center;
33+
}
34+
}

0 commit comments

Comments
 (0)