From b35b17f6f08db3fb49ea5287b597ca58e9b45ad1 Mon Sep 17 00:00:00 2001 From: Jasper Huang Date: Thu, 29 Jul 2021 11:29:29 -0700 Subject: [PATCH 01/15] Directly create the workspace instead of navigating to the new workspace page --- src/libs/actions/Policy.js | 22 ++++++++++++++++++++-- src/pages/home/sidebar/SidebarScreen.js | 3 ++- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/src/libs/actions/Policy.js b/src/libs/actions/Policy.js index 7c96603338999..1c19f30fba550 100644 --- a/src/libs/actions/Policy.js +++ b/src/libs/actions/Policy.js @@ -182,9 +182,9 @@ function invite(logins, welcomeNote, policyID) { /** * Merges the passed in login into the specified policy * - * @param {String} name + * @param {String} [name] */ -function create(name) { +function create(name = '') { API.Policy_Create({type: CONST.POLICY.TYPE.FREE, policyName: name}) .then((response) => { if (response.jsonCode !== 200) { @@ -223,6 +223,23 @@ function setAvatarURL(policyID, avatarURL = '') { }); } +/** + * Sets the name of the policy. + * @param {String} policyID + * @param {String} name + */ +function setName(policyID, name ) { + API.UpdatePolicy({policyID, value: JSON.stringify({name}), lastModified: null}) + .then((policyResponse) => { + if (policyResponse.jsonCode !== 200) { + return; + } + + Onyx.merge(`${ONYXKEYS.COLLECTION.POLICY}${policyID}`, {name}); + Growl.success(translateLocal('workspace.edit.growlMessageOnSave')); + }); +} + /** * @param {String} policyID * @param {Object} file @@ -247,4 +264,5 @@ export { create, updateAvatar, setAvatarURL, + setName, }; diff --git a/src/pages/home/sidebar/SidebarScreen.js b/src/pages/home/sidebar/SidebarScreen.js index b4f9dabeb2ed8..e908d5410d9fb 100755 --- a/src/pages/home/sidebar/SidebarScreen.js +++ b/src/pages/home/sidebar/SidebarScreen.js @@ -24,6 +24,7 @@ import { import Permissions from '../../../libs/Permissions'; import ONYXKEYS from '../../../ONYXKEYS'; import Firebase from '../../../libs/Firebase'; +import {create} from '../../../libs/actions/Policy'; const propTypes = { /** Beta features list */ @@ -147,7 +148,7 @@ class SidebarScreen extends Component { iconHeight: 40, text: this.props.translate('workspace.new.newWorkspace'), description: this.props.translate('workspace.new.getTheExpensifyCardAndMore'), - onSelected: () => Navigation.navigate(ROUTES.WORKSPACE_NEW), + onSelected: () => create(), }, ] : []), ]} From 876bf4394ad18f6070fbbe02083904046182813f Mon Sep 17 00:00:00 2001 From: Jasper Huang Date: Thu, 29 Jul 2021 11:29:44 -0700 Subject: [PATCH 02/15] localizations --- src/languages/en.js | 4 ++++ src/languages/es.js | 5 +++++ 2 files changed, 9 insertions(+) diff --git a/src/languages/en.js b/src/languages/en.js index 61cfaee21bc4e..7a8db4514ffba 100755 --- a/src/languages/en.js +++ b/src/languages/en.js @@ -516,6 +516,10 @@ export default { genericFailureMessage: 'An error occurred inviting the user to the workspace, please try again.', welcomeNote: ({workspaceName}) => `You have been invited to the ${workspaceName} Workspace! Download the Expensify mobile App to start tracking your expenses.`, }, + edit: { + editWorkspace: 'Edit Workspace', + growlMessageOnSave: 'Your workspace was successfully saved', + }, }, requestCallPage: { requestACall: 'Request a Call', diff --git a/src/languages/es.js b/src/languages/es.js index df6d010ee03e0..4f5025616d94a 100644 --- a/src/languages/es.js +++ b/src/languages/es.js @@ -432,6 +432,11 @@ export default { genericFailureMessage: 'Se produjo un error al invitar al usuario al espacio de trabajo. Vuelva a intentarlo..', welcomeNote: ({workspaceName}) => `¡Has sido invitado a la ${workspaceName} Espacio de trabajo! Descargue la aplicación móvil Expensify para comenzar a rastrear sus gastos.`, }, + edit: { + // TODO + editWorkspace: 'Edit Workspace', + growlMessageOnSave: 'Your workspace was successfully saved', + }, }, companyStep: { headerTitle: 'Información de la Empresa', From 9b826056f04acf7a94150fd83c82b9ae4cd50837 Mon Sep 17 00:00:00 2001 From: Jasper Huang Date: Thu, 29 Jul 2021 11:29:59 -0700 Subject: [PATCH 03/15] Setup navigation for EditWorkspacePage --- src/ROUTES.js | 3 ++- src/libs/Navigation/AppNavigator/AuthScreens.js | 6 +++--- src/libs/Navigation/linkingConfig.js | 4 ++-- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/ROUTES.js b/src/ROUTES.js index bbe1883d441e0..25e9a0ed5e2bf 100644 --- a/src/ROUTES.js +++ b/src/ROUTES.js @@ -71,10 +71,11 @@ export default { VALIDATE_LOGIN_WITH_VALIDATE_CODE_NEW_WORKSPACE: 'v/:accountID/:validateCode/new-workspace', VALIDATE_LOGIN_WITH_VALIDATE_CODE_2FA_NEW_WORKSPACE: 'v/:accountID/:validateCode/2fa/new-workspace', ENABLE_PAYMENTS: 'enable-payments', - WORKSPACE_NEW: 'workspace/new', WORKSPACE: 'workspace', + WORKSPACE_EDIT: 'workspace/:policyID/edit', WORKSPACE_CARD: ':policyID/card', WORKSPACE_PEOPLE: ':policyID/people', + getWorkspaceEditRoute: policyID => `workspace/${policyID}/edit`, getWorkspaceCardRoute: policyID => `workspace/${policyID}/card`, getWorkspacePeopleRoute: policyID => `workspace/${policyID}/people`, getWorkspaceInviteRoute: policyID => `workspace/${policyID}/invite`, diff --git a/src/libs/Navigation/AppNavigator/AuthScreens.js b/src/libs/Navigation/AppNavigator/AuthScreens.js index 028ff82ea4438..267c8177862f0 100644 --- a/src/libs/Navigation/AppNavigator/AuthScreens.js +++ b/src/libs/Navigation/AppNavigator/AuthScreens.js @@ -54,7 +54,7 @@ import { EnablePaymentsStackNavigator, AddPersonalBankAccountModalStackNavigator, ReimbursementAccountModalStackNavigator, - NewWorkspaceStackNavigator, + EditWorkspaceStackNavigator, WorkspaceInviteModalStackNavigator, RequestCallModalStackNavigator, ReportDetailsModalStackNavigator, @@ -378,9 +378,9 @@ class AuthScreens extends React.Component { listeners={modalScreenListeners} /> Date: Thu, 29 Jul 2021 11:30:20 -0700 Subject: [PATCH 04/15] Create the EditWorkspacePage from the NewWorkspacePage --- .../AppNavigator/ModalStackNavigators.js | 10 +- src/pages/workspace/NewWorkspacePage.js | 95 ------------------- src/pages/workspace/WorkspaceSidebar.js | 35 ++++--- 3 files changed, 25 insertions(+), 115 deletions(-) delete mode 100644 src/pages/workspace/NewWorkspacePage.js diff --git a/src/libs/Navigation/AppNavigator/ModalStackNavigators.js b/src/libs/Navigation/AppNavigator/ModalStackNavigators.js index 326dc6ed11ad0..db9c5e250a8df 100644 --- a/src/libs/Navigation/AppNavigator/ModalStackNavigators.js +++ b/src/libs/Navigation/AppNavigator/ModalStackNavigators.js @@ -25,7 +25,7 @@ import EnablePaymentsPage from '../../../pages/EnablePayments'; import AddPersonalBankAccountPage from '../../../pages/AddPersonalBankAccountPage'; import WorkspaceInvitePage from '../../../pages/workspace/WorkspaceInvitePage'; import ReimbursementAccountPage from '../../../pages/ReimbursementAccount/ReimbursementAccountPage'; -import NewWorkspacePage from '../../../pages/workspace/NewWorkspacePage'; +import EditWorkspacePage from '../../../pages/workspace/EditWorkspacePage'; import RequestCallPage from '../../../pages/RequestCallPage'; import ReportDetailsPage from '../../../pages/ReportDetailsPage'; @@ -182,9 +182,9 @@ const ReimbursementAccountModalStackNavigator = createModalStackNavigator([{ name: 'ReimbursementAccount_Root', }]); -const NewWorkspaceStackNavigator = createModalStackNavigator([{ - Component: NewWorkspacePage, - name: 'NewWorkspace_Root', +const EditWorkspaceStackNavigator = createModalStackNavigator([{ + Component: EditWorkspacePage, + name: 'EditWorkspace_Root', }]); const WorkspaceInviteModalStackNavigator = createModalStackNavigator([{ @@ -212,7 +212,7 @@ export { EnablePaymentsStackNavigator, AddPersonalBankAccountModalStackNavigator, ReimbursementAccountModalStackNavigator, - NewWorkspaceStackNavigator, + EditWorkspaceStackNavigator, WorkspaceInviteModalStackNavigator, RequestCallModalStackNavigator, }; diff --git a/src/pages/workspace/NewWorkspacePage.js b/src/pages/workspace/NewWorkspacePage.js deleted file mode 100644 index c817cab3d155a..0000000000000 --- a/src/pages/workspace/NewWorkspacePage.js +++ /dev/null @@ -1,95 +0,0 @@ -import React from 'react'; -import {View} from 'react-native'; -import {withOnyx} from 'react-native-onyx'; -import PropTypes from 'prop-types'; -import ONYXKEYS from '../../ONYXKEYS'; -import HeaderWithCloseButton from '../../components/HeaderWithCloseButton'; -import ScreenWrapper from '../../components/ScreenWrapper'; -import withLocalize, {withLocalizePropTypes} from '../../components/withLocalize'; -import Navigation from '../../libs/Navigation/Navigation'; -import Permissions from '../../libs/Permissions'; -import styles from '../../styles/styles'; -import WorkspaceDefaultAvatar from '../../../assets/images/workspace-default-avatar.svg'; -import TextInputWithLabel from '../../components/TextInputWithLabel'; -import Button from '../../components/Button'; -import Text from '../../components/Text'; -import compose from '../../libs/compose'; -import {create} from '../../libs/actions/Policy'; -import defaultTheme from '../../styles/themes/default'; - -const propTypes = { - /** List of betas */ - betas: PropTypes.arrayOf(PropTypes.string), - - ...withLocalizePropTypes, -}; -const defaultProps = { - betas: [], -}; - -class NewWorkspacePage extends React.Component { - constructor(props) { - super(props); - - this.state = { - name: '', - }; - - this.submit = this.submit.bind(this); - } - - submit() { - const name = this.state.name.trim(); - create(name); - } - - render() { - if (!Permissions.canUseFreePlan(this.props.betas)) { - console.debug('Not showing new workspace page because user is not on free plan beta'); - return ; - } - - return ( - - - - - - - - this.setState({name})} - onSubmitEditting={this.submit} - /> - {this.props.translate('workspace.new.helpText')} - - -