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: {