diff --git a/src/assets/themes/wipro/wipro-logo.png b/src/assets/themes/wipro/wipro-logo.png new file mode 100644 index 0000000000..5ac77dd121 Binary files /dev/null and b/src/assets/themes/wipro/wipro-logo.png differ diff --git a/src/server/tc-communities/wipro/metadata.json b/src/server/tc-communities/wipro/metadata.json index 5ec5bd10d0..a47bb864f1 100644 --- a/src/server/tc-communities/wipro/metadata.json +++ b/src/server/tc-communities/wipro/metadata.json @@ -20,7 +20,7 @@ }], "leaderboardApiUrl": "https://api.topcoder.com/v4/looks/0/run/json/", "logos": [ - "https://upload.wikimedia.org/wikipedia/commons/thumb/0/0e/Wipro_Logo_RGB.png/480px-Wipro_Logo_RGB.png", + "/themes/wipro/wipro-logo.png", "/themes/wipro/logo_topcoder_with_name.svg" ], "menuItems": [ diff --git a/src/shared/actions/tc-communities/index.js b/src/shared/actions/tc-communities/index.js index a8398c22bb..b5937a3b39 100644 --- a/src/shared/actions/tc-communities/index.js +++ b/src/shared/actions/tc-communities/index.js @@ -18,5 +18,7 @@ export default createActions({ HIDE_JOIN_BUTTON: _.noop, JOIN_INIT: _.noop, JOIN_DONE: joinDone, + RESET_JOIN_BUTTON: _.noop, + SHOW_JOIN_CONFIRM_MODAL: _.noop, }, }); diff --git a/src/shared/components/tc-communities/JoinCommunity/index.jsx b/src/shared/components/tc-communities/JoinCommunity/index.jsx index fd673c7883..bbf2a60c08 100644 --- a/src/shared/components/tc-communities/JoinCommunity/index.jsx +++ b/src/shared/components/tc-communities/JoinCommunity/index.jsx @@ -7,6 +7,7 @@ /* global window */ +import _ from 'lodash'; import config from 'utils/config'; import LoadingIndicator from 'components/LoadingIndicator'; import Modal from 'components/Modal'; @@ -14,24 +15,37 @@ import PT from 'prop-types'; import React from 'react'; import style from './style.scss'; +export const STATE = { + CONFIRM_JOIN: 'confirm-join', + DEFAULT: 'default', + HIDDEN: 'hidden', + JOINED: 'joined', + JOINING: 'joining', +}; + export default function JoinCommunity({ - canJoin, communityName, groupId, hideJoinButton, join, - joined, - joining, + resetJoinButton, + showJoinConfirmModal, + state, token, userId, }) { - if (!canJoin) return
; + if (state === STATE.HIDDEN) return
; return (
- { joined ? ( + { state === STATE.JOINED ? (

Congratulations!

You have joined {communityName}!

@@ -58,6 +72,23 @@ export default function JoinCommunity({ >Return to the Community
) : null} + { state === STATE.CONFIRM_JOIN ? ( + +

+ Are you sure you want to join {communityName}? +

+
+ + +
+
+ ) : null}
); } @@ -69,13 +100,13 @@ JoinCommunity.defaultProps = { }; JoinCommunity.propTypes = { - canJoin: PT.bool.isRequired, communityName: PT.string.isRequired, groupId: PT.string, hideJoinButton: PT.func.isRequired, join: PT.func.isRequired, - joined: PT.bool.isRequired, - joining: PT.bool.isRequired, + resetJoinButton: PT.func.isRequired, + showJoinConfirmModal: PT.func.isRequired, + state: PT.oneOf(_.values(STATE)).isRequired, token: PT.string, userId: PT.string, }; diff --git a/src/shared/components/tc-communities/JoinCommunity/style.scss b/src/shared/components/tc-communities/JoinCommunity/style.scss index e408697637..00cd7a08b9 100644 --- a/src/shared/components/tc-communities/JoinCommunity/style.scss +++ b/src/shared/components/tc-communities/JoinCommunity/style.scss @@ -1,5 +1,58 @@ @import "~styles/tc-styles"; +@mixin button($color, $highlight-color) { + color: $color; + display: block; + background: $tc-white; + border: 1px solid $color; + border-radius: 20px; + font: 700 14px/40px 'Open Sans'; + margin: 24px auto; + height: 40px; + text-align: center; + text-transform: uppercase; + width: 171px; + + &:hover, + &:active, + &:focus, + &:visited { + color: $color; + outline: none; + text-decoration: none; + } + + &:hover { + background: $highlight-color; + } +} + +.confirmMsg { + @include tc-body; + + text-align: center; +} + +.btnCancel { + @include button($tc-light-blue, $tc-light-blue-10); + + display: inline-block; + margin: 24px 0 0 12px; + width: 100px; +} + +.btnConfirm { + @include button($tc-green, $tc-green-10); + + display: inline-block; + margin: 24px 12px 0 0; + width: 100px; +} + +.buttons { + text-align: center; +} + .done { color: $tc-light-blue; display: block; diff --git a/src/shared/containers/tc-communities/JoinCommunity.js b/src/shared/containers/tc-communities/JoinCommunity.js index ec03a10312..f0facb02b0 100644 --- a/src/shared/containers/tc-communities/JoinCommunity.js +++ b/src/shared/containers/tc-communities/JoinCommunity.js @@ -1,6 +1,8 @@ import _ from 'lodash'; import actions from 'actions/tc-communities'; -import JoinCommunity from 'components/tc-communities/JoinCommunity'; +import JoinCommunity, { + STATE as JOIN_COMMUNITY, +} from 'components/tc-communities/JoinCommunity'; import { connect } from 'react-redux'; function mapStateToProps(state) { @@ -11,13 +13,14 @@ function mapStateToProps(state) { item.id === state.tcCommunities.meta.challengeGroupId); if (state.tcCommunities.hideJoinButton) canJoin = false; + if (canJoin) canJoin = state.tcCommunities.joinCommunityButton; + else canJoin = JOIN_COMMUNITY.HIDDEN; + return { - canJoin, communityName: state.tcCommunities.meta.communityName, groupId: state.tcCommunities.meta.challengeGroupId, - joined: state.tcCommunities.joined, - joining: state.tcCommunities.joining, token: state.auth.tokenV3, + state: canJoin, userId: _.get(state.auth.user, 'userId'), }; } @@ -30,6 +33,8 @@ function mapDispatchToProps(dispatch) { dispatch(a.joinInit()); dispatch(a.joinDone(...args)); }, + resetJoinButton: () => dispatch(a.resetJoinButton()), + showJoinConfirmModal: () => dispatch(a.showJoinConfirmModal()), }; } diff --git a/src/shared/reducers/tc-communities/index.js b/src/shared/reducers/tc-communities/index.js index 931a9b6c13..994e112b79 100644 --- a/src/shared/reducers/tc-communities/index.js +++ b/src/shared/reducers/tc-communities/index.js @@ -9,6 +9,7 @@ import actions from 'actions/tc-communities'; import logger from 'utils/logger'; import { handleActions } from 'redux-actions'; import { combine, resolveReducers } from 'utils/redux'; +import { STATE as JOIN_COMMUNITY } from 'components/tc-communities/JoinCommunity'; import { factory as metaFactory } from './meta'; import { factory as newsFactory } from './news'; @@ -22,21 +23,29 @@ function onJoinDone(state, action) { * to see it normally. */ alert('Failed to join the group!'); // eslint-disable-line no-alert - return { ...state, joined: false, joining: false }; + return { ...state, joinCommunityButton: JOIN_COMMUNITY.DEFAULT }; } - return { ...state, joined: true }; + return { ...state, joinCommunityButton: JOIN_COMMUNITY.JOINED }; } function create(initialState = {}) { const a = actions.tcCommunity; return handleActions({ - [a.hideJoinButton]: state => ({ ...state, hideJoinButton: true }), - [a.joinInit]: state => ({ ...state, joining: true }), + [a.hideJoinButton]: state => ({ + ...state, joinCommunityButton: JOIN_COMMUNITY.HIDDEN, + }), + [a.joinInit]: state => ({ + ...state, joinCommunityButton: JOIN_COMMUNITY.JOINING, + }), [a.joinDone]: onJoinDone, + [a.resetJoinButton]: state => ({ + ...state, joinCommunityButton: JOIN_COMMUNITY.DEFAULT, + }), + [a.showJoinConfirmModal]: state => ({ + ...state, joinCommunityButton: JOIN_COMMUNITY.CONFIRM_JOIN, + }), }, _.defaults(_.clone(initialState), { - hideJoinButton: false, - joined: false, - joining: false, + joinCommunityButton: JOIN_COMMUNITY.DEFAULT, })); }