diff --git a/android/app/build.gradle b/android/app/build.gradle index 45faaf1c4f04..308156e3acba 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -156,8 +156,8 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion multiDexEnabled rootProject.ext.multiDexEnabled - versionCode 1001025702 - versionName "1.2.57-2" + versionCode 1001025803 + versionName "1.2.58-3" buildConfigField "boolean", "IS_NEW_ARCHITECTURE_ENABLED", isNewArchitectureEnabled().toString() if (isNewArchitectureEnabled()) { diff --git a/ios/NewExpensify/Info.plist b/ios/NewExpensify/Info.plist index fb94fb7e9e8a..99798a262963 100644 --- a/ios/NewExpensify/Info.plist +++ b/ios/NewExpensify/Info.plist @@ -17,7 +17,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.2.57 + 1.2.58 CFBundleSignature ???? CFBundleURLTypes @@ -30,7 +30,7 @@ CFBundleVersion - 1.2.57.2 + 1.2.58.3 ITSAppUsesNonExemptEncryption LSApplicationQueriesSchemes diff --git a/ios/NewExpensifyTests/Info.plist b/ios/NewExpensifyTests/Info.plist index 4ca474c2832d..377a0034c8eb 100644 --- a/ios/NewExpensifyTests/Info.plist +++ b/ios/NewExpensifyTests/Info.plist @@ -15,10 +15,10 @@ CFBundlePackageType BNDL CFBundleShortVersionString - 1.2.57 + 1.2.58 CFBundleSignature ???? CFBundleVersion - 1.2.57.2 + 1.2.58.3 diff --git a/package-lock.json b/package-lock.json index 6d48055f0626..44646d6a582c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "new.expensify", - "version": "1.2.57-2", + "version": "1.2.58-3", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "new.expensify", - "version": "1.2.57-2", + "version": "1.2.58-3", "hasInstallScript": true, "license": "MIT", "dependencies": { @@ -69,7 +69,7 @@ "react-native-image-picker": "^4.10.2", "react-native-image-size": "git+https://github.com/Expensify/react-native-image-size#6b5ab5110dc3ed554f8eafbc38d7d87c17147972", "react-native-modal": "^13.0.0", - "react-native-onyx": "1.0.35", + "react-native-onyx": "1.0.36", "react-native-pdf": "^6.6.2", "react-native-performance": "^4.0.0", "react-native-permissions": "^3.0.1", @@ -133,7 +133,7 @@ "css-loader": "^5.2.4", "diff-so-fancy": "^1.3.0", "dotenv": "^16.0.3", - "electron": "^21.3.4", + "electron": "^21.3.5", "electron-builder": "23.5.0", "electron-notarize": "^1.2.1", "eslint": "^7.6.0", @@ -21553,9 +21553,9 @@ } }, "node_modules/electron": { - "version": "21.3.4", - "resolved": "https://registry.npmjs.org/electron/-/electron-21.3.4.tgz", - "integrity": "sha512-700+zY0j7DikPtBRxb68i24HGGcJKqyJ9MrJoHc0J1pwcJLJFoDBP7lj2CK7QmHTO95D0d30jnvQQwreKhyozA==", + "version": "21.3.5", + "resolved": "https://registry.npmjs.org/electron/-/electron-21.3.5.tgz", + "integrity": "sha512-KV/qACdMsppgrleKuPNKk2kynO/o+hCDbl6MfGFbqY3d8RnhLixCBuertBrcap04dQ5vspMiDHekMOpSDS3SaA==", "dev": true, "hasInstallScript": true, "dependencies": { @@ -35628,9 +35628,9 @@ } }, "node_modules/react-native-onyx": { - "version": "1.0.35", - "resolved": "https://registry.npmjs.org/react-native-onyx/-/react-native-onyx-1.0.35.tgz", - "integrity": "sha512-HQDSM0c2ADb54NoSQdxqeJOhViICB9HwE8aMEB62AdHkRw6crCoIX7iSIF0ewbZ2A/hbX3frewWq8AUh3AyMvA==", + "version": "1.0.36", + "resolved": "https://registry.npmjs.org/react-native-onyx/-/react-native-onyx-1.0.36.tgz", + "integrity": "sha512-7kMdj27dk4q9bD37Jg5t9lwQSR8Cjr/9KZPKBUvWhwCwzUeg9YmPaZfu6O22eiUPo9gk4Y5L2j/mQMmXq4wc/w==", "dependencies": { "ascii-table": "0.0.9", "fast-equals": "^4.0.3", @@ -59205,9 +59205,9 @@ } }, "electron": { - "version": "21.3.4", - "resolved": "https://registry.npmjs.org/electron/-/electron-21.3.4.tgz", - "integrity": "sha512-700+zY0j7DikPtBRxb68i24HGGcJKqyJ9MrJoHc0J1pwcJLJFoDBP7lj2CK7QmHTO95D0d30jnvQQwreKhyozA==", + "version": "21.3.5", + "resolved": "https://registry.npmjs.org/electron/-/electron-21.3.5.tgz", + "integrity": "sha512-KV/qACdMsppgrleKuPNKk2kynO/o+hCDbl6MfGFbqY3d8RnhLixCBuertBrcap04dQ5vspMiDHekMOpSDS3SaA==", "dev": true, "requires": { "@electron/get": "^1.14.1", @@ -70042,9 +70042,9 @@ } }, "react-native-onyx": { - "version": "1.0.35", - "resolved": "https://registry.npmjs.org/react-native-onyx/-/react-native-onyx-1.0.35.tgz", - "integrity": "sha512-HQDSM0c2ADb54NoSQdxqeJOhViICB9HwE8aMEB62AdHkRw6crCoIX7iSIF0ewbZ2A/hbX3frewWq8AUh3AyMvA==", + "version": "1.0.36", + "resolved": "https://registry.npmjs.org/react-native-onyx/-/react-native-onyx-1.0.36.tgz", + "integrity": "sha512-7kMdj27dk4q9bD37Jg5t9lwQSR8Cjr/9KZPKBUvWhwCwzUeg9YmPaZfu6O22eiUPo9gk4Y5L2j/mQMmXq4wc/w==", "requires": { "ascii-table": "0.0.9", "fast-equals": "^4.0.3", diff --git a/package.json b/package.json index e24155b74cae..582d34f0c2ae 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "new.expensify", - "version": "1.2.57-2", + "version": "1.2.58-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.", @@ -100,7 +100,7 @@ "react-native-image-picker": "^4.10.2", "react-native-image-size": "git+https://github.com/Expensify/react-native-image-size#6b5ab5110dc3ed554f8eafbc38d7d87c17147972", "react-native-modal": "^13.0.0", - "react-native-onyx": "1.0.35", + "react-native-onyx": "1.0.36", "react-native-pdf": "^6.6.2", "react-native-performance": "^4.0.0", "react-native-permissions": "^3.0.1", @@ -164,7 +164,7 @@ "css-loader": "^5.2.4", "diff-so-fancy": "^1.3.0", "dotenv": "^16.0.3", - "electron": "^21.3.4", + "electron": "^21.3.5", "electron-builder": "23.5.0", "electron-notarize": "^1.2.1", "eslint": "^7.6.0", diff --git a/src/CONST.js b/src/CONST.js index 455a96926c4b..4bf94c64b5e8 100755 --- a/src/CONST.js +++ b/src/CONST.js @@ -481,6 +481,7 @@ const CONST = { DECIMAL_PAD: 'decimal-pad', VISIBLE_PASSWORD: 'visible-password', EMAIL_ADDRESS: 'email-address', + ASCII_CAPABLE: 'ascii-capable', }, ATTACHMENT_SOURCE_ATTRIBUTE: 'data-expensify-source', diff --git a/src/Expensify.js b/src/Expensify.js index 71f0a7c80688..6750c365c164 100644 --- a/src/Expensify.js +++ b/src/Expensify.js @@ -24,6 +24,8 @@ import * as User from './libs/actions/User'; import NetworkConnection from './libs/NetworkConnection'; import Navigation from './libs/Navigation/Navigation'; import DeeplinkWrapper from './components/DeeplinkWrapper'; +import PopoverReportActionContextMenu from './pages/home/report/ContextMenu/PopoverReportActionContextMenu'; +import * as ReportActionContextMenu from './pages/home/report/ContextMenu/ReportActionContextMenu'; // This lib needs to be imported, but it has nothing to export since all it contains is an Onyx connection // eslint-disable-next-line no-unused-vars @@ -189,6 +191,9 @@ class Expensify extends PureComponent { {!this.state.isSplashShown && ( <> + {/* We include the modal for showing a new update at the top level so the option is always present. */} {this.props.updateAvailable ? : null} {this.props.screenShareRequest ? ( diff --git a/src/components/RoomNameInput/index.native.js b/src/components/RoomNameInput/index.native.js index 273bae8a8107..a2af6fbbf049 100644 --- a/src/components/RoomNameInput/index.native.js +++ b/src/components/RoomNameInput/index.native.js @@ -30,7 +30,7 @@ class RoomNameInput extends Component { } render() { - const keyboardType = getOperatingSystem() === CONST.OS.IOS ? 'default' : 'visible-password'; + const keyboardType = getOperatingSystem() === CONST.OS.IOS ? CONST.KEYBOARD_TYPE.ASCII_CAPABLE : CONST.KEYBOARD_TYPE.VISIBLE_PASSWORD; return ( ); } diff --git a/src/libs/RoomNameInputUtils.js b/src/libs/RoomNameInputUtils.js index 3940996ec3fa..15b85f9f651a 100644 --- a/src/libs/RoomNameInputUtils.js +++ b/src/libs/RoomNameInputUtils.js @@ -8,7 +8,10 @@ import CONST from '../CONST'; */ function modifyRoomName(roomName) { const modifiedRoomNameWithoutHash = roomName - .replace(/ /g, '-'); + .replace(/ /g, '-') + + // Replaces the smart dash on iOS devices with two hyphens + .replace(/—/g, '--'); return `${CONST.POLICY.ROOM_PREFIX}${modifiedRoomNameWithoutHash}`; } diff --git a/src/pages/home/report/ContextMenu/PopoverReportActionContextMenu.js b/src/pages/home/report/ContextMenu/PopoverReportActionContextMenu.js index 2f174ce5ccf2..dd637193b0e9 100644 --- a/src/pages/home/report/ContextMenu/PopoverReportActionContextMenu.js +++ b/src/pages/home/report/ContextMenu/PopoverReportActionContextMenu.js @@ -3,7 +3,6 @@ import { Dimensions, } from 'react-native'; import _ from 'underscore'; -import PropTypes from 'prop-types'; import lodashGet from 'lodash/get'; import * as Report from '../../../../libs/actions/Report'; import withLocalize, {withLocalizePropTypes} from '../../../../components/withLocalize'; @@ -12,20 +11,9 @@ import BaseReportActionContextMenu from './BaseReportActionContextMenu'; import ConfirmModal from '../../../../components/ConfirmModal'; const propTypes = { - /** Flag to check if the chat participant is Chronos */ - isChronosReport: PropTypes.bool, - - /** Whether the provided report is an archived room */ - isArchivedRoom: PropTypes.bool, - ...withLocalizePropTypes, }; -const defaultProps = { - isChronosReport: false, - isArchivedRoom: false, -}; - class PopoverReportActionContextMenu extends React.Component { constructor(props) { super(props); @@ -48,6 +36,8 @@ class PopoverReportActionContextMenu extends React.Component { horizontal: 0, vertical: 0, }, + isArchivedRoom: false, + isChronosReport: false, }; this.onPopoverShow = () => {}; this.onPopoverHide = () => {}; @@ -126,6 +116,8 @@ class PopoverReportActionContextMenu extends React.Component { * @param {String} draftMessage - ReportAction Draftmessage * @param {Function} [onShow] - Run a callback when Menu is shown * @param {Function} [onHide] - Run a callback when Menu is hidden + * @param {Boolean} isArchivedRoom - Whether the provided report is an archived room + * @param {Boolean} isChronosReport - Flag to check if the chat participant is Chronos */ showContextMenu( type, @@ -137,6 +129,8 @@ class PopoverReportActionContextMenu extends React.Component { draftMessage, onShow = () => {}, onHide = () => {}, + isArchivedRoom, + isChronosReport, ) { const nativeEvent = event.nativeEvent || {}; this.contextMenuAnchor = contextMenuAnchor; @@ -167,6 +161,8 @@ class PopoverReportActionContextMenu extends React.Component { selection, isPopoverVisible: true, reportActionDraftMessage: draftMessage, + isArchivedRoom, + isChronosReport, }); }); } @@ -239,8 +235,8 @@ class PopoverReportActionContextMenu extends React.Component { selection={this.state.selection} reportID={this.state.reportID} reportAction={this.state.reportAction} - isArchivedRoom={this.props.isArchivedRoom} - isChronosReport={this.props.isChronosReport} + isArchivedRoom={this.state.isArchivedRoom} + isChronosReport={this.state.isChronosReport} anchor={this.contextMenuTargetNode} /> ); @@ -269,6 +265,8 @@ class PopoverReportActionContextMenu extends React.Component { reportAction: {}, isDeleteCommentConfirmModalVisible: false, shouldSetModalVisibilityForDeleteConfirmation: true, + isArchivedRoom: false, + isChronosReport: false, }); } @@ -313,8 +311,8 @@ class PopoverReportActionContextMenu extends React.Component { reportID={this.state.reportID} reportAction={this.state.reportAction} draftMessage={this.state.reportActionDraftMessage} - isArchivedRoom={this.props.isArchivedRoom} - isChronosReport={this.props.isChronosReport} + isArchivedRoom={this.state.isArchivedRoom} + isChronosReport={this.state.isChronosReport} anchor={this.contextMenuTargetNode} /> @@ -336,6 +334,5 @@ class PopoverReportActionContextMenu extends React.Component { } PopoverReportActionContextMenu.propTypes = propTypes; -PopoverReportActionContextMenu.defaultProps = defaultProps; export default withLocalize(PopoverReportActionContextMenu); diff --git a/src/pages/home/report/ContextMenu/ReportActionContextMenu.js b/src/pages/home/report/ContextMenu/ReportActionContextMenu.js index 6d14773a8ff0..df544f2e7202 100644 --- a/src/pages/home/report/ContextMenu/ReportActionContextMenu.js +++ b/src/pages/home/report/ContextMenu/ReportActionContextMenu.js @@ -14,6 +14,8 @@ const contextMenuRef = React.createRef(); * @param {String} draftMessage - ReportAction Draftmessage * @param {Function} [onShow=() => {}] - Run a callback when Menu is shown * @param {Function} [onHide=() => {}] - Run a callback when Menu is hidden + * @param {Boolean} isArchivedRoom - Whether the provided report is an archived room + * @param {Boolean} isChronosReport - Flag to check if the chat participant is Chronos */ function showContextMenu( type, @@ -25,6 +27,8 @@ function showContextMenu( draftMessage = '', onShow = () => {}, onHide = () => {}, + isArchivedRoom = false, + isChronosReport = false, ) { if (!contextMenuRef.current) { return; @@ -39,6 +43,8 @@ function showContextMenu( draftMessage, onShow, onHide, + isArchivedRoom, + isChronosReport, ); } diff --git a/src/pages/home/report/ReportActionCompose.js b/src/pages/home/report/ReportActionCompose.js index f88ea64b4fc4..c287ca22341d 100644 --- a/src/pages/home/report/ReportActionCompose.js +++ b/src/pages/home/report/ReportActionCompose.js @@ -610,7 +610,7 @@ class ReportActionCompose extends React.Component { this.actionButton.blur(); this.setMenuVisibility(true); }} - style={styles.chatItemAttachButton} + style={styles.composerSizeButton} disabled={isBlockedFromConcierge || this.props.disabled} > diff --git a/src/pages/home/report/ReportActionItem.js b/src/pages/home/report/ReportActionItem.js index fe0b8049050e..f4a871078ed8 100644 --- a/src/pages/home/report/ReportActionItem.js +++ b/src/pages/home/report/ReportActionItem.js @@ -133,6 +133,8 @@ class ReportActionItem extends Component { this.props.draftMessage, undefined, this.checkIfContextMenuActive, + ReportUtils.isArchivedRoom(this.props.report), + ReportUtils.chatIncludesChronos(this.props.report), ); } diff --git a/src/pages/home/report/ReportActionItemSingle.js b/src/pages/home/report/ReportActionItemSingle.js index bb1d39e62dc1..c90335a9da92 100644 --- a/src/pages/home/report/ReportActionItemSingle.js +++ b/src/pages/home/report/ReportActionItemSingle.js @@ -73,7 +73,7 @@ const ReportActionItemSingle = (props) => { return ( showUserDetails(props.action.actorEmail)} diff --git a/src/pages/home/report/ReportActionsView.js b/src/pages/home/report/ReportActionsView.js index b0a477769c20..c4eb9b3cc606 100755 --- a/src/pages/home/report/ReportActionsView.js +++ b/src/pages/home/report/ReportActionsView.js @@ -12,8 +12,6 @@ import withWindowDimensions, {windowDimensionsPropTypes} from '../../../componen import {withDrawerPropTypes} from '../../../components/withDrawerState'; import * as ReportScrollManager from '../../../libs/ReportScrollManager'; import withLocalize, {withLocalizePropTypes} from '../../../components/withLocalize'; -import * as ReportActionContextMenu from './ContextMenu/ReportActionContextMenu'; -import PopoverReportActionContextMenu from './ContextMenu/PopoverReportActionContextMenu'; import Performance from '../../../libs/Performance'; import {withNetwork} from '../../../components/OnyxProvider'; import * as EmojiPickerAction from '../../../libs/actions/EmojiPickerAction'; @@ -360,11 +358,6 @@ class ReportActionsView extends React.Component { loadMoreChats={this.loadMoreChats} newMarkerReportActionID={this.state.newMarkerReportActionID} /> - )} diff --git a/src/pages/settings/AppDownloadLinks.js b/src/pages/settings/AppDownloadLinks.js index 2738d184419b..9b47bdb644ef 100644 --- a/src/pages/settings/AppDownloadLinks.js +++ b/src/pages/settings/AppDownloadLinks.js @@ -17,7 +17,6 @@ import withWindowDimensions, {windowDimensionsPropTypes} from '../../components/ import * as DeviceCapabilities from '../../libs/DeviceCapabilities'; import * as ReportActionContextMenu from '../home/report/ContextMenu/ReportActionContextMenu'; import * as ContextMenuActions from '../home/report/ContextMenu/ContextMenuActions'; -import PopoverReportActionContextMenu from '../home/report/ContextMenu/PopoverReportActionContextMenu'; const propTypes = { ...withLocalizePropTypes, @@ -81,9 +80,6 @@ const AppDownloadLinksPage = (props) => { onCloseButtonPress={() => Navigation.dismissModal(true)} /> - {_.map(menuItems, item => ( { } : () => Navigation.navigate(ROUTES.getSettingsAddLoginRoute(this.props.type))} shouldShowRightIcon={Boolean(!this.props.login.partnerUserID)} - style={[!this.props.login.partnerUserID && styles.colorMuted]} + style={!this.props.login.partnerUserID ? styles.colorMuted : []} /> ) : ( diff --git a/src/styles/styles.js b/src/styles/styles.js index 665f7766cd25..47bda478842e 100644 --- a/src/styles/styles.js +++ b/src/styles/styles.js @@ -141,6 +141,7 @@ const webViewStyles = { fontSize: variables.fontSizeNormal, fontFamily: fontFamily.EXP_NEUE, flex: 1, + lineHeight: variables.fontSizeNormalHeight, }, }; @@ -709,7 +710,6 @@ const styles = { // Actions actionAvatar: { borderRadius: 20, - marginRight: variables.avatarChatSpacing, }, componentHeightLarge: { @@ -1529,34 +1529,19 @@ const styles = { backgroundColor: themeColors.buttonHoveredBG, }, - chatItemAttachButton: { - alignSelf: 'flex-end', - borderRadius: variables.componentBorderRadiusRounded, - backgroundColor: themeColors.transparent, - height: 32, - padding: 6, - marginLeft: 3, - marginRight: 3, - justifyContent: 'center', - }, - chatItemAttachBorder: { borderRightColor: themeColors.border, borderRightWidth: 1, - marginBottom: 3, - marginTop: 3, - }, composerSizeButton: { - alignItems: 'center', - alignSelf: 'flex-end', - height: 26, - marginBottom: 6, - marginTop: 6, - marginRight: 4, - justifyContent: 'center', + alignSelf: 'center', + height: 32, width: 32, + padding: 6, + margin: 3, + borderRadius: variables.componentBorderRadiusRounded, + backgroundColor: themeColors.transparent, }, chatItemAttachmentPlaceholder: {