Skip to content

Commit 3084810

Browse files
committed
fix: approvals number should increase automatically
1 parent 0eb9250 commit 3084810

File tree

5 files changed

+45
-11
lines changed

5 files changed

+45
-11
lines changed

__tests__/shared/components/tc-communities/__snapshots__/JoinCommunity.jsx.snap

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ exports[`Matches shallow shapshot 2`] = `
6565
Joining...
6666
</span>
6767
<ThemedLoadingIndicator
68+
className=""
6869
composeAdhocTheme="deeply"
6970
composeContextTheme="softly"
7071
mapThemrProps={[Function]}

config/default.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -467,5 +467,6 @@ module.exports = {
467467
TIMELINE: {
468468
REJECTION_EVENT_REASONS: ['Duplicate Event', 'Violates the Topcoder terms', 'Inaccurate or Invalid'],
469469
ALLOWED_FILETYPES: ['image/jpeg', 'image/png', 'video/mp4', 'video/x-msvideo', 'video/webm'],
470+
FETCHING_PENDING_APPROVAL_EVENTS_INTERVAL: 5 * 60 * 1000, // 5 minutes
470471
},
471472
};

src/shared/components/LoadingIndicator/index.jsx

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,12 @@
88
import PT from 'prop-types';
99
import React from 'react';
1010
import { themr } from 'react-css-super-themr';
11+
import cn from 'classnames';
1112
import style from './styles.scss';
1213

13-
const LoadingIndicator = ({ theme }) => (
14+
const LoadingIndicator = ({ theme, className }) => (
1415
<svg
15-
className={theme.container}
16+
className={cn(theme.container, className)}
1617
viewBox="0 0 64 64"
1718
>
1819
<circle
@@ -32,8 +33,13 @@ const LoadingIndicator = ({ theme }) => (
3233
</svg>
3334
);
3435

36+
LoadingIndicator.defaultProps = {
37+
className: '',
38+
};
39+
3540
LoadingIndicator.propTypes = {
3641
theme: PT.shape().isRequired,
42+
className: PT.string,
3743
};
3844

3945
export default themr('LoadingIndicator', style)(LoadingIndicator);

src/shared/containers/timeline-wall/index.jsx

Lines changed: 33 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React, { useState, useEffect } from 'react';
1+
import React, { useState, useEffect, useRef } from 'react';
22
import PT from 'prop-types';
33
import { connect } from 'react-redux';
44
import TopBanner from 'assets/images/timeline-wall/top-banner.png';
@@ -9,15 +9,19 @@ import cn from 'classnames';
99
import moment from 'moment';
1010
import { useMediaQuery } from 'react-responsive';
1111
import _ from 'lodash';
12+
import { config } from 'topcoder-react-utils';
1213
import timelineActions from 'actions/timelineWall';
1314
import LoadingIndicator from 'components/LoadingIndicator';
1415
import TimelineEvents from './timeline-events';
1516
import PendingApprovals from './pending-approvals';
1617

1718
import './styles.scss';
1819

20+
21+
const FETCHING_PENDING_APPROVAL_EVENTS_INTERVAL = _.get(config, 'TIMELINE.FETCHING_PENDING_APPROVAL_EVENTS_INTERVAL', 0);
1922
function TimelineWallContainer(props) {
2023
const [tab, setTab] = useState(0);
24+
const fetchingApprovalsInterval = useRef(null);
2125
const [showRightFilterMobile, setShowRightFilterMobile] = useState(false);
2226
const [selectedFilterValue, setSelectedFilterValue] = useState({
2327
year: 0,
@@ -36,6 +40,7 @@ function TimelineWallContainer(props) {
3640
getAvatar,
3741
userAvatars,
3842
pendingApprovals,
43+
loadingApprovals,
3944
uploading,
4045
uploadResult,
4146
} = props;
@@ -55,9 +60,25 @@ function TimelineWallContainer(props) {
5560
}, []);
5661

5762
useEffect(() => {
58-
if (authToken && isAdmin && !pendingApprovals.length) {
63+
if (fetchingApprovalsInterval.current) {
64+
clearInterval(fetchingApprovalsInterval.current);
65+
fetchingApprovalsInterval.current = null;
66+
}
67+
if (authToken && isAdmin) {
5968
getPendingApprovals(authToken);
69+
if (FETCHING_PENDING_APPROVAL_EVENTS_INTERVAL) {
70+
fetchingApprovalsInterval.current = setInterval(() => {
71+
getPendingApprovals(authToken);
72+
}, FETCHING_PENDING_APPROVAL_EVENTS_INTERVAL);
73+
}
6074
}
75+
76+
return () => {
77+
if (fetchingApprovalsInterval.current) {
78+
clearInterval(fetchingApprovalsInterval.current);
79+
fetchingApprovalsInterval.current = null;
80+
}
81+
};
6182
}, [isAdmin]);
6283

6384
useEffect(() => {
@@ -72,7 +93,7 @@ function TimelineWallContainer(props) {
7293
}, [events]);
7394

7495
useEffect(() => {
75-
if ((pendingApprovals || []).length) {
96+
if (pendingApprovals.length) {
7697
_.uniqBy(pendingApprovals, 'createdBy').forEach((eventItem) => {
7798
const photoURL = _.get(userAvatars, eventItem.createdBy);
7899
if (!photoURL) {
@@ -205,8 +226,10 @@ function TimelineWallContainer(props) {
205226
/>
206227
<React.Fragment>
207228
{
208-
loading ? (
209-
<LoadingIndicator />
229+
loadingApprovals ? (
230+
<LoadingIndicator
231+
styleName={cn({ hide: tab === 0 })}
232+
/>
210233
) : (
211234
<PendingApprovals
212235
events={pendingApprovals}
@@ -232,6 +255,7 @@ TimelineWallContainer.defaultProps = {
232255
auth: null,
233256
isAdmin: false,
234257
loading: false,
258+
loadingApprovals: false,
235259
uploading: false,
236260
uploadResult: '',
237261
events: [],
@@ -246,6 +270,7 @@ TimelineWallContainer.propTypes = {
246270
auth: PT.shape(),
247271
isAdmin: PT.bool,
248272
loading: PT.bool,
273+
loadingApprovals: PT.bool,
249274
uploading: PT.bool,
250275
uploadResult: PT.string,
251276
events: PT.arrayOf(PT.shape()),
@@ -264,11 +289,13 @@ const mapStateToProps = state => ({
264289
},
265290
isAdmin: state.timelineWall.isAdmin,
266291
loading: state.timelineWall.loading,
292+
loadingApprovals: state.timelineWall.loadingApprovals
293+
&& !(state.timelineWall.pendingApprovals || []).length,
267294
uploading: state.timelineWall.uploading,
268295
uploadResult: state.timelineWall.uploadResult,
269296
events: state.timelineWall.events,
270297
userAvatars: state.timelineWall.userAvatars,
271-
pendingApprovals: state.timelineWall.pendingApprovals,
298+
pendingApprovals: state.timelineWall.pendingApprovals || [],
272299
});
273300

274301
function mapDispatchToProps(dispatch) {

src/shared/reducers/timelineWall.js

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,7 @@ function onEventsDone(state, { payload }) {
6060
function onPendingApprovalInit(state) {
6161
return {
6262
...state,
63-
loading: true,
64-
pendingApprovals: [],
63+
loadingApprovals: true,
6564
};
6665
}
6766

@@ -74,7 +73,7 @@ function onPendingApprovalDone(state, { payload }) {
7473
const approvals = _.isArray(payload) ? payload : [];
7574
return {
7675
...state,
77-
loading: false,
76+
loadingApprovals: false,
7877
pendingApprovals: approvals,
7978
};
8079
}

0 commit comments

Comments
 (0)