Skip to content

Commit

Permalink
Merge branch 'main' into fix/31372-user-avatar-not-showing
Browse files Browse the repository at this point in the history
  • Loading branch information
bernhardoj committed Dec 1, 2023
2 parents cd3ae07 + 2e8de3f commit 86b38b6
Show file tree
Hide file tree
Showing 78 changed files with 663 additions and 1,157 deletions.
13 changes: 0 additions & 13 deletions android/app/src/main/res/values/styles.xml
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@
<item name="android:editTextBackground">@drawable/rn_edit_text_material</item>
<item name="popupTheme">@style/AppTheme.Popup</item>
<item name="android:spinnerDropDownItemStyle">@style/TextViewSpinnerDropDownItem</item>
<item name="android:datePickerDialogTheme">@style/DatePickerDialogTheme</item>
<item name="android:alertDialogTheme">@style/AlertDialogTheme</item>
</style>

Expand All @@ -28,18 +27,6 @@
<item name="android:fontFamily">@font/expneuebold</item>
</style>

<!-- Theme used by the DatePicker dialog -->
<style name="DatePickerDialogTheme" parent="Theme.AppCompat.Dialog">
<item name="android:windowBackground">@drawable/datepicker_background</item>
<item name="android:datePickerStyle">@style/DatePickerStyle</item>
<item name="android:fontFamily">@font/expneuebold</item>
<item name="colorAccent">@color/accent</item>
</style>

<style name="DatePickerStyle" parent="android:Widget.Material.DatePicker">
<item name="android:headerBackground">@color/card_highlight_bg</item> <!-- header background color -->
</style>

<!-- Theme used by the Alert dialog -->
<style name="AlertDialogTheme" parent="Theme.AppCompat.Dialog.Alert">
<item name="android:windowBackground">@drawable/alert_background</item>
Expand Down
21 changes: 12 additions & 9 deletions docs/articles/expensify-classic/account-settings/Merge-Accounts.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,29 +5,32 @@ description: How to merge two Expensify accounts and why this is useful.

# Overview

Merging accounts allows you to combine two accounts. When you combine two accounts, all receipts, expenses, expense reports, invoices, bills, imported cards, secondary logins, co-pilots, and group policy settings will be combined into one account.
Merging accounts allows you to combine two accounts. When you combine two accounts, all receipts, expenses, expense reports, invoices, bills, imported cards, secondary logins, co-pilots, and group workspace settings will be combined into one account.
This can be useful if you start off with an account of your own but your organization creates a separate account for you. You can then track both personal and business expenses via one account.

# How to merge accounts
Merging two accounts together is fairly straightforward. Let’s go over how to do that below:
1. Navigate to [expensify.com](https://www.expensify.com)
2. Log into the account you want to set as the Primary account
3. Navigate to Settings > Account > Account Details
4. Scroll down to the Merge Accounts section and fill in the fields. Once you click Merge, a magic code link will be sent to you via email and you'll be prompted to enter the magic code
5. Copy the magic code, switch back to the expensify.com page, and paste the code into the required field
3. Navigate to **Settings > Account > Account Details**
4. Scroll down to Merge Accounts and fill in the fields
6. Click Merge Accounts
7. Once you click Merge, a magic code is sent to you via email
8. Paste the code into the required field
If you have any questions about this process, feel free to reach out to Concierge for some assistance!

# FAQ
## Can you merge accounts from the mobile app?
No, accounts can only be merged from the full website at expensify.com.
## Can I administratively merge two accounts together?
No, only the account holder (user) can perform account merging.
No, only the account holder (member) can perform account merging.
## Is merging accounts reversible?
No, merging accounts is not reversible. It is a permanent action that cannot be undone.
## I have open expenses in the account I'm merging from. Will those expenses merge into the new account?
All expenses must be reported and submitted for them to merge into the new account. Any open expenses will not merge.
## Are there any restrictions on account merging?
Yes! Please see below:
* If your email address belongs to a verified domain (verified in Expensify), you must start the process from the email account under the verified domain. You cannot merge a verified company email account into a personal account.
* If you have two accounts with two different verified domains, you cannot merge them together.
## What happens to my “personal” Individual policy when merging accounts?
The old “personal” Individual policy will be deleted. If you plan to submit reports under a different policy in the future, ensure that any reports on the Individual policy in the old account are marked as Open before merging the accounts. You can typically do this by selecting “Undo Submit” on any submitted reports.
- If your email address belongs to a verified domain (verified in Expensify), you must start the process from the email account under the verified domain. You cannot merge a verified company email account into a personal account.
- If you have two accounts with two different verified domains, you cannot merge them together.
## What happens to my “personal” Individual workspace when merging accounts?
The old “personal” Individual workspace is deleted. If you plan to submit reports under a different workspace in the future, ensure that any reports on the Individual workspace in the old account are marked as Open before merging the accounts. You can typically do this by selecting “Undo Submit” on any submitted reports.
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,30 @@ description: Get the most out of your Expensify Card with exclusive perks!


# Overview
The Expensify Card is packed with perks, both native to our Card program and through exclusive discounts with partnering solutions. Below, we’ll cover all of our exclusive offers in more detail and how to claim discounts with our partners.
The Expensify Card is packed with perks, both native to our Card program and through exclusive discounts with partnering solutions. The Expensify Card’s primary perks include:
- Swipe to Win, where every swipe has a chance to win fun personalized gifts for you and your closest friends and family members
- Unbeatable cash back incentive with each swipe
Below, we’ll cover all of our exclusive offers in more detail and how to claim discounts with our partners.

# Expensify Card Perks

## Swipe to Win
Swipe to Win is a new [Expensify Card](https://use.expensify.com/company-credit-card) perk that gives cardholders the chance to send a gift to a friend, family member, or essential worker on the frontlines!

Winners can choose to _Send a Smile_ or _Send a Laugh_. To start, we’re offering one gift per option:

- **Send A Smile:** Champagne by Expensify
- **Send a Laugh:** Jenga Set

**How to Participate**
It’s easy! Once you have an Expensify Card, you just need to start using it. With each swipe, you're automatically entered to win and have a 1 in 250 chance of getting a prize!

**How will I know if I’ve won?**
Winners will be notified immediately via the Expensify app, and receive additional instructions on how to choose and send their desired gift.

If you don't have Expensify notifications turned on yet, here are some helpful guides:
- [Apple Notification Preferences](https://support.apple.com/en-us/HT201925)
- [Android Notification Preferences](https://community.expensify.com/home/leaving?allowTrusted=1&target=https%3A%2F%2Fsupport.google.com%2Fandroid%2Fanswer%2F9079661%3Fhl%3Den)

# Partner Specific Perks

Expand Down Expand Up @@ -188,4 +211,3 @@ Stripe Atlas helps removes obstacles typically associated with starting a busine
**Receive $100 off Stripe Atlas and get access to a startup toolkit and special offers on additional Strip Atlas services.**

**How to redeem:** Sign up with your Expensify Card.

27 changes: 27 additions & 0 deletions docs/articles/new-expensify/get-paid-back/Distance-Requests.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
---
title: Distance Requests
description: How to create a distance request and request reimbursement for mileage
---
<!-- The lines above are required by Jekyll to process the .md file -->

# Overview

Expensify allows you to request reimbursement for mileage by creating a distance request from a map. You can send a distance request in Expensify's mobile, desktop, or web app.


# How to create and send a distance request

1. Click the green + button and select Request Money.
2. Select Distance along the top row of the Request Money window.
3. Enter the Start and Finish addresses then click Next. If there are multiple stops, you can add them before clicking Next.
4. Choose who to send the request to by selecting your organization's workspace from the list of recent workspaces.
5. On the confirmation page, confirm the amount, date, distance, and optionally add a description or category. Click the Request button.
6. A workspace admin will receive your request and can reimburse you through Expensify or elsewhere!



# FAQs

## Is there an easy way to reuse recent locations?

Yes! We save your recently used locations and list them out on the page where you select the Start and Finish.
Binary file modified docs/assets/images/ExpensifyHelp_Time.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/assets/images/QBO1.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/assets/images/QBO2-Bill.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/assets/images/QBO3-Checktoprint.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/assets/images/QBO4-JournalEntry.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/assets/images/QBO5-Expense.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/assets/images/QBO6-Check.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/assets/images/QBO7-Transactions.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
6 changes: 0 additions & 6 deletions ios/Podfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -726,8 +726,6 @@ PODS:
- React-Core
- RNCPicker (2.4.4):
- React-Core
- RNDateTimePicker (3.5.2):
- React-Core
- RNDeviceInfo (10.3.0):
- React-Core
- RNDevMenu (4.1.1):
Expand Down Expand Up @@ -919,7 +917,6 @@ DEPENDENCIES:
- "RNCAsyncStorage (from `../node_modules/@react-native-async-storage/async-storage`)"
- "RNCClipboard (from `../node_modules/@react-native-clipboard/clipboard`)"
- "RNCPicker (from `../node_modules/@react-native-picker/picker`)"
- "RNDateTimePicker (from `../node_modules/@react-native-community/datetimepicker`)"
- RNDeviceInfo (from `../node_modules/react-native-device-info`)
- RNDevMenu (from `../node_modules/react-native-dev-menu`)
- RNFastImage (from `../node_modules/react-native-fast-image`)
Expand Down Expand Up @@ -1121,8 +1118,6 @@ EXTERNAL SOURCES:
:path: "../node_modules/@react-native-clipboard/clipboard"
RNCPicker:
:path: "../node_modules/@react-native-picker/picker"
RNDateTimePicker:
:path: "../node_modules/@react-native-community/datetimepicker"
RNDeviceInfo:
:path: "../node_modules/react-native-device-info"
RNDevMenu:
Expand Down Expand Up @@ -1270,7 +1265,6 @@ SPEC CHECKSUMS:
RNCAsyncStorage: 8616bd5a58af409453ea4e1b246521bb76578d60
RNCClipboard: d77213bfa269013bf4b857b7a9ca37ee062d8ef1
RNCPicker: 0b65be85fe7954fbb2062ef079e3d1cde252d888
RNDateTimePicker: 7658208086d86d09e1627b5c34ba0cf237c60140
RNDeviceInfo: 4701f0bf2a06b34654745053db0ce4cb0c53ada7
RNDevMenu: 72807568fe4188bd4c40ce32675d82434b43c45d
RNFastImage: 5c9c9fed9c076e521b3f509fe79e790418a544e8
Expand Down
18 changes: 0 additions & 18 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 0 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,6 @@
"@react-native-async-storage/async-storage": "^1.17.10",
"@react-native-camera-roll/camera-roll": "5.4.0",
"@react-native-clipboard/clipboard": "^1.12.1",
"@react-native-community/datetimepicker": "^3.5.2",
"@react-native-community/geolocation": "^3.0.6",
"@react-native-community/netinfo": "^9.3.10",
"@react-native-firebase/analytics": "^12.3.0",
Expand Down
30 changes: 30 additions & 0 deletions src/CONST.ts
Original file line number Diff line number Diff line change
Expand Up @@ -497,6 +497,7 @@ const CONST = {
MODIFIEDEXPENSE: 'MODIFIEDEXPENSE',
MOVED: 'MOVED',
REIMBURSEMENTQUEUED: 'REIMBURSEMENTQUEUED',
REIMBURSEMENTDEQUEUED: 'REIMBURSEMENTDEQUEUED',
RENAMED: 'RENAMED',
REPORTPREVIEW: 'REPORTPREVIEW',
SUBMITTED: 'SUBMITTED',
Expand Down Expand Up @@ -1165,6 +1166,9 @@ const CONST = {
SVG: 'svg',
},
RECEIPT_ERROR: 'receiptError',
CANCEL_REASON: {
PAYMENT_EXPIRED: 'CANCEL_REASON_PAYMENT_EXPIRED',
},
},

GROWL: {
Expand Down Expand Up @@ -2852,6 +2856,32 @@ const CONST = {
RUNS: 20,
},

/**
* Bank account names
*/
BANK_NAMES: {
EXPENSIFY: 'expensify',
AMERICAN_EXPRESS: 'americanexpress',
BANK_OF_AMERICA: 'bank of america',
BB_T: 'bbt',
CAPITAL_ONE: 'capital one',
CHASE: 'chase',
CHARLES_SCHWAB: 'charles schwab',
CITIBANK: 'citibank',
CITIZENS_BANK: 'citizens bank',
DISCOVER: 'discover',
FIDELITY: 'fidelity',
GENERIC_BANK: 'generic bank',
HUNTINGTON_BANK: 'huntington bank',
NAVY_FEDERAL_CREDIT_UNION: 'navy federal credit union',
PNC: 'pnc',
REGIONS_BANK: 'regions bank',
SUNTRUST: 'suntrust',
TD_BANK: 'td bank',
US_BANK: 'us bank',
USAA: 'usaa',
},

/**
* Constants for maxToRenderPerBatch parameter that is used for FlatList or SectionList. This controls the amount of items rendered per batch, which is the next chunk of items rendered on every scroll.
*/
Expand Down
Original file line number Diff line number Diff line change
@@ -1,57 +1,52 @@
import PropTypes from 'prop-types';
import React from 'react';
import {Text, View} from 'react-native';
import reportPropTypes from '@pages/reportPropTypes';
import {OnyxCollection} from 'react-native-onyx';
import {OnyxEntry} from 'react-native-onyx/lib/types';
import useLocalize from '@hooks/useLocalize';
import useThemeStyles from '@styles/useThemeStyles';
import * as Session from '@userActions/Session';
import {PersonalDetails, Report} from '@src/types/onyx';
import AvatarWithDisplayName from './AvatarWithDisplayName';
import Button from './Button';
import ExpensifyWordmark from './ExpensifyWordmark';
import participantPropTypes from './participantPropTypes';
import withLocalize, {withLocalizePropTypes} from './withLocalize';

const propTypes = {
type AnonymousReportFooterProps = {
/** The report currently being looked at */
report: reportPropTypes,
report: OnyxEntry<Report>;

isSmallSizeLayout: PropTypes.bool,
/** Whether the small screen size layout should be used */
isSmallSizeLayout?: boolean;

/** Personal details of all the users */
personalDetails: PropTypes.objectOf(participantPropTypes),

...withLocalizePropTypes,
};

const defaultProps = {
report: {},
isSmallSizeLayout: false,
personalDetails: {},
personalDetails: OnyxCollection<PersonalDetails>;
};

function AnonymousReportFooter(props) {
function AnonymousReportFooter({isSmallSizeLayout = false, personalDetails, report}: AnonymousReportFooterProps) {
const styles = useThemeStyles();
const {translate} = useLocalize();

return (
<View style={styles.anonymousRoomFooter(props.isSmallSizeLayout)}>
<View style={styles.anonymousRoomFooter(isSmallSizeLayout)}>
<View style={[styles.flexRow, styles.flexShrink1]}>
<AvatarWithDisplayName
report={props.report}
personalDetails={props.personalDetails}
report={report}
personalDetails={personalDetails}
isAnonymous
shouldEnableDetailPageNavigation
/>
</View>
<View style={styles.anonymousRoomFooterWordmarkAndLogoContainer(props.isSmallSizeLayout)}>
<View style={[props.isSmallSizeLayout ? styles.mr1 : styles.mr4, styles.flexShrink1]}>
<View style={[props.isSmallSizeLayout ? styles.alignItemsStart : styles.alignItemsEnd]}>
<View style={styles.anonymousRoomFooterWordmarkAndLogoContainer(isSmallSizeLayout)}>
<View style={[isSmallSizeLayout ? styles.mr1 : styles.mr4, styles.flexShrink1]}>
<View style={[isSmallSizeLayout ? styles.alignItemsStart : styles.alignItemsEnd]}>
<ExpensifyWordmark style={styles.anonymousRoomFooterLogo} />
</View>
<Text style={styles.anonymousRoomFooterLogoTaglineText}>{props.translate('anonymousReportFooter.logoTagline')}</Text>
<Text style={styles.anonymousRoomFooterLogoTaglineText}>{translate('anonymousReportFooter.logoTagline')}</Text>
</View>
<View style={[styles.anonymousRoomFooterSignInButton]}>
<Button
medium
success
text={props.translate('common.signIn')}
text={translate('common.signIn')}
onPress={() => Session.signOutAndRedirectToSignIn()}
/>
</View>
Expand All @@ -60,8 +55,6 @@ function AnonymousReportFooter(props) {
);
}

AnonymousReportFooter.propTypes = propTypes;
AnonymousReportFooter.defaultProps = defaultProps;
AnonymousReportFooter.displayName = 'AnonymousReportFooter';

export default withLocalize(AnonymousReportFooter);
export default AnonymousReportFooter;
5 changes: 2 additions & 3 deletions src/components/Composer/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -171,11 +171,10 @@ function Composer({
const {windowWidth} = useWindowDimensions();
const textRef = useRef(null);
const textInput = useRef(null);
const initialValue = defaultValue ? `${defaultValue}` : `${value || ''}`;
const [numberOfLines, setNumberOfLines] = useState(numberOfLinesProp);
const [selection, setSelection] = useState({
start: initialValue.length,
end: initialValue.length,
start: selectionProp.start,
end: selectionProp.end,
});
const [caretContent, setCaretContent] = useState('');
const [valueBeforeCaret, setValueBeforeCaret] = useState('');
Expand Down
Loading

0 comments on commit 86b38b6

Please sign in to comment.