From 799d0e944a53f02dceadb30e5b9c47e280062731 Mon Sep 17 00:00:00 2001 From: haraldox Date: Fri, 19 Jan 2018 17:29:57 +0100 Subject: allow arbitrary routes in dev mode navigate to other routes in the console by typing `document.location.href = "#path/to/route"` --- src/stores/UserStore.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/stores/UserStore.js b/src/stores/UserStore.js index 09000dcdb..3a43668a7 100644 --- a/src/stores/UserStore.js +++ b/src/stores/UserStore.js @@ -237,7 +237,9 @@ export default class UserStore extends Store { && currentRoute.includes(this.BASE_ROUTE) && (this.hasCompletedSignup || this.hasCompletedSignup === null)) { - this.stores.router.push('/'); + if (!isDevMode) { + this.stores.router.push('/'); + } } }; -- cgit v1.2.3-70-g09d2 From 05269a20c78406d8ff3a83fddca923a996f82d1b Mon Sep 17 00:00:00 2001 From: haraldox Date: Sun, 21 Jan 2018 18:35:29 +0100 Subject: ADDED invite button in Account Settings [WIP] return to previous route on submit / cancel --- .../settings/account/AccountDashboard.js | 27 ++++++++++++++++++---- src/containers/auth/InviteScreen.js | 3 +++ src/i18n/locales/de.json | 1 + src/i18n/locales/en-US.json | 1 + src/i18n/locales/es.json | 1 + src/i18n/locales/fr.json | 1 + src/i18n/locales/it.json | 1 + src/stores/UserStore.js | 2 ++ src/styles/settings.scss | 9 ++++++++ 9 files changed, 42 insertions(+), 4 deletions(-) diff --git a/src/components/settings/account/AccountDashboard.js b/src/components/settings/account/AccountDashboard.js index 43272fe96..1e71beadf 100644 --- a/src/components/settings/account/AccountDashboard.js +++ b/src/components/settings/account/AccountDashboard.js @@ -48,6 +48,11 @@ const messages = defineMessages({ id: 'settings.account.account.editButton', defaultMessage: '!!!Edit Account', }, + accountInviteButton: { + id: "settings.account.account.inviteButton", + defaultMessage: '!!!Invite Friends', + }, + invoiceDownload: { id: 'settings.account.invoiceDownload', defaultMessage: '!!!Download', @@ -174,10 +179,24 @@ export default class AccountDashboard extends Component { {intl.formatMessage(messages.accountTypePremium)} )} - - {intl.formatMessage(messages.accountEditButton)} - - +
+
+ + {intl.formatMessage(messages.accountEditButton)} + +
+
+ + {intl.formatMessage(messages.accountInviteButton)} + +
+
+ {user.emailValidated} diff --git a/src/containers/auth/InviteScreen.js b/src/containers/auth/InviteScreen.js index 51971f436..6b39b1dd1 100644 --- a/src/containers/auth/InviteScreen.js +++ b/src/containers/auth/InviteScreen.js @@ -12,6 +12,9 @@ export default class InviteScreen extends Component { render() { const { actions } = this.props; + + console.log(this.props.location.state) + return ( Date: Mon, 22 Jan 2018 14:26:31 +0100 Subject: return to account screen from invite screen cheap solution because `state` prop of `` is not being passed to route --- src/components/auth/Invite.js | 8 ++++++-- src/components/settings/account/AccountDashboard.js | 4 +++- src/components/ui/Link.js | 5 ++++- src/containers/auth/InviteScreen.js | 8 +++++--- src/containers/settings/AccountScreen.js | 1 + src/stores/UserStore.js | 6 ++---- 6 files changed, 21 insertions(+), 11 deletions(-) diff --git a/src/components/auth/Invite.js b/src/components/auth/Invite.js index c1d815dcd..d4d789781 100644 --- a/src/components/auth/Invite.js +++ b/src/components/auth/Invite.js @@ -64,7 +64,10 @@ export default class Invite extends Component { e.preventDefault(); this.form.submit({ onSuccess: (form) => { - this.props.onSubmit({ invites: form.values().invite }); + this.props.onSubmit({ + invites: form.values().invite, + from: this.props.from + }); }, onError: () => {}, }); @@ -73,6 +76,7 @@ export default class Invite extends Component { render() { const { form } = this; const { intl } = this.context; + const { from } = this.props; return (
@@ -99,7 +103,7 @@ export default class Invite extends Component { label={intl.formatMessage(messages.submitButtonLabel)} /> {intl.formatMessage(messages.skipButtonLabel)} diff --git a/src/components/settings/account/AccountDashboard.js b/src/components/settings/account/AccountDashboard.js index 1e71beadf..d5f2e238c 100644 --- a/src/components/settings/account/AccountDashboard.js +++ b/src/components/settings/account/AccountDashboard.js @@ -118,6 +118,7 @@ export default class AccountDashboard extends Component { deleteAccount, isLoadingDeleteAccount, isDeleteAccountSuccessful, + pathname, } = this.props; const { intl } = this.context; @@ -189,7 +190,8 @@ export default class AccountDashboard extends Component { {intl.formatMessage(messages.accountInviteButton)} diff --git a/src/components/ui/Link.js b/src/components/ui/Link.js index f5da921fa..bc3c2d8aa 100644 --- a/src/components/ui/Link.js +++ b/src/components/ui/Link.js @@ -62,7 +62,10 @@ Link.wrappedComponent.propTypes = { oneOrManyChildElements, PropTypes.string, ]).isRequired, - to: PropTypes.string.isRequired, + to: PropTypes.oneOfType([ + PropTypes.string, + PropTypes.object + ]).isRequired, className: PropTypes.string, activeClassName: PropTypes.string, strictFilter: PropTypes.bool, diff --git a/src/containers/auth/InviteScreen.js b/src/containers/auth/InviteScreen.js index 6b39b1dd1..a624e2245 100644 --- a/src/containers/auth/InviteScreen.js +++ b/src/containers/auth/InviteScreen.js @@ -11,13 +11,15 @@ export default class InviteScreen extends Component { } render() { - const { actions } = this.props; - - console.log(this.props.location.state) + const { + actions, + location + } = this.props; return ( ); } diff --git a/src/containers/settings/AccountScreen.js b/src/containers/settings/AccountScreen.js index c5c2982b0..b57530884 100644 --- a/src/containers/settings/AccountScreen.js +++ b/src/containers/settings/AccountScreen.js @@ -83,6 +83,7 @@ export default class AccountScreen extends Component { deleteAccount={userActions.delete} isLoadingDeleteAccount={user.deleteAccountRequest.isExecuting} isDeleteAccountSuccessful={user.deleteAccountRequest.wasExecuted && !user.deleteAccountRequest.isError} + pathname={this.props.location.pathname} /> ); } diff --git a/src/stores/UserStore.js b/src/stores/UserStore.js index 2c164f1bf..476c1f040 100644 --- a/src/stores/UserStore.js +++ b/src/stores/UserStore.js @@ -160,15 +160,13 @@ export default class UserStore extends Store { gaEvent('User', 'retrievePassword'); } - @action _invite({ invites }) { + @action _invite({ invites, from }) { const data = invites.filter(invite => invite.email !== ''); this.inviteRequest.execute(data); - console.log(this.stores.router.location ) - // we do not wait for a server response before redirecting the user - this.stores.router.push('/'); + this.stores.router.push(!!from ? from : '/'); gaEvent('User', 'inviteUsers'); } -- cgit v1.2.3-70-g09d2 From 25446bbdf8d0020b1adfe34e4f45c1a1eec6528e Mon Sep 17 00:00:00 2001 From: haraldox Date: Tue, 30 Jan 2018 12:41:42 +0100 Subject: Merge branch 'fix-invite-screen' into feature/invite-button fix linitng errors --- src/components/auth/Invite.js | 39 ++++++---------------- .../settings/account/AccountDashboard.js | 10 +++--- src/components/ui/Link.js | 2 +- src/containers/auth/InviteScreen.js | 9 +++-- src/containers/settings/AccountScreen.js | 3 ++ src/i18n/locales/en-US.json | 1 - src/stores/UserStore.js | 3 +- src/styles/invite.scss | 4 --- src/styles/main.scss | 1 - 9 files changed, 28 insertions(+), 44 deletions(-) delete mode 100644 src/styles/invite.scss diff --git a/src/components/auth/Invite.js b/src/components/auth/Invite.js index 1fe594d73..fa83837ac 100644 --- a/src/components/auth/Invite.js +++ b/src/components/auth/Invite.js @@ -30,16 +30,17 @@ const messages = defineMessages({ id: 'invite.skip.label', defaultMessage: '!!!I want to do this later', }, - noEmailAddresses: { - id: 'invite.error.noEmails', - defaultMessage: '!!!At least one email address is required', - } }); @observer export default class Invite extends Component { static propTypes = { onSubmit: PropTypes.func.isRequired, + from: PropTypes.string, + }; + + static defaultProps = { + from: '/', }; static contextTypes = { @@ -58,8 +59,8 @@ export default class Invite extends Component { label: this.context.intl.formatMessage(messages.emailLabel), placeholder: this.context.intl.formatMessage(messages.emailLabel), validators: [email], - } - } + }, + }, })], }, }, this.context.intl); @@ -68,21 +69,6 @@ export default class Invite extends Component { e.preventDefault(); this.form.submit({ onSuccess: (form) => { - - this.props.onSubmit({ - invites: form.values().invite, - from: this.props.from - }); - - const atLeastOneEmailAddress = form.$('invite') - .map(invite => {return invite.$('email').value}) - .some(email => email.trim() !== '') - - if (!atLeastOneEmailAddress) { - form.invalidate('no-email-addresses') - return - } - this.props.onSubmit({ invites: form.values().invite }); }, onError: () => {}, @@ -95,8 +81,8 @@ export default class Invite extends Component { const { from } = this.props; const atLeastOneEmailAddress = form.$('invite') - .map(invite => {return invite.$('email').value}) - .some(email => email.trim() !== '') + .map(invite => invite.$('email').value) + .some(emailValue => emailValue.trim() !== ''); return (
@@ -117,11 +103,6 @@ export default class Invite extends Component {
))} - {form.error === 'no-email-addresses' && ( -

- {intl.formatMessage(messages.noEmailAddresses)} -

- )}