diff --git a/android/app/build.gradle b/android/app/build.gradle index 5de2294c0993..c2c04759474a 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -106,8 +106,8 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion multiDexEnabled rootProject.ext.multiDexEnabled - versionCode 1001030801 - versionName "1.3.8-1" + versionCode 1001030808 + versionName "1.3.8-8" } splits { diff --git a/ios/NewExpensify/Info.plist b/ios/NewExpensify/Info.plist index 2cc293c5a6c4..edb2ad6b1ad8 100644 --- a/ios/NewExpensify/Info.plist +++ b/ios/NewExpensify/Info.plist @@ -30,7 +30,7 @@ CFBundleVersion - 1.3.8.1 + 1.3.8.8 ITSAppUsesNonExemptEncryption LSApplicationQueriesSchemes diff --git a/ios/NewExpensifyTests/Info.plist b/ios/NewExpensifyTests/Info.plist index 5937e2f2354b..525a2fc820c3 100644 --- a/ios/NewExpensifyTests/Info.plist +++ b/ios/NewExpensifyTests/Info.plist @@ -19,6 +19,6 @@ CFBundleSignature ???? CFBundleVersion - 1.3.8.1 + 1.3.8.8 diff --git a/package-lock.json b/package-lock.json index b506b3096155..813aea19a959 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "new.expensify", - "version": "1.3.8-1", + "version": "1.3.8-8", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "new.expensify", - "version": "1.3.8-1", + "version": "1.3.8-8", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index fed34b346dfe..c8340c932f5d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "new.expensify", - "version": "1.3.8-1", + "version": "1.3.8-8", "author": "Expensify, Inc.", "homepage": "https://new.expensify.com", "description": "New Expensify is the next generation of Expensify: a reimagination of payments based atop a foundation of chat.", diff --git a/src/CONST.js b/src/CONST.js index 20e293011f1c..b021c0e85b8f 100755 --- a/src/CONST.js +++ b/src/CONST.js @@ -675,6 +675,9 @@ const CONST = { EMAIL: 'email', }, + MAGIC_CODE_LENGTH: 6, + MAGIC_CODE_EMPTY_CHAR: ' ', + KEYBOARD_TYPE: { PHONE_PAD: 'phone-pad', NUMBER_PAD: 'number-pad', @@ -908,8 +911,9 @@ const CONST = { LOCALES: { EN: 'en', - ES_ES: 'es-ES', ES: 'es', + ES_ES: 'es-ES', + ES_ES_ONFIDO: 'es_ES', DEFAULT: 'en', }, diff --git a/src/ONYXKEYS.js b/src/ONYXKEYS.js index c9ed8ef43dab..7d59363feffd 100755 --- a/src/ONYXKEYS.js +++ b/src/ONYXKEYS.js @@ -105,6 +105,7 @@ export default { DOWNLOAD: 'download_', POLICY: 'policy_', POLICY_MEMBER_LIST: 'policyMemberList_', + WORKSPACE_INVITE_MEMBERS_DRAFT: 'workspaceInviteMembersDraft_', REPORT: 'report_', REPORT_ACTIONS: 'reportActions_', REPORT_ACTIONS_DRAFTS: 'reportActionsDrafts_', @@ -187,6 +188,7 @@ export default { PROFILE_SETTINGS_FORM: 'profileSettingsForm', DISPLAY_NAME_FORM: 'displayNameForm', LEGAL_NAME_FORM: 'legalNameForm', + WORKSPACE_INVITE_MESSAGE_FORM: 'workspaceInviteMessageForm', DATE_OF_BIRTH_FORM: 'dateOfBirthForm', HOME_ADDRESS_FORM: 'homeAddressForm', NEW_ROOM_FORM: 'newRoomForm', diff --git a/src/ROUTES.js b/src/ROUTES.js index 117cd0e6c85a..4d32028d4c6d 100644 --- a/src/ROUTES.js +++ b/src/ROUTES.js @@ -122,6 +122,7 @@ export default { WORKSPACE_NEW: 'workspace/new', WORKSPACE_INITIAL: 'workspace/:policyID', WORKSPACE_INVITE: 'workspace/:policyID/invite', + WORKSPACE_INVITE_MESSAGE: 'workspace/:policyID/invite-message', WORKSPACE_SETTINGS: 'workspace/:policyID/settings', WORKSPACE_CARD: 'workspace/:policyID/card', WORKSPACE_REIMBURSE: 'workspace/:policyID/reimburse', @@ -132,6 +133,7 @@ export default { WORKSPACE_NEW_ROOM: 'workspace/new-room', getWorkspaceInitialRoute: policyID => `workspace/${policyID}`, getWorkspaceInviteRoute: policyID => `workspace/${policyID}/invite`, + getWorkspaceInviteMessageRoute: policyID => `workspace/${policyID}/invite-message`, getWorkspaceSettingsRoute: policyID => `workspace/${policyID}/settings`, getWorkspaceCardRoute: policyID => `workspace/${policyID}/card`, getWorkspaceReimburseRoute: policyID => `workspace/${policyID}/reimburse`, diff --git a/src/components/AnchorForAttachmentsOnly/index.native.js b/src/components/AnchorForAttachmentsOnly/index.native.js index 0a98ee0bb4ec..a07aef5f8952 100644 --- a/src/components/AnchorForAttachmentsOnly/index.native.js +++ b/src/components/AnchorForAttachmentsOnly/index.native.js @@ -1,10 +1,11 @@ import React from 'react'; import * as anchorForAttachmentsOnlyPropTypes from './anchorForAttachmentsOnlyPropTypes'; import BaseAnchorForAttachmentsOnly from './BaseAnchorForAttachmentsOnly'; +import * as StyleUtils from '../../styles/StyleUtils'; import styles from '../../styles/styles'; // eslint-disable-next-line react/jsx-props-no-spreading -const AnchorForAttachmentsOnly = props => ; +const AnchorForAttachmentsOnly = props => ; AnchorForAttachmentsOnly.propTypes = anchorForAttachmentsOnlyPropTypes.propTypes; AnchorForAttachmentsOnly.defaultProps = anchorForAttachmentsOnlyPropTypes.defaultProps; diff --git a/src/components/Form.js b/src/components/Form.js index 1abfe5599576..8708eab04c6c 100644 --- a/src/components/Form.js +++ b/src/components/Form.js @@ -71,6 +71,9 @@ const propTypes = { /** Container styles */ style: stylePropTypes, + /** Custom content to display in the footer after submit button */ + footerContent: PropTypes.oneOfType([PropTypes.func, PropTypes.node]), + ...withLocalizePropTypes, }; @@ -84,6 +87,7 @@ const defaultProps = { enabledWhenOffline: false, isSubmitActionDangerous: false, scrollContextEnabled: false, + footerContent: null, style: [], }; @@ -332,6 +336,7 @@ class Form extends React.Component { isLoading={this.props.formState.isLoading} message={_.isEmpty(this.props.formState.errorFields) ? this.getErrorMessage() : null} onSubmit={this.submit} + footerContent={this.props.footerContent} onFixTheErrorsLinkPressed={() => { const errors = !_.isEmpty(this.state.errors) ? this.state.errors : this.props.formState.errorFields; const focusKey = _.find(_.keys(this.inputRefs), key => _.keys(errors).includes(key)); diff --git a/src/components/FormAlertWithSubmitButton.js b/src/components/FormAlertWithSubmitButton.js index 2ff4f0b94b55..2ef81e47ce32 100644 --- a/src/components/FormAlertWithSubmitButton.js +++ b/src/components/FormAlertWithSubmitButton.js @@ -1,5 +1,6 @@ import React from 'react'; import PropTypes from 'prop-types'; +import {View} from 'react-native'; import styles from '../styles/styles'; import Button from './Button'; import FormAlertWrapper from './FormAlertWrapper'; @@ -41,6 +42,9 @@ const propTypes = { /** Whether the form submit action is dangerous */ isSubmitActionDangerous: PropTypes.bool, + + /** Custom content to display in the footer after submit button */ + footerContent: PropTypes.oneOfType([PropTypes.func, PropTypes.node]), }; const defaultProps = { @@ -53,6 +57,7 @@ const defaultProps = { enabledWhenOffline: false, disablePressOnEnter: false, isSubmitActionDangerous: false, + footerContent: null, }; const FormAlertWithSubmitButton = props => ( @@ -63,25 +68,30 @@ const FormAlertWithSubmitButton = props => ( message={props.message} onFixTheErrorsLinkPressed={props.onFixTheErrorsLinkPressed} > - {isOffline => ((isOffline && !props.enabledWhenOffline) ? ( -