diff --git a/android/app/build.gradle b/android/app/build.gradle index 8a908f0ac306..ca023e4a5b9c 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 1001034802 - versionName "1.3.48-2" + versionCode 1001034803 + versionName "1.3.48-3" } splits { diff --git a/ios/NewExpensify/Info.plist b/ios/NewExpensify/Info.plist index 92b8b9877a60..54df358523e0 100644 --- a/ios/NewExpensify/Info.plist +++ b/ios/NewExpensify/Info.plist @@ -32,7 +32,7 @@ CFBundleVersion - 1.3.48.2 + 1.3.48.3 ITSAppUsesNonExemptEncryption LSApplicationQueriesSchemes diff --git a/ios/NewExpensifyTests/Info.plist b/ios/NewExpensifyTests/Info.plist index babb0945f07e..4a3502f97d0c 100644 --- a/ios/NewExpensifyTests/Info.plist +++ b/ios/NewExpensifyTests/Info.plist @@ -19,6 +19,6 @@ CFBundleSignature ???? CFBundleVersion - 1.3.48.2 + 1.3.48.3 diff --git a/package-lock.json b/package-lock.json index 396840f8fd42..09472f396189 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "new.expensify", - "version": "1.3.48-2", + "version": "1.3.48-3", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "new.expensify", - "version": "1.3.48-2", + "version": "1.3.48-3", "hasInstallScript": true, "license": "MIT", "dependencies": { @@ -81,7 +81,6 @@ "react-native-localize": "^2.2.6", "react-native-modal": "^13.0.0", "react-native-onyx": "1.0.52", - "react-native-pager-view": "^6.2.0", "react-native-pdf": "^6.6.2", "react-native-performance": "^4.0.0", "react-native-permissions": "^3.0.1", @@ -36620,6 +36619,7 @@ "version": "6.2.0", "resolved": "https://registry.npmjs.org/react-native-pager-view/-/react-native-pager-view-6.2.0.tgz", "integrity": "sha512-pf9OnL/Tkr+5s4Gjmsn7xh91PtJLDa6qxYa/bmtUhd/+s4cQdWQ8DIFoOFghwZIHHHwVdWtoXkp6HtpjN+r20g==", + "peer": true, "peerDependencies": { "react": "*", "react-native": "*" @@ -68238,6 +68238,7 @@ "version": "6.2.0", "resolved": "https://registry.npmjs.org/react-native-pager-view/-/react-native-pager-view-6.2.0.tgz", "integrity": "sha512-pf9OnL/Tkr+5s4Gjmsn7xh91PtJLDa6qxYa/bmtUhd/+s4cQdWQ8DIFoOFghwZIHHHwVdWtoXkp6HtpjN+r20g==", + "peer": true, "requires": {} }, "react-native-pdf": { diff --git a/package.json b/package.json index 2b5ad9513ae7..f7bb1fe289ec 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "new.expensify", - "version": "1.3.48-2", + "version": "1.3.48-3", "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.", @@ -119,7 +119,6 @@ "react-native-localize": "^2.2.6", "react-native-modal": "^13.0.0", "react-native-onyx": "1.0.52", - "react-native-pager-view": "^6.2.0", "react-native-pdf": "^6.6.2", "react-native-performance": "^4.0.0", "react-native-permissions": "^3.0.1", diff --git a/src/CONST.js b/src/CONST.js index b214bc614f04..79c50cccac79 100755 --- a/src/CONST.js +++ b/src/CONST.js @@ -324,8 +324,8 @@ const CONST = { }, type: KEYBOARD_SHORTCUT_NAVIGATION_TYPE, }, - NEW_GROUP: { - descriptionKey: 'newGroup', + NEW_CHAT: { + descriptionKey: 'newChat', shortcutKey: 'K', modifiers: ['CTRL', 'SHIFT'], trigger: { @@ -2550,6 +2550,8 @@ const CONST = { RECEIPT_TAB_ID: 'ReceiptTab', MANUAL: 'manual', SCAN: 'scan', + NEW_CHAT: 'chat', + NEW_ROOM: 'room', }, }; diff --git a/src/ROUTES.js b/src/ROUTES.js index 65b335325e3d..0f78061c5155 100644 --- a/src/ROUTES.js +++ b/src/ROUTES.js @@ -58,8 +58,9 @@ export default { SETTINGS_2FA_CODES: 'settings/security/two-factor-auth/codes', SETTINGS_2FA_VERIFY: 'settings/security/two-factor-auth/verify', SETTINGS_2FA_SUCCESS: 'settings/security/two-factor-auth/success', - NEW_GROUP: 'new/group', + NEW: 'new/:tab', NEW_CHAT: 'new/chat', + NEW_ROOM: 'new/room', NEW_TASK, REPORT, REPORT_WITH_ID: 'r/:reportID?', @@ -155,7 +156,6 @@ export default { WORKSPACE_INVOICES: 'workspace/:policyID/invoices', WORKSPACE_TRAVEL: 'workspace/:policyID/travel', WORKSPACE_MEMBERS: 'workspace/:policyID/members', - WORKSPACE_NEW_ROOM: 'workspace/new-room', getWorkspaceInitialRoute: (policyID) => `workspace/${policyID}`, getWorkspaceInviteRoute: (policyID) => `workspace/${policyID}/invite`, getWorkspaceInviteMessageRoute: (policyID) => `workspace/${policyID}/invite-message`, diff --git a/src/components/Button/index.js b/src/components/Button/index.js index a850a43d2fb0..7f6fa06a845f 100644 --- a/src/components/Button/index.js +++ b/src/components/Button/index.js @@ -49,6 +49,9 @@ const propTypes = { /** medium sized button */ medium: PropTypes.bool, + /** Center the text and the icon */ + centered: PropTypes.bool, + /** Indicates whether the button should be disabled and in the loading state */ isLoading: PropTypes.bool, @@ -96,6 +99,9 @@ const propTypes = { /** Whether we should use the danger theme color */ danger: PropTypes.bool, + /** Whether the background of the button should be transparent */ + transparent: PropTypes.bool, + /** Children to replace all inner contents of button */ children: PropTypes.node, @@ -135,6 +141,7 @@ const defaultProps = { small: false, large: false, medium: false, + centered: false, onPress: () => {}, onLongPress: () => {}, onPressIn: () => {}, @@ -148,6 +155,7 @@ const defaultProps = { shouldUseDefaultHover: false, success: false, danger: false, + transparent: false, children: null, shouldRemoveRightBorderRadius: false, shouldRemoveLeftBorderRadius: false, @@ -225,7 +233,7 @@ class Button extends Component { if (this.props.icon || this.props.shouldShowRightIcon) { return ( - + {this.props.icon && ( @@ -292,6 +300,7 @@ class Button extends Component { this.props.large ? styles.buttonLarge : undefined, this.props.success ? styles.buttonSuccess : undefined, this.props.danger ? styles.buttonDanger : undefined, + this.props.transparent ? styles.buttonTransparent : undefined, this.props.isDisabled && (this.props.success || this.props.danger) ? styles.buttonOpacityDisabled : undefined, this.props.isDisabled && !this.props.danger && !this.props.success ? styles.buttonDisabled : undefined, this.props.shouldRemoveRightBorderRadius ? styles.noRightBorderRadius : undefined, diff --git a/src/components/OptionRow.js b/src/components/OptionRow.js index adaa4457bbd9..9f194a31196c 100644 --- a/src/components/OptionRow.js +++ b/src/components/OptionRow.js @@ -6,6 +6,7 @@ import {View, StyleSheet, InteractionManager} from 'react-native'; import styles from '../styles/styles'; import * as StyleUtils from '../styles/StyleUtils'; import optionPropTypes from './optionPropTypes'; +import Button from './Button'; import Icon from './Icon'; import * as Expensicons from './Icon/Expensicons'; import MultipleAvatars from './MultipleAvatars'; @@ -39,6 +40,15 @@ const propTypes = { /** Whether we should show the selected state */ showSelectedState: PropTypes.bool, + /** Whether to show a button pill instead of a tickbox */ + shouldShowSelectedStateAsButton: PropTypes.bool, + + /** Text for button pill */ + selectedStateButtonText: PropTypes.string, + + /** Callback to fire when the multiple selector (tickbox or button) is clicked */ + onSelectedStatePressed: PropTypes.func, + /** Whether this item is selected */ isSelected: PropTypes.bool, @@ -65,6 +75,9 @@ const propTypes = { const defaultProps = { hoverStyle: styles.sidebarLinkHover, showSelectedState: false, + shouldShowSelectedStateAsButton: false, + selectedStateButtonText: 'Select', + onSelectedStatePressed: undefined, isSelected: false, boldStyle: false, showTitleTooltip: false, @@ -149,7 +162,6 @@ class OptionRow extends Component { pendingAction={this.props.option.pendingAction} errors={this.props.option.allReportErrors} shouldShowErrorMessages={false} - needsOffscreenAlphaCompositing > {(hovered) => ( @@ -248,7 +260,15 @@ class OptionRow extends Component { /> )} - {this.props.showSelectedState && } + {this.props.showSelectedState && (this.props.shouldShowSelectedStateAsButton && !this.props.isSelected) ? +