diff --git a/client/accept-invite/actions.js b/client/accept-invite/actions.js deleted file mode 100644 index 009c61e336fae..0000000000000 --- a/client/accept-invite/actions.js +++ /dev/null @@ -1,52 +0,0 @@ -/** - * Internal dependencies - */ -import wpcom from 'lib/wp' ; -import Dispatcher from 'dispatcher'; -import { DISPLAY_INVITE_ACCEPTED_NOTICE, DISMISS_INVITE_ACCEPTED_NOTICE, DISPLAY_INVITE_DECLINED_NOTICE, DISMISS_INVITE_DECLINED_NOTICE } from './invite-message/constants' - -export function createAccount( userData, callback ) { - return wpcom.undocumented().usersNew( - Object.assign( {}, userData, { validate: false } ), - ( error, response ) => { - const bearerToken = response && response.bearer_token; - callback( error, bearerToken ); - } - ); -} - -export function acceptInvite( invite, callback, bearerToken ) { - if ( bearerToken ) { - wpcom.loadToken( bearerToken ); - } - return wpcom.undocumented().acceptInvite( - invite.blog_id, - invite.invite_slug, - callback - ); -} - -export function displayInviteAccepted( siteId ) { - Dispatcher.handleViewAction( { - type: DISPLAY_INVITE_ACCEPTED_NOTICE, - siteId - } ); -} - -export function dismissInviteAccepted() { - Dispatcher.handleViewAction( { - type: DISMISS_INVITE_ACCEPTED_NOTICE - } ); -} - -export function displayInviteDeclined() { - Dispatcher.handleViewAction( { - type: DISPLAY_INVITE_DECLINED_NOTICE - } ); -} - -export function dismissInviteDeclined() { - Dispatcher.handleViewAction( { - type: DISMISS_INVITE_DECLINED_NOTICE - } ); -} diff --git a/client/accept-invite/controller.js b/client/accept-invite/controller.js deleted file mode 100644 index af795b598cfa3..0000000000000 --- a/client/accept-invite/controller.js +++ /dev/null @@ -1,25 +0,0 @@ -/** - * External Dependencies - */ -import React from 'react'; - -/** - * Internal Dependencies - */ -import i18n from 'lib/mixins/i18n'; -import titleActions from 'lib/screen-title/actions'; -import Main from './main'; - -export default { - acceptInvite( context ) { - titleActions.setTitle( i18n.translate( 'Accept Invite', { textOnly: true } ) ); - - React.unmountComponentAtNode( document.getElementById( 'secondary' ) ); - context.layout.setState( { noSidebar: true } ); - - React.render( - React.createElement( Main, context.params ), - document.getElementById( 'primary' ) - ); - } -}; diff --git a/client/accept-invite/invite-header/mock-data.js b/client/accept-invite/invite-header/mock-data.js deleted file mode 100644 index 2660dd973cd27..0000000000000 --- a/client/accept-invite/invite-header/mock-data.js +++ /dev/null @@ -1,33 +0,0 @@ -module.exports = { - invite: { - invite_slug: 'asdf2345', - blog_id: 1234, - user_id: 1234, - invited_id: 5678, - signed_up: '0000-00-00 00:00:00', - invite_date: '2015-11-03 16:45:37', - meta: { - role: 'editor' - } - }, - inviter: { - ID: 1234, - login: 'testuser', - email: false, - name: 'Test User', - first_name: 'Test', - last_name: 'User', - URL: 'https://example.com', - avatar_URL: 'https://1.gravatar.com/avatar', - profile_URL: 'http://en.gravatar.com', - site_ID: 1234 - }, - blog_details: { - domain: 'example.com', - title: 'Example WordPress website', - icon: { - img: 'https://secure.gravatar.com/blavatar', - ico: 'https://secure.gravatar.com/blavatar' - } - } -} diff --git a/client/accept-invite/invite-message/constants.js b/client/accept-invite/invite-message/constants.js deleted file mode 100644 index d2f931717e9a3..0000000000000 --- a/client/accept-invite/invite-message/constants.js +++ /dev/null @@ -1,11 +0,0 @@ -/** - * External dependencies - */ -import keyMirror from 'react/lib/keyMirror'; - -export default keyMirror( { - DISPLAY_INVITE_ACCEPTED_NOTICE: null, - DISMISS_INVITE_ACCEPTED_NOTICE: null, - DISPLAY_INVITE_DECLINED_NOTICE: null, - DISMISS_INVITE_DECLINED_NOTICE: null -} ); diff --git a/client/accept-invite/logged-out-invite/index.jsx b/client/accept-invite/logged-out-invite/index.jsx deleted file mode 100644 index 41d3b049e05e4..0000000000000 --- a/client/accept-invite/logged-out-invite/index.jsx +++ /dev/null @@ -1,15 +0,0 @@ -/** - * External dependencies - */ -import React from 'react' - -/** - * Internal dependencies - */ -import SignupForm from './signup-form' - -export default class LoggedOutInvite extends React.Component { - render() { - return - } -} diff --git a/client/boot/index.js b/client/boot/index.js index 20e68c18ca9fc..2e2e11a900853 100644 --- a/client/boot/index.js +++ b/client/boot/index.js @@ -30,7 +30,6 @@ var config = require( 'config' ), translatorInvitation = require( 'layout/community-translator/invitation-utils' ), layoutFocus = require( 'lib/layout-focus' ), nuxWelcome = require( 'nux-welcome' ), - inviteActions = require( 'accept-invite/actions' ), emailVerification = require( 'components/email-verification' ), viewport = require( 'lib/viewport' ), detectHistoryNavigation = require( 'lib/detect-history-navigation' ), @@ -42,6 +41,7 @@ var config = require( 'config' ), // The following mixins require i18n content, so must be required after i18n is initialized Layout, LoggedOutLayout; +import { displayInviteAccepted } from 'lib/invites/actions'; function init() { var i18nLocaleStringsObject = null; @@ -233,7 +233,7 @@ function boot() { } if ( context.query.invite_accepted ) { - inviteActions.displayInviteAccepted( parseInt( context.query.invite_accepted ) ); + displayInviteAccepted( parseInt( context.query.invite_accepted ) ); page( context.pathname ); } diff --git a/client/accept-invite/invite-form-header/index.jsx b/client/components/invites/invite-form-header/index.jsx similarity index 96% rename from client/accept-invite/invite-form-header/index.jsx rename to client/components/invites/invite-form-header/index.jsx index 9a3081b66403c..07b475d8ee6ed 100644 --- a/client/accept-invite/invite-form-header/index.jsx +++ b/client/components/invites/invite-form-header/index.jsx @@ -4,16 +4,6 @@ import React from 'react'; import get from 'lodash/object/get'; -/** - * Internal dependencies - */ -import userModule from 'lib/user'; - -/** - * Module variables - */ -const user = userModule(); - export default React.createClass( { displayName: 'InviteFormHeader', @@ -249,7 +239,7 @@ export default React.createClass( { return (

- { user.get() ? this.getLoggedInTitleForInvite() : this.getLoggedOutTitleForInvite() } + { this.props.user ? this.getLoggedInTitleForInvite() : this.getLoggedOutTitleForInvite() }

{ roleExplanation &&

diff --git a/client/accept-invite/invite-form-header/style.scss b/client/components/invites/invite-form-header/style.scss similarity index 100% rename from client/accept-invite/invite-form-header/style.scss rename to client/components/invites/invite-form-header/style.scss diff --git a/client/accept-invite/invite-header/index.jsx b/client/components/invites/invite-header/index.jsx similarity index 100% rename from client/accept-invite/invite-header/index.jsx rename to client/components/invites/invite-header/index.jsx diff --git a/client/accept-invite/invite-header/style.scss b/client/components/invites/invite-header/style.scss similarity index 100% rename from client/accept-invite/invite-header/style.scss rename to client/components/invites/invite-header/style.scss diff --git a/client/layout/index.jsx b/client/layout/index.jsx index b7404a1dac94f..b23f243f82e59 100644 --- a/client/layout/index.jsx +++ b/client/layout/index.jsx @@ -19,7 +19,7 @@ var Masterbar = require( './masterbar' ), EmailVerificationNotice = require( 'components/email-verification/email-verification-notice' ), Welcome = require( 'my-sites/welcome/welcome' ), WelcomeMessage = require( 'nux-welcome/welcome-message' ), - InviteMessage = require( 'accept-invite/invite-message' ), + InviteMessage = require( 'lib/invites/invite-message' ), analytics = require( 'analytics' ), config = require( 'config' ), PulsingDot = require( 'components/pulsing-dot' ), diff --git a/client/accept-invite/logged-in-accept/index.jsx b/client/lib/invites/accept-invite/logged-in-accept/index.jsx similarity index 92% rename from client/accept-invite/logged-in-accept/index.jsx rename to client/lib/invites/accept-invite/logged-in-accept/index.jsx index 97dad65fe8998..86fee02ae20f3 100644 --- a/client/accept-invite/logged-in-accept/index.jsx +++ b/client/lib/invites/accept-invite/logged-in-accept/index.jsx @@ -12,7 +12,7 @@ import Gravatar from 'components/gravatar'; import Button from 'components/button'; import config from 'config'; import userModule from 'lib/user'; -import InviteFormHeader from '../invite-form-header'; +import InviteFormHeader from 'components/invites/invite-form-header'; import { acceptInvite } from '../actions'; const user = userModule(); @@ -28,7 +28,7 @@ export default React.createClass( { return (

- +
{ diff --git a/client/accept-invite/main.jsx b/client/lib/invites/accept/index.jsx similarity index 90% rename from client/accept-invite/main.jsx rename to client/lib/invites/accept/index.jsx index 07d75715c8fa5..b394cf011067d 100644 --- a/client/accept-invite/main.jsx +++ b/client/lib/invites/accept/index.jsx @@ -8,11 +8,11 @@ import classNames from 'classnames'; /** * Internal Dependencies */ -import InviteHeader from './invite-header'; -import LoggedInAccept from './logged-in-accept'; -import LoggedOutInvite from './logged-out-invite'; +import InviteHeader from 'components/invites/invite-header'; +import LoggedInAccept from './logged-in'; +import LoggedOutInvite from './logged-out'; import userModule from 'lib/user'; -import InvitesActions from 'lib/invites/actions'; +import { fetchInvite } from 'lib/invites/actions'; import InvitesStore from 'lib/invites/stores/invites-validation'; import EmptyContent from 'components/empty-content'; @@ -34,7 +34,7 @@ export default React.createClass( { }, componentWillMount() { - InvitesActions.fetchInvite( this.props.site_id, this.props.invitation_key ); + fetchInvite( this.props.site_id, this.props.invitation_key ); InvitesStore.on( 'change', this.refreshInvite ); }, diff --git a/client/lib/invites/accept/logged-in/index.jsx b/client/lib/invites/accept/logged-in/index.jsx new file mode 100644 index 0000000000000..6e894f86cbed8 --- /dev/null +++ b/client/lib/invites/accept/logged-in/index.jsx @@ -0,0 +1,60 @@ +/** + * External dependencies + */ +import React from 'react'; +import classNames from 'classnames'; + +/** + * Internal dependencies + */ +import Card from 'components/card'; +import Gravatar from 'components/gravatar'; +import Button from 'components/button'; +import config from 'config'; +import userModule from 'lib/user'; +import InviteFormHeader from 'components/invites/invite-form-header'; +import { acceptInvite } from 'lib/invites/actions'; + +const user = userModule(); + +export default React.createClass( { + + displayName: 'LoggedInAccept', + + render() { + let userObject = user.get(), + signInLink = config( 'login_url' ) + '?redirect_to=' + encodeURIComponent( window.location.href ); + + return ( +
+ + +
+ + { + this.translate( 'Join as {{usernameWrap}}%(username)s{{/usernameWrap}}', { + components: { + usernameWrap: + }, + args: { + username: userObject && userObject.display_name + } + } ) + } +
+
+ + +
+
+ + { this.translate( 'Sign in as a different user' ) } + +
+ ); + } +} ); diff --git a/client/accept-invite/logged-in-accept/style.scss b/client/lib/invites/accept/logged-in/style.scss similarity index 100% rename from client/accept-invite/logged-in-accept/style.scss rename to client/lib/invites/accept/logged-in/style.scss diff --git a/client/accept-invite/logged-out-invite/signup-form.jsx b/client/lib/invites/accept/logged-out/index.jsx similarity index 93% rename from client/accept-invite/logged-out-invite/signup-form.jsx rename to client/lib/invites/accept/logged-out/index.jsx index 4caa40fea67dd..c1064e38ce3e2 100644 --- a/client/accept-invite/logged-out-invite/signup-form.jsx +++ b/client/lib/invites/accept/logged-out/index.jsx @@ -8,8 +8,8 @@ import get from 'lodash/object/get' * Internal dependencies */ import SignupForm from 'components/signup-form' -import InviteFormHeader from '../invite-form-header' -import { createAccount, acceptInvite } from '../actions' +import InviteFormHeader from 'components/invites/invite-form-header' +import { createAccount, acceptInvite } from 'lib/invites/actions' import WpcomLoginForm from 'signup/wpcom-login-form' import config from 'config' diff --git a/client/accept-invite/logged-out-invite/style.scss b/client/lib/invites/accept/logged-out/style.scss similarity index 100% rename from client/accept-invite/logged-out-invite/style.scss rename to client/lib/invites/accept/logged-out/style.scss diff --git a/client/accept-invite/style.scss b/client/lib/invites/accept/style.scss similarity index 100% rename from client/accept-invite/style.scss rename to client/lib/invites/accept/style.scss diff --git a/client/lib/invites/actions.js b/client/lib/invites/actions.js index 836b22d1ada20..a5607eabc4266 100644 --- a/client/lib/invites/actions.js +++ b/client/lib/invites/actions.js @@ -14,39 +14,82 @@ import { action as ActionTypes } from 'lib/invites/constants'; */ const debug = new Debug( 'calypso:invites-actions' ); -const InvitesActions = { - fetchInvites( siteId, number = 100, offset = 0 ) { - debug( 'fetchInvites', siteId ); - - Dispatcher.handleViewAction( { - type: ActionTypes.FETCH_INVITES, - siteId, - offset - } ); +export function fetchInvites( siteId, number = 100, offset = 0 ) { + debug( 'fetchInvites', siteId ); - wpcom.undocumented().invitesList( siteId, number, offset, function( error, data ) { - Dispatcher.handleServerAction( { - type: error ? ActionTypes.RECEIVE_INVITES_ERROR : ActionTypes.RECEIVE_INVITES, - siteId, offset, data, error - } ); - } ); - }, - fetchInvite( siteId, inviteKey ) { - debug( 'fetchInvite', siteId, inviteKey ); - - Dispatcher.handleViewAction( { - type: ActionTypes.FETCH_INVITE, - siteId, - inviteKey + Dispatcher.handleViewAction( { + type: ActionTypes.FETCH_INVITES, + siteId, + offset + } ); + + wpcom.undocumented().invitesList( siteId, number, offset, function( error, data ) { + Dispatcher.handleServerAction( { + type: error ? ActionTypes.RECEIVE_INVITES_ERROR : ActionTypes.RECEIVE_INVITES, + siteId, offset, data, error } ); + } ); +} + +export function fetchInvite( siteId, inviteKey ) { + debug( 'fetchInvite', siteId, inviteKey ); + + Dispatcher.handleViewAction( { + type: ActionTypes.FETCH_INVITE, + siteId, + inviteKey + } ); - wpcom.undocumented().getInvite( siteId, inviteKey, ( error, data ) => { - Dispatcher.handleServerAction( { - type: error ? ActionTypes.RECEIVE_INVITE_ERROR : ActionTypes.RECEIVE_INVITE, - siteId, inviteKey, data, error - } ); + wpcom.undocumented().getInvite( siteId, inviteKey, ( error, data ) => { + Dispatcher.handleServerAction( { + type: error ? ActionTypes.RECEIVE_INVITE_ERROR : ActionTypes.RECEIVE_INVITE, + siteId, inviteKey, data, error } ); + } ); +} + +export function createAccount( userData, callback ) { + return wpcom.undocumented().usersNew( + Object.assign( {}, userData, { validate: false } ), + ( error, response ) => { + const bearerToken = response && response.bearer_token; + callback( error, bearerToken ); + } + ); +} + +export function acceptInvite( invite, callback, bearerToken ) { + if ( bearerToken ) { + wpcom.loadToken( bearerToken ); } -}; + return wpcom.undocumented().acceptInvite( + invite.blog_id, + invite.invite_slug, + callback + ); +} + +export function displayInviteAccepted( siteId ) { + Dispatcher.handleViewAction( { + type: ActionTypes.DISPLAY_INVITE_ACCEPTED_NOTICE, + siteId + } ); +} + +export function dismissInviteAccepted() { + Dispatcher.handleViewAction( { + type: ActionTypes.DISMISS_INVITE_ACCEPTED_NOTICE + } ); +} + +export function displayInviteDeclined() { + Dispatcher.handleViewAction( { + type: ActionTypes.DISPLAY_INVITE_DECLINED_NOTICE + } ); +} -export default InvitesActions; +export function dismissInviteDeclined() { + Dispatcher.handleViewAction( { + type: ActionTypes.DISMISS_INVITE_DECLINED_NOTICE + } ); +} diff --git a/client/lib/invites/constants.js b/client/lib/invites/constants.js index ddd1d87c19ffa..83b84b6b16ec4 100644 --- a/client/lib/invites/constants.js +++ b/client/lib/invites/constants.js @@ -12,5 +12,9 @@ export const action = keyMirror( { RECEIVE_INVITES: null, RECEIVE_INVITE: null, RECEIVE_INVITES_ERROR: null, - RECEIVE_INVITE_ERROR: null + RECEIVE_INVITE_ERROR: null, + DISPLAY_INVITE_ACCEPTED_NOTICE: null, + DISMISS_INVITE_ACCEPTED_NOTICE: null, + DISPLAY_INVITE_DECLINED_NOTICE: null, + DISMISS_INVITE_DECLINED_NOTICE: null } ); diff --git a/client/lib/invites/controller.js b/client/lib/invites/controller.js new file mode 100644 index 0000000000000..907fb142df2fc --- /dev/null +++ b/client/lib/invites/controller.js @@ -0,0 +1,23 @@ +/** + * External Dependencies + */ +import React from 'react'; + +/** + * Internal Dependencies + */ +import i18n from 'lib/mixins/i18n'; +import titleActions from 'lib/screen-title/actions'; +import AcceptInvite from 'lib/invites/accept'; + +export function acceptInvite( context ) { + titleActions.setTitle( i18n.translate( 'Accept Invite', { textOnly: true } ) ); + + React.unmountComponentAtNode( document.getElementById( 'secondary' ) ); + context.layout.setState( { noSidebar: true } ); + + React.render( + React.createElement( AcceptInvite, context.params ), + document.getElementById( 'primary' ) + ); +} diff --git a/client/accept-invite/index.js b/client/lib/invites/index.js similarity index 72% rename from client/accept-invite/index.js rename to client/lib/invites/index.js index 8984073e6c54e..f5bf3dada5e72 100644 --- a/client/accept-invite/index.js +++ b/client/lib/invites/index.js @@ -6,11 +6,11 @@ import page from 'page'; /** * Internal dependencies */ -import controller from './controller'; +import { acceptInvite } from './controller'; export default () => { page( '/accept-invite/:site_id/:invitation_key', - controller.acceptInvite + acceptInvite ); }; diff --git a/client/accept-invite/invite-message/index.jsx b/client/lib/invites/invite-message/index.jsx similarity index 91% rename from client/accept-invite/invite-message/index.jsx rename to client/lib/invites/invite-message/index.jsx index d284d8e66e7c8..ce7ccbd261960 100644 --- a/client/accept-invite/invite-message/index.jsx +++ b/client/lib/invites/invite-message/index.jsx @@ -7,8 +7,8 @@ import React from 'react' * Internal dependencies */ import Notice from 'components/notice' -import { dismissInviteAccepted, dismissInviteDeclined } from 'accept-invite/actions' -import store from 'accept-invite/invite-message/store' +import { dismissInviteAccepted, dismissInviteDeclined } from 'lib/invites/actions' +import store from 'lib/invites/stores/invite-accepted' export default React.createClass( { diff --git a/client/lib/invites/reducers/list-invites.js b/client/lib/invites/reducers/invites-list.js similarity index 100% rename from client/lib/invites/reducers/list-invites.js rename to client/lib/invites/reducers/invites-list.js diff --git a/client/accept-invite/invite-message/store.js b/client/lib/invites/stores/invite-accepted.js similarity index 67% rename from client/accept-invite/invite-message/store.js rename to client/lib/invites/stores/invite-accepted.js index 4b20edf54a5a0..5c94657f33456 100644 --- a/client/accept-invite/invite-message/store.js +++ b/client/lib/invites/stores/invite-accepted.js @@ -2,22 +2,22 @@ * Internal dependencies */ import { createReducerStore } from 'lib/store' -import { DISPLAY_INVITE_ACCEPTED_NOTICE, DISMISS_INVITE_ACCEPTED_NOTICE, DISPLAY_INVITE_DECLINED_NOTICE, DISMISS_INVITE_DECLINED_NOTICE } from './constants' +import { action as ActionTypes } from 'lib/invites/constants'; const InviteMessageStore = createReducerStore( ( state, payload ) => { const { action } = payload; let newState = Object.assign( {}, state ); switch ( action.type ) { - case DISPLAY_INVITE_ACCEPTED_NOTICE: + case ActionTypes.DISPLAY_INVITE_ACCEPTED_NOTICE: newState.accepted = true; newState.siteId = action.siteId; return newState; - case DISPLAY_INVITE_DECLINED_NOTICE: + case ActionTypes.DISPLAY_INVITE_DECLINED_NOTICE: newState.declined = true; newState.siteId = action.siteId; return newState; - case DISMISS_INVITE_ACCEPTED_NOTICE: - case DISMISS_INVITE_DECLINED_NOTICE: + case ActionTypes.DISMISS_INVITE_ACCEPTED_NOTICE: + case ActionTypes.DISMISS_INVITE_DECLINED_NOTICE: newState.accepted = false; newState.declined = false; newState.siteId = false; diff --git a/client/lib/invites/stores/list-invites.js b/client/lib/invites/stores/invites-list.js similarity index 78% rename from client/lib/invites/stores/list-invites.js rename to client/lib/invites/stores/invites-list.js index 192a5aed102fa..b2e8c37092231 100644 --- a/client/lib/invites/stores/list-invites.js +++ b/client/lib/invites/stores/invites-list.js @@ -2,7 +2,7 @@ * Internal dependencies */ import { createReducerStore } from 'lib/store'; -import { reducer, initialState } from 'lib/invites/reducers/list-invites'; +import { reducer, initialState } from 'lib/invites/reducers/invites-list'; const InvitesStore = createReducerStore( reducer, initialState ); diff --git a/client/lib/invites/test/list-invites-store.js b/client/lib/invites/test/list-invites-store.js index 6a89403a617c0..8e0e6d7385937 100644 --- a/client/lib/invites/test/list-invites-store.js +++ b/client/lib/invites/test/list-invites-store.js @@ -51,7 +51,7 @@ describe( 'List Invites Store', function() { }; beforeEach( function() { - ListInvitesStore = require( 'lib/invites/stores/list-invites' ); + ListInvitesStore = require( 'lib/invites/stores/invites-list' ); } ); describe( 'Listing invites', function() { diff --git a/client/sections.js b/client/sections.js index a153ed839f2de..74b8e9a771f9f 100644 --- a/client/sections.js +++ b/client/sections.js @@ -176,7 +176,7 @@ if ( config.isEnabled( 'accept-invite' ) ) { sections.push( { name: 'accept-invite', paths: [ '/accept-invite' ], - module: 'accept-invite', + module: 'lib/invites', enableLoggedOut: true } ); }