Skip to content

Commit

Permalink
Merge branch 'main' into Rory-AutomatedThemeHookMigration
Browse files Browse the repository at this point in the history
  • Loading branch information
roryabraham committed Nov 15, 2023
2 parents b082a9a + 39a6ed3 commit 6ff977b
Show file tree
Hide file tree
Showing 31 changed files with 374 additions and 276 deletions.
4 changes: 2 additions & 2 deletions android/app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -91,8 +91,8 @@ android {
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
multiDexEnabled rootProject.ext.multiDexEnabled
versionCode 1001039805
versionName "1.3.98-5"
versionCode 1001039900
versionName "1.3.99-0"
}

flavorDimensions "default"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
---
title: ExpensifyApproved! Partner Program
description: How to Join the ExpensifyApproved! Partner Program
---

# Overview

As trusted accountants and financial advisors, you strive to offer your clients the best tools available. Expensify is recognized as a leading, all-in-one expense and corporate card management platform suitable for clients of every size. By becoming an ExpensifyApproved! Partner, you unlock exclusive benefits for both you and your clientele.
## Key Benefits
Dedicated Partner Manager: Enjoy personalized assistance with an assigned Partner Manager post-course completion.
Client Onboarding Support: A dedicated Client Onboarding Manager will aid in smooth transitions.
Free Expensify Account: Complimentary access to our platform for your convenience.
Revenue share (US-only): All partners receive 0.5% revenue share on client Expensify Card transactions. Keep this as a bonus or offer it to your clients as cash back.
Exclusive CPA Card (US-only): Automated expense reconciliation from swipe to journal entry with the CPA Card.
Special Pricing Offers (US-only): Avail partner-specific discounts for your clients and a revenue share from client Expensify Card transactions.
Professional Growth (US-only): Earn 3 CPE credits after completing the ExpensifyApproved! University.
Cobranded Marketing - Collaborate with your Partner Manager to craft custom marketing materials, case studies, and more.

# How to join the ExpensifyApproved! Partner Program

1. Enroll in ExpensifyApproved! University (EA!U)
Visit university.expensify.com and enroll in the “Getting Started with Expensify” course.
This course imparts the essentials of Expensify, ensuring you follow the best practices for client setups.

2. Complete the course
Grasp the core features and functionalities of Expensify.
Ensure you're equipped to serve your clients using Expensify to its fullest.
Once completed, you’ll be prompted to schedule a call with your Partner Manager. **This call is required to earn your certification.**

3. Once you successfully complete the course, you'll unlock:
- A dedicated Partner Manager - assigned to you after you have completed the course!
- A dedicated Client Setup Specialist
- Membership to the ExpensifyApproved! Partner Program.
- A complimentary free Expensify account
- Access to the exclusive CPA Card (US-only).
- Partner-specific discounts to extend to your clients.
- A 0.5% revenue share on client Expensify Card expenses (US-only)
- 3 CPE credits (US-only).
135 changes: 134 additions & 1 deletion docs/articles/expensify-classic/getting-started/Employees.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,137 @@
title: Employees
description: Employees
---
## Resource Coming Soon!
# Overview

This post will cover getting started with Expensify for new users (submitters and employees).

# Download the Mobile App

You can download Expensify for [iOS](https://apps.apple.com/us/app/new-expensify/id1530278510) and [Android](https://play.google.com/store/apps/details?id=com.expensify.chat&hl=en_US&gl=US) devices using the respective links here.

# How to review homepage tasks

Every time you log into Expensify, you'll land on your Home page. Here, you'll find tasks you need to take care of, like:
- Reviewing and fixing mistakes before sending your report
- Starting the review process for upcoming expense reports
- Getting helpful tips on how to use Expensify

# Create your first expense

You can create expenses in two ways: manually or automatically with SmartScan.

### Manual Expense Creation:
- On the mobile app, tap the blue "+" icon.
- On the desktop app, click "New Expense."

### Automatic Expense Creation with SmartScan:
- On the mobile app, tap the "camera" icon.
- Take a clear picture of your receipt.
- Click "Save" for the expense.
SmartScan will pull the details from the receipt and fill them in for you.

You can also forward receipts from your email address to [[email protected]](mailto:[email protected]). SmartScan will handle the receipts the same way.

Feel free to add coding details, categories, tags, comments, or attendees while SmartScan processes your receipt. SmartScan will handle the merchant, date, amount, and currency for you.

For more details on how to create and edit expenses, take a look [here](https://help.expensify.com/articles/expensify-classic/get-paid-back/expenses/Create-Expenses).

# Submit your first report

Expensify can automatically handle your reports through Scheduled Submit. There are two ways to activate this:

### Activating Scheduled Submit for personal use:
- Go to Settings > Workspaces > Individual > [Workspace Name] > Reports.
- Toggle the setting to "Enabled".
- Choose how often you want reports to be submitted.

### Activating Scheduled Submit globally for members of your Group Workspace:
- Go to Settings > Workspaces > Group > [Workspace Name] > Reports.
- Toggle the setting to "Enabled".
- Choose how often you want reports to be submitted.

_Note: If you are a member of a Group Workspace, the company's settings might already have Scheduled Submit enabled. In this case, your personal Scheduled Submit settings will be ignored in favor of the Group Workspace’s submission schedule._

If you need to send a report manually:
- Click the Submit button in the top left of the report.
- On the mobile app, tap the report and click, Submit Report.

For more details on creating and submitting reports, take a look [here](https://help.expensify.com/articles/expensify-classic/get-paid-back/reports/Create-A-Report#how-to-create-a-report).

# What happens to my reports when they’re submitted?

When you create a report, Expensify will automatically set your report to submit under the company Workspace your account is set to submit under. That means, when your report is submitted, it will follow the rules and approval chain of the Workspace.

Every new user account has access to a “personal” Workspace, which is essentially a set of rules that you set for your own, non-company reports.

With that in mind, it’s important to make sure your account is set to your company’s Workspace by default, to ensure that all newly created reports will be submitted under your company’s Workspace by default.

If you find your reports are being submitted under your personal Workspace, you can correct this by changing your default Workspace which can be found in the account menu by clicking your Account Switcher icon. Additionally, if you have a Draft report that is set to submit under your personal Workspace, you can correct that by navigating to the report, clicking the Details button in the top right corner, and selecting your company Workspace from the dropdown.

# How to use the Expenses page

The Expenses page is your hub for managing your expenses. Here you'll see three types of expenses, each with an icon representing an expense type:

- Cash Expense (represented by an icon of a bank note)
- Personal Credit Card (represented by an icon of a credit card)
- Corporate Company Card (represented by an icon of a credit card with a lock)

In Expensify, any expense that has been manually created (i.e., not imported from a bank automatically) is considered a Cash Expense. These are typically out-of-pocket expenses and default to "reimbursable" unless indicated otherwise by your Workspace Admin.

A Personal Credit Card expense is an expense that has been imported automatically from your personal bank. Personal Credit Cards can be imported through your Personal Settings, and the expenses are considered reimbursable by default unless you set it otherwise.

A Corporate Company Card expense is an expense that has been imported automatically from your company card feed set on your company's domain. This card is assigned to you by your Domain Admin, and the expenses are typically non-reimbursable.

### Navigating the Expenses page

The Expenses page allows you to search your expenses using a wide variety of filters, including date ranges, merchant names, categories and tags, and the state of the report that the expense is contained within. You can also change the view of the Expenses page to fit your personal preferences.

# How to use the Reports page

The Reports page is a hub for managing your expense reports. There are four available states for reports:

- Draft Reports: These are reports you've created but haven't submitted for approval.
- Processing Reports: These are reports currently under review by your admin.
- Approved Reports: These are reports that have been reviewed and approved by your admin.
- Reimbursed Reports: These are reports that have been reimbursed either through Expensify or by your admin outside of Expensify.

### Navigating the Reports page

The Reports page allows you to search your reports using a wide variety of filters, including date range, Report name or email address of the submitter, Report type, and Report state.

# How to add a deposit account

Adding a deposit account allows you to be reimbursed through Expensify by your company. There are a few nuanced differences between how to add deposit accounts depending on the currency you will be reimbursed in. Take a look at the different options [here](https://help.expensify.com/expensify-classic/hubs/bank-accounts-and-credit-cards/deposit-accounts).

# Add a Secondary Login to your account

Expensify accounts are personal by design. They belong to you, the user, forever. Yes, you might change careers, but your account will always be yours, just add your new company email address.

To ensure you get to keep your Expensify account as you shuffle through your professional life, we recommend adding your personal email address as your Secondary Login. This will ensure that, even if you were to leave your current position for something new and exciting, your account will not be closed when you are removed from the company. Instead, your company email address would be stripped from the account, but you would maintain ownership of the Expensify account.

[Here’s](https://help.expensify.com/articles/expensify-classic/account-settings/Account-Details#how-to-add-a-secondary-login) how you can do that!

# How to secure your account

You can add an extra layer of security to your account by turning on Two Factor Authentication (2FA). Follow these steps on either your computer or mobile phone:

### On Computer (Desktop):
- Open the desktop app.
- Go to Settings > Accounts > Account Details > Two Factor Authentication.
- Toggle the switch to "Enabled."
- Save or download your Recovery Codes. If you can't use your authenticator app, these codes are essential for access.

### On Mobile phone:
- Open the Expensify app and go to Settings.
- Turn on the switch next to Two Factor Authentication.
- Save or download your Recovery Codes.
- On the next screen, copy the Secret Key and paste it into your preferred authenticator app.
- Once connected, enter the code from your app into Expensify before the time runs out.

*Note: It's best to keep the time/date set to "Network" for Android and iOS to avoid issues with authentication codes that depend on time zones.*

### Using Recovery Codes

Only use a recovery code as a last resort to sign into your Expensify account. If you do use a recovery code:
- Reset 2FA in your account settings on the web or mobile app after gaining access.
- Toggle off and on 2FA to set it up again and get new recovery codes.
4 changes: 2 additions & 2 deletions ios/NewExpensify/Info.plist
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>1.3.98</string>
<string>1.3.99</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleURLTypes</key>
Expand All @@ -40,7 +40,7 @@
</dict>
</array>
<key>CFBundleVersion</key>
<string>1.3.98.5</string>
<string>1.3.99.0</string>
<key>ITSAppUsesNonExemptEncryption</key>
<false/>
<key>LSApplicationQueriesSchemes</key>
Expand Down
4 changes: 2 additions & 2 deletions ios/NewExpensifyTests/Info.plist
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,10 @@
<key>CFBundlePackageType</key>
<string>BNDL</string>
<key>CFBundleShortVersionString</key>
<string>1.3.98</string>
<string>1.3.99</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1.3.98.5</string>
<string>1.3.99.0</string>
</dict>
</plist>
4 changes: 2 additions & 2 deletions package-lock.json

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

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "new.expensify",
"version": "1.3.98-5",
"version": "1.3.99-0",
"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.",
Expand Down
1 change: 0 additions & 1 deletion src/CONST.ts
Original file line number Diff line number Diff line change
Expand Up @@ -260,7 +260,6 @@ const CONST = {
TASKS: 'tasks',
THREADS: 'threads',
CUSTOM_STATUS: 'customStatus',
NEW_DOT_TAGS: 'newDotTags',
NEW_DOT_SAML: 'newDotSAML',
PDF_META_STORE: 'pdfMetaStore',
REPORT_ACTION_CONTEXT_MENU: 'reportActionContextMenu',
Expand Down
24 changes: 24 additions & 0 deletions src/components/AvatarSkeleton.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import React from 'react';
import {Circle} from 'react-native-svg';
import themeColors from '@styles/themes/default';
import SkeletonViewContentLoader from './SkeletonViewContentLoader';

function AvatarSkeleton() {
return (
<SkeletonViewContentLoader
animate
height={40}
backgroundColor={themeColors.skeletonLHNIn}
foregroundColor={themeColors.skeletonLHNOut}
>
<Circle
cx={20}
cy={20}
r={20}
/>
</SkeletonViewContentLoader>
);
}

AvatarSkeleton.displayName = 'AvatarSkeleton';
export default AvatarSkeleton;
21 changes: 16 additions & 5 deletions src/components/AvatarWithIndicator.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import {View} from 'react-native';
import * as UserUtils from '@libs/UserUtils';
import styles from '@styles/styles';
import Avatar from './Avatar';
import AvatarSkeleton from './AvatarSkeleton';
import * as Expensicons from './Icon/Expensicons';
import Indicator from './Indicator';
import Tooltip from './Tooltip';
Expand All @@ -17,22 +18,32 @@ const propTypes = {

/** A fallback avatar icon to display when there is an error on loading avatar from remote URL. */
fallbackIcon: PropTypes.oneOfType([PropTypes.func, PropTypes.string]),

/** Indicates whether the avatar is loaded or not */
isLoading: PropTypes.bool,
};

const defaultProps = {
tooltipText: '',
fallbackIcon: Expensicons.FallbackAvatar,
isLoading: true,
};

function AvatarWithIndicator(props) {
return (
<Tooltip text={props.tooltipText}>
<View style={[styles.sidebarAvatar]}>
<Avatar
source={UserUtils.getSmallSizeAvatar(props.source)}
fallbackIcon={props.fallbackIcon}
/>
<Indicator />
{props.isLoading ? (
<AvatarSkeleton />
) : (
<>
<Avatar
source={UserUtils.getSmallSizeAvatar(props.source)}
fallbackIcon={props.fallbackIcon}
/>
<Indicator />
</>
)}
</View>
</Tooltip>
);
Expand Down
2 changes: 1 addition & 1 deletion src/components/Composer/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ const propTypes = {
const defaultProps = {
defaultValue: undefined,
value: undefined,
numberOfLines: undefined,
numberOfLines: 0,
onNumberOfLinesChange: () => {},
maxLines: -1,
onPasteFile: () => {},
Expand Down
Original file line number Diff line number Diff line change
@@ -1,32 +1,17 @@
import PropTypes from 'prop-types';
import React from 'react';
import {ErrorBoundary} from 'react-error-boundary';
import BootSplash from '@libs/BootSplash';
import GenericErrorPage from '@pages/ErrorPage/GenericErrorPage';

const propTypes = {
/* A message posted to `logError` (along with error data) when this component intercepts an error */
errorMessage: PropTypes.string.isRequired,

/* A function to perform the actual logging since different platforms support different tools */
logError: PropTypes.func,

/* Actual content wrapped by this error boundary */
children: PropTypes.node.isRequired,
};

const defaultProps = {
logError: () => {},
};
import {BaseErrorBoundaryProps, LogError} from './types';

/**
* This component captures an error in the child component tree and logs it to the server
* It can be used to wrap the entire app as well as to wrap specific parts for more granularity
* @see {@link https://reactjs.org/docs/error-boundaries.html#where-to-place-error-boundaries}
* @return {React.Component}
*/
function BaseErrorBoundary({logError, errorMessage, children}) {
const catchError = (error, errorInfo) => {

function BaseErrorBoundary({logError = () => {}, errorMessage, children}: BaseErrorBoundaryProps) {
const catchError = (error: Error, errorInfo: React.ErrorInfo) => {
logError(errorMessage, error, JSON.stringify(errorInfo));
// We hide the splash screen since the error might happened during app init
BootSplash.hide();
Expand All @@ -42,8 +27,6 @@ function BaseErrorBoundary({logError, errorMessage, children}) {
);
}

BaseErrorBoundary.propTypes = propTypes;
BaseErrorBoundary.defaultProps = defaultProps;
BaseErrorBoundary.displayName = 'BaseErrorBoundary';

export type {LogError, BaseErrorBoundaryProps};
export default BaseErrorBoundary;
8 changes: 0 additions & 8 deletions src/components/ErrorBoundary/index.js

This file was deleted.

Loading

0 comments on commit 6ff977b

Please sign in to comment.