diff --git a/assets/stylesheets/_components.scss b/assets/stylesheets/_components.scss index 466350186ff40..c52d133b465af 100644 --- a/assets/stylesheets/_components.scss +++ b/assets/stylesheets/_components.scss @@ -6,12 +6,7 @@ // stylesheet order does not matter. // ========================================================================== -@import 'accept-invite/invite-form-header/style'; -@import 'accept-invite/invite-header/style'; -@import 'accept-invite/logged-in-accept/style'; -@import 'accept-invite/style'; @import 'auth/style'; -@import 'accept-invite/logged-out-invite/style'; @import 'components/accordion/style'; @import 'components/add-new-button/style'; @import 'components/author-selector/style'; @@ -177,6 +172,11 @@ @import 'my-sites/draft/style'; @import 'my-sites/drafts/style'; @import 'my-sites/exporter/style'; +@import 'my-sites/invites/invite-form-header/style'; +@import 'my-sites/invites/invite-header/style'; +@import 'my-sites/invites/invite-accept/logged-in/style'; +@import 'my-sites/invites/invite-accept/logged-out/style'; +@import 'my-sites/invites/invite-accept/style'; @import 'my-sites/media-library/style'; @import 'my-sites/no-results/style'; @import 'my-sites/pages/style'; 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/layout/index.jsx b/client/layout/index.jsx index b7404a1dac94f..81b696f292f25 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( 'my-sites/invites/invite-message' ), analytics = require( 'analytics' ), config = require( 'config' ), PulsingDot = require( 'components/pulsing-dot' ), 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/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/my-sites/invites/controller.js b/client/my-sites/invites/controller.js new file mode 100644 index 0000000000000..be5c148ca7975 --- /dev/null +++ b/client/my-sites/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 InviteAccept from 'my-sites/invites/invite-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( InviteAccept, context.params ), + document.getElementById( 'primary' ) + ); +} diff --git a/client/accept-invite/index.js b/client/my-sites/invites/index.js similarity index 72% rename from client/accept-invite/index.js rename to client/my-sites/invites/index.js index 8984073e6c54e..f5bf3dada5e72 100644 --- a/client/accept-invite/index.js +++ b/client/my-sites/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/main.jsx b/client/my-sites/invites/invite-accept/index.jsx similarity index 90% rename from client/accept-invite/main.jsx rename to client/my-sites/invites/invite-accept/index.jsx index 07d75715c8fa5..3a53be48ca7a2 100644 --- a/client/accept-invite/main.jsx +++ b/client/my-sites/invites/invite-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 'my-sites/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/accept-invite/logged-in-accept/index.jsx b/client/my-sites/invites/invite-accept/logged-in/index.jsx similarity index 89% rename from client/accept-invite/logged-in-accept/index.jsx rename to client/my-sites/invites/invite-accept/logged-in/index.jsx index 97dad65fe8998..35d8a7bccfa47 100644 --- a/client/accept-invite/logged-in-accept/index.jsx +++ b/client/my-sites/invites/invite-accept/logged-in/index.jsx @@ -12,8 +12,8 @@ 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 { acceptInvite } from '../actions'; +import InviteFormHeader from 'my-sites/invites/invite-form-header'; +import { acceptInvite } from 'lib/invites/actions'; const user = userModule(); @@ -28,7 +28,7 @@ export default React.createClass( { return (
- +
{ diff --git a/client/accept-invite/logged-in-accept/style.scss b/client/my-sites/invites/invite-accept/logged-in/style.scss similarity index 100% rename from client/accept-invite/logged-in-accept/style.scss rename to client/my-sites/invites/invite-accept/logged-in/style.scss diff --git a/client/accept-invite/logged-out-invite/signup-form.jsx b/client/my-sites/invites/invite-accept/logged-out/index.jsx similarity index 93% rename from client/accept-invite/logged-out-invite/signup-form.jsx rename to client/my-sites/invites/invite-accept/logged-out/index.jsx index 4caa40fea67dd..8d469ad008c29 100644 --- a/client/accept-invite/logged-out-invite/signup-form.jsx +++ b/client/my-sites/invites/invite-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 'my-sites/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/my-sites/invites/invite-accept/logged-out/style.scss similarity index 100% rename from client/accept-invite/logged-out-invite/style.scss rename to client/my-sites/invites/invite-accept/logged-out/style.scss diff --git a/client/accept-invite/style.scss b/client/my-sites/invites/invite-accept/style.scss similarity index 100% rename from client/accept-invite/style.scss rename to client/my-sites/invites/invite-accept/style.scss diff --git a/client/accept-invite/invite-form-header/index.jsx b/client/my-sites/invites/invite-form-header/index.jsx similarity index 96% rename from client/accept-invite/invite-form-header/index.jsx rename to client/my-sites/invites/invite-form-header/index.jsx index 9a3081b66403c..07b475d8ee6ed 100644 --- a/client/accept-invite/invite-form-header/index.jsx +++ b/client/my-sites/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/my-sites/invites/invite-form-header/style.scss similarity index 100% rename from client/accept-invite/invite-form-header/style.scss rename to client/my-sites/invites/invite-form-header/style.scss diff --git a/client/accept-invite/invite-header/index.jsx b/client/my-sites/invites/invite-header/index.jsx similarity index 100% rename from client/accept-invite/invite-header/index.jsx rename to client/my-sites/invites/invite-header/index.jsx diff --git a/client/accept-invite/invite-header/style.scss b/client/my-sites/invites/invite-header/style.scss similarity index 100% rename from client/accept-invite/invite-header/style.scss rename to client/my-sites/invites/invite-header/style.scss diff --git a/client/accept-invite/invite-message/index.jsx b/client/my-sites/invites/invite-message/index.jsx similarity index 91% rename from client/accept-invite/invite-message/index.jsx rename to client/my-sites/invites/invite-message/index.jsx index d284d8e66e7c8..ce7ccbd261960 100644 --- a/client/accept-invite/invite-message/index.jsx +++ b/client/my-sites/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/sections.js b/client/sections.js index a153ed839f2de..626975557fbb9 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: 'my-sites/invites', enableLoggedOut: true } ); }