diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
index e9c61c6ca5bf..a75f4ceeca2b 100644
--- a/.github/PULL_REQUEST_TEMPLATE.md
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -50,11 +50,11 @@ For example:
- [ ] Verify that no errors appear in the JS console
-### PR Review Checklist
+### PR Author Checklist
-#### PR Author Checklist
+
- [ ] I linked the correct issue in the `### Fixed Issues` section above
- [ ] I wrote clear testing steps that cover the changes made in this PR
- [ ] I added steps for local testing in the `Tests` section
diff --git a/.github/actions/composite/setupNode/action.yml b/.github/actions/composite/setupNode/action.yml
index 2e92ac26d667..95e187ff4d3a 100644
--- a/.github/actions/composite/setupNode/action.yml
+++ b/.github/actions/composite/setupNode/action.yml
@@ -14,7 +14,7 @@ runs:
cache: npm
- name: Install node packages
- uses: nick-invision/retry@7c68161adf97a48beb850a595b8784ec57a98cbb
+ uses: nick-invision/retry@0711ba3d7808574133d713a0d92d2941be03a350
with:
timeout_minutes: 10
max_attempts: 5
diff --git a/.github/actions/composite/updateProtectedBranch/action.yml b/.github/actions/composite/updateProtectedBranch/action.yml
index e272a3282e3b..d636a8deb8f0 100644
--- a/.github/actions/composite/updateProtectedBranch/action.yml
+++ b/.github/actions/composite/updateProtectedBranch/action.yml
@@ -99,8 +99,8 @@ runs:
- name: Check changed files
if: ${{ inputs.TARGET_BRANCH == 'main' }}
id: changedFiles
- # Version: 3.3.0
- uses: umani/changed-files@1d252c611c64289d35243fc37ece7323ea5e93e1
+ # TODO: Remove and switch back to upstream when https://github.com/umani/changed-files/pull/27 is merged
+ uses: roryabraham/changed-files@c14fad74000cf77ff62b7f78cfd34c2124665c35
with:
repo-token: ${{ github.token }}
pr-number: ${{ steps.createPullRequest.outputs.PR_NUMBER }}
diff --git a/.github/workflows/createNewVersion.yml b/.github/workflows/createNewVersion.yml
index bff08e73a313..31184425795a 100644
--- a/.github/workflows/createNewVersion.yml
+++ b/.github/workflows/createNewVersion.yml
@@ -55,7 +55,8 @@ jobs:
with:
GPG_PASSPHRASE: ${{ secrets.LARGE_SECRET_PASSPHRASE }}
- - uses: softprops/turnstyle@8db075d65b19bf94e6e8687b504db69938dc3c65
+ # TODO: Point back at upstream when https://github.com/softprops/turnstyle/pull/46 is merged
+ - uses: roryabraham/turnstyle@d50d3ffc3f2c8d280dec4cd802c1c735fcda77c8
with:
poll-interval-seconds: 10
env:
diff --git a/.github/workflows/platformDeploy.yml b/.github/workflows/platformDeploy.yml
index a57dc69e3554..33c0b51cd91e 100644
--- a/.github/workflows/platformDeploy.yml
+++ b/.github/workflows/platformDeploy.yml
@@ -138,7 +138,7 @@ jobs:
bundler-cache: true
- name: Install cocoapods
- uses: nick-invision/retry@7c68161adf97a48beb850a595b8784ec57a98cbb
+ uses: nick-invision/retry@0711ba3d7808574133d713a0d92d2941be03a350
with:
timeout_minutes: 10
max_attempts: 5
diff --git a/.github/workflows/preDeploy.yml b/.github/workflows/preDeploy.yml
index 521889fdd636..045187c396e1 100644
--- a/.github/workflows/preDeploy.yml
+++ b/.github/workflows/preDeploy.yml
@@ -82,7 +82,8 @@ jobs:
needs: [chooseDeployActions, createNewVersion]
runs-on: ubuntu-latest
steps:
- - uses: softprops/turnstyle@8db075d65b19bf94e6e8687b504db69938dc3c65
+ # TODO: Point back at upstream when https://github.com/softprops/turnstyle/pull/46 is merged
+ - uses: roryabraham/turnstyle@d50d3ffc3f2c8d280dec4cd802c1c735fcda77c8
with:
poll-interval-seconds: 10
env:
diff --git a/android/app/build.gradle b/android/app/build.gradle
index 41b9c2d97305..c6001ca26cb2 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 1001022201
- versionName "1.2.22-1"
+ versionCode 1001022404
+ versionName "1.2.24-4"
buildConfigField "boolean", "IS_NEW_ARCHITECTURE_ENABLED", isNewArchitectureEnabled().toString()
if (isNewArchitectureEnabled()) {
diff --git a/android/app/src/main/assets/fonts/ExpensifyMono-Bold.otf b/android/app/src/main/assets/fonts/ExpensifyMono-Bold.otf
new file mode 100755
index 000000000000..4198f46f6d79
Binary files /dev/null and b/android/app/src/main/assets/fonts/ExpensifyMono-Bold.otf differ
diff --git a/android/app/src/main/assets/fonts/ExpensifyMono-Regular.otf b/android/app/src/main/assets/fonts/ExpensifyMono-Regular.otf
new file mode 100755
index 000000000000..1c6242a717f9
Binary files /dev/null and b/android/app/src/main/assets/fonts/ExpensifyMono-Regular.otf differ
diff --git a/android/app/src/main/assets/fonts/ExpensifyNeue-Bold.otf b/android/app/src/main/assets/fonts/ExpensifyNeue-Bold.otf
new file mode 100755
index 000000000000..7534aecda322
Binary files /dev/null and b/android/app/src/main/assets/fonts/ExpensifyNeue-Bold.otf differ
diff --git a/android/app/src/main/assets/fonts/ExpensifyNeue-BoldItalic.otf b/android/app/src/main/assets/fonts/ExpensifyNeue-BoldItalic.otf
new file mode 100755
index 000000000000..4c28031fedd6
Binary files /dev/null and b/android/app/src/main/assets/fonts/ExpensifyNeue-BoldItalic.otf differ
diff --git a/android/app/src/main/assets/fonts/ExpensifyNeue-Italic.otf b/android/app/src/main/assets/fonts/ExpensifyNeue-Italic.otf
new file mode 100755
index 000000000000..a5d19502dbfe
Binary files /dev/null and b/android/app/src/main/assets/fonts/ExpensifyNeue-Italic.otf differ
diff --git a/android/app/src/main/assets/fonts/ExpensifyNeue-Regular.otf b/android/app/src/main/assets/fonts/ExpensifyNeue-Regular.otf
new file mode 100755
index 000000000000..d4d8cbe63b44
Binary files /dev/null and b/android/app/src/main/assets/fonts/ExpensifyNeue-Regular.otf differ
diff --git a/android/app/src/main/assets/fonts/ExpensifyNewKansas-Medium.otf b/android/app/src/main/assets/fonts/ExpensifyNewKansas-Medium.otf
new file mode 100755
index 000000000000..a7277555fad9
Binary files /dev/null and b/android/app/src/main/assets/fonts/ExpensifyNewKansas-Medium.otf differ
diff --git a/android/app/src/main/assets/fonts/ExpensifyNewKansas-MediumItalic.otf b/android/app/src/main/assets/fonts/ExpensifyNewKansas-MediumItalic.otf
new file mode 100755
index 000000000000..984ef4bfa2d4
Binary files /dev/null and b/android/app/src/main/assets/fonts/ExpensifyNewKansas-MediumItalic.otf differ
diff --git a/android/build.gradle b/android/build.gradle
index 49fa013fac6b..a35d82861347 100644
--- a/android/build.gradle
+++ b/android/build.gradle
@@ -21,7 +21,6 @@ buildscript {
}
repositories {
google()
- jcenter()
mavenCentral()
}
dependencies {
@@ -42,10 +41,14 @@ allprojects {
configurations.all {
resolutionStrategy {
force 'org.xerial:sqlite-jdbc:3.34.0'
+
+ // Manually set the react-native version to resolve this upstream issue: https://github.com/facebook/react-native/issues/35210
+ def REACT_NATIVE_VERSION = new File(['node', '--print',"JSON.parse(require('fs').readFileSync(require.resolve('react-native/package.json'), 'utf-8')).version"].execute(null, rootDir).text.trim())
+ force "com.facebook.react:react-native:" + REACT_NATIVE_VERSION
+ force "com.facebook.react:hermes-engine:" + REACT_NATIVE_VERSION
}
}
repositories {
- jcenter()
maven {
// All of React Native (JS, Obj-C sources, Android binaries) is installed from npm
url("$rootDir/../node_modules/react-native/android")
diff --git a/assets/fonts/ExpensifyMono-Bold.otf b/assets/fonts/ExpensifyMono-Bold.otf
new file mode 100755
index 000000000000..4198f46f6d79
Binary files /dev/null and b/assets/fonts/ExpensifyMono-Bold.otf differ
diff --git a/assets/fonts/ExpensifyMono-Regular.otf b/assets/fonts/ExpensifyMono-Regular.otf
new file mode 100755
index 000000000000..1c6242a717f9
Binary files /dev/null and b/assets/fonts/ExpensifyMono-Regular.otf differ
diff --git a/assets/fonts/ExpensifyNeue-Bold.otf b/assets/fonts/ExpensifyNeue-Bold.otf
new file mode 100755
index 000000000000..7534aecda322
Binary files /dev/null and b/assets/fonts/ExpensifyNeue-Bold.otf differ
diff --git a/assets/fonts/ExpensifyNeue-BoldItalic.otf b/assets/fonts/ExpensifyNeue-BoldItalic.otf
new file mode 100755
index 000000000000..4c28031fedd6
Binary files /dev/null and b/assets/fonts/ExpensifyNeue-BoldItalic.otf differ
diff --git a/assets/fonts/ExpensifyNeue-Italic.otf b/assets/fonts/ExpensifyNeue-Italic.otf
new file mode 100755
index 000000000000..a5d19502dbfe
Binary files /dev/null and b/assets/fonts/ExpensifyNeue-Italic.otf differ
diff --git a/assets/fonts/ExpensifyNeue-Regular.otf b/assets/fonts/ExpensifyNeue-Regular.otf
new file mode 100755
index 000000000000..d4d8cbe63b44
Binary files /dev/null and b/assets/fonts/ExpensifyNeue-Regular.otf differ
diff --git a/assets/fonts/ExpensifyNewKansas-Medium.otf b/assets/fonts/ExpensifyNewKansas-Medium.otf
new file mode 100755
index 000000000000..a7277555fad9
Binary files /dev/null and b/assets/fonts/ExpensifyNewKansas-Medium.otf differ
diff --git a/assets/fonts/ExpensifyNewKansas-MediumItalic.otf b/assets/fonts/ExpensifyNewKansas-MediumItalic.otf
new file mode 100755
index 000000000000..984ef4bfa2d4
Binary files /dev/null and b/assets/fonts/ExpensifyNewKansas-MediumItalic.otf differ
diff --git a/contributingGuides/REVIEWER_CHECKLIST.md b/contributingGuides/REVIEWER_CHECKLIST.md
new file mode 100644
index 000000000000..7d0889742f52
--- /dev/null
+++ b/contributingGuides/REVIEWER_CHECKLIST.md
@@ -0,0 +1,91 @@
+## Reviewer Checklist
+
+- [ ] I have verified the author checklist is complete (all boxes are checked off).
+- [ ] I verified the correct issue is linked in the `### Fixed Issues` section above
+- [ ] I verified testing steps are clear and they cover the changes made in this PR
+ - [ ] I verified the steps for local testing are in the `Tests` section
+ - [ ] I verified the steps for Staging and/or Production testing are in the `QA steps` section
+ - [ ] I verified the steps cover any possible failure scenarios (i.e. verify an input displays the correct error message if the entered data is not correct)
+ - [ ] I turned off my network connection and tested it while offline to ensure it matches the expected behavior (i.e. verify the default avatar icon is displayed if app is offline)
+- [ ] I checked that screenshots or videos are included for tests on [all platforms](https://github.com/Expensify/App/blob/main/contributingGuides/CONTRIBUTING.md#make-sure-you-can-test-on-all-platforms)
+- [ ] I included screenshots or videos for tests on [all platforms](https://github.com/Expensify/App/blob/main/contributingGuides/CONTRIBUTING.md#make-sure-you-can-test-on-all-platforms)
+- [ ] I verified tests pass on **all platforms** & I tested again on:
+ - [ ] iOS / native
+ - [ ] Android / native
+ - [ ] iOS / Safari
+ - [ ] Android / Chrome
+ - [ ] MacOS / Chrome
+ - [ ] MacOS / Desktop
+- [ ] If there are any errors in the console that are unrelated to this PR, I either fixed them (preferred) or linked to where I reported them in Slack
+- [ ] I verified proper code patterns were followed (see [Reviewing the code](https://github.com/Expensify/App/blob/main/contributingGuides/PR_REVIEW_GUIDELINES.md#reviewing-the-code))
+ - [ ] I verified that any callback methods that were added or modified are named for what the method does and never what callback they handle (i.e. `toggleReport` and not `onIconClick`).
+ - [ ] I verified that comments were added to code that is not self explanatory
+ - [ ] I verified that any new or modified comments were clear, correct English, and explained "why" the code was doing something instead of only explaining "what" the code was doing.
+ - [ ] I verified any copy / text shown in the product was added in all `src/languages/*` files
+ - [ ] I verified any copy / text that was added to the app is correct English and approved by marketing by adding the `Waiting for Copy` label for a copy review on the original GH to get the correct copy.
+ - [ ] I verified proper file naming conventions were followed for any new files or renamed files. All non-platform specific files are named after what they export and are not named "index.js". All platform-specific files are named for the platform the code supports as outlined in the README.
+ - [ ] I verified the JSDocs style guidelines (in [`STYLE.md`](https://github.com/Expensify/App/blob/main/contributingGuides/STYLE.md#jsdocs)) were followed
+- [ ] If a new code pattern is added I verified it was agreed to be used by multiple Expensify engineers
+- [ ] I verified that this PR follows the guidelines as stated in the [Review Guidelines](https://github.com/Expensify/App/blob/main/contributingGuides/PR_REVIEW_GUIDELINES.md)
+- [ ] I verified other components that can be impacted by these changes have been tested, and I retested again (i.e. if the PR modifies a shared library or component like `Avatar`, I verified the components using `Avatar` have been tested & I retested again)
+- [ ] I verified all code is DRY (the PR doesn't include any logic written more than once, with the exception of tests)
+- [ ] I verified any variables that can be defined as constants (ie. in CONST.js or at the top of the file that uses the constant) are defined as such
+- [ ] If a new component is created I verified that:
+ - [ ] A similar component doesn't exist in the codebase
+ - [ ] All props are defined accurately and each prop has a `/** comment above it */`
+ - [ ] The file is named correctly
+ - [ ] The component has a clear name that is non-ambiguous and the purpose of the component can be inferred from the name alone
+ - [ ] The only data being stored in the state is data necessary for rendering and nothing else
+ - [ ] For Class Components, any internal methods passed to components event handlers are bound to `this` properly so there are no scoping issues (i.e. for `onClick={this.submit}` the method `this.submit` should be bound to `this` in the constructor)
+ - [ ] Any internal methods bound to `this` are necessary to be bound (i.e. avoid `this.submit = this.submit.bind(this);` if `this.submit` is never passed to a component event handler like `onClick`)
+ - [ ] All JSX used for rendering exists in the render method
+ - [ ] The component has the minimum amount of code necessary for its purpose, and it is broken down into smaller components in order to separate concerns and functions
+- [ ] If a new CSS style is added I verified that:
+ - [ ] A similar style doesn't already exist
+ - [ ] The style can't be created with an existing [StyleUtils](https://github.com/Expensify/App/blob/main/src/styles/StyleUtils.js) function (i.e. `StyleUtils.getBackgroundAndBorderStyle(themeColors.componentBG`)
+- [ ] If the PR modifies a generic component, I tested and verified that those changes do not break usages of that component in the rest of the App (i.e. if a shared library or component like `Avatar` is modified, I verified that `Avatar` is working as expected in all cases)
+- [ ] If the PR modifies a component related to any of the existing Storybook stories, I tested and verified all stories for that component are still working as expected.
+- [ ] I have checked off every checkbox in the PR reviewer checklist, including those that don't apply to this PR.
+
+### Screenshots/Videos
+
+Web
+
+
+
+
+
+
+Mobile Web - Chrome
+
+
+
+
+
+
+Mobile Web - Safari
+
+
+
+
+
+
+Desktop
+
+
+
+
+
+
+iOS
+
+
+
+
+
+
+Android
+
+
+
+
diff --git a/desktop/main.js b/desktop/main.js
index 5336b472e0c3..78c13e4d448c 100644
--- a/desktop/main.js
+++ b/desktop/main.js
@@ -265,7 +265,14 @@ const mainWindow = (() => {
}
evt.preventDefault();
- browserWindow.hide();
+
+ // Check if window is fullscreen and exit fullscreen before hiding
+ if (browserWindow.isFullScreen()) {
+ browserWindow.once('leave-full-screen', () => browserWindow.hide());
+ browserWindow.setFullScreen(false);
+ } else {
+ browserWindow.hide();
+ }
});
// Initiating a browser-back or browser-forward with mouse buttons should navigate history.
diff --git a/docs/404.html b/docs/404.html
index ccbbded12cae..6440e4efb47f 100644
--- a/docs/404.html
+++ b/docs/404.html
@@ -1,6 +1,5 @@
---
permalink: /404.html
-lhn_content: '404'
---
diff --git a/docs/README.md b/docs/README.md
index 5e5fee07e08d..f7a7df509de7 100644
--- a/docs/README.md
+++ b/docs/README.md
@@ -15,7 +15,8 @@
- Clone and/or pull the [App repo](https://github.com/Expensify/App) to your local machine.
- Check the [requirements](https://jekyllrb.com/docs/installation/) to install Jekyll.
- Install Jekyll locally by running:
-```
+
+```bash
gem install bundler
cd docs
bundle install
@@ -24,32 +25,31 @@ bundle install
## Steps
1. Open the Terminal command line in macOS.
-2. Navigate to the `docs` folder in the command line.
-3. Run `bundle exec jekyll serve --livereload`.
+1. Navigate to the `docs` folder in the command line.
+1. Run `bundle exec jekyll serve --livereload`.
- _Note: If you see an error like `Unable to load the EventMachine C Extension...`, try running `gem uninstall eventmachine && bundle install`. If that doesn't work just removing the `--livereload` flag should work._
-4. Open http://localhost:4000 in the browser to see the site running locally.
-5. Modify a `.html` or `.md` file and refresh the page in the browser.
+1. Modify a `.html` or `.md` file and save your changes, and the browser should quickly auto-refresh.
# How the project is structured
The [docs](https://github.com/Expensify/App/tree/main/docs) folder will contain the following main folders:
-- *_layouts*: This contains HTML templates used by Jekyll to create pages in the static site. For now it has only one file ([default.html](https://github.com/Expensify/App/blob/main/docs/_layouts/default.html)) which will render the common HTML elements and the assets on every page. It also supports the use of the [liquid template language](https://shopify.github.io/liquid/).
-- *_includes*: Contains HTML content that can be reused on different pages. For now, it contains various html elements that are used to populate the left-hand-nav (LHN).
-- *assets*: it will contain the three sub-folders css, images, and js.
- - The css folder can contain either .css or .sass files (where SASS files will be processed by Jekyll and it will generate a CSS file in an output folder also generated by Jekyll).
- - In order to organize the image files, we're going to have multiple sub-folders grouped by subject in the images folder.
-- *hubs*: it will contain two HTML files that will have the content of the `Request Money` and `Send Money` hub pages respectively.
-- *articles*: it will contain sub-folders for each stage and each of them will contain all the articles related to that stage or subsection.
-- *_site*: this will be the output folder that will contain the generated HTML files. This is the default name by Jekyll but can be changed.
-index.html: it will have the homepage content.
-
-More details about the Jekyll project structure can be found [here](https://jekyllrb.com/docs/structure/).
+
+- *_layouts*: Contains HTML templates used by Jekyll to create pages in the static site. For now it has only one file ([default.html](https://github.com/Expensify/App/blob/main/docs/_layouts/default.html)) which will render the common HTML elements and the assets on every page.
+- *_includes*: Contains HTML content that can be reused on different pages. [Includes](https://jekyllrb.com/docs/includes/) can accept parameters and be nested, so they are quite powerful.
+- *assets*: Contains the three sub-folders css, images, and js. The css folder can contain either .css or .sass files (where SASS files will be processed by Jekyll and it will generate a CSS file in an output folder also generated by Jekyll).
+- *hubs*: Contains hubs that display various related articles, optionally grouped by sub-topic within the hub.
+- *articles*: Contains sub-folders for each hub and each of them will contain all the articles related to that hub.
+- *_data*: Contains [custom global data](https://jekyllrb.com/docs/datafiles/), available anywhere via liquid with the syntax `site.data.
`. Notably, there is a file called [routes.yml](https://github.com/Expensify/App/blob/55f2c73d8e3bb0efd0e2a985c05f25e87d28f3cc/docs/_data/routes.yml) in there which defines the structure of the app and metadata for its pages.
+- *_site*: The output folder that contains the generated HTML files. This is the default name by Jekyll but can be changed. Files in here are generated and should not be manually edited.
+- index.html: The main homepage content.
+
+More details about the Jekyll project structure can be found [here](https://jekyllrb.com/docs/structure/). Note that all html files in this project support the use of the [liquid template language](https://shopify.github.io/liquid/).
# How to add a new Article
## Add content
-Copy the [template](https://github.com/Expensify/App/blob/main/docs/TEMPLATE.md) file and rename it with the name of the article title, i.e. [SmartScan.md](https://github.com/Expensify/App/blob/main/docs/articles/request-money/SmartScan.md) (you can use dashes for spaces in the file name if it's needed) and put the new file inside of the respective hub folder or sub-folder. The title will be rendered automatically according to the filename (the dashes will be removed in the generated site page).
+Copy the [template](https://github.com/Expensify/App/blob/main/docs/TEMPLATE.md) file into the correct subdirectory of `/articles`. For example, if the article belongs in the `Send money` hub, then copy the template into `articles/send-money` directory. Next, rename the copy with the name of the article title, i.e. [The-Free-Plan.md](https://github.com/Expensify/App/blob/main/docs/articles/send-money/The-Free-Plan.md) (you can use dashes for spaces in the file name if it's needed) and put the new file inside of the respective hub folder or sub-folder. The title will be rendered automatically according to the filename (the dashes will be removed in the generated site page).
The sections of the article will be filled and nested automatically in the LHN, just ensure to use the [heading markdown tags](https://www.markdownguide.org/cheat-sheet/) correctly.
@@ -62,93 +62,14 @@ At the top of template file we're going to find a few variables that will help u
title: The title of the post, page, or document
description: A short description of the page's content
image: (Optional) URL to an image associated with the post, page, or document (e.g., /assets/page-pic.jpg)
-author: (Optional) Page-, post-, or document-specific author information.
-locale: (Optional) Page-, post-, or document-specific locale information. Takes priority over existing front matter attribute lang.
---
```
Just update the content for each variable accordingly or remove it if the information is not available. More details [here](https://github.com/jekyll/jekyll-seo-tag/blob/master/docs/usage.md#usage).
-## Add a new entry in the hub page
-
-There are 3 main components in the hub page: 1. Stage title, 2. Row of Card buttons and 3. Card buttons.
-
-```html
-
-
- Request Money
-
-
-
-
-```
-### Add a Stage title (optional)
-
-In order to add a new stage title in the hub page just copy and paste the following HTML block in the respective hub page and modify the values accordingly:
-
-```html
-
- Request Money
-
-```
-
-Where `id` is an arbitrary value that will help us to anchor this title to the LHN element.
-
-### Add a Row of Card buttons (optional)
-
-If it's required, you can add a new row of Card buttons with the following HTML block:
-
-```html
-
-
-
-```
-
-### Add a Card button
-
-A card button is the box that contains the article title and the caret right icon `>`. It navigates to the article when it's pressed.
-
-In order to add a new Card button in the respective hub page ([send-money/index.html](https://github.com/Expensify/App/blob/main/docs/hubs/send-money.html) or [request-money/index.html](https://github.com/Expensify/App/blob/main/docs/hubs/request-money.html)) just copy and pase the following Card element:
-
-```html
-
-
-
SmartScan
-
-
-
-
-
-```
-
-Then replace the article title accordingly (in this case replace the value `SmartScan` with the new article title) and add a link to the relative path of the article (in this case replace `./request-money/SmartScan` accordingly to the path of the new article file without the file extension).
+## Add the new page to routes.yml
-## Add a new entry in the LHN page
-To add a new entry to the LHN, simply update the _data/hubs.yml file with the new entry. Note that LHN "hubs" contain 1 or more stages, and stages can be either 1 article or multiple articles.
+Next, add the article to `_data/routes.yml`. Note that hubs contain one or more articles, which may or may not be grouped into sections with other related articles.
# How the site is deployed
This site is hosted on GitHub Pages. GitHub Pages has a built-in Jekyll integration, and we have it configured such that whenever code is merged to main, GitHub will automatically build the Jekyll site housed in the `/docs` directory and deploy it straight to production. The help site is publicly discoverable at https://help.expensify.com/
diff --git a/docs/_data/hubs.yml b/docs/_data/hubs.yml
deleted file mode 100644
index ab2ed00d4093..000000000000
--- a/docs/_data/hubs.yml
+++ /dev/null
@@ -1,15 +0,0 @@
-- href: send-money
- title: Send money
- stages:
- - href: workspaces
- title: Workspaces
- articles:
- - href: The-Free-Plan
- title: The Free Plan
-- href: request-money
- title: Request money
-- href: other
- title: Other
- stages:
- - href: Account-Management
- title: Account Management
diff --git a/docs/_data/routes.yml b/docs/_data/routes.yml
new file mode 100644
index 000000000000..8e613030f3cb
--- /dev/null
+++ b/docs/_data/routes.yml
@@ -0,0 +1,41 @@
+home:
+ href: home
+ title: Welcome to the New Expensify!
+ description: Find the answers to all of your questions about receipts, expenses, corporate cards, or anything else in the spend management universe.
+
+# Hubs are comprised of sections and articles. Sections contain multiple related articles, but there can be standalone articles as well
+hubs:
+ - href: send-money
+ title: Send money
+ description: With only a couple of clicks, send money to your friends or coworkers using NewExpensify.
+ icon: /assets/images/send.svg
+ articles:
+ - href: Request-and-Send-Money
+ title: Request and Send Money
+ sections:
+ - href: workspaces
+ title: Workspaces
+ articles:
+ - href: The-Free-Plan
+ title: The Free Plan
+ - href: chat
+ title: Chat
+ articles:
+ - href: Everything-About-Chat
+ title: Everything About Chat
+
+ - href: request-money
+ title: Request money
+ icon: /assets/images/money-circle.svg
+ description: Request money for work expenses, bills, or a night out with friends using NewExpensify.
+ articles:
+ - href: Request-and-Send-Money
+ title: Request and Send Money
+
+ - href: other
+ title: Other
+ description: Everything else you're looking for is right here.
+ icon: /assets/images/users.svg
+ articles:
+ - href: Account-Management
+ title: Account Management
diff --git a/docs/_includes/article-card.html b/docs/_includes/article-card.html
new file mode 100644
index 000000000000..644863c83d04
--- /dev/null
+++ b/docs/_includes/article-card.html
@@ -0,0 +1,8 @@
+
+
+
{{ include.title }}
+
+
+
+
+
diff --git a/docs/_includes/hub-card.html b/docs/_includes/hub-card.html
new file mode 100644
index 000000000000..379a42a26340
--- /dev/null
+++ b/docs/_includes/hub-card.html
@@ -0,0 +1,13 @@
+{% assign hub = site.data.routes.hubs | where: "href", include.href | first %}
+
+
+
+
+
+
+
+
{{ hub.title }}
+
{{ hub.description }}
+
+
+
diff --git a/docs/_includes/hub.html b/docs/_includes/hub.html
new file mode 100644
index 000000000000..b0f26d19f220
--- /dev/null
+++ b/docs/_includes/hub.html
@@ -0,0 +1,34 @@
+{% assign activeHub = page.url | remove: "/hubs/" | remove: ".html" %}
+{% assign hub = site.data.routes.hubs | where: "href", activeHub | first %}
+
+
+ {{ hub.title }}
+
+
+
+ {{ hub.description }}
+
+
+{% for section in hub.sections %}
+
+
+ {{ section.title }}
+
+
+
+ {% for article in section.articles %}
+ {% include article-card.html hub=hub.href href=article.href title=article.title %}
+ {% endfor %}
+
+
+{% endfor %}
+
+{% if hub.articles %}
+
+
+ {% for article in hub.articles %}
+ {% include article-card.html hub=hub.href href=article.href title=article.title %}
+ {% endfor %}
+
+
+{% endif %}
diff --git a/docs/_includes/lhn-article-link.html b/docs/_includes/lhn-article-link.html
new file mode 100644
index 000000000000..f83cc4d34423
--- /dev/null
+++ b/docs/_includes/lhn-article-link.html
@@ -0,0 +1,5 @@
+
+
+ {{ include.title }}
+
+
diff --git a/docs/_includes/lhn-template.html b/docs/_includes/lhn-template.html
index 56f1e364cf8f..647665536316 100644
--- a/docs/_includes/lhn-template.html
+++ b/docs/_includes/lhn-template.html
@@ -1,39 +1,38 @@
+{% assign activeHub = page.url | remove: "/hubs/" | remove: ".html" %}
+
- {% if include.activeHub == "home" %}
+ {% if page.url == "/" %}
Home
{% else %}
Home
{% endif %}
- {% for hub in site.data.hubs %}
- {% if hub.href == include.activeHub %}
+ {% for hub in site.data.routes.hubs %}
+ {% if hub.href == activeHub %}
{{ hub.title }}
- {% for stage in hub.stages %}
+
+ {% for section in hub.sections %}
-
- {% if stage.articles %}
- {{ stage.title }}
-
- {% else %}
- {{ stage.title }}
- {% endif %}
+ {{ section.title }}
+
+ {% for article in section.articles %}
+ {% include lhn-article-link.html hub=hub.href href=article.href title=article.title %}
+ {% endfor %}
+
{% endfor %}
+
+
+ {% for article in hub.articles %}
+ {% include lhn-article-link.html hub=hub.href href=article.href title=article.title %}
+ {% endfor %}
{% else %}
diff --git a/docs/_layouts/default.html b/docs/_layouts/default.html
index c88256df2d23..b2614aeef4a4 100644
--- a/docs/_layouts/default.html
+++ b/docs/_layouts/default.html
@@ -24,30 +24,22 @@
-
- {% case page.lhn_content %}
- {% when "homepage" %}
- {% include lhn-template.html activeHub="home" %}
- {% when "request-money" %}
- {% include lhn-template.html activeHub="request-money" %}
- {% when "send-money" %}
- {% include lhn-template.html activeHub="send-money" %}
- {% when "other" %}
- {% include lhn-template.html activeHub="other" %}
+ {% if page.url == "/" or page.url contains "/hubs/" %}
+ {% include lhn-template.html %}
{% else %}
- {% if page.lhn_content == nil %}
-
In this article
-
- {% endif %}
- {% endcase %}
+
+ {% endif %}
@@ -57,7 +49,7 @@
- {% if page.lhn_content == nil %}
+ {% if page.url contains "/articles/" %}
{{ page.name | remove: '.md' | split: "-" | join: " " }}
diff --git a/docs/articles/request-money/Request-and-Send-Money.md b/docs/articles/request-money/Request-and-Send-Money.md
new file mode 100644
index 000000000000..277ffcf830c1
--- /dev/null
+++ b/docs/articles/request-money/Request-and-Send-Money.md
@@ -0,0 +1,53 @@
+---
+title: Request Money, Split Bills, and Send Money to Friends
+description: Everything you need to know about Requesting Money, Splitting Bills, and Sending Money to Friends!
+---
+
+
+
+# How do these Payment Features work?
+Our suite of money movement features enables you to request money owed by an individual, split a bill with a group, and proactively send money for a one-off expense.
+
+**Request Money** lets your friends pay you back directly in Expensify. When you send a payment request to a friend, Expensify will display the amount owed and the option to pay the corresponding request in a chat between you.
+
+**Split Bill** allows you to split payments between friends and ensures the person who settled the tab gets paid back.
+
+**Send Money** allows you to send money to someone proactively. With this feature, you can Send Money to a friend without receiving a payment or split bill request.
+
+These three features ensure you can live in the moment and settle up afterward.
+
+# How to Request Money
+- Select the Green **+** button and choose **Request Money**
+- Enter the amount **$** they owe and click **Next**
+- Search for the user or enter their email!
+- Enter a reason for the request (optional)
+- Click **Request!**
+- If you change your mind, all you have to do is click **Cancel**
+- The user will be able to **Settle up outside of Expensify** or pay you via **Venmo** or **PayPal.me**
+
+# How to Split a Bill
+- Select the Green **+** button and choose **Split Bill**
+- Enter the total amount for the bill and click **Next**
+- Search for users or enter their emails and **Select**
+- Enter a reason for the split
+- The split is then shared equally between the attendees
+
+# How to Send Money
+- Click the green **+** button and select **Send Money**
+- Enter an **amount > Next**
+- Enter the **email address** or **phone number** (including area code) of the person you’re paying
+- Add a note about why you’re paying them (this is optional, but it’s fun!)
+- Click **Pay with Expensify**
+- Choose **Bank Account\*** or **Debit Card\*\***
+\* If paying with a Bank Account, follow the prompts to connect your bank to Expensify.
+\*\* If paying with a Debit Card, enter your card details and tap Save.
+
+# FAQs
+## Send Money Payment: Why is the option to Pay With Expensify not visible to me?
+If “I’ll Settle Elsewhere” is showing for you when you’re trying to send money, this is because we don’t support money movement through Expensify in your jurisdiction yet. You can use “I’ll settle elsewhere” if you want to track the payments for audit in Expensify.
+
+## I’ve received a payment request/bill split from a friend in a DM. Do I use Send Money to send this payment?
+No. Click the green “Pay” button in the payment preview in the DM, and this will ensure you are paying the accompanying Payment or Bill Split request - canceling out the IOU to 0.
+
+## Can I request money from more than one person at a time?
+If you need to request money for more than one person at a time, you’ll want to use the Split Bill feature. The Request Money option is for one-to-one payments between two people.
diff --git a/docs/articles/send-money/Everything-About-Chat.md b/docs/articles/send-money/Everything-About-Chat.md
new file mode 100644
index 000000000000..7a8bf5cf6554
--- /dev/null
+++ b/docs/articles/send-money/Everything-About-Chat.md
@@ -0,0 +1,52 @@
+---
+title: Everything About Chat
+description: Everything you need to know about Expensify's Chat Features!
+---
+
+
+
+# What is Expensify Chat?
+Expensify Chat is the ideal way to collaborate on expenses or payment requests by communicating in real time with your accountant, clients, employees, friends, and family.
+
+With Expensify Chat, you can start a conversation about that missing receipt your employee forgot to submit or chat about splitting that electric bill with your roommates. Through eChat, you can even request money from your friends!
+
+# How to use Chat in Expensify
+Download NewExpensify from the [App Store](https://apps.apple.com/us/app/expensify-cash/id1530278510) or [Google Play](https://play.google.com/store/apps/details?id=com.expensify.chat) to use the chat function. You can also access your account at new.expensify.com from your favorite web browser.
+
+After downloading the app, log into your new.expensify.com account (you’ll use the same username and password for your standard Expensify account). From there, you can customize your profile and start chatting immediately.
+
+
+## Start Chatting
+Select **New Chat** to chat one-on-one or **New Group** to start a group chat.
+## Workspace Chat Rooms
+In addition to 1:1 and group chat, members of a Workspace will have access to two additional rooms; the #announce and #admins rooms.
+All workspace members are added to the #announce room by default. The #announce room lets you share important company announcements and have conversations between workspace members.
+
+Workspace admins will have access to the #admins room. Use the #admins room to collaborate between admins and your dedicated Expensify Guide!
+
+# FAQs
+## How do I add more than one person to a chat?
+Creating a Group chat with multiple people is easy. Start by clicking the green chat **+** button and select **New Group**. Search for the people you want to invite and check the circle to the far right. Once you’ve selected everyone, click the **Create Group** button at the bottom of your screen.
+
+## Can I add people to an existing Group chat?
+Adding people to an existing group chat isn’t possible right now, so you’ll need to make a new group chat with the latest additions.
+
+## Someone I don’t recognize is in my #admins room for my workspace; who is it?
+After creating your workspace, you’ll have a dedicated Expensify specialist who will help you onboard and answer your questions. You can chat with them directly in the #admins room or request a call to talk to them over the phone.
+
+## Can I force a chat to stay at the top of the chats list?
+You sure can! Click on the chat you want to keep at the top of the list, and then click the small **pin** icon. From now on, your chat will stay pinned to the top of the chat list. If you want to unpin a chat, just click the **pin** icon again.
+
+# Deep Dive
+## Chat display, aka Priority Mode
+The way your chats display in the left-hand menu is customizable, and we offer two different options; Most Recent mode and _#focus_ mode.
+
+- Most Recent mode will display all chats by default, sorted by most recent, with your pinned chats at the top of the list.
+- #focus mode will display only unread and pinned chats, all sorted alphabetically. This setting is perfect for when you need to heads down to focus on a crucial project.
+
+You can find your display mode by clicking on your User Icon > Preferences > Priority Mode.
+
+## Inviting someone to Expensify Chat
+If the person you want to chat with doesn’t appear in your contact list, simply type their email or phone number to invite them to chat! They will receive an email with instructions and can reply directly to it to start chatting with you.
+
+All they have to do is click the link, and a new.expensify.com account will be set up automatically for them (if they don't have one already), and they can start chatting immediately!
diff --git a/docs/articles/send-money/Request-and-Send-Money.md b/docs/articles/send-money/Request-and-Send-Money.md
new file mode 100644
index 000000000000..277ffcf830c1
--- /dev/null
+++ b/docs/articles/send-money/Request-and-Send-Money.md
@@ -0,0 +1,53 @@
+---
+title: Request Money, Split Bills, and Send Money to Friends
+description: Everything you need to know about Requesting Money, Splitting Bills, and Sending Money to Friends!
+---
+
+
+
+# How do these Payment Features work?
+Our suite of money movement features enables you to request money owed by an individual, split a bill with a group, and proactively send money for a one-off expense.
+
+**Request Money** lets your friends pay you back directly in Expensify. When you send a payment request to a friend, Expensify will display the amount owed and the option to pay the corresponding request in a chat between you.
+
+**Split Bill** allows you to split payments between friends and ensures the person who settled the tab gets paid back.
+
+**Send Money** allows you to send money to someone proactively. With this feature, you can Send Money to a friend without receiving a payment or split bill request.
+
+These three features ensure you can live in the moment and settle up afterward.
+
+# How to Request Money
+- Select the Green **+** button and choose **Request Money**
+- Enter the amount **$** they owe and click **Next**
+- Search for the user or enter their email!
+- Enter a reason for the request (optional)
+- Click **Request!**
+- If you change your mind, all you have to do is click **Cancel**
+- The user will be able to **Settle up outside of Expensify** or pay you via **Venmo** or **PayPal.me**
+
+# How to Split a Bill
+- Select the Green **+** button and choose **Split Bill**
+- Enter the total amount for the bill and click **Next**
+- Search for users or enter their emails and **Select**
+- Enter a reason for the split
+- The split is then shared equally between the attendees
+
+# How to Send Money
+- Click the green **+** button and select **Send Money**
+- Enter an **amount > Next**
+- Enter the **email address** or **phone number** (including area code) of the person you’re paying
+- Add a note about why you’re paying them (this is optional, but it’s fun!)
+- Click **Pay with Expensify**
+- Choose **Bank Account\*** or **Debit Card\*\***
+\* If paying with a Bank Account, follow the prompts to connect your bank to Expensify.
+\*\* If paying with a Debit Card, enter your card details and tap Save.
+
+# FAQs
+## Send Money Payment: Why is the option to Pay With Expensify not visible to me?
+If “I’ll Settle Elsewhere” is showing for you when you’re trying to send money, this is because we don’t support money movement through Expensify in your jurisdiction yet. You can use “I’ll settle elsewhere” if you want to track the payments for audit in Expensify.
+
+## I’ve received a payment request/bill split from a friend in a DM. Do I use Send Money to send this payment?
+No. Click the green “Pay” button in the payment preview in the DM, and this will ensure you are paying the accompanying Payment or Bill Split request - canceling out the IOU to 0.
+
+## Can I request money from more than one person at a time?
+If you need to request money for more than one person at a time, you’ll want to use the Split Bill feature. The Request Money option is for one-to-one payments between two people.
diff --git a/docs/articles/send-money/The-Free-Plan.md b/docs/articles/send-money/The-Free-Plan.md
index 5a5128392d4e..88fb83429483 100644
--- a/docs/articles/send-money/The-Free-Plan.md
+++ b/docs/articles/send-money/The-Free-Plan.md
@@ -21,15 +21,7 @@ The free plan is ideal for start-ups and small businesses to manage expenses. Wi
- Navigate to new.expensify.com, enter your company email address, and set a password
- Click the **green “+”** button and select **_New workspace_**
-
-
-Once you’ve created your Workspace, you should receive a message from Concierge encouraging you to chat with your Setup Specialist.
-
-
-
-- Click the link sent to you by Concierge, and your designated Setup Specialist will guide you through how to configure your company setup.
-
-
+Once you’ve created your Workspace, you should receive a message from Concierge encouraging you to chat with your Setup Specialist. Click the link sent to you by Concierge, and your designated Setup Specialist will guide you through how to configure your company setup.
Once you’ve completed your company setup, you should have done the following:
@@ -42,14 +34,9 @@ Once you’ve completed your company setup, you should have done the following:
- To use the Expensify Card, you must invite them to your workspace via your company email address (i.e., admin@companyemail.com and NOT admin@gmail.com).
# Managing the Free Plan
-To access your workspace settings, click your profile icon and then on your workspace name:
-
-
-
-
-
+To access your workspace settings, click your profile icon and then on your workspace name.
-This menu allows you to manage your workspace members, issue additional Expensify Cards, and utilize this plan’s various bill pay and payment options.
+This settings menu allows you to manage your workspace members, issue additional Expensify Cards, and utilize this plan’s various bill pay and payment options.
# FAQs
## Do I need a business bank account to use the Free Plan?
diff --git a/docs/assets/images/chat-with-concierge-setup.png b/docs/assets/images/chat-with-concierge-setup.png
deleted file mode 100644
index 94e00e2f00e7..000000000000
Binary files a/docs/assets/images/chat-with-concierge-setup.png and /dev/null differ
diff --git a/docs/assets/images/chat-with-setup-specialist.png b/docs/assets/images/chat-with-setup-specialist.png
deleted file mode 100644
index ad6622d5abf8..000000000000
Binary files a/docs/assets/images/chat-with-setup-specialist.png and /dev/null differ
diff --git a/docs/assets/images/new-workspace.png b/docs/assets/images/new-workspace.png
deleted file mode 100644
index 3a9458df98fa..000000000000
Binary files a/docs/assets/images/new-workspace.png and /dev/null differ
diff --git a/docs/assets/images/profile-settings.png b/docs/assets/images/profile-settings.png
deleted file mode 100644
index 5b1dcc0ca492..000000000000
Binary files a/docs/assets/images/profile-settings.png and /dev/null differ
diff --git a/docs/assets/images/workspace-settings.png b/docs/assets/images/workspace-settings.png
deleted file mode 100644
index 76b96d6f4e80..000000000000
Binary files a/docs/assets/images/workspace-settings.png and /dev/null differ
diff --git a/docs/hubs/other.html b/docs/hubs/other.html
index 096b5d97d27d..7d6d7f204062 100644
--- a/docs/hubs/other.html
+++ b/docs/hubs/other.html
@@ -1,33 +1,6 @@
---
layout: default
-lhn_content: 'other'
title: Other
---
-
- Other
-
-
-
- Everything else you're looking for is right here.
-
-
-
-
-
-
+{% include hub.html %}
diff --git a/docs/hubs/request-money.html b/docs/hubs/request-money.html
index ff283be70ac1..e3ef68f5c050 100644
--- a/docs/hubs/request-money.html
+++ b/docs/hubs/request-money.html
@@ -1,15 +1,6 @@
---
layout: default
-lhn_content: 'request-money'
title: Request money
---
-
- Request money
-
-
-
- Request money for work expenses, bills, or a night out with friends using NewExpensify.
-
-
-
+{% include hub.html %}
diff --git a/docs/hubs/send-money.html b/docs/hubs/send-money.html
index 5f1461b100b7..cf496512ca22 100644
--- a/docs/hubs/send-money.html
+++ b/docs/hubs/send-money.html
@@ -1,38 +1,6 @@
---
layout: default
-lhn_content: 'send-money'
title: Send money
---
-
- Send Money page
-
-
-
- With only a couple of clicks, send money to your friends or coworkers using NewExpensify.
-
-
-
-
-
-
- Workspaces
-
-
-
-
+{% include hub.html %}
diff --git a/docs/index.html b/docs/index.html
index ece10bbda221..f3f27b7c9b76 100644
--- a/docs/index.html
+++ b/docs/index.html
@@ -1,59 +1,19 @@
---
-lhn_content: 'homepage'
---
+
{{ site.data.routes.home.title }}
-
- Welcome to Expensify Help!
-
-
-
- Find the answers to all of your questions about receipts, expenses, corporate cards, or anything else in the spend management universe.
-
+
{{ site.data.routes.home.description }}
Which best describes how you use Expensify?
diff --git a/ios/ExpensifyMono-Bold.otf b/ios/ExpensifyMono-Bold.otf
new file mode 100755
index 000000000000..4198f46f6d79
Binary files /dev/null and b/ios/ExpensifyMono-Bold.otf differ
diff --git a/ios/ExpensifyMono-Regular.otf b/ios/ExpensifyMono-Regular.otf
new file mode 100755
index 000000000000..1c6242a717f9
Binary files /dev/null and b/ios/ExpensifyMono-Regular.otf differ
diff --git a/ios/ExpensifyNeue-Bold.otf b/ios/ExpensifyNeue-Bold.otf
new file mode 100755
index 000000000000..7534aecda322
Binary files /dev/null and b/ios/ExpensifyNeue-Bold.otf differ
diff --git a/ios/ExpensifyNeue-BoldItalic.otf b/ios/ExpensifyNeue-BoldItalic.otf
new file mode 100755
index 000000000000..4c28031fedd6
Binary files /dev/null and b/ios/ExpensifyNeue-BoldItalic.otf differ
diff --git a/ios/ExpensifyNeue-Italic.otf b/ios/ExpensifyNeue-Italic.otf
new file mode 100755
index 000000000000..a5d19502dbfe
Binary files /dev/null and b/ios/ExpensifyNeue-Italic.otf differ
diff --git a/ios/ExpensifyNeue-Regular.otf b/ios/ExpensifyNeue-Regular.otf
new file mode 100755
index 000000000000..d4d8cbe63b44
Binary files /dev/null and b/ios/ExpensifyNeue-Regular.otf differ
diff --git a/ios/ExpensifyNewKansas-Medium.otf b/ios/ExpensifyNewKansas-Medium.otf
new file mode 100755
index 000000000000..a7277555fad9
Binary files /dev/null and b/ios/ExpensifyNewKansas-Medium.otf differ
diff --git a/ios/ExpensifyNewKansas-MediumItalic.otf b/ios/ExpensifyNewKansas-MediumItalic.otf
new file mode 100755
index 000000000000..984ef4bfa2d4
Binary files /dev/null and b/ios/ExpensifyNewKansas-MediumItalic.otf differ
diff --git a/ios/NewExpensify.xcodeproj/project.pbxproj b/ios/NewExpensify.xcodeproj/project.pbxproj
index cad2b5f4eb2e..953179f1e1f8 100644
--- a/ios/NewExpensify.xcodeproj/project.pbxproj
+++ b/ios/NewExpensify.xcodeproj/project.pbxproj
@@ -74,6 +74,14 @@
3981452A2C7340EBBA2B9BD1 /* GTAmericaExpMono-BdIt.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "GTAmericaExpMono-BdIt.otf"; path = "../assets/fonts/GTAmericaExpMono-BdIt.otf"; sourceTree = "
"; };
3EDF186626B8D2CBA203E08D /* libPods-NewExpensify.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-NewExpensify.a"; sourceTree = BUILT_PRODUCTS_DIR; };
5150E5D0D7F74DBA8D7C1914 /* GTAmericaExpMono-RgIt.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "GTAmericaExpMono-RgIt.otf"; path = "../assets/fonts/GTAmericaExpMono-RgIt.otf"; sourceTree = ""; };
+ 5935414E2915C8CF001E81A5 /* ExpensifyNeue-Regular.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "ExpensifyNeue-Regular.otf"; sourceTree = ""; };
+ 5935414F2915C8CF001E81A5 /* ExpensifyNeue-BoldItalic.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "ExpensifyNeue-BoldItalic.otf"; sourceTree = ""; };
+ 593541502915C8CF001E81A5 /* ExpensifyNeue-Italic.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "ExpensifyNeue-Italic.otf"; sourceTree = ""; };
+ 593541512915C8CF001E81A5 /* ExpensifyNeue-Bold.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "ExpensifyNeue-Bold.otf"; sourceTree = ""; };
+ 593541522915C8DF001E81A5 /* ExpensifyMono-Bold.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "ExpensifyMono-Bold.otf"; sourceTree = ""; };
+ 593541532915C8DF001E81A5 /* ExpensifyMono-Regular.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "ExpensifyMono-Regular.otf"; sourceTree = ""; };
+ 593541542915C8ED001E81A5 /* ExpensifyNewKansas-Medium.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "ExpensifyNewKansas-Medium.otf"; sourceTree = ""; };
+ 593541552915C8ED001E81A5 /* ExpensifyNewKansas-MediumItalic.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "ExpensifyNewKansas-MediumItalic.otf"; sourceTree = ""; };
67D5C3A6A7FA417C8A853FC1 /* GTAmericaExp-Light.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "GTAmericaExp-Light.otf"; path = "../assets/fonts/GTAmericaExp-Light.otf"; sourceTree = ""; };
7041848326A8E40900E09F4D /* RCTStartupTimer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = RCTStartupTimer.h; path = NewExpensify/RCTStartupTimer.h; sourceTree = ""; };
7041848426A8E47D00E09F4D /* RCTStartupTimer.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = RCTStartupTimer.m; path = NewExpensify/RCTStartupTimer.m; sourceTree = ""; };
@@ -206,6 +214,14 @@
isa = PBXGroup;
children = (
A5AAD008CBD84A6CAEB9AC97 /* GTAmericaExp-Bold.otf */,
+ 593541512915C8CF001E81A5 /* ExpensifyNeue-Bold.otf */,
+ 593541522915C8DF001E81A5 /* ExpensifyMono-Bold.otf */,
+ 593541532915C8DF001E81A5 /* ExpensifyMono-Regular.otf */,
+ 593541542915C8ED001E81A5 /* ExpensifyNewKansas-Medium.otf */,
+ 593541552915C8ED001E81A5 /* ExpensifyNewKansas-MediumItalic.otf */,
+ 5935414F2915C8CF001E81A5 /* ExpensifyNeue-BoldItalic.otf */,
+ 593541502915C8CF001E81A5 /* ExpensifyNeue-Italic.otf */,
+ 5935414E2915C8CF001E81A5 /* ExpensifyNeue-Regular.otf */,
67D5C3A6A7FA417C8A853FC1 /* GTAmericaExp-Light.otf */,
AE65058949E14DA5A2D5435D /* GTAmericaExp-Medium.otf */,
8C7003903C1E4957824899BB /* GTAmericaExp-Regular.otf */,
diff --git a/ios/NewExpensify/Info.plist b/ios/NewExpensify/Info.plist
index b0dbb4069eb4..1937c0102918 100644
--- a/ios/NewExpensify/Info.plist
+++ b/ios/NewExpensify/Info.plist
@@ -17,7 +17,7 @@
CFBundlePackageType
APPL
CFBundleShortVersionString
- 1.2.22
+ 1.2.24
CFBundleSignature
????
CFBundleURLTypes
@@ -30,7 +30,7 @@
CFBundleVersion
- 1.2.22.1
+ 1.2.24.4
ITSAppUsesNonExemptEncryption
LSApplicationQueriesSchemes
@@ -75,6 +75,14 @@
Your photos are used to create chat attachments.
UIAppFonts
+ ExpensifyNewKansas-MediumItalic.otf
+ ExpensifyNewKansas-Meduim.otf
+ ExpensifyNeue-Regular.otf
+ ExpensifyNeue-Italic.otf
+ ExpensifyNeue-BoldItalic.otf
+ ExpensifyNeue-Bold.otf
+ ExpensifyMono-Regular.otf
+ ExpensifyMono-Bold.otf
GTAmericaExp-Bold.otf
GTAmericaExp-Light.otf
GTAmericaExp-Medium.otf
diff --git a/ios/NewExpensifyTests/Info.plist b/ios/NewExpensifyTests/Info.plist
index bef1dded1490..f4241782e2fc 100644
--- a/ios/NewExpensifyTests/Info.plist
+++ b/ios/NewExpensifyTests/Info.plist
@@ -15,10 +15,10 @@
CFBundlePackageType
BNDL
CFBundleShortVersionString
- 1.2.22
+ 1.2.24
CFBundleSignature
????
CFBundleVersion
- 1.2.22.1
+ 1.2.24.4
diff --git a/ios/Podfile.lock b/ios/Podfile.lock
index 8edde52c08b1..e8c0a53362e1 100644
--- a/ios/Podfile.lock
+++ b/ios/Podfile.lock
@@ -201,7 +201,7 @@ PODS:
- GoogleUtilities/Logger
- GoogleUtilities/UserDefaults (7.7.0):
- GoogleUtilities/Logger
- - hermes-engine (0.70.1)
+ - hermes-engine (0.70.4)
- libevent (2.1.12)
- libwebp (1.2.3):
- libwebp/demux (= 1.2.3)
@@ -624,7 +624,7 @@ PODS:
- RNScreens (3.17.0):
- React-Core
- React-RCTImage
- - RNSVG (13.4.0):
+ - RNSVG (13.5.0):
- React-Core
- SDWebImage (5.11.1):
- SDWebImage/Core (= 5.11.1)
@@ -946,7 +946,7 @@ SPEC CHECKSUMS:
GoogleAppMeasurement: 5ba1164e3c844ba84272555e916d0a6d3d977e91
GoogleDataTransport: 1c8145da7117bd68bbbed00cf304edb6a24de00f
GoogleUtilities: e0913149f6b0625b553d70dae12b49fc62914fd1
- hermes-engine: 9cd393f741bfa14d1d0cd90cc373e3619c0bc7ea
+ hermes-engine: 3623325e0d0676a45fbc544d72c57dd79fce7446
libevent: 4049cae6c81cdb3654a443be001fb9bdceff7913
libwebp: 60305b2e989864154bd9be3d772730f08fc6a59c
nanopb: a0ba3315591a9ae0a16a309ee504766e90db0c96
@@ -1015,7 +1015,7 @@ SPEC CHECKSUMS:
RNReactNativeHapticFeedback: 1e3efeca9628ff9876ee7cdd9edec1b336913f8c
RNReanimated: 6c980139eb3b043569a08b8cb3d92cdf46bd54fa
RNScreens: 0df01424e9e0ed7827200d6ed1087ddd06c493f9
- RNSVG: 07dbd870b0dcdecc99b3a202fa37c8ca163caec2
+ RNSVG: 38ca962c970dbce1ca38991a5aebf26d163f9efb
SDWebImage: a7f831e1a65eb5e285e3fb046a23fcfbf08e696d
SDWebImageWebPCoder: 908b83b6adda48effe7667cd2b7f78c897e5111d
SocketRocket: fccef3f9c5cedea1353a9ef6ada904fde10d6608
diff --git a/package-lock.json b/package-lock.json
index ec64c2c90a31..0a44a3029502 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "new.expensify",
- "version": "1.2.22-1",
+ "version": "1.2.24-4",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "new.expensify",
- "version": "1.2.22-1",
+ "version": "1.2.24-4",
"hasInstallScript": true,
"license": "MIT",
"dependencies": {
@@ -68,7 +68,7 @@
"react-native-image-picker": "^4.8.5",
"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.26",
+ "react-native-onyx": "1.0.27",
"react-native-pdf": "^6.6.2",
"react-native-performance": "^2.0.0",
"react-native-permissions": "^3.0.1",
@@ -78,7 +78,7 @@
"react-native-render-html": "6.3.1",
"react-native-safe-area-context": "4.4.1",
"react-native-screens": "3.17.0",
- "react-native-svg": "git+https://github.com/software-mansion/react-native-svg#2a892a9eac4a0b11d33c0cf866b3475a6d332424",
+ "react-native-svg": "^13.5.0",
"react-native-webview": "^11.17.2",
"react-pdf": "5.7.2",
"react-plaid-link": "3.3.2",
@@ -111,7 +111,7 @@
"@storybook/manager-webpack5": "^6.5.10",
"@storybook/react": "^6.5.9",
"@storybook/theming": "^6.5.9",
- "@svgr/webpack": "^5.5.0",
+ "@svgr/webpack": "^6.0.0",
"@testing-library/jest-native": "^3.4.2",
"@testing-library/react-native": "^7.0.2",
"@vercel/ncc": "^0.27.0",
@@ -149,7 +149,7 @@
"react-native-clean-project": "^4.0.0-alpha4.0",
"react-native-flipper": "https://gitpkg.now.sh/facebook/flipper/react-native/react-native-flipper?9cacc9b59402550eae866e0e81e5f0c2f8203e6b",
"react-native-performance-flipper-reporter": "^2.0.0",
- "react-native-svg-transformer": "^0.14.3",
+ "react-native-svg-transformer": "^1.0.0",
"react-test-renderer": "18.1.0",
"semver": "^7.3.4",
"speed-measure-webpack-plugin": "^1.5.0",
@@ -304,28 +304,28 @@
}
},
"node_modules/@babel/compat-data": {
- "version": "7.18.8",
- "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.8.tgz",
- "integrity": "sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ==",
+ "version": "7.20.0",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.0.tgz",
+ "integrity": "sha512-Gt9jszFJYq7qzXVK4slhc6NzJXnOVmRECWcVjF/T23rNXD9NtWQ0W3qxdg+p9wWIB+VQw3GYV/U2Ha9bRTfs4w==",
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/core": {
- "version": "7.18.10",
- "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.10.tgz",
- "integrity": "sha512-JQM6k6ENcBFKVtWvLavlvi/mPcpYZ3+R+2EySDEMSMbp7Mn4FexlbbJVrx2R7Ijhr01T8gyqrOaABWIOgxeUyw==",
+ "version": "7.19.6",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.19.6.tgz",
+ "integrity": "sha512-D2Ue4KHpc6Ys2+AxpIx1BZ8+UegLLLE2p3KJEuJRKmokHOtl49jQ5ny1773KsGLZs8MQvBidAF6yWUJxRqtKtg==",
"dependencies": {
"@ampproject/remapping": "^2.1.0",
"@babel/code-frame": "^7.18.6",
- "@babel/generator": "^7.18.10",
- "@babel/helper-compilation-targets": "^7.18.9",
- "@babel/helper-module-transforms": "^7.18.9",
- "@babel/helpers": "^7.18.9",
- "@babel/parser": "^7.18.10",
+ "@babel/generator": "^7.19.6",
+ "@babel/helper-compilation-targets": "^7.19.3",
+ "@babel/helper-module-transforms": "^7.19.6",
+ "@babel/helpers": "^7.19.4",
+ "@babel/parser": "^7.19.6",
"@babel/template": "^7.18.10",
- "@babel/traverse": "^7.18.10",
- "@babel/types": "^7.18.10",
+ "@babel/traverse": "^7.19.6",
+ "@babel/types": "^7.19.4",
"convert-source-map": "^1.7.0",
"debug": "^4.1.0",
"gensync": "^1.0.0-beta.2",
@@ -349,11 +349,11 @@
}
},
"node_modules/@babel/generator": {
- "version": "7.19.0",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.19.0.tgz",
- "integrity": "sha512-S1ahxf1gZ2dpoiFgA+ohK9DIpz50bJ0CWs7Zlzb54Z4sG8qmdIrGrVqmy1sAtTVRb+9CU6U8VqT9L0Zj7hxHVg==",
+ "version": "7.20.0",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.0.tgz",
+ "integrity": "sha512-GUPcXxWibClgmYJuIwC2Bc2Lg+8b9VjaJ+HlNdACEVt+Wlr1eoU1OPZjZRm7Hzl0gaTsUZNQfeihvZJhG7oc3w==",
"dependencies": {
- "@babel/types": "^7.19.0",
+ "@babel/types": "^7.20.0",
"@jridgewell/gen-mapping": "^0.3.2",
"jsesc": "^2.5.1"
},
@@ -398,13 +398,13 @@
}
},
"node_modules/@babel/helper-compilation-targets": {
- "version": "7.18.9",
- "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz",
- "integrity": "sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg==",
+ "version": "7.20.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz",
+ "integrity": "sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==",
"dependencies": {
- "@babel/compat-data": "^7.18.8",
+ "@babel/compat-data": "^7.20.0",
"@babel/helper-validator-option": "^7.18.6",
- "browserslist": "^4.20.2",
+ "browserslist": "^4.21.3",
"semver": "^6.3.0"
},
"engines": {
@@ -443,9 +443,9 @@
}
},
"node_modules/@babel/helper-create-regexp-features-plugin": {
- "version": "7.18.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.18.6.tgz",
- "integrity": "sha512-7LcpH1wnQLGrI+4v+nPp+zUvIkF9x0ddv1Hkdue10tg3gmRnLy97DXh4STiOf1qeIInyD69Qv5kKSZzKD8B/7A==",
+ "version": "7.19.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.19.0.tgz",
+ "integrity": "sha512-htnV+mHX32DF81amCDrwIDr8nrp1PTm+3wfBN9/v8QJOLEioOCOG7qNyq0nHeFiWbT3Eb7gsPwEmV64UCQ1jzw==",
"dependencies": {
"@babel/helper-annotate-as-pure": "^7.18.6",
"regexpu-core": "^5.1.0"
@@ -458,9 +458,9 @@
}
},
"node_modules/@babel/helper-define-polyfill-provider": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.2.tgz",
- "integrity": "sha512-r9QJJ+uDWrd+94BSPcP6/de67ygLtvVy6cK4luE6MOuDsZIdoaPBnfSpbO/+LTifjPckbKXRuI9BB/Z2/y3iTg==",
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz",
+ "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==",
"dependencies": {
"@babel/helper-compilation-targets": "^7.17.7",
"@babel/helper-plugin-utils": "^7.16.7",
@@ -546,18 +546,18 @@
}
},
"node_modules/@babel/helper-module-transforms": {
- "version": "7.18.9",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz",
- "integrity": "sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g==",
+ "version": "7.19.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.19.6.tgz",
+ "integrity": "sha512-fCmcfQo/KYr/VXXDIyd3CBGZ6AFhPFy1TfSEJ+PilGVlQT6jcbqtHAM4C1EciRqMza7/TpOUZliuSH+U6HAhJw==",
"dependencies": {
"@babel/helper-environment-visitor": "^7.18.9",
"@babel/helper-module-imports": "^7.18.6",
- "@babel/helper-simple-access": "^7.18.6",
+ "@babel/helper-simple-access": "^7.19.4",
"@babel/helper-split-export-declaration": "^7.18.6",
- "@babel/helper-validator-identifier": "^7.18.6",
- "@babel/template": "^7.18.6",
- "@babel/traverse": "^7.18.9",
- "@babel/types": "^7.18.9"
+ "@babel/helper-validator-identifier": "^7.19.1",
+ "@babel/template": "^7.18.10",
+ "@babel/traverse": "^7.19.6",
+ "@babel/types": "^7.19.4"
},
"engines": {
"node": ">=6.9.0"
@@ -615,11 +615,11 @@
}
},
"node_modules/@babel/helper-simple-access": {
- "version": "7.18.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz",
- "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==",
+ "version": "7.19.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.19.4.tgz",
+ "integrity": "sha512-f9Xq6WqBFqaDfbCzn2w85hwklswz5qsKlh7f08w4Y9yhJHpnNC0QemtSkK5YyOY8kPGvyiwdzZksGUhnGdaUIg==",
"dependencies": {
- "@babel/types": "^7.18.6"
+ "@babel/types": "^7.19.4"
},
"engines": {
"node": ">=6.9.0"
@@ -648,17 +648,17 @@
}
},
"node_modules/@babel/helper-string-parser": {
- "version": "7.18.10",
- "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz",
- "integrity": "sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==",
+ "version": "7.19.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz",
+ "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==",
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-validator-identifier": {
- "version": "7.18.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz",
- "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==",
+ "version": "7.19.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz",
+ "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==",
"engines": {
"node": ">=6.9.0"
}
@@ -686,13 +686,13 @@
}
},
"node_modules/@babel/helpers": {
- "version": "7.18.9",
- "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.9.tgz",
- "integrity": "sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ==",
+ "version": "7.20.0",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.0.tgz",
+ "integrity": "sha512-aGMjYraN0zosCEthoGLdqot1oRsmxVTQRHadsUPz5QM44Zej2PYRz7XiDE7GqnkZnNtLbOuxqoZw42vkU7+XEQ==",
"dependencies": {
- "@babel/template": "^7.18.6",
- "@babel/traverse": "^7.18.9",
- "@babel/types": "^7.18.9"
+ "@babel/template": "^7.18.10",
+ "@babel/traverse": "^7.20.0",
+ "@babel/types": "^7.20.0"
},
"engines": {
"node": ">=6.9.0"
@@ -712,9 +712,9 @@
}
},
"node_modules/@babel/parser": {
- "version": "7.19.1",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.1.tgz",
- "integrity": "sha512-h7RCSorm1DdTVGJf3P2Mhj3kdnkmF/EiysUkzS2TdgAYqyjFdMQJbVuXOBej2SBJaXan/lIVtT6KkGbyyq753A==",
+ "version": "7.20.0",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.0.tgz",
+ "integrity": "sha512-G9VgAhEaICnz8iiJeGJQyVl6J2nTjbW0xeisva0PK6XcKsga7BIaqm4ZF8Rg1Wbaqmy6znspNqhPaPkyukujzg==",
"bin": {
"parser": "bin/babel-parser.js"
},
@@ -753,12 +753,12 @@
}
},
"node_modules/@babel/plugin-proposal-async-generator-functions": {
- "version": "7.18.10",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.18.10.tgz",
- "integrity": "sha512-1mFuY2TOsR1hxbjCo4QL+qlIjV07p4H4EUYw2J/WCqsvFV6V9X9z9YhXbWndc/4fw+hYGlDT7egYxliMp5O6Ew==",
+ "version": "7.19.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.19.1.tgz",
+ "integrity": "sha512-0yu8vNATgLy4ivqMNBIwb1HebCelqN7YX8SL3FDXORv/RqT0zEEWUCH4GH44JsSrvCu6GqnAdR5EBFAPeNBB4Q==",
"dependencies": {
"@babel/helper-environment-visitor": "^7.18.9",
- "@babel/helper-plugin-utils": "^7.18.9",
+ "@babel/helper-plugin-utils": "^7.19.0",
"@babel/helper-remap-async-to-generator": "^7.18.9",
"@babel/plugin-syntax-async-generators": "^7.8.4"
},
@@ -925,13 +925,13 @@
}
},
"node_modules/@babel/plugin-proposal-object-rest-spread": {
- "version": "7.18.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.9.tgz",
- "integrity": "sha512-kDDHQ5rflIeY5xl69CEqGEZ0KY369ehsCIEbTGb4siHG5BE9sga/T0r0OUwyZNLMmZE79E1kbsqAjwFCW4ds6Q==",
+ "version": "7.19.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.19.4.tgz",
+ "integrity": "sha512-wHmj6LDxVDnL+3WhXteUBaoM1aVILZODAUjg11kHqG4cOlfgMQGxw6aCgvrXrmaJR3Bn14oZhImyCPZzRpC93Q==",
"dependencies": {
- "@babel/compat-data": "^7.18.8",
- "@babel/helper-compilation-targets": "^7.18.9",
- "@babel/helper-plugin-utils": "^7.18.9",
+ "@babel/compat-data": "^7.19.4",
+ "@babel/helper-compilation-targets": "^7.19.3",
+ "@babel/helper-plugin-utils": "^7.19.0",
"@babel/plugin-syntax-object-rest-spread": "^7.8.3",
"@babel/plugin-transform-parameters": "^7.18.8"
},
@@ -1337,11 +1337,11 @@
}
},
"node_modules/@babel/plugin-transform-block-scoping": {
- "version": "7.18.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.9.tgz",
- "integrity": "sha512-5sDIJRV1KtQVEbt/EIBwGy4T01uYIo4KRB3VUqzkhrAIOGx7AoctL9+Ux88btY0zXdDyPJ9mW+bg+v+XEkGmtw==",
+ "version": "7.20.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.0.tgz",
+ "integrity": "sha512-sXOohbpHZSk7GjxK9b3dKB7CfqUD5DwOH+DggKzOQ7TXYP+RCSbRykfjQmn/zq+rBjycVRtLf9pYhAaEJA786w==",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.18.9"
+ "@babel/helper-plugin-utils": "^7.19.0"
},
"engines": {
"node": ">=6.9.0"
@@ -1351,15 +1351,16 @@
}
},
"node_modules/@babel/plugin-transform-classes": {
- "version": "7.18.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.9.tgz",
- "integrity": "sha512-EkRQxsxoytpTlKJmSPYrsOMjCILacAjtSVkd4gChEe2kXjFCun3yohhW5I7plXJhCemM0gKsaGMcO8tinvCA5g==",
+ "version": "7.19.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.19.0.tgz",
+ "integrity": "sha512-YfeEE9kCjqTS9IitkgfJuxjcEtLUHMqa8yUJ6zdz8vR7hKuo6mOy2C05P0F1tdMmDCeuyidKnlrw/iTppHcr2A==",
"dependencies": {
"@babel/helper-annotate-as-pure": "^7.18.6",
+ "@babel/helper-compilation-targets": "^7.19.0",
"@babel/helper-environment-visitor": "^7.18.9",
- "@babel/helper-function-name": "^7.18.9",
+ "@babel/helper-function-name": "^7.19.0",
"@babel/helper-optimise-call-expression": "^7.18.6",
- "@babel/helper-plugin-utils": "^7.18.9",
+ "@babel/helper-plugin-utils": "^7.19.0",
"@babel/helper-replace-supers": "^7.18.9",
"@babel/helper-split-export-declaration": "^7.18.6",
"globals": "^11.1.0"
@@ -1386,11 +1387,11 @@
}
},
"node_modules/@babel/plugin-transform-destructuring": {
- "version": "7.18.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.9.tgz",
- "integrity": "sha512-p5VCYNddPLkZTq4XymQIaIfZNJwT9YsjkPOhkVEqt6QIpQFZVM9IltqqYpOEkJoN1DPznmxUDyZ5CTZs/ZCuHA==",
+ "version": "7.20.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.0.tgz",
+ "integrity": "sha512-1dIhvZfkDVx/zn2S1aFwlruspTt4189j7fEkH0Y0VyuDM6bQt7bD6kLcz3l4IlLG+e5OReaBz9ROAbttRtUHqA==",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.18.9"
+ "@babel/helper-plugin-utils": "^7.19.0"
},
"engines": {
"node": ">=6.9.0"
@@ -1550,15 +1551,14 @@
}
},
"node_modules/@babel/plugin-transform-modules-systemjs": {
- "version": "7.18.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.9.tgz",
- "integrity": "sha512-zY/VSIbbqtoRoJKo2cDTewL364jSlZGvn0LKOf9ntbfxOvjfmyrdtEEOAdswOswhZEb8UH3jDkCKHd1sPgsS0A==",
+ "version": "7.19.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.19.6.tgz",
+ "integrity": "sha512-fqGLBepcc3kErfR9R3DnVpURmckXP7gj7bAlrTQyBxrigFqszZCkFkcoxzCp2v32XmwXLvbw+8Yq9/b+QqksjQ==",
"dependencies": {
"@babel/helper-hoist-variables": "^7.18.6",
- "@babel/helper-module-transforms": "^7.18.9",
- "@babel/helper-plugin-utils": "^7.18.9",
- "@babel/helper-validator-identifier": "^7.18.6",
- "babel-plugin-dynamic-import-node": "^2.3.3"
+ "@babel/helper-module-transforms": "^7.19.6",
+ "@babel/helper-plugin-utils": "^7.19.0",
+ "@babel/helper-validator-identifier": "^7.19.1"
},
"engines": {
"node": ">=6.9.0"
@@ -1583,12 +1583,12 @@
}
},
"node_modules/@babel/plugin-transform-named-capturing-groups-regex": {
- "version": "7.18.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.18.6.tgz",
- "integrity": "sha512-UmEOGF8XgaIqD74bC8g7iV3RYj8lMf0Bw7NJzvnS9qQhM4mg+1WHKotUIdjxgD2RGrgFLZZPCFPFj3P/kVDYhg==",
+ "version": "7.19.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.19.1.tgz",
+ "integrity": "sha512-oWk9l9WItWBQYS4FgXD4Uyy5kq898lvkXpXQxoJEY1RnvPk4R/Dvu2ebXU9q8lP+rlMwUQTFf2Ok6d78ODa0kw==",
"dependencies": {
- "@babel/helper-create-regexp-features-plugin": "^7.18.6",
- "@babel/helper-plugin-utils": "^7.18.6"
+ "@babel/helper-create-regexp-features-plugin": "^7.19.0",
+ "@babel/helper-plugin-utils": "^7.19.0"
},
"engines": {
"node": ">=6.9.0"
@@ -1845,11 +1845,11 @@
}
},
"node_modules/@babel/plugin-transform-spread": {
- "version": "7.18.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.18.9.tgz",
- "integrity": "sha512-39Q814wyoOPtIB/qGopNIL9xDChOE1pNU0ZY5dO0owhiVt/5kFm4li+/bBtwc7QotG0u5EPzqhZdjMtmqBqyQA==",
+ "version": "7.19.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.19.0.tgz",
+ "integrity": "sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w==",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.18.9",
+ "@babel/helper-plugin-utils": "^7.19.0",
"@babel/helper-skip-transparent-expression-wrappers": "^7.18.9"
},
"engines": {
@@ -1947,17 +1947,17 @@
}
},
"node_modules/@babel/preset-env": {
- "version": "7.18.10",
- "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.10.tgz",
- "integrity": "sha512-wVxs1yjFdW3Z/XkNfXKoblxoHgbtUF7/l3PvvP4m02Qz9TZ6uZGxRVYjSQeR87oQmHco9zWitW5J82DJ7sCjvA==",
+ "version": "7.19.4",
+ "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.19.4.tgz",
+ "integrity": "sha512-5QVOTXUdqTCjQuh2GGtdd7YEhoRXBMVGROAtsBeLGIbIz3obCBIfRMT1I3ZKkMgNzwkyCkftDXSSkHxnfVf4qg==",
"dependencies": {
- "@babel/compat-data": "^7.18.8",
- "@babel/helper-compilation-targets": "^7.18.9",
- "@babel/helper-plugin-utils": "^7.18.9",
+ "@babel/compat-data": "^7.19.4",
+ "@babel/helper-compilation-targets": "^7.19.3",
+ "@babel/helper-plugin-utils": "^7.19.0",
"@babel/helper-validator-option": "^7.18.6",
"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6",
"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9",
- "@babel/plugin-proposal-async-generator-functions": "^7.18.10",
+ "@babel/plugin-proposal-async-generator-functions": "^7.19.1",
"@babel/plugin-proposal-class-properties": "^7.18.6",
"@babel/plugin-proposal-class-static-block": "^7.18.6",
"@babel/plugin-proposal-dynamic-import": "^7.18.6",
@@ -1966,7 +1966,7 @@
"@babel/plugin-proposal-logical-assignment-operators": "^7.18.9",
"@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6",
"@babel/plugin-proposal-numeric-separator": "^7.18.6",
- "@babel/plugin-proposal-object-rest-spread": "^7.18.9",
+ "@babel/plugin-proposal-object-rest-spread": "^7.19.4",
"@babel/plugin-proposal-optional-catch-binding": "^7.18.6",
"@babel/plugin-proposal-optional-chaining": "^7.18.9",
"@babel/plugin-proposal-private-methods": "^7.18.6",
@@ -1990,10 +1990,10 @@
"@babel/plugin-transform-arrow-functions": "^7.18.6",
"@babel/plugin-transform-async-to-generator": "^7.18.6",
"@babel/plugin-transform-block-scoped-functions": "^7.18.6",
- "@babel/plugin-transform-block-scoping": "^7.18.9",
- "@babel/plugin-transform-classes": "^7.18.9",
+ "@babel/plugin-transform-block-scoping": "^7.19.4",
+ "@babel/plugin-transform-classes": "^7.19.0",
"@babel/plugin-transform-computed-properties": "^7.18.9",
- "@babel/plugin-transform-destructuring": "^7.18.9",
+ "@babel/plugin-transform-destructuring": "^7.19.4",
"@babel/plugin-transform-dotall-regex": "^7.18.6",
"@babel/plugin-transform-duplicate-keys": "^7.18.9",
"@babel/plugin-transform-exponentiation-operator": "^7.18.6",
@@ -2003,9 +2003,9 @@
"@babel/plugin-transform-member-expression-literals": "^7.18.6",
"@babel/plugin-transform-modules-amd": "^7.18.6",
"@babel/plugin-transform-modules-commonjs": "^7.18.6",
- "@babel/plugin-transform-modules-systemjs": "^7.18.9",
+ "@babel/plugin-transform-modules-systemjs": "^7.19.0",
"@babel/plugin-transform-modules-umd": "^7.18.6",
- "@babel/plugin-transform-named-capturing-groups-regex": "^7.18.6",
+ "@babel/plugin-transform-named-capturing-groups-regex": "^7.19.1",
"@babel/plugin-transform-new-target": "^7.18.6",
"@babel/plugin-transform-object-super": "^7.18.6",
"@babel/plugin-transform-parameters": "^7.18.8",
@@ -2013,18 +2013,18 @@
"@babel/plugin-transform-regenerator": "^7.18.6",
"@babel/plugin-transform-reserved-words": "^7.18.6",
"@babel/plugin-transform-shorthand-properties": "^7.18.6",
- "@babel/plugin-transform-spread": "^7.18.9",
+ "@babel/plugin-transform-spread": "^7.19.0",
"@babel/plugin-transform-sticky-regex": "^7.18.6",
"@babel/plugin-transform-template-literals": "^7.18.9",
"@babel/plugin-transform-typeof-symbol": "^7.18.9",
"@babel/plugin-transform-unicode-escapes": "^7.18.10",
"@babel/plugin-transform-unicode-regex": "^7.18.6",
"@babel/preset-modules": "^0.1.5",
- "@babel/types": "^7.18.10",
- "babel-plugin-polyfill-corejs2": "^0.3.2",
- "babel-plugin-polyfill-corejs3": "^0.5.3",
- "babel-plugin-polyfill-regenerator": "^0.4.0",
- "core-js-compat": "^3.22.1",
+ "@babel/types": "^7.19.4",
+ "babel-plugin-polyfill-corejs2": "^0.3.3",
+ "babel-plugin-polyfill-corejs3": "^0.6.0",
+ "babel-plugin-polyfill-regenerator": "^0.4.1",
+ "core-js-compat": "^3.25.1",
"semver": "^6.3.0"
},
"engines": {
@@ -2034,6 +2034,18 @@
"@babel/core": "^7.0.0-0"
}
},
+ "node_modules/@babel/preset-env/node_modules/babel-plugin-polyfill-corejs3": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz",
+ "integrity": "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==",
+ "dependencies": {
+ "@babel/helper-define-polyfill-provider": "^0.3.3",
+ "core-js-compat": "^3.25.1"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
"node_modules/@babel/preset-env/node_modules/semver": {
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
@@ -2165,18 +2177,18 @@
}
},
"node_modules/@babel/traverse": {
- "version": "7.19.1",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.1.tgz",
- "integrity": "sha512-0j/ZfZMxKukDaag2PtOPDbwuELqIar6lLskVPPJDjXMXjfLb1Obo/1yjxIGqqAJrmfaTIY3z2wFLAQ7qSkLsuA==",
+ "version": "7.20.0",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.0.tgz",
+ "integrity": "sha512-5+cAXQNARgjRUK0JWu2UBwja4JLSO/rBMPJzpsKb+oBF5xlUuCfljQepS4XypBQoiigL0VQjTZy6WiONtUdScQ==",
"dependencies": {
"@babel/code-frame": "^7.18.6",
- "@babel/generator": "^7.19.0",
+ "@babel/generator": "^7.20.0",
"@babel/helper-environment-visitor": "^7.18.9",
"@babel/helper-function-name": "^7.19.0",
"@babel/helper-hoist-variables": "^7.18.6",
"@babel/helper-split-export-declaration": "^7.18.6",
- "@babel/parser": "^7.19.1",
- "@babel/types": "^7.19.0",
+ "@babel/parser": "^7.20.0",
+ "@babel/types": "^7.20.0",
"debug": "^4.1.0",
"globals": "^11.1.0"
},
@@ -2185,12 +2197,12 @@
}
},
"node_modules/@babel/types": {
- "version": "7.19.0",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.0.tgz",
- "integrity": "sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==",
+ "version": "7.20.0",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.0.tgz",
+ "integrity": "sha512-Jlgt3H0TajCW164wkTOTzHkZb075tMQMULzrLUoUeKmO7eFL96GgDxf7/Axhc5CAuKE3KFyVW1p6ysKsi2oXAg==",
"dependencies": {
- "@babel/helper-string-parser": "^7.18.10",
- "@babel/helper-validator-identifier": "^7.18.6",
+ "@babel/helper-string-parser": "^7.19.4",
+ "@babel/helper-validator-identifier": "^7.19.1",
"to-fast-properties": "^2.0.0"
},
"engines": {
@@ -13893,9 +13905,9 @@
}
},
"node_modules/@svgr/babel-plugin-add-jsx-attribute": {
- "version": "5.4.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz",
- "integrity": "sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==",
+ "version": "6.5.1",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.5.1.tgz",
+ "integrity": "sha512-9PYGcXrAxitycIjRmZB+Q0JaN07GZIWaTBIGQzfaZv+qr1n8X1XUEJ5rZ/vx6OVD9RRYlrNnXWExQXcmZeD/BQ==",
"dev": true,
"engines": {
"node": ">=10"
@@ -13903,12 +13915,15 @@
"funding": {
"type": "github",
"url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
}
},
"node_modules/@svgr/babel-plugin-remove-jsx-attribute": {
- "version": "5.4.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz",
- "integrity": "sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==",
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-6.5.0.tgz",
+ "integrity": "sha512-8zYdkym7qNyfXpWvu4yq46k41pyNM9SOstoWhKlm+IfdCE1DdnRKeMUPsWIEO/DEkaWxJ8T9esNdG3QwQ93jBA==",
"dev": true,
"engines": {
"node": ">=10"
@@ -13916,12 +13931,15 @@
"funding": {
"type": "github",
"url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
}
},
"node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz",
- "integrity": "sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==",
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-6.5.0.tgz",
+ "integrity": "sha512-NFdxMq3xA42Kb1UbzCVxplUc0iqSyM9X8kopImvFnB+uSDdzIHOdbs1op8ofAvVRtbg4oZiyRl3fTYeKcOe9Iw==",
"dev": true,
"engines": {
"node": ">=10"
@@ -13929,12 +13947,15 @@
"funding": {
"type": "github",
"url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
}
},
"node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz",
- "integrity": "sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==",
+ "version": "6.5.1",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.5.1.tgz",
+ "integrity": "sha512-8DPaVVE3fd5JKuIC29dqyMB54sA6mfgki2H2+swh+zNJoynC8pMPzOkidqHOSc6Wj032fhl8Z0TVn1GiPpAiJg==",
"dev": true,
"engines": {
"node": ">=10"
@@ -13942,12 +13963,15 @@
"funding": {
"type": "github",
"url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
}
},
"node_modules/@svgr/babel-plugin-svg-dynamic-title": {
- "version": "5.4.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz",
- "integrity": "sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==",
+ "version": "6.5.1",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.5.1.tgz",
+ "integrity": "sha512-FwOEi0Il72iAzlkaHrlemVurgSQRDFbk0OC8dSvD5fSBPHltNh7JtLsxmZUhjYBZo2PpcU/RJvvi6Q0l7O7ogw==",
"dev": true,
"engines": {
"node": ">=10"
@@ -13955,12 +13979,15 @@
"funding": {
"type": "github",
"url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
}
},
"node_modules/@svgr/babel-plugin-svg-em-dimensions": {
- "version": "5.4.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz",
- "integrity": "sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==",
+ "version": "6.5.1",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.5.1.tgz",
+ "integrity": "sha512-gWGsiwjb4tw+ITOJ86ndY/DZZ6cuXMNE/SjcDRg+HLuCmwpcjOktwRF9WgAiycTqJD/QXqL2f8IzE2Rzh7aVXA==",
"dev": true,
"engines": {
"node": ">=10"
@@ -13968,12 +13995,15 @@
"funding": {
"type": "github",
"url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
}
},
"node_modules/@svgr/babel-plugin-transform-react-native-svg": {
- "version": "5.4.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz",
- "integrity": "sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==",
+ "version": "6.5.1",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.5.1.tgz",
+ "integrity": "sha512-2jT3nTayyYP7kI6aGutkyfJ7UMGtuguD72OjeGLwVNyfPRBD8zQthlvL+fAbAKk5n9ZNcvFkp/b1lZ7VsYqVJg==",
"dev": true,
"engines": {
"node": ">=10"
@@ -13981,35 +14011,41 @@
"funding": {
"type": "github",
"url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
}
},
"node_modules/@svgr/babel-plugin-transform-svg-component": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz",
- "integrity": "sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==",
+ "version": "6.5.1",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.5.1.tgz",
+ "integrity": "sha512-a1p6LF5Jt33O3rZoVRBqdxL350oge54iZWHNI6LJB5tQ7EelvD/Mb1mfBiZNAan0dt4i3VArkFRjA4iObuNykQ==",
"dev": true,
"engines": {
- "node": ">=10"
+ "node": ">=12"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
}
},
"node_modules/@svgr/babel-preset": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-5.5.0.tgz",
- "integrity": "sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==",
+ "version": "6.5.1",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-6.5.1.tgz",
+ "integrity": "sha512-6127fvO/FF2oi5EzSQOAjo1LE3OtNVh11R+/8FXa+mHx1ptAaS4cknIjnUA7e6j6fwGGJ17NzaTJFUwOV2zwCw==",
"dev": true,
"dependencies": {
- "@svgr/babel-plugin-add-jsx-attribute": "^5.4.0",
- "@svgr/babel-plugin-remove-jsx-attribute": "^5.4.0",
- "@svgr/babel-plugin-remove-jsx-empty-expression": "^5.0.1",
- "@svgr/babel-plugin-replace-jsx-attribute-value": "^5.0.1",
- "@svgr/babel-plugin-svg-dynamic-title": "^5.4.0",
- "@svgr/babel-plugin-svg-em-dimensions": "^5.4.0",
- "@svgr/babel-plugin-transform-react-native-svg": "^5.4.0",
- "@svgr/babel-plugin-transform-svg-component": "^5.5.0"
+ "@svgr/babel-plugin-add-jsx-attribute": "^6.5.1",
+ "@svgr/babel-plugin-remove-jsx-attribute": "*",
+ "@svgr/babel-plugin-remove-jsx-empty-expression": "*",
+ "@svgr/babel-plugin-replace-jsx-attribute-value": "^6.5.1",
+ "@svgr/babel-plugin-svg-dynamic-title": "^6.5.1",
+ "@svgr/babel-plugin-svg-em-dimensions": "^6.5.1",
+ "@svgr/babel-plugin-transform-react-native-svg": "^6.5.1",
+ "@svgr/babel-plugin-transform-svg-component": "^6.5.1"
},
"engines": {
"node": ">=10"
@@ -14017,17 +14053,22 @@
"funding": {
"type": "github",
"url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
}
},
"node_modules/@svgr/core": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/@svgr/core/-/core-5.5.0.tgz",
- "integrity": "sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==",
+ "version": "6.5.1",
+ "resolved": "https://registry.npmjs.org/@svgr/core/-/core-6.5.1.tgz",
+ "integrity": "sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw==",
"dev": true,
"dependencies": {
- "@svgr/plugin-jsx": "^5.5.0",
+ "@babel/core": "^7.19.6",
+ "@svgr/babel-preset": "^6.5.1",
+ "@svgr/plugin-jsx": "^6.5.1",
"camelcase": "^6.2.0",
- "cosmiconfig": "^7.0.0"
+ "cosmiconfig": "^7.0.1"
},
"engines": {
"node": ">=10"
@@ -14038,12 +14079,13 @@
}
},
"node_modules/@svgr/hast-util-to-babel-ast": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz",
- "integrity": "sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==",
+ "version": "6.5.1",
+ "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.5.1.tgz",
+ "integrity": "sha512-1hnUxxjd83EAxbL4a0JDJoD3Dao3hmjvyvyEV8PzWmLK3B9m9NPlW7GKjFyoWE8nM7HnXzPcmmSyOW8yOddSXw==",
"dev": true,
"dependencies": {
- "@babel/types": "^7.12.6"
+ "@babel/types": "^7.20.0",
+ "entities": "^4.4.0"
},
"engines": {
"node": ">=10"
@@ -14053,16 +14095,28 @@
"url": "https://github.com/sponsors/gregberge"
}
},
+ "node_modules/@svgr/hast-util-to-babel-ast/node_modules/entities": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz",
+ "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
"node_modules/@svgr/plugin-jsx": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz",
- "integrity": "sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==",
+ "version": "6.5.1",
+ "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-6.5.1.tgz",
+ "integrity": "sha512-+UdQxI3jgtSjCykNSlEMuy1jSRQlGC7pqBCPvkG/2dATdWo082zHTTK3uhnAju2/6XpE6B5mZ3z4Z8Ns01S8Gw==",
"dev": true,
"dependencies": {
- "@babel/core": "^7.12.3",
- "@svgr/babel-preset": "^5.5.0",
- "@svgr/hast-util-to-babel-ast": "^5.5.0",
- "svg-parser": "^2.0.2"
+ "@babel/core": "^7.19.6",
+ "@svgr/babel-preset": "^6.5.1",
+ "@svgr/hast-util-to-babel-ast": "^6.5.1",
+ "svg-parser": "^2.0.4"
},
"engines": {
"node": ">=10"
@@ -14070,17 +14124,20 @@
"funding": {
"type": "github",
"url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@svgr/core": "^6.0.0"
}
},
"node_modules/@svgr/plugin-svgo": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz",
- "integrity": "sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==",
+ "version": "6.5.1",
+ "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-6.5.1.tgz",
+ "integrity": "sha512-omvZKf8ixP9z6GWgwbtmP9qQMPX4ODXi+wzbVZgomNFsUIlHA1sf4fThdwTWSsZGgvGAG6yE+b/F5gWUkcZ/iQ==",
"dev": true,
"dependencies": {
- "cosmiconfig": "^7.0.0",
+ "cosmiconfig": "^7.0.1",
"deepmerge": "^4.2.2",
- "svgo": "^1.2.2"
+ "svgo": "^2.8.0"
},
"engines": {
"node": ">=10"
@@ -14088,22 +14145,77 @@
"funding": {
"type": "github",
"url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@svgr/core": "*"
+ }
+ },
+ "node_modules/@svgr/plugin-svgo/node_modules/commander": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
+ "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@svgr/plugin-svgo/node_modules/css-select": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz",
+ "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==",
+ "dev": true,
+ "dependencies": {
+ "boolbase": "^1.0.0",
+ "css-what": "^6.0.1",
+ "domhandler": "^4.3.1",
+ "domutils": "^2.8.0",
+ "nth-check": "^2.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
+ "node_modules/@svgr/plugin-svgo/node_modules/picocolors": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
+ "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
+ "dev": true
+ },
+ "node_modules/@svgr/plugin-svgo/node_modules/svgo": {
+ "version": "2.8.0",
+ "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz",
+ "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==",
+ "dev": true,
+ "dependencies": {
+ "@trysound/sax": "0.2.0",
+ "commander": "^7.2.0",
+ "css-select": "^4.1.3",
+ "css-tree": "^1.1.3",
+ "csso": "^4.2.0",
+ "picocolors": "^1.0.0",
+ "stable": "^0.1.8"
+ },
+ "bin": {
+ "svgo": "bin/svgo"
+ },
+ "engines": {
+ "node": ">=10.13.0"
}
},
"node_modules/@svgr/webpack": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-5.5.0.tgz",
- "integrity": "sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==",
+ "version": "6.5.1",
+ "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-6.5.1.tgz",
+ "integrity": "sha512-cQ/AsnBkXPkEK8cLbv4Dm7JGXq2XrumKnL1dRpJD9rIO2fTIlJI9a1uCciYG1F2aUsox/hJQyNGbt3soDxSRkA==",
"dev": true,
"dependencies": {
- "@babel/core": "^7.12.3",
- "@babel/plugin-transform-react-constant-elements": "^7.12.1",
- "@babel/preset-env": "^7.12.1",
- "@babel/preset-react": "^7.12.5",
- "@svgr/core": "^5.5.0",
- "@svgr/plugin-jsx": "^5.5.0",
- "@svgr/plugin-svgo": "^5.5.0",
- "loader-utils": "^2.0.0"
+ "@babel/core": "^7.19.6",
+ "@babel/plugin-transform-react-constant-elements": "^7.18.12",
+ "@babel/preset-env": "^7.19.4",
+ "@babel/preset-react": "^7.18.6",
+ "@babel/preset-typescript": "^7.18.6",
+ "@svgr/core": "^6.5.1",
+ "@svgr/plugin-jsx": "^6.5.1",
+ "@svgr/plugin-svgo": "^6.5.1"
},
"engines": {
"node": ">=10"
@@ -14230,6 +14342,15 @@
"node": ">= 10"
}
},
+ "node_modules/@trysound/sax": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz",
+ "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
"node_modules/@types/babel__core": {
"version": "7.1.19",
"resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz",
@@ -14565,12 +14686,6 @@
"integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==",
"peer": true
},
- "node_modules/@types/q": {
- "version": "1.5.5",
- "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.5.tgz",
- "integrity": "sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==",
- "dev": true
- },
"node_modules/@types/qs": {
"version": "6.9.7",
"resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz",
@@ -17048,12 +17163,12 @@
"dev": true
},
"node_modules/babel-plugin-polyfill-corejs2": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.2.tgz",
- "integrity": "sha512-LPnodUl3lS0/4wN3Rb+m+UK8s7lj2jcLRrjho4gLw+OJs+I4bvGXshINesY5xx/apM+biTnQ9reDI8yj+0M5+Q==",
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz",
+ "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==",
"dependencies": {
"@babel/compat-data": "^7.17.7",
- "@babel/helper-define-polyfill-provider": "^0.3.2",
+ "@babel/helper-define-polyfill-provider": "^0.3.3",
"semver": "^6.1.1"
},
"peerDependencies": {
@@ -17081,11 +17196,11 @@
}
},
"node_modules/babel-plugin-polyfill-regenerator": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.0.tgz",
- "integrity": "sha512-RW1cnryiADFeHmfLS+WW/G431p1PsW5qdRdz0SDRi7TKcUgc7Oh/uXkT7MZ/+tGsT1BkczEAmD5XjUyJ5SWDTw==",
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz",
+ "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==",
"dependencies": {
- "@babel/helper-define-polyfill-provider": "^0.3.2"
+ "@babel/helper-define-polyfill-provider": "^0.3.3"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
@@ -17894,9 +18009,9 @@
}
},
"node_modules/browserslist": {
- "version": "4.21.3",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.3.tgz",
- "integrity": "sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==",
+ "version": "4.21.4",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz",
+ "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==",
"funding": [
{
"type": "opencollective",
@@ -17908,10 +18023,10 @@
}
],
"dependencies": {
- "caniuse-lite": "^1.0.30001370",
- "electron-to-chromium": "^1.4.202",
+ "caniuse-lite": "^1.0.30001400",
+ "electron-to-chromium": "^1.4.251",
"node-releases": "^2.0.6",
- "update-browserslist-db": "^1.0.5"
+ "update-browserslist-db": "^1.0.9"
},
"bin": {
"browserslist": "cli.js"
@@ -18442,9 +18557,9 @@
}
},
"node_modules/caniuse-lite": {
- "version": "1.0.30001378",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001378.tgz",
- "integrity": "sha512-JVQnfoO7FK7WvU4ZkBRbPjaot4+YqxogSDosHv0Hv5mWpUESmN+UubMU6L/hGz8QlQ2aY5U0vR6MOs6j/CXpNA==",
+ "version": "1.0.30001427",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001427.tgz",
+ "integrity": "sha512-lfXQ73oB9c8DP5Suxaszm+Ta2sr/4tf8+381GkIm1MLj/YdLf+rEDyDSRCzeltuyTVGm+/s18gdZ0q+Wmp8VsQ==",
"funding": [
{
"type": "opencollective",
@@ -18999,20 +19114,6 @@
"node": ">= 0.12.0"
}
},
- "node_modules/coa": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz",
- "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==",
- "dev": true,
- "dependencies": {
- "@types/q": "^1.5.1",
- "chalk": "^2.4.1",
- "q": "^1.1.2"
- },
- "engines": {
- "node": ">= 4.0"
- }
- },
"node_modules/code-point-at": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
@@ -19654,26 +19755,17 @@
}
},
"node_modules/core-js-compat": {
- "version": "3.24.1",
- "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.24.1.tgz",
- "integrity": "sha512-XhdNAGeRnTpp8xbD+sR/HFDK9CbeeeqXT6TuofXh3urqEevzkWmLRgrVoykodsw8okqo2pu1BOmuCKrHx63zdw==",
+ "version": "3.26.0",
+ "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.26.0.tgz",
+ "integrity": "sha512-piOX9Go+Z4f9ZiBFLnZ5VrOpBl0h7IGCkiFUN11QTe6LjAvOT3ifL/5TdoizMh99hcGy5SoLyWbapIY/PIb/3A==",
"dependencies": {
- "browserslist": "^4.21.3",
- "semver": "7.0.0"
+ "browserslist": "^4.21.4"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/core-js"
}
},
- "node_modules/core-js-compat/node_modules/semver": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz",
- "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==",
- "bin": {
- "semver": "bin/semver.js"
- }
- },
"node_modules/core-js-pure": {
"version": "3.24.1",
"resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.24.1.tgz",
@@ -20313,12 +20405,6 @@
"url": "https://github.com/sponsors/fb55"
}
},
- "node_modules/css-select-base-adapter": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz",
- "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==",
- "dev": true
- },
"node_modules/css-select/node_modules/dom-serializer": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz",
@@ -21644,9 +21730,9 @@
}
},
"node_modules/electron-to-chromium": {
- "version": "1.4.223",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.223.tgz",
- "integrity": "sha512-uWa+i2Vz1odvE+zWXOe23rW9UPLh/5X7ESUVdK8wmNg+T6FfOZbhyZEK1GuC8JqaAZ4VBFUYaTYHFPrAX6y5bA=="
+ "version": "1.4.284",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz",
+ "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA=="
},
"node_modules/electron/node_modules/@types/node": {
"version": "16.11.60",
@@ -24632,18 +24718,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/for-own": {
- "version": "0.1.5",
- "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz",
- "integrity": "sha512-SKmowqGTJoPzLO1T0BBJpkfp3EMacCMOuH40hOUbrbzElVktk4DioXVM99QkLCyKoiuOmyjgcWMpVz2xjE7LZw==",
- "dev": true,
- "dependencies": {
- "for-in": "^1.0.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/foreground-child": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz",
@@ -31181,111 +31255,6 @@
"url": "https://github.com/wojtekmaj/merge-class-names?sponsor=1"
}
},
- "node_modules/merge-deep": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/merge-deep/-/merge-deep-3.0.3.tgz",
- "integrity": "sha512-qtmzAS6t6grwEkNrunqTBdn0qKwFgNWvlxUbAV8es9M7Ot1EbyApytCnvE0jALPa46ZpKDUo527kKiaWplmlFA==",
- "dev": true,
- "dependencies": {
- "arr-union": "^3.1.0",
- "clone-deep": "^0.2.4",
- "kind-of": "^3.0.2"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/merge-deep/node_modules/clone-deep": {
- "version": "0.2.4",
- "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-0.2.4.tgz",
- "integrity": "sha512-we+NuQo2DHhSl+DP6jlUiAhyAjBQrYnpOk15rN6c6JSPScjiCLh8IbSU+VTcph6YS3o7mASE8a0+gbZ7ChLpgg==",
- "dev": true,
- "dependencies": {
- "for-own": "^0.1.3",
- "is-plain-object": "^2.0.1",
- "kind-of": "^3.0.2",
- "lazy-cache": "^1.0.3",
- "shallow-clone": "^0.1.2"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/merge-deep/node_modules/is-buffer": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
- "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
- "dev": true
- },
- "node_modules/merge-deep/node_modules/is-extendable": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
- "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/merge-deep/node_modules/is-plain-object": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
- "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
- "dev": true,
- "dependencies": {
- "isobject": "^3.0.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/merge-deep/node_modules/kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
- "dev": true,
- "dependencies": {
- "is-buffer": "^1.1.5"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/merge-deep/node_modules/shallow-clone": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-0.1.2.tgz",
- "integrity": "sha512-J1zdXCky5GmNnuauESROVu31MQSnLoYvlyEn6j2Ztk6Q5EHFIhxkMhYcv6vuDzl2XEzoRr856QwzMgWM/TmZgw==",
- "dev": true,
- "dependencies": {
- "is-extendable": "^0.1.1",
- "kind-of": "^2.0.1",
- "lazy-cache": "^0.2.3",
- "mixin-object": "^2.0.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/merge-deep/node_modules/shallow-clone/node_modules/kind-of": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-2.0.1.tgz",
- "integrity": "sha512-0u8i1NZ/mg0b+W3MGGw5I7+6Eib2nx72S/QvXa0hYjEkjTknYmEYQJwGu3mLC0BrhtJjtQafTkyRUQ75Kx0LVg==",
- "dev": true,
- "dependencies": {
- "is-buffer": "^1.0.2"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/merge-deep/node_modules/shallow-clone/node_modules/lazy-cache": {
- "version": "0.2.7",
- "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz",
- "integrity": "sha512-gkX52wvU/R8DVMMt78ATVPFMJqfW8FPz1GZ1sVHBVQHmu/WvhIWE4cE1GBzhJNFicDeYhnwp6Rl35BcAIM3YOQ==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/merge-descriptors": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
@@ -34937,16 +34906,6 @@
"resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.24.tgz",
"integrity": "sha512-aJdn8XErcSrfr7k8ZDDfU6/2OgjZcB2Fu9d+ESK8D7Oa5mtsv8Fa8GpcwTA0v60kuZBaalKPzuzun4Ov1YWO/w=="
},
- "node_modules/q": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
- "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==",
- "dev": true,
- "engines": {
- "node": ">=0.6.0",
- "teleport": ">=0.2.0"
- }
- },
"node_modules/qs": {
"version": "6.11.0",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
@@ -35473,9 +35432,9 @@
}
},
"node_modules/react-native-onyx": {
- "version": "1.0.26",
- "resolved": "https://registry.npmjs.org/react-native-onyx/-/react-native-onyx-1.0.26.tgz",
- "integrity": "sha512-wp09GEsWVSzxSjWnkZhpqX4ODhLdDCP9NXG1xBE5sXCtuEgsRg3koODt8KgPFyv+I9WV25f4fs5Ortut23ulEQ==",
+ "version": "1.0.27",
+ "resolved": "https://registry.npmjs.org/react-native-onyx/-/react-native-onyx-1.0.27.tgz",
+ "integrity": "sha512-+kC4SQhgl+kI2PEnj6RAGSteMV2Amy9+1BvUV4gxpKEseMzcTHlpozxNeYiXYfgIo7lIsk0DicZbtwBuB3sgaw==",
"dependencies": {
"ascii-table": "0.0.9",
"fast-equals": "^4.0.3",
@@ -35650,10 +35609,9 @@
}
},
"node_modules/react-native-svg": {
- "version": "13.4.0",
- "resolved": "git+ssh://git@github.com/software-mansion/react-native-svg.git#2a892a9eac4a0b11d33c0cf866b3475a6d332424",
- "integrity": "sha512-1MlEJ3WpUEIedfWrcUC9rzIL8F66U9WUwFxID6F6te9UmSQipc1Thbh4Vm181g2uTvzU6Rkfg5qGfytcZMJOSg==",
- "license": "MIT",
+ "version": "13.5.0",
+ "resolved": "https://registry.npmjs.org/react-native-svg/-/react-native-svg-13.5.0.tgz",
+ "integrity": "sha512-JWou/k4zfXRY6TsVgM4i30D0z54McqQ64D5cAfOzX17ThZwFjOheN24owmbAs7Y+naD0Bk5j409kT/6FZEop4g==",
"dependencies": {
"css-select": "^5.1.0",
"css-tree": "^1.1.3"
@@ -35664,233 +35622,18 @@
}
},
"node_modules/react-native-svg-transformer": {
- "version": "0.14.3",
- "resolved": "https://registry.npmjs.org/react-native-svg-transformer/-/react-native-svg-transformer-0.14.3.tgz",
- "integrity": "sha512-agDGdMeeBAsWEgg/u7mjtR2Z3c8smGCLep/n3svwifut9dpswZCP+bSIrU8ekg6RNtxAJL+eGJbWjJ38vWxw6g==",
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/react-native-svg-transformer/-/react-native-svg-transformer-1.0.0.tgz",
+ "integrity": "sha512-ALHU5VvLLyKM/BvyEG7VYJmqglvaXtU7mGRCxrEwwpJO/GBf1ZMUzc4AeJAjSodj7yYtlDYRxNSt9ySWpaa6JQ==",
"dev": true,
"dependencies": {
- "@svgr/core": "^4.3.3",
- "@svgr/plugin-svgo": "^4.3.1",
- "path-dirname": "^1.0.2",
- "semver": "^5.6.0"
+ "@svgr/core": "^6.1.2",
+ "@svgr/plugin-svgo": "^6.1.2",
+ "path-dirname": "^1.0.2"
},
"peerDependencies": {
- "react-native": ">=0.45.0",
- "react-native-svg": ">=6.5.1"
- }
- },
- "node_modules/react-native-svg-transformer/node_modules/@svgr/babel-plugin-add-jsx-attribute": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-4.2.0.tgz",
- "integrity": "sha512-j7KnilGyZzYr/jhcrSYS3FGWMZVaqyCG0vzMCwzvei0coIkczuYMcniK07nI0aHJINciujjH11T72ICW5eL5Ig==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/react-native-svg-transformer/node_modules/@svgr/babel-plugin-remove-jsx-attribute": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-4.2.0.tgz",
- "integrity": "sha512-3XHLtJ+HbRCH4n28S7y/yZoEQnRpl0tvTZQsHqvaeNXPra+6vE5tbRliH3ox1yZYPCxrlqaJT/Mg+75GpDKlvQ==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/react-native-svg-transformer/node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-4.2.0.tgz",
- "integrity": "sha512-yTr2iLdf6oEuUE9MsRdvt0NmdpMBAkgK8Bjhl6epb+eQWk6abBaX3d65UZ3E3FWaOwePyUgNyNCMVG61gGCQ7w==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/react-native-svg-transformer/node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-4.2.0.tgz",
- "integrity": "sha512-U9m870Kqm0ko8beHawRXLGLvSi/ZMrl89gJ5BNcT452fAjtF2p4uRzXkdzvGJJJYBgx7BmqlDjBN/eCp5AAX2w==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/react-native-svg-transformer/node_modules/@svgr/babel-plugin-svg-dynamic-title": {
- "version": "4.3.3",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-4.3.3.tgz",
- "integrity": "sha512-w3Be6xUNdwgParsvxkkeZb545VhXEwjGMwExMVBIdPQJeyMQHqm9Msnb2a1teHBqUYL66qtwfhNkbj1iarCG7w==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/react-native-svg-transformer/node_modules/@svgr/babel-plugin-svg-em-dimensions": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-4.2.0.tgz",
- "integrity": "sha512-C0Uy+BHolCHGOZ8Dnr1zXy/KgpBOkEUYY9kI/HseHVPeMbluaX3CijJr7D4C5uR8zrc1T64nnq/k63ydQuGt4w==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/react-native-svg-transformer/node_modules/@svgr/babel-plugin-transform-react-native-svg": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-4.2.0.tgz",
- "integrity": "sha512-7YvynOpZDpCOUoIVlaaOUU87J4Z6RdD6spYN4eUb5tfPoKGSF9OG2NuhgYnq4jSkAxcpMaXWPf1cePkzmqTPNw==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/react-native-svg-transformer/node_modules/@svgr/babel-plugin-transform-svg-component": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-4.2.0.tgz",
- "integrity": "sha512-hYfYuZhQPCBVotABsXKSCfel2slf/yvJY8heTVX1PCTaq/IgASq1IyxPPKJ0chWREEKewIU/JMSsIGBtK1KKxw==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/react-native-svg-transformer/node_modules/@svgr/babel-preset": {
- "version": "4.3.3",
- "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-4.3.3.tgz",
- "integrity": "sha512-6PG80tdz4eAlYUN3g5GZiUjg2FMcp+Wn6rtnz5WJG9ITGEF1pmFdzq02597Hn0OmnQuCVaBYQE1OVFAnwOl+0A==",
- "dev": true,
- "dependencies": {
- "@svgr/babel-plugin-add-jsx-attribute": "^4.2.0",
- "@svgr/babel-plugin-remove-jsx-attribute": "^4.2.0",
- "@svgr/babel-plugin-remove-jsx-empty-expression": "^4.2.0",
- "@svgr/babel-plugin-replace-jsx-attribute-value": "^4.2.0",
- "@svgr/babel-plugin-svg-dynamic-title": "^4.3.3",
- "@svgr/babel-plugin-svg-em-dimensions": "^4.2.0",
- "@svgr/babel-plugin-transform-react-native-svg": "^4.2.0",
- "@svgr/babel-plugin-transform-svg-component": "^4.2.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/react-native-svg-transformer/node_modules/@svgr/core": {
- "version": "4.3.3",
- "resolved": "https://registry.npmjs.org/@svgr/core/-/core-4.3.3.tgz",
- "integrity": "sha512-qNuGF1QON1626UCaZamWt5yedpgOytvLj5BQZe2j1k1B8DUG4OyugZyfEwBeXozCUwhLEpsrgPrE+eCu4fY17w==",
- "dev": true,
- "dependencies": {
- "@svgr/plugin-jsx": "^4.3.3",
- "camelcase": "^5.3.1",
- "cosmiconfig": "^5.2.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/react-native-svg-transformer/node_modules/@svgr/hast-util-to-babel-ast": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-4.3.2.tgz",
- "integrity": "sha512-JioXclZGhFIDL3ddn4Kiq8qEqYM2PyDKV0aYno8+IXTLuYt6TOgHUbUAAFvqtb0Xn37NwP0BTHglejFoYr8RZg==",
- "dev": true,
- "dependencies": {
- "@babel/types": "^7.4.4"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/react-native-svg-transformer/node_modules/@svgr/plugin-jsx": {
- "version": "4.3.3",
- "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-4.3.3.tgz",
- "integrity": "sha512-cLOCSpNWQnDB1/v+SUENHH7a0XY09bfuMKdq9+gYvtuwzC2rU4I0wKGFEp1i24holdQdwodCtDQdFtJiTCWc+w==",
- "dev": true,
- "dependencies": {
- "@babel/core": "^7.4.5",
- "@svgr/babel-preset": "^4.3.3",
- "@svgr/hast-util-to-babel-ast": "^4.3.2",
- "svg-parser": "^2.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/react-native-svg-transformer/node_modules/@svgr/plugin-svgo": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-4.3.1.tgz",
- "integrity": "sha512-PrMtEDUWjX3Ea65JsVCwTIXuSqa3CG9px+DluF1/eo9mlDrgrtFE7NE/DjdhjJgSM9wenlVBzkzneSIUgfUI/w==",
- "dev": true,
- "dependencies": {
- "cosmiconfig": "^5.2.1",
- "merge-deep": "^3.0.2",
- "svgo": "^1.2.2"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/react-native-svg-transformer/node_modules/camelcase": {
- "version": "5.3.1",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
- "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/react-native-svg-transformer/node_modules/cosmiconfig": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz",
- "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==",
- "dev": true,
- "dependencies": {
- "import-fresh": "^2.0.0",
- "is-directory": "^0.3.1",
- "js-yaml": "^3.13.1",
- "parse-json": "^4.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/react-native-svg-transformer/node_modules/import-fresh": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz",
- "integrity": "sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==",
- "dev": true,
- "dependencies": {
- "caller-path": "^2.0.0",
- "resolve-from": "^3.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/react-native-svg-transformer/node_modules/parse-json": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
- "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==",
- "dev": true,
- "dependencies": {
- "error-ex": "^1.3.1",
- "json-parse-better-errors": "^1.0.1"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/react-native-svg-transformer/node_modules/resolve-from": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz",
- "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/react-native-svg-transformer/node_modules/semver": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
- "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
- "dev": true,
- "bin": {
- "semver": "bin/semver"
+ "react-native": ">=0.59.0",
+ "react-native-svg": ">=12.0.0"
}
},
"node_modules/react-native-webview": {
@@ -39788,114 +39531,6 @@
"integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==",
"dev": true
},
- "node_modules/svgo": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz",
- "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==",
- "deprecated": "This SVGO version is no longer supported. Upgrade to v2.x.x.",
- "dev": true,
- "dependencies": {
- "chalk": "^2.4.1",
- "coa": "^2.0.2",
- "css-select": "^2.0.0",
- "css-select-base-adapter": "^0.1.1",
- "css-tree": "1.0.0-alpha.37",
- "csso": "^4.0.2",
- "js-yaml": "^3.13.1",
- "mkdirp": "~0.5.1",
- "object.values": "^1.1.0",
- "sax": "~1.2.4",
- "stable": "^0.1.8",
- "unquote": "~1.1.1",
- "util.promisify": "~1.0.0"
- },
- "bin": {
- "svgo": "bin/svgo"
- },
- "engines": {
- "node": ">=4.0.0"
- }
- },
- "node_modules/svgo/node_modules/css-select": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz",
- "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==",
- "dev": true,
- "dependencies": {
- "boolbase": "^1.0.0",
- "css-what": "^3.2.1",
- "domutils": "^1.7.0",
- "nth-check": "^1.0.2"
- }
- },
- "node_modules/svgo/node_modules/css-tree": {
- "version": "1.0.0-alpha.37",
- "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz",
- "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==",
- "dev": true,
- "dependencies": {
- "mdn-data": "2.0.4",
- "source-map": "^0.6.1"
- },
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/svgo/node_modules/css-what": {
- "version": "3.4.2",
- "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz",
- "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==",
- "dev": true,
- "engines": {
- "node": ">= 6"
- },
- "funding": {
- "url": "https://github.com/sponsors/fb55"
- }
- },
- "node_modules/svgo/node_modules/domelementtype": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz",
- "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==",
- "dev": true
- },
- "node_modules/svgo/node_modules/domutils": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz",
- "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==",
- "dev": true,
- "dependencies": {
- "dom-serializer": "0",
- "domelementtype": "1"
- }
- },
- "node_modules/svgo/node_modules/mdn-data": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz",
- "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==",
- "dev": true
- },
- "node_modules/svgo/node_modules/mkdirp": {
- "version": "0.5.6",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
- "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
- "dev": true,
- "dependencies": {
- "minimist": "^1.2.6"
- },
- "bin": {
- "mkdirp": "bin/cmd.js"
- }
- },
- "node_modules/svgo/node_modules/nth-check": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz",
- "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==",
- "dev": true,
- "dependencies": {
- "boolbase": "~1.0.0"
- }
- },
"node_modules/symbol-tree": {
"version": "3.2.4",
"resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
@@ -41066,12 +40701,6 @@
"node": ">= 0.8"
}
},
- "node_modules/unquote": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz",
- "integrity": "sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==",
- "dev": true
- },
"node_modules/unset-value": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
@@ -41145,9 +40774,9 @@
}
},
"node_modules/update-browserslist-db": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz",
- "integrity": "sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==",
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz",
+ "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==",
"funding": [
{
"type": "opencollective",
@@ -43214,25 +42843,25 @@
}
},
"@babel/compat-data": {
- "version": "7.18.8",
- "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.8.tgz",
- "integrity": "sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ=="
+ "version": "7.20.0",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.0.tgz",
+ "integrity": "sha512-Gt9jszFJYq7qzXVK4slhc6NzJXnOVmRECWcVjF/T23rNXD9NtWQ0W3qxdg+p9wWIB+VQw3GYV/U2Ha9bRTfs4w=="
},
"@babel/core": {
- "version": "7.18.10",
- "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.10.tgz",
- "integrity": "sha512-JQM6k6ENcBFKVtWvLavlvi/mPcpYZ3+R+2EySDEMSMbp7Mn4FexlbbJVrx2R7Ijhr01T8gyqrOaABWIOgxeUyw==",
+ "version": "7.19.6",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.19.6.tgz",
+ "integrity": "sha512-D2Ue4KHpc6Ys2+AxpIx1BZ8+UegLLLE2p3KJEuJRKmokHOtl49jQ5ny1773KsGLZs8MQvBidAF6yWUJxRqtKtg==",
"requires": {
"@ampproject/remapping": "^2.1.0",
"@babel/code-frame": "^7.18.6",
- "@babel/generator": "^7.18.10",
- "@babel/helper-compilation-targets": "^7.18.9",
- "@babel/helper-module-transforms": "^7.18.9",
- "@babel/helpers": "^7.18.9",
- "@babel/parser": "^7.18.10",
+ "@babel/generator": "^7.19.6",
+ "@babel/helper-compilation-targets": "^7.19.3",
+ "@babel/helper-module-transforms": "^7.19.6",
+ "@babel/helpers": "^7.19.4",
+ "@babel/parser": "^7.19.6",
"@babel/template": "^7.18.10",
- "@babel/traverse": "^7.18.10",
- "@babel/types": "^7.18.10",
+ "@babel/traverse": "^7.19.6",
+ "@babel/types": "^7.19.4",
"convert-source-map": "^1.7.0",
"debug": "^4.1.0",
"gensync": "^1.0.0-beta.2",
@@ -43248,11 +42877,11 @@
}
},
"@babel/generator": {
- "version": "7.19.0",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.19.0.tgz",
- "integrity": "sha512-S1ahxf1gZ2dpoiFgA+ohK9DIpz50bJ0CWs7Zlzb54Z4sG8qmdIrGrVqmy1sAtTVRb+9CU6U8VqT9L0Zj7hxHVg==",
+ "version": "7.20.0",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.0.tgz",
+ "integrity": "sha512-GUPcXxWibClgmYJuIwC2Bc2Lg+8b9VjaJ+HlNdACEVt+Wlr1eoU1OPZjZRm7Hzl0gaTsUZNQfeihvZJhG7oc3w==",
"requires": {
- "@babel/types": "^7.19.0",
+ "@babel/types": "^7.20.0",
"@jridgewell/gen-mapping": "^0.3.2",
"jsesc": "^2.5.1"
},
@@ -43287,13 +42916,13 @@
}
},
"@babel/helper-compilation-targets": {
- "version": "7.18.9",
- "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz",
- "integrity": "sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg==",
+ "version": "7.20.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz",
+ "integrity": "sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==",
"requires": {
- "@babel/compat-data": "^7.18.8",
+ "@babel/compat-data": "^7.20.0",
"@babel/helper-validator-option": "^7.18.6",
- "browserslist": "^4.20.2",
+ "browserslist": "^4.21.3",
"semver": "^6.3.0"
},
"dependencies": {
@@ -43319,18 +42948,18 @@
}
},
"@babel/helper-create-regexp-features-plugin": {
- "version": "7.18.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.18.6.tgz",
- "integrity": "sha512-7LcpH1wnQLGrI+4v+nPp+zUvIkF9x0ddv1Hkdue10tg3gmRnLy97DXh4STiOf1qeIInyD69Qv5kKSZzKD8B/7A==",
+ "version": "7.19.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.19.0.tgz",
+ "integrity": "sha512-htnV+mHX32DF81amCDrwIDr8nrp1PTm+3wfBN9/v8QJOLEioOCOG7qNyq0nHeFiWbT3Eb7gsPwEmV64UCQ1jzw==",
"requires": {
"@babel/helper-annotate-as-pure": "^7.18.6",
"regexpu-core": "^5.1.0"
}
},
"@babel/helper-define-polyfill-provider": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.2.tgz",
- "integrity": "sha512-r9QJJ+uDWrd+94BSPcP6/de67ygLtvVy6cK4luE6MOuDsZIdoaPBnfSpbO/+LTifjPckbKXRuI9BB/Z2/y3iTg==",
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz",
+ "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==",
"requires": {
"@babel/helper-compilation-targets": "^7.17.7",
"@babel/helper-plugin-utils": "^7.16.7",
@@ -43394,18 +43023,18 @@
}
},
"@babel/helper-module-transforms": {
- "version": "7.18.9",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz",
- "integrity": "sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g==",
+ "version": "7.19.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.19.6.tgz",
+ "integrity": "sha512-fCmcfQo/KYr/VXXDIyd3CBGZ6AFhPFy1TfSEJ+PilGVlQT6jcbqtHAM4C1EciRqMza7/TpOUZliuSH+U6HAhJw==",
"requires": {
"@babel/helper-environment-visitor": "^7.18.9",
"@babel/helper-module-imports": "^7.18.6",
- "@babel/helper-simple-access": "^7.18.6",
+ "@babel/helper-simple-access": "^7.19.4",
"@babel/helper-split-export-declaration": "^7.18.6",
- "@babel/helper-validator-identifier": "^7.18.6",
- "@babel/template": "^7.18.6",
- "@babel/traverse": "^7.18.9",
- "@babel/types": "^7.18.9"
+ "@babel/helper-validator-identifier": "^7.19.1",
+ "@babel/template": "^7.18.10",
+ "@babel/traverse": "^7.19.6",
+ "@babel/types": "^7.19.4"
}
},
"@babel/helper-optimise-call-expression": {
@@ -43445,11 +43074,11 @@
}
},
"@babel/helper-simple-access": {
- "version": "7.18.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz",
- "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==",
+ "version": "7.19.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.19.4.tgz",
+ "integrity": "sha512-f9Xq6WqBFqaDfbCzn2w85hwklswz5qsKlh7f08w4Y9yhJHpnNC0QemtSkK5YyOY8kPGvyiwdzZksGUhnGdaUIg==",
"requires": {
- "@babel/types": "^7.18.6"
+ "@babel/types": "^7.19.4"
}
},
"@babel/helper-skip-transparent-expression-wrappers": {
@@ -43469,14 +43098,14 @@
}
},
"@babel/helper-string-parser": {
- "version": "7.18.10",
- "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz",
- "integrity": "sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw=="
+ "version": "7.19.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz",
+ "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw=="
},
"@babel/helper-validator-identifier": {
- "version": "7.18.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz",
- "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g=="
+ "version": "7.19.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz",
+ "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w=="
},
"@babel/helper-validator-option": {
"version": "7.18.6",
@@ -43495,13 +43124,13 @@
}
},
"@babel/helpers": {
- "version": "7.18.9",
- "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.9.tgz",
- "integrity": "sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ==",
+ "version": "7.20.0",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.0.tgz",
+ "integrity": "sha512-aGMjYraN0zosCEthoGLdqot1oRsmxVTQRHadsUPz5QM44Zej2PYRz7XiDE7GqnkZnNtLbOuxqoZw42vkU7+XEQ==",
"requires": {
- "@babel/template": "^7.18.6",
- "@babel/traverse": "^7.18.9",
- "@babel/types": "^7.18.9"
+ "@babel/template": "^7.18.10",
+ "@babel/traverse": "^7.20.0",
+ "@babel/types": "^7.20.0"
}
},
"@babel/highlight": {
@@ -43515,9 +43144,9 @@
}
},
"@babel/parser": {
- "version": "7.19.1",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.1.tgz",
- "integrity": "sha512-h7RCSorm1DdTVGJf3P2Mhj3kdnkmF/EiysUkzS2TdgAYqyjFdMQJbVuXOBej2SBJaXan/lIVtT6KkGbyyq753A=="
+ "version": "7.20.0",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.0.tgz",
+ "integrity": "sha512-G9VgAhEaICnz8iiJeGJQyVl6J2nTjbW0xeisva0PK6XcKsga7BIaqm4ZF8Rg1Wbaqmy6znspNqhPaPkyukujzg=="
},
"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
"version": "7.18.6",
@@ -43538,12 +43167,12 @@
}
},
"@babel/plugin-proposal-async-generator-functions": {
- "version": "7.18.10",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.18.10.tgz",
- "integrity": "sha512-1mFuY2TOsR1hxbjCo4QL+qlIjV07p4H4EUYw2J/WCqsvFV6V9X9z9YhXbWndc/4fw+hYGlDT7egYxliMp5O6Ew==",
+ "version": "7.19.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.19.1.tgz",
+ "integrity": "sha512-0yu8vNATgLy4ivqMNBIwb1HebCelqN7YX8SL3FDXORv/RqT0zEEWUCH4GH44JsSrvCu6GqnAdR5EBFAPeNBB4Q==",
"requires": {
"@babel/helper-environment-visitor": "^7.18.9",
- "@babel/helper-plugin-utils": "^7.18.9",
+ "@babel/helper-plugin-utils": "^7.19.0",
"@babel/helper-remap-async-to-generator": "^7.18.9",
"@babel/plugin-syntax-async-generators": "^7.8.4"
}
@@ -43644,13 +43273,13 @@
}
},
"@babel/plugin-proposal-object-rest-spread": {
- "version": "7.18.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.9.tgz",
- "integrity": "sha512-kDDHQ5rflIeY5xl69CEqGEZ0KY369ehsCIEbTGb4siHG5BE9sga/T0r0OUwyZNLMmZE79E1kbsqAjwFCW4ds6Q==",
+ "version": "7.19.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.19.4.tgz",
+ "integrity": "sha512-wHmj6LDxVDnL+3WhXteUBaoM1aVILZODAUjg11kHqG4cOlfgMQGxw6aCgvrXrmaJR3Bn14oZhImyCPZzRpC93Q==",
"requires": {
- "@babel/compat-data": "^7.18.8",
- "@babel/helper-compilation-targets": "^7.18.9",
- "@babel/helper-plugin-utils": "^7.18.9",
+ "@babel/compat-data": "^7.19.4",
+ "@babel/helper-compilation-targets": "^7.19.3",
+ "@babel/helper-plugin-utils": "^7.19.0",
"@babel/plugin-syntax-object-rest-spread": "^7.8.3",
"@babel/plugin-transform-parameters": "^7.18.8"
}
@@ -43909,23 +43538,24 @@
}
},
"@babel/plugin-transform-block-scoping": {
- "version": "7.18.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.9.tgz",
- "integrity": "sha512-5sDIJRV1KtQVEbt/EIBwGy4T01uYIo4KRB3VUqzkhrAIOGx7AoctL9+Ux88btY0zXdDyPJ9mW+bg+v+XEkGmtw==",
+ "version": "7.20.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.0.tgz",
+ "integrity": "sha512-sXOohbpHZSk7GjxK9b3dKB7CfqUD5DwOH+DggKzOQ7TXYP+RCSbRykfjQmn/zq+rBjycVRtLf9pYhAaEJA786w==",
"requires": {
- "@babel/helper-plugin-utils": "^7.18.9"
+ "@babel/helper-plugin-utils": "^7.19.0"
}
},
"@babel/plugin-transform-classes": {
- "version": "7.18.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.9.tgz",
- "integrity": "sha512-EkRQxsxoytpTlKJmSPYrsOMjCILacAjtSVkd4gChEe2kXjFCun3yohhW5I7plXJhCemM0gKsaGMcO8tinvCA5g==",
+ "version": "7.19.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.19.0.tgz",
+ "integrity": "sha512-YfeEE9kCjqTS9IitkgfJuxjcEtLUHMqa8yUJ6zdz8vR7hKuo6mOy2C05P0F1tdMmDCeuyidKnlrw/iTppHcr2A==",
"requires": {
"@babel/helper-annotate-as-pure": "^7.18.6",
+ "@babel/helper-compilation-targets": "^7.19.0",
"@babel/helper-environment-visitor": "^7.18.9",
- "@babel/helper-function-name": "^7.18.9",
+ "@babel/helper-function-name": "^7.19.0",
"@babel/helper-optimise-call-expression": "^7.18.6",
- "@babel/helper-plugin-utils": "^7.18.9",
+ "@babel/helper-plugin-utils": "^7.19.0",
"@babel/helper-replace-supers": "^7.18.9",
"@babel/helper-split-export-declaration": "^7.18.6",
"globals": "^11.1.0"
@@ -43940,11 +43570,11 @@
}
},
"@babel/plugin-transform-destructuring": {
- "version": "7.18.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.9.tgz",
- "integrity": "sha512-p5VCYNddPLkZTq4XymQIaIfZNJwT9YsjkPOhkVEqt6QIpQFZVM9IltqqYpOEkJoN1DPznmxUDyZ5CTZs/ZCuHA==",
+ "version": "7.20.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.0.tgz",
+ "integrity": "sha512-1dIhvZfkDVx/zn2S1aFwlruspTt4189j7fEkH0Y0VyuDM6bQt7bD6kLcz3l4IlLG+e5OReaBz9ROAbttRtUHqA==",
"requires": {
- "@babel/helper-plugin-utils": "^7.18.9"
+ "@babel/helper-plugin-utils": "^7.19.0"
}
},
"@babel/plugin-transform-dotall-regex": {
@@ -44038,15 +43668,14 @@
}
},
"@babel/plugin-transform-modules-systemjs": {
- "version": "7.18.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.9.tgz",
- "integrity": "sha512-zY/VSIbbqtoRoJKo2cDTewL364jSlZGvn0LKOf9ntbfxOvjfmyrdtEEOAdswOswhZEb8UH3jDkCKHd1sPgsS0A==",
+ "version": "7.19.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.19.6.tgz",
+ "integrity": "sha512-fqGLBepcc3kErfR9R3DnVpURmckXP7gj7bAlrTQyBxrigFqszZCkFkcoxzCp2v32XmwXLvbw+8Yq9/b+QqksjQ==",
"requires": {
"@babel/helper-hoist-variables": "^7.18.6",
- "@babel/helper-module-transforms": "^7.18.9",
- "@babel/helper-plugin-utils": "^7.18.9",
- "@babel/helper-validator-identifier": "^7.18.6",
- "babel-plugin-dynamic-import-node": "^2.3.3"
+ "@babel/helper-module-transforms": "^7.19.6",
+ "@babel/helper-plugin-utils": "^7.19.0",
+ "@babel/helper-validator-identifier": "^7.19.1"
}
},
"@babel/plugin-transform-modules-umd": {
@@ -44059,12 +43688,12 @@
}
},
"@babel/plugin-transform-named-capturing-groups-regex": {
- "version": "7.18.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.18.6.tgz",
- "integrity": "sha512-UmEOGF8XgaIqD74bC8g7iV3RYj8lMf0Bw7NJzvnS9qQhM4mg+1WHKotUIdjxgD2RGrgFLZZPCFPFj3P/kVDYhg==",
+ "version": "7.19.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.19.1.tgz",
+ "integrity": "sha512-oWk9l9WItWBQYS4FgXD4Uyy5kq898lvkXpXQxoJEY1RnvPk4R/Dvu2ebXU9q8lP+rlMwUQTFf2Ok6d78ODa0kw==",
"requires": {
- "@babel/helper-create-regexp-features-plugin": "^7.18.6",
- "@babel/helper-plugin-utils": "^7.18.6"
+ "@babel/helper-create-regexp-features-plugin": "^7.19.0",
+ "@babel/helper-plugin-utils": "^7.19.0"
}
},
"@babel/plugin-transform-new-target": {
@@ -44218,11 +43847,11 @@
}
},
"@babel/plugin-transform-spread": {
- "version": "7.18.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.18.9.tgz",
- "integrity": "sha512-39Q814wyoOPtIB/qGopNIL9xDChOE1pNU0ZY5dO0owhiVt/5kFm4li+/bBtwc7QotG0u5EPzqhZdjMtmqBqyQA==",
+ "version": "7.19.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.19.0.tgz",
+ "integrity": "sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w==",
"requires": {
- "@babel/helper-plugin-utils": "^7.18.9",
+ "@babel/helper-plugin-utils": "^7.19.0",
"@babel/helper-skip-transparent-expression-wrappers": "^7.18.9"
}
},
@@ -44278,17 +43907,17 @@
}
},
"@babel/preset-env": {
- "version": "7.18.10",
- "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.10.tgz",
- "integrity": "sha512-wVxs1yjFdW3Z/XkNfXKoblxoHgbtUF7/l3PvvP4m02Qz9TZ6uZGxRVYjSQeR87oQmHco9zWitW5J82DJ7sCjvA==",
+ "version": "7.19.4",
+ "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.19.4.tgz",
+ "integrity": "sha512-5QVOTXUdqTCjQuh2GGtdd7YEhoRXBMVGROAtsBeLGIbIz3obCBIfRMT1I3ZKkMgNzwkyCkftDXSSkHxnfVf4qg==",
"requires": {
- "@babel/compat-data": "^7.18.8",
- "@babel/helper-compilation-targets": "^7.18.9",
- "@babel/helper-plugin-utils": "^7.18.9",
+ "@babel/compat-data": "^7.19.4",
+ "@babel/helper-compilation-targets": "^7.19.3",
+ "@babel/helper-plugin-utils": "^7.19.0",
"@babel/helper-validator-option": "^7.18.6",
"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6",
"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9",
- "@babel/plugin-proposal-async-generator-functions": "^7.18.10",
+ "@babel/plugin-proposal-async-generator-functions": "^7.19.1",
"@babel/plugin-proposal-class-properties": "^7.18.6",
"@babel/plugin-proposal-class-static-block": "^7.18.6",
"@babel/plugin-proposal-dynamic-import": "^7.18.6",
@@ -44297,7 +43926,7 @@
"@babel/plugin-proposal-logical-assignment-operators": "^7.18.9",
"@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6",
"@babel/plugin-proposal-numeric-separator": "^7.18.6",
- "@babel/plugin-proposal-object-rest-spread": "^7.18.9",
+ "@babel/plugin-proposal-object-rest-spread": "^7.19.4",
"@babel/plugin-proposal-optional-catch-binding": "^7.18.6",
"@babel/plugin-proposal-optional-chaining": "^7.18.9",
"@babel/plugin-proposal-private-methods": "^7.18.6",
@@ -44321,10 +43950,10 @@
"@babel/plugin-transform-arrow-functions": "^7.18.6",
"@babel/plugin-transform-async-to-generator": "^7.18.6",
"@babel/plugin-transform-block-scoped-functions": "^7.18.6",
- "@babel/plugin-transform-block-scoping": "^7.18.9",
- "@babel/plugin-transform-classes": "^7.18.9",
+ "@babel/plugin-transform-block-scoping": "^7.19.4",
+ "@babel/plugin-transform-classes": "^7.19.0",
"@babel/plugin-transform-computed-properties": "^7.18.9",
- "@babel/plugin-transform-destructuring": "^7.18.9",
+ "@babel/plugin-transform-destructuring": "^7.19.4",
"@babel/plugin-transform-dotall-regex": "^7.18.6",
"@babel/plugin-transform-duplicate-keys": "^7.18.9",
"@babel/plugin-transform-exponentiation-operator": "^7.18.6",
@@ -44334,9 +43963,9 @@
"@babel/plugin-transform-member-expression-literals": "^7.18.6",
"@babel/plugin-transform-modules-amd": "^7.18.6",
"@babel/plugin-transform-modules-commonjs": "^7.18.6",
- "@babel/plugin-transform-modules-systemjs": "^7.18.9",
+ "@babel/plugin-transform-modules-systemjs": "^7.19.0",
"@babel/plugin-transform-modules-umd": "^7.18.6",
- "@babel/plugin-transform-named-capturing-groups-regex": "^7.18.6",
+ "@babel/plugin-transform-named-capturing-groups-regex": "^7.19.1",
"@babel/plugin-transform-new-target": "^7.18.6",
"@babel/plugin-transform-object-super": "^7.18.6",
"@babel/plugin-transform-parameters": "^7.18.8",
@@ -44344,21 +43973,30 @@
"@babel/plugin-transform-regenerator": "^7.18.6",
"@babel/plugin-transform-reserved-words": "^7.18.6",
"@babel/plugin-transform-shorthand-properties": "^7.18.6",
- "@babel/plugin-transform-spread": "^7.18.9",
+ "@babel/plugin-transform-spread": "^7.19.0",
"@babel/plugin-transform-sticky-regex": "^7.18.6",
"@babel/plugin-transform-template-literals": "^7.18.9",
"@babel/plugin-transform-typeof-symbol": "^7.18.9",
"@babel/plugin-transform-unicode-escapes": "^7.18.10",
"@babel/plugin-transform-unicode-regex": "^7.18.6",
"@babel/preset-modules": "^0.1.5",
- "@babel/types": "^7.18.10",
- "babel-plugin-polyfill-corejs2": "^0.3.2",
- "babel-plugin-polyfill-corejs3": "^0.5.3",
- "babel-plugin-polyfill-regenerator": "^0.4.0",
- "core-js-compat": "^3.22.1",
+ "@babel/types": "^7.19.4",
+ "babel-plugin-polyfill-corejs2": "^0.3.3",
+ "babel-plugin-polyfill-corejs3": "^0.6.0",
+ "babel-plugin-polyfill-regenerator": "^0.4.1",
+ "core-js-compat": "^3.25.1",
"semver": "^6.3.0"
},
"dependencies": {
+ "babel-plugin-polyfill-corejs3": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz",
+ "integrity": "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==",
+ "requires": {
+ "@babel/helper-define-polyfill-provider": "^0.3.3",
+ "core-js-compat": "^3.25.1"
+ }
+ },
"semver": {
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
@@ -44453,29 +44091,29 @@
}
},
"@babel/traverse": {
- "version": "7.19.1",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.1.tgz",
- "integrity": "sha512-0j/ZfZMxKukDaag2PtOPDbwuELqIar6lLskVPPJDjXMXjfLb1Obo/1yjxIGqqAJrmfaTIY3z2wFLAQ7qSkLsuA==",
+ "version": "7.20.0",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.0.tgz",
+ "integrity": "sha512-5+cAXQNARgjRUK0JWu2UBwja4JLSO/rBMPJzpsKb+oBF5xlUuCfljQepS4XypBQoiigL0VQjTZy6WiONtUdScQ==",
"requires": {
"@babel/code-frame": "^7.18.6",
- "@babel/generator": "^7.19.0",
+ "@babel/generator": "^7.20.0",
"@babel/helper-environment-visitor": "^7.18.9",
"@babel/helper-function-name": "^7.19.0",
"@babel/helper-hoist-variables": "^7.18.6",
"@babel/helper-split-export-declaration": "^7.18.6",
- "@babel/parser": "^7.19.1",
- "@babel/types": "^7.19.0",
+ "@babel/parser": "^7.20.0",
+ "@babel/types": "^7.20.0",
"debug": "^4.1.0",
"globals": "^11.1.0"
}
},
"@babel/types": {
- "version": "7.19.0",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.0.tgz",
- "integrity": "sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==",
+ "version": "7.20.0",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.0.tgz",
+ "integrity": "sha512-Jlgt3H0TajCW164wkTOTzHkZb075tMQMULzrLUoUeKmO7eFL96GgDxf7/Axhc5CAuKE3KFyVW1p6ysKsi2oXAg==",
"requires": {
- "@babel/helper-string-parser": "^7.18.10",
- "@babel/helper-validator-identifier": "^7.18.6",
+ "@babel/helper-string-parser": "^7.19.4",
+ "@babel/helper-validator-identifier": "^7.19.1",
"to-fast-properties": "^2.0.0"
}
},
@@ -53360,126 +52998,187 @@
}
},
"@svgr/babel-plugin-add-jsx-attribute": {
- "version": "5.4.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz",
- "integrity": "sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==",
- "dev": true
+ "version": "6.5.1",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.5.1.tgz",
+ "integrity": "sha512-9PYGcXrAxitycIjRmZB+Q0JaN07GZIWaTBIGQzfaZv+qr1n8X1XUEJ5rZ/vx6OVD9RRYlrNnXWExQXcmZeD/BQ==",
+ "dev": true,
+ "requires": {}
},
"@svgr/babel-plugin-remove-jsx-attribute": {
- "version": "5.4.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz",
- "integrity": "sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==",
- "dev": true
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-6.5.0.tgz",
+ "integrity": "sha512-8zYdkym7qNyfXpWvu4yq46k41pyNM9SOstoWhKlm+IfdCE1DdnRKeMUPsWIEO/DEkaWxJ8T9esNdG3QwQ93jBA==",
+ "dev": true,
+ "requires": {}
},
"@svgr/babel-plugin-remove-jsx-empty-expression": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz",
- "integrity": "sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==",
- "dev": true
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-6.5.0.tgz",
+ "integrity": "sha512-NFdxMq3xA42Kb1UbzCVxplUc0iqSyM9X8kopImvFnB+uSDdzIHOdbs1op8ofAvVRtbg4oZiyRl3fTYeKcOe9Iw==",
+ "dev": true,
+ "requires": {}
},
"@svgr/babel-plugin-replace-jsx-attribute-value": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz",
- "integrity": "sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==",
- "dev": true
+ "version": "6.5.1",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.5.1.tgz",
+ "integrity": "sha512-8DPaVVE3fd5JKuIC29dqyMB54sA6mfgki2H2+swh+zNJoynC8pMPzOkidqHOSc6Wj032fhl8Z0TVn1GiPpAiJg==",
+ "dev": true,
+ "requires": {}
},
"@svgr/babel-plugin-svg-dynamic-title": {
- "version": "5.4.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz",
- "integrity": "sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==",
- "dev": true
+ "version": "6.5.1",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.5.1.tgz",
+ "integrity": "sha512-FwOEi0Il72iAzlkaHrlemVurgSQRDFbk0OC8dSvD5fSBPHltNh7JtLsxmZUhjYBZo2PpcU/RJvvi6Q0l7O7ogw==",
+ "dev": true,
+ "requires": {}
},
"@svgr/babel-plugin-svg-em-dimensions": {
- "version": "5.4.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz",
- "integrity": "sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==",
- "dev": true
+ "version": "6.5.1",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.5.1.tgz",
+ "integrity": "sha512-gWGsiwjb4tw+ITOJ86ndY/DZZ6cuXMNE/SjcDRg+HLuCmwpcjOktwRF9WgAiycTqJD/QXqL2f8IzE2Rzh7aVXA==",
+ "dev": true,
+ "requires": {}
},
"@svgr/babel-plugin-transform-react-native-svg": {
- "version": "5.4.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz",
- "integrity": "sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==",
- "dev": true
+ "version": "6.5.1",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.5.1.tgz",
+ "integrity": "sha512-2jT3nTayyYP7kI6aGutkyfJ7UMGtuguD72OjeGLwVNyfPRBD8zQthlvL+fAbAKk5n9ZNcvFkp/b1lZ7VsYqVJg==",
+ "dev": true,
+ "requires": {}
},
"@svgr/babel-plugin-transform-svg-component": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz",
- "integrity": "sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==",
- "dev": true
+ "version": "6.5.1",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.5.1.tgz",
+ "integrity": "sha512-a1p6LF5Jt33O3rZoVRBqdxL350oge54iZWHNI6LJB5tQ7EelvD/Mb1mfBiZNAan0dt4i3VArkFRjA4iObuNykQ==",
+ "dev": true,
+ "requires": {}
},
"@svgr/babel-preset": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-5.5.0.tgz",
- "integrity": "sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==",
+ "version": "6.5.1",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-6.5.1.tgz",
+ "integrity": "sha512-6127fvO/FF2oi5EzSQOAjo1LE3OtNVh11R+/8FXa+mHx1ptAaS4cknIjnUA7e6j6fwGGJ17NzaTJFUwOV2zwCw==",
"dev": true,
"requires": {
- "@svgr/babel-plugin-add-jsx-attribute": "^5.4.0",
- "@svgr/babel-plugin-remove-jsx-attribute": "^5.4.0",
- "@svgr/babel-plugin-remove-jsx-empty-expression": "^5.0.1",
- "@svgr/babel-plugin-replace-jsx-attribute-value": "^5.0.1",
- "@svgr/babel-plugin-svg-dynamic-title": "^5.4.0",
- "@svgr/babel-plugin-svg-em-dimensions": "^5.4.0",
- "@svgr/babel-plugin-transform-react-native-svg": "^5.4.0",
- "@svgr/babel-plugin-transform-svg-component": "^5.5.0"
+ "@svgr/babel-plugin-add-jsx-attribute": "^6.5.1",
+ "@svgr/babel-plugin-remove-jsx-attribute": "*",
+ "@svgr/babel-plugin-remove-jsx-empty-expression": "*",
+ "@svgr/babel-plugin-replace-jsx-attribute-value": "^6.5.1",
+ "@svgr/babel-plugin-svg-dynamic-title": "^6.5.1",
+ "@svgr/babel-plugin-svg-em-dimensions": "^6.5.1",
+ "@svgr/babel-plugin-transform-react-native-svg": "^6.5.1",
+ "@svgr/babel-plugin-transform-svg-component": "^6.5.1"
}
},
"@svgr/core": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/@svgr/core/-/core-5.5.0.tgz",
- "integrity": "sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==",
+ "version": "6.5.1",
+ "resolved": "https://registry.npmjs.org/@svgr/core/-/core-6.5.1.tgz",
+ "integrity": "sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw==",
"dev": true,
"requires": {
- "@svgr/plugin-jsx": "^5.5.0",
+ "@babel/core": "^7.19.6",
+ "@svgr/babel-preset": "^6.5.1",
+ "@svgr/plugin-jsx": "^6.5.1",
"camelcase": "^6.2.0",
- "cosmiconfig": "^7.0.0"
+ "cosmiconfig": "^7.0.1"
}
},
"@svgr/hast-util-to-babel-ast": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz",
- "integrity": "sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==",
+ "version": "6.5.1",
+ "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.5.1.tgz",
+ "integrity": "sha512-1hnUxxjd83EAxbL4a0JDJoD3Dao3hmjvyvyEV8PzWmLK3B9m9NPlW7GKjFyoWE8nM7HnXzPcmmSyOW8yOddSXw==",
"dev": true,
"requires": {
- "@babel/types": "^7.12.6"
+ "@babel/types": "^7.20.0",
+ "entities": "^4.4.0"
+ },
+ "dependencies": {
+ "entities": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz",
+ "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==",
+ "dev": true
+ }
}
},
"@svgr/plugin-jsx": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz",
- "integrity": "sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==",
+ "version": "6.5.1",
+ "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-6.5.1.tgz",
+ "integrity": "sha512-+UdQxI3jgtSjCykNSlEMuy1jSRQlGC7pqBCPvkG/2dATdWo082zHTTK3uhnAju2/6XpE6B5mZ3z4Z8Ns01S8Gw==",
"dev": true,
"requires": {
- "@babel/core": "^7.12.3",
- "@svgr/babel-preset": "^5.5.0",
- "@svgr/hast-util-to-babel-ast": "^5.5.0",
- "svg-parser": "^2.0.2"
+ "@babel/core": "^7.19.6",
+ "@svgr/babel-preset": "^6.5.1",
+ "@svgr/hast-util-to-babel-ast": "^6.5.1",
+ "svg-parser": "^2.0.4"
}
},
"@svgr/plugin-svgo": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz",
- "integrity": "sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==",
+ "version": "6.5.1",
+ "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-6.5.1.tgz",
+ "integrity": "sha512-omvZKf8ixP9z6GWgwbtmP9qQMPX4ODXi+wzbVZgomNFsUIlHA1sf4fThdwTWSsZGgvGAG6yE+b/F5gWUkcZ/iQ==",
"dev": true,
"requires": {
- "cosmiconfig": "^7.0.0",
+ "cosmiconfig": "^7.0.1",
"deepmerge": "^4.2.2",
- "svgo": "^1.2.2"
+ "svgo": "^2.8.0"
+ },
+ "dependencies": {
+ "commander": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
+ "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
+ "dev": true
+ },
+ "css-select": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz",
+ "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==",
+ "dev": true,
+ "requires": {
+ "boolbase": "^1.0.0",
+ "css-what": "^6.0.1",
+ "domhandler": "^4.3.1",
+ "domutils": "^2.8.0",
+ "nth-check": "^2.0.1"
+ }
+ },
+ "picocolors": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
+ "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
+ "dev": true
+ },
+ "svgo": {
+ "version": "2.8.0",
+ "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz",
+ "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==",
+ "dev": true,
+ "requires": {
+ "@trysound/sax": "0.2.0",
+ "commander": "^7.2.0",
+ "css-select": "^4.1.3",
+ "css-tree": "^1.1.3",
+ "csso": "^4.2.0",
+ "picocolors": "^1.0.0",
+ "stable": "^0.1.8"
+ }
+ }
}
},
"@svgr/webpack": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-5.5.0.tgz",
- "integrity": "sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==",
+ "version": "6.5.1",
+ "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-6.5.1.tgz",
+ "integrity": "sha512-cQ/AsnBkXPkEK8cLbv4Dm7JGXq2XrumKnL1dRpJD9rIO2fTIlJI9a1uCciYG1F2aUsox/hJQyNGbt3soDxSRkA==",
"dev": true,
"requires": {
- "@babel/core": "^7.12.3",
- "@babel/plugin-transform-react-constant-elements": "^7.12.1",
- "@babel/preset-env": "^7.12.1",
- "@babel/preset-react": "^7.12.5",
- "@svgr/core": "^5.5.0",
- "@svgr/plugin-jsx": "^5.5.0",
- "@svgr/plugin-svgo": "^5.5.0",
- "loader-utils": "^2.0.0"
+ "@babel/core": "^7.19.6",
+ "@babel/plugin-transform-react-constant-elements": "^7.18.12",
+ "@babel/preset-env": "^7.19.4",
+ "@babel/preset-react": "^7.18.6",
+ "@babel/preset-typescript": "^7.18.6",
+ "@svgr/core": "^6.5.1",
+ "@svgr/plugin-jsx": "^6.5.1",
+ "@svgr/plugin-svgo": "^6.5.1"
}
},
"@szmarczak/http-timer": {
@@ -53570,6 +53269,12 @@
"integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==",
"dev": true
},
+ "@trysound/sax": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz",
+ "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==",
+ "dev": true
+ },
"@types/babel__core": {
"version": "7.1.19",
"resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz",
@@ -53905,12 +53610,6 @@
"integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==",
"peer": true
},
- "@types/q": {
- "version": "1.5.5",
- "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.5.tgz",
- "integrity": "sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==",
- "dev": true
- },
"@types/qs": {
"version": "6.9.7",
"resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz",
@@ -55877,12 +55576,12 @@
"dev": true
},
"babel-plugin-polyfill-corejs2": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.2.tgz",
- "integrity": "sha512-LPnodUl3lS0/4wN3Rb+m+UK8s7lj2jcLRrjho4gLw+OJs+I4bvGXshINesY5xx/apM+biTnQ9reDI8yj+0M5+Q==",
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz",
+ "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==",
"requires": {
"@babel/compat-data": "^7.17.7",
- "@babel/helper-define-polyfill-provider": "^0.3.2",
+ "@babel/helper-define-polyfill-provider": "^0.3.3",
"semver": "^6.1.1"
},
"dependencies": {
@@ -55903,11 +55602,11 @@
}
},
"babel-plugin-polyfill-regenerator": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.0.tgz",
- "integrity": "sha512-RW1cnryiADFeHmfLS+WW/G431p1PsW5qdRdz0SDRi7TKcUgc7Oh/uXkT7MZ/+tGsT1BkczEAmD5XjUyJ5SWDTw==",
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz",
+ "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==",
"requires": {
- "@babel/helper-define-polyfill-provider": "^0.3.2"
+ "@babel/helper-define-polyfill-provider": "^0.3.3"
}
},
"babel-plugin-react-docgen": {
@@ -56602,14 +56301,14 @@
}
},
"browserslist": {
- "version": "4.21.3",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.3.tgz",
- "integrity": "sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==",
+ "version": "4.21.4",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz",
+ "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==",
"requires": {
- "caniuse-lite": "^1.0.30001370",
- "electron-to-chromium": "^1.4.202",
+ "caniuse-lite": "^1.0.30001400",
+ "electron-to-chromium": "^1.4.251",
"node-releases": "^2.0.6",
- "update-browserslist-db": "^1.0.5"
+ "update-browserslist-db": "^1.0.9"
}
},
"bser": {
@@ -57025,9 +56724,9 @@
"integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ=="
},
"caniuse-lite": {
- "version": "1.0.30001378",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001378.tgz",
- "integrity": "sha512-JVQnfoO7FK7WvU4ZkBRbPjaot4+YqxogSDosHv0Hv5mWpUESmN+UubMU6L/hGz8QlQ2aY5U0vR6MOs6j/CXpNA=="
+ "version": "1.0.30001427",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001427.tgz",
+ "integrity": "sha512-lfXQ73oB9c8DP5Suxaszm+Ta2sr/4tf8+381GkIm1MLj/YdLf+rEDyDSRCzeltuyTVGm+/s18gdZ0q+Wmp8VsQ=="
},
"canvas": {
"version": "2.9.3",
@@ -57432,17 +57131,6 @@
"resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
"integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ=="
},
- "coa": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz",
- "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==",
- "dev": true,
- "requires": {
- "@types/q": "^1.5.1",
- "chalk": "^2.4.1",
- "q": "^1.1.2"
- }
- },
"code-point-at": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
@@ -57949,19 +57637,11 @@
"integrity": "sha512-0QTBSYSUZ6Gq21utGzkfITDylE8jWC9Ne1D2MrhvlsZBI1x39OdDIVbzSqtgMndIy6BlHxBXpMGqzZmnztg2rg=="
},
"core-js-compat": {
- "version": "3.24.1",
- "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.24.1.tgz",
- "integrity": "sha512-XhdNAGeRnTpp8xbD+sR/HFDK9CbeeeqXT6TuofXh3urqEevzkWmLRgrVoykodsw8okqo2pu1BOmuCKrHx63zdw==",
+ "version": "3.26.0",
+ "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.26.0.tgz",
+ "integrity": "sha512-piOX9Go+Z4f9ZiBFLnZ5VrOpBl0h7IGCkiFUN11QTe6LjAvOT3ifL/5TdoizMh99hcGy5SoLyWbapIY/PIb/3A==",
"requires": {
- "browserslist": "^4.21.3",
- "semver": "7.0.0"
- },
- "dependencies": {
- "semver": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz",
- "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A=="
- }
+ "browserslist": "^4.21.4"
}
},
"core-js-pure": {
@@ -58507,12 +58187,6 @@
}
}
},
- "css-select-base-adapter": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz",
- "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==",
- "dev": true
- },
"css-to-react-native": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.0.0.tgz",
@@ -59523,9 +59197,9 @@
}
},
"electron-to-chromium": {
- "version": "1.4.223",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.223.tgz",
- "integrity": "sha512-uWa+i2Vz1odvE+zWXOe23rW9UPLh/5X7ESUVdK8wmNg+T6FfOZbhyZEK1GuC8JqaAZ4VBFUYaTYHFPrAX6y5bA=="
+ "version": "1.4.284",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz",
+ "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA=="
},
"element-resize-detector": {
"version": "1.2.4",
@@ -61820,15 +61494,6 @@
"resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
"integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ=="
},
- "for-own": {
- "version": "0.1.5",
- "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz",
- "integrity": "sha512-SKmowqGTJoPzLO1T0BBJpkfp3EMacCMOuH40hOUbrbzElVktk4DioXVM99QkLCyKoiuOmyjgcWMpVz2xjE7LZw==",
- "dev": true,
- "requires": {
- "for-in": "^1.0.1"
- }
- },
"foreground-child": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz",
@@ -66734,91 +66399,6 @@
"resolved": "https://registry.npmjs.org/merge-class-names/-/merge-class-names-1.4.2.tgz",
"integrity": "sha512-bOl98VzwCGi25Gcn3xKxnR5p/WrhWFQB59MS/aGENcmUc6iSm96yrFDF0XSNurX9qN4LbJm0R9kfvsQ17i8zCw=="
},
- "merge-deep": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/merge-deep/-/merge-deep-3.0.3.tgz",
- "integrity": "sha512-qtmzAS6t6grwEkNrunqTBdn0qKwFgNWvlxUbAV8es9M7Ot1EbyApytCnvE0jALPa46ZpKDUo527kKiaWplmlFA==",
- "dev": true,
- "requires": {
- "arr-union": "^3.1.0",
- "clone-deep": "^0.2.4",
- "kind-of": "^3.0.2"
- },
- "dependencies": {
- "clone-deep": {
- "version": "0.2.4",
- "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-0.2.4.tgz",
- "integrity": "sha512-we+NuQo2DHhSl+DP6jlUiAhyAjBQrYnpOk15rN6c6JSPScjiCLh8IbSU+VTcph6YS3o7mASE8a0+gbZ7ChLpgg==",
- "dev": true,
- "requires": {
- "for-own": "^0.1.3",
- "is-plain-object": "^2.0.1",
- "kind-of": "^3.0.2",
- "lazy-cache": "^1.0.3",
- "shallow-clone": "^0.1.2"
- }
- },
- "is-buffer": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
- "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
- "dev": true
- },
- "is-extendable": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
- "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==",
- "dev": true
- },
- "is-plain-object": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
- "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
- "dev": true,
- "requires": {
- "isobject": "^3.0.1"
- }
- },
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
- "dev": true,
- "requires": {
- "is-buffer": "^1.1.5"
- }
- },
- "shallow-clone": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-0.1.2.tgz",
- "integrity": "sha512-J1zdXCky5GmNnuauESROVu31MQSnLoYvlyEn6j2Ztk6Q5EHFIhxkMhYcv6vuDzl2XEzoRr856QwzMgWM/TmZgw==",
- "dev": true,
- "requires": {
- "is-extendable": "^0.1.1",
- "kind-of": "^2.0.1",
- "lazy-cache": "^0.2.3",
- "mixin-object": "^2.0.1"
- },
- "dependencies": {
- "kind-of": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-2.0.1.tgz",
- "integrity": "sha512-0u8i1NZ/mg0b+W3MGGw5I7+6Eib2nx72S/QvXa0hYjEkjTknYmEYQJwGu3mLC0BrhtJjtQafTkyRUQ75Kx0LVg==",
- "dev": true,
- "requires": {
- "is-buffer": "^1.0.2"
- }
- },
- "lazy-cache": {
- "version": "0.2.7",
- "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz",
- "integrity": "sha512-gkX52wvU/R8DVMMt78ATVPFMJqfW8FPz1GZ1sVHBVQHmu/WvhIWE4cE1GBzhJNFicDeYhnwp6Rl35BcAIM3YOQ==",
- "dev": true
- }
- }
- }
- }
- },
"merge-descriptors": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
@@ -69706,12 +69286,6 @@
"integrity": "sha512-Ge86G6kMEMhbh073jbvBEMY/plKnJZuDJWUxcba6gotA2UVV5yzmbUu7chdwHvD2khP45w+62+suJyB2te7Teg==",
"dev": true
},
- "q": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
- "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==",
- "dev": true
- },
"qs": {
"version": "6.11.0",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
@@ -70204,9 +69778,9 @@
}
},
"react-native-onyx": {
- "version": "1.0.26",
- "resolved": "https://registry.npmjs.org/react-native-onyx/-/react-native-onyx-1.0.26.tgz",
- "integrity": "sha512-wp09GEsWVSzxSjWnkZhpqX4ODhLdDCP9NXG1xBE5sXCtuEgsRg3koODt8KgPFyv+I9WV25f4fs5Ortut23ulEQ==",
+ "version": "1.0.27",
+ "resolved": "https://registry.npmjs.org/react-native-onyx/-/react-native-onyx-1.0.27.tgz",
+ "integrity": "sha512-+kC4SQhgl+kI2PEnj6RAGSteMV2Amy9+1BvUV4gxpKEseMzcTHlpozxNeYiXYfgIo7lIsk0DicZbtwBuB3sgaw==",
"requires": {
"ascii-table": "0.0.9",
"fast-equals": "^4.0.3",
@@ -70324,183 +69898,23 @@
}
},
"react-native-svg": {
- "version": "git+ssh://git@github.com/software-mansion/react-native-svg.git#2a892a9eac4a0b11d33c0cf866b3475a6d332424",
- "integrity": "sha512-1MlEJ3WpUEIedfWrcUC9rzIL8F66U9WUwFxID6F6te9UmSQipc1Thbh4Vm181g2uTvzU6Rkfg5qGfytcZMJOSg==",
- "from": "react-native-svg@git+https://github.com/software-mansion/react-native-svg#2a892a9eac4a0b11d33c0cf866b3475a6d332424",
+ "version": "13.5.0",
+ "resolved": "https://registry.npmjs.org/react-native-svg/-/react-native-svg-13.5.0.tgz",
+ "integrity": "sha512-JWou/k4zfXRY6TsVgM4i30D0z54McqQ64D5cAfOzX17ThZwFjOheN24owmbAs7Y+naD0Bk5j409kT/6FZEop4g==",
"requires": {
"css-select": "^5.1.0",
"css-tree": "^1.1.3"
}
},
"react-native-svg-transformer": {
- "version": "0.14.3",
- "resolved": "https://registry.npmjs.org/react-native-svg-transformer/-/react-native-svg-transformer-0.14.3.tgz",
- "integrity": "sha512-agDGdMeeBAsWEgg/u7mjtR2Z3c8smGCLep/n3svwifut9dpswZCP+bSIrU8ekg6RNtxAJL+eGJbWjJ38vWxw6g==",
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/react-native-svg-transformer/-/react-native-svg-transformer-1.0.0.tgz",
+ "integrity": "sha512-ALHU5VvLLyKM/BvyEG7VYJmqglvaXtU7mGRCxrEwwpJO/GBf1ZMUzc4AeJAjSodj7yYtlDYRxNSt9ySWpaa6JQ==",
"dev": true,
"requires": {
- "@svgr/core": "^4.3.3",
- "@svgr/plugin-svgo": "^4.3.1",
- "path-dirname": "^1.0.2",
- "semver": "^5.6.0"
- },
- "dependencies": {
- "@svgr/babel-plugin-add-jsx-attribute": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-4.2.0.tgz",
- "integrity": "sha512-j7KnilGyZzYr/jhcrSYS3FGWMZVaqyCG0vzMCwzvei0coIkczuYMcniK07nI0aHJINciujjH11T72ICW5eL5Ig==",
- "dev": true
- },
- "@svgr/babel-plugin-remove-jsx-attribute": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-4.2.0.tgz",
- "integrity": "sha512-3XHLtJ+HbRCH4n28S7y/yZoEQnRpl0tvTZQsHqvaeNXPra+6vE5tbRliH3ox1yZYPCxrlqaJT/Mg+75GpDKlvQ==",
- "dev": true
- },
- "@svgr/babel-plugin-remove-jsx-empty-expression": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-4.2.0.tgz",
- "integrity": "sha512-yTr2iLdf6oEuUE9MsRdvt0NmdpMBAkgK8Bjhl6epb+eQWk6abBaX3d65UZ3E3FWaOwePyUgNyNCMVG61gGCQ7w==",
- "dev": true
- },
- "@svgr/babel-plugin-replace-jsx-attribute-value": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-4.2.0.tgz",
- "integrity": "sha512-U9m870Kqm0ko8beHawRXLGLvSi/ZMrl89gJ5BNcT452fAjtF2p4uRzXkdzvGJJJYBgx7BmqlDjBN/eCp5AAX2w==",
- "dev": true
- },
- "@svgr/babel-plugin-svg-dynamic-title": {
- "version": "4.3.3",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-4.3.3.tgz",
- "integrity": "sha512-w3Be6xUNdwgParsvxkkeZb545VhXEwjGMwExMVBIdPQJeyMQHqm9Msnb2a1teHBqUYL66qtwfhNkbj1iarCG7w==",
- "dev": true
- },
- "@svgr/babel-plugin-svg-em-dimensions": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-4.2.0.tgz",
- "integrity": "sha512-C0Uy+BHolCHGOZ8Dnr1zXy/KgpBOkEUYY9kI/HseHVPeMbluaX3CijJr7D4C5uR8zrc1T64nnq/k63ydQuGt4w==",
- "dev": true
- },
- "@svgr/babel-plugin-transform-react-native-svg": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-4.2.0.tgz",
- "integrity": "sha512-7YvynOpZDpCOUoIVlaaOUU87J4Z6RdD6spYN4eUb5tfPoKGSF9OG2NuhgYnq4jSkAxcpMaXWPf1cePkzmqTPNw==",
- "dev": true
- },
- "@svgr/babel-plugin-transform-svg-component": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-4.2.0.tgz",
- "integrity": "sha512-hYfYuZhQPCBVotABsXKSCfel2slf/yvJY8heTVX1PCTaq/IgASq1IyxPPKJ0chWREEKewIU/JMSsIGBtK1KKxw==",
- "dev": true
- },
- "@svgr/babel-preset": {
- "version": "4.3.3",
- "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-4.3.3.tgz",
- "integrity": "sha512-6PG80tdz4eAlYUN3g5GZiUjg2FMcp+Wn6rtnz5WJG9ITGEF1pmFdzq02597Hn0OmnQuCVaBYQE1OVFAnwOl+0A==",
- "dev": true,
- "requires": {
- "@svgr/babel-plugin-add-jsx-attribute": "^4.2.0",
- "@svgr/babel-plugin-remove-jsx-attribute": "^4.2.0",
- "@svgr/babel-plugin-remove-jsx-empty-expression": "^4.2.0",
- "@svgr/babel-plugin-replace-jsx-attribute-value": "^4.2.0",
- "@svgr/babel-plugin-svg-dynamic-title": "^4.3.3",
- "@svgr/babel-plugin-svg-em-dimensions": "^4.2.0",
- "@svgr/babel-plugin-transform-react-native-svg": "^4.2.0",
- "@svgr/babel-plugin-transform-svg-component": "^4.2.0"
- }
- },
- "@svgr/core": {
- "version": "4.3.3",
- "resolved": "https://registry.npmjs.org/@svgr/core/-/core-4.3.3.tgz",
- "integrity": "sha512-qNuGF1QON1626UCaZamWt5yedpgOytvLj5BQZe2j1k1B8DUG4OyugZyfEwBeXozCUwhLEpsrgPrE+eCu4fY17w==",
- "dev": true,
- "requires": {
- "@svgr/plugin-jsx": "^4.3.3",
- "camelcase": "^5.3.1",
- "cosmiconfig": "^5.2.1"
- }
- },
- "@svgr/hast-util-to-babel-ast": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-4.3.2.tgz",
- "integrity": "sha512-JioXclZGhFIDL3ddn4Kiq8qEqYM2PyDKV0aYno8+IXTLuYt6TOgHUbUAAFvqtb0Xn37NwP0BTHglejFoYr8RZg==",
- "dev": true,
- "requires": {
- "@babel/types": "^7.4.4"
- }
- },
- "@svgr/plugin-jsx": {
- "version": "4.3.3",
- "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-4.3.3.tgz",
- "integrity": "sha512-cLOCSpNWQnDB1/v+SUENHH7a0XY09bfuMKdq9+gYvtuwzC2rU4I0wKGFEp1i24holdQdwodCtDQdFtJiTCWc+w==",
- "dev": true,
- "requires": {
- "@babel/core": "^7.4.5",
- "@svgr/babel-preset": "^4.3.3",
- "@svgr/hast-util-to-babel-ast": "^4.3.2",
- "svg-parser": "^2.0.0"
- }
- },
- "@svgr/plugin-svgo": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-4.3.1.tgz",
- "integrity": "sha512-PrMtEDUWjX3Ea65JsVCwTIXuSqa3CG9px+DluF1/eo9mlDrgrtFE7NE/DjdhjJgSM9wenlVBzkzneSIUgfUI/w==",
- "dev": true,
- "requires": {
- "cosmiconfig": "^5.2.1",
- "merge-deep": "^3.0.2",
- "svgo": "^1.2.2"
- }
- },
- "camelcase": {
- "version": "5.3.1",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
- "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
- "dev": true
- },
- "cosmiconfig": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz",
- "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==",
- "dev": true,
- "requires": {
- "import-fresh": "^2.0.0",
- "is-directory": "^0.3.1",
- "js-yaml": "^3.13.1",
- "parse-json": "^4.0.0"
- }
- },
- "import-fresh": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz",
- "integrity": "sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==",
- "dev": true,
- "requires": {
- "caller-path": "^2.0.0",
- "resolve-from": "^3.0.0"
- }
- },
- "parse-json": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
- "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==",
- "dev": true,
- "requires": {
- "error-ex": "^1.3.1",
- "json-parse-better-errors": "^1.0.1"
- }
- },
- "resolve-from": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz",
- "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==",
- "dev": true
- },
- "semver": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
- "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
- "dev": true
- }
+ "@svgr/core": "^6.1.2",
+ "@svgr/plugin-svgo": "^6.1.2",
+ "path-dirname": "^1.0.2"
}
},
"react-native-webview": {
@@ -73492,97 +72906,6 @@
"integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==",
"dev": true
},
- "svgo": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz",
- "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==",
- "dev": true,
- "requires": {
- "chalk": "^2.4.1",
- "coa": "^2.0.2",
- "css-select": "^2.0.0",
- "css-select-base-adapter": "^0.1.1",
- "css-tree": "1.0.0-alpha.37",
- "csso": "^4.0.2",
- "js-yaml": "^3.13.1",
- "mkdirp": "~0.5.1",
- "object.values": "^1.1.0",
- "sax": "~1.2.4",
- "stable": "^0.1.8",
- "unquote": "~1.1.1",
- "util.promisify": "~1.0.0"
- },
- "dependencies": {
- "css-select": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz",
- "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==",
- "dev": true,
- "requires": {
- "boolbase": "^1.0.0",
- "css-what": "^3.2.1",
- "domutils": "^1.7.0",
- "nth-check": "^1.0.2"
- }
- },
- "css-tree": {
- "version": "1.0.0-alpha.37",
- "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz",
- "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==",
- "dev": true,
- "requires": {
- "mdn-data": "2.0.4",
- "source-map": "^0.6.1"
- }
- },
- "css-what": {
- "version": "3.4.2",
- "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz",
- "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==",
- "dev": true
- },
- "domelementtype": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz",
- "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==",
- "dev": true
- },
- "domutils": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz",
- "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==",
- "dev": true,
- "requires": {
- "dom-serializer": "0",
- "domelementtype": "1"
- }
- },
- "mdn-data": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz",
- "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==",
- "dev": true
- },
- "mkdirp": {
- "version": "0.5.6",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
- "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
- "dev": true,
- "requires": {
- "minimist": "^1.2.6"
- }
- },
- "nth-check": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz",
- "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==",
- "dev": true,
- "requires": {
- "boolbase": "~1.0.0"
- }
- }
- }
- },
"symbol-tree": {
"version": "3.2.4",
"resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
@@ -74469,12 +73792,6 @@
"resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
"integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="
},
- "unquote": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz",
- "integrity": "sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==",
- "dev": true
- },
"unset-value": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
@@ -74533,9 +73850,9 @@
"optional": true
},
"update-browserslist-db": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz",
- "integrity": "sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==",
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz",
+ "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==",
"requires": {
"escalade": "^3.1.1",
"picocolors": "^1.0.0"
diff --git a/package.json b/package.json
index bf8cb05fc550..cc2599d0d705 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "new.expensify",
- "version": "1.2.22-1",
+ "version": "1.2.24-4",
"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.",
@@ -97,7 +97,7 @@
"react-native-image-picker": "^4.8.5",
"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.26",
+ "react-native-onyx": "1.0.27",
"react-native-pdf": "^6.6.2",
"react-native-performance": "^2.0.0",
"react-native-permissions": "^3.0.1",
@@ -107,7 +107,7 @@
"react-native-render-html": "6.3.1",
"react-native-safe-area-context": "4.4.1",
"react-native-screens": "3.17.0",
- "react-native-svg": "git+https://github.com/software-mansion/react-native-svg#2a892a9eac4a0b11d33c0cf866b3475a6d332424",
+ "react-native-svg": "^13.5.0",
"react-native-webview": "^11.17.2",
"react-pdf": "5.7.2",
"react-plaid-link": "3.3.2",
@@ -140,7 +140,7 @@
"@storybook/manager-webpack5": "^6.5.10",
"@storybook/react": "^6.5.9",
"@storybook/theming": "^6.5.9",
- "@svgr/webpack": "^5.5.0",
+ "@svgr/webpack": "^6.0.0",
"@testing-library/jest-native": "^3.4.2",
"@testing-library/react-native": "^7.0.2",
"@vercel/ncc": "^0.27.0",
@@ -178,7 +178,7 @@
"react-native-clean-project": "^4.0.0-alpha4.0",
"react-native-flipper": "https://gitpkg.now.sh/facebook/flipper/react-native/react-native-flipper?9cacc9b59402550eae866e0e81e5f0c2f8203e6b",
"react-native-performance-flipper-reporter": "^2.0.0",
- "react-native-svg-transformer": "^0.14.3",
+ "react-native-svg-transformer": "^1.0.0",
"react-test-renderer": "18.1.0",
"semver": "^7.3.4",
"speed-measure-webpack-plugin": "^1.5.0",
diff --git a/src/CONST.js b/src/CONST.js
index cbf24bae5610..5906c18b31bd 100755
--- a/src/CONST.js
+++ b/src/CONST.js
@@ -18,8 +18,8 @@ const CONST = {
// Same as the PHP layer allows
ALLOWED_EXTENSIONS: ['jpg', 'jpeg', 'png', 'gif', 'pdf', 'html', 'txt', 'rtf', 'doc', 'docx', 'htm', 'tiff', 'tif', 'xml', 'mp3', 'mp4', 'mov'],
- // 50 megabytes in bytes
- MAX_SIZE: 52428800,
+ // 24 megabytes in bytes
+ MAX_SIZE: 25165824,
// An arbitrary size, but the same minimum as in the PHP layer
MIN_SIZE: 240,
@@ -661,6 +661,8 @@ const CONST = {
PAY: 'pay',
CREATE: 'create',
SPLIT: 'split',
+ DECLINE: 'decline',
+ CANCEL: 'cancel',
},
AMOUNT_MAX_LENGTH: 10,
},
@@ -824,7 +826,6 @@ const CONST = {
INVITE: 'invite',
LEAVE_ROOM: 'leaveRoom',
},
- PROFILE_SETTINGS_FORM: 'profileSettingsForm',
// These split the maximum decimal value of a signed 64-bit number (9,223,372,036,854,775,807) into parts where none of them are too big to fit into a 32-bit number, so that we can
// generate them each with a random number generator with only 32-bits of precision.
diff --git a/src/ONYXKEYS.js b/src/ONYXKEYS.js
index b4d3998db100..04ca95c21169 100755
--- a/src/ONYXKEYS.js
+++ b/src/ONYXKEYS.js
@@ -155,6 +155,9 @@ export default {
// Is report data loading?
IS_LOADING_REPORT_DATA: 'isLoadingReportData',
+ // Are we loading the initial app data?
+ IS_LOADING_INITIAL_APP_DATA: 'isLoadingInitialAppData',
+
// Is Keyboard shortcuts modal open?
IS_SHORTCUTS_MODAL_OPEN: 'isShortcutsModalOpen',
@@ -173,6 +176,8 @@ export default {
REQUEST_CALL_FORM: 'requestCallForm',
REIMBURSEMENT_ACCOUNT_FORM: 'reimbursementAccount',
WORKSPACE_SETTINGS_FORM: 'workspaceSettingsForm',
+ PROFILE_SETTINGS_FORM: 'profileSettingsForm',
+ DISPLAY_NAME_FORM: 'displayNameForm',
},
// Whether we should show the compose input or not
diff --git a/src/ROUTES.js b/src/ROUTES.js
index 0dd0f61824e2..6872398c20f1 100644
--- a/src/ROUTES.js
+++ b/src/ROUTES.js
@@ -22,6 +22,7 @@ export default {
HOME: '',
SETTINGS: 'settings',
SETTINGS_PROFILE: 'settings/profile',
+ SETTINGS_DISPLAY_NAME: 'settings/profile/display-name',
SETTINGS_PREFERENCES: 'settings/preferences',
SETTINGS_WORKSPACES: 'settings/workspaces',
SETTINGS_SECURITY: 'settings/security',
diff --git a/src/components/CheckboxWithLabel.js b/src/components/CheckboxWithLabel.js
index 8ee5c6712a6e..96f85fb25d91 100644
--- a/src/components/CheckboxWithLabel.js
+++ b/src/components/CheckboxWithLabel.js
@@ -1,11 +1,10 @@
import React from 'react';
import PropTypes from 'prop-types';
import {View, TouchableOpacity} from 'react-native';
-import _ from 'underscore';
import styles from '../styles/styles';
import Checkbox from './Checkbox';
import Text from './Text';
-import InlineErrorText from './InlineErrorText';
+import FormHelpMessage from './FormHelpMessage';
const requiredPropsCheck = (props) => {
if (!props.label && !props.LabelComponent) {
@@ -77,8 +76,6 @@ class CheckboxWithLabel extends React.Component {
this.isChecked = props.value || props.defaultValue || props.isChecked;
this.LabelComponent = props.LabelComponent;
- this.defaultStyles = [styles.flexRow, styles.alignItemsCenter];
- this.wrapperStyles = _.isArray(props.style) ? [...this.defaultStyles, ...props.style] : [...this.defaultStyles, props.style];
this.toggleCheckbox = this.toggleCheckbox.bind(this);
}
@@ -90,8 +87,8 @@ class CheckboxWithLabel extends React.Component {
render() {
return (
- <>
-
+
+
)}
-
- {this.props.errorText}
-
- >
+
+
);
}
}
diff --git a/src/components/DatePicker/index.android.js b/src/components/DatePicker/index.android.js
index 77d7bbc705a2..813bf517d08b 100644
--- a/src/components/DatePicker/index.android.js
+++ b/src/components/DatePicker/index.android.js
@@ -39,7 +39,7 @@ class DatePicker extends React.Component {
}
render() {
- const dateAsText = this.props.defaultValue ? moment(this.props.defaultValue).format(CONST.DATE.MOMENT_FORMAT_STRING) : '';
+ const dateAsText = this.props.value || this.props.defaultValue ? moment(this.props.value || this.props.defaultValue).format(CONST.DATE.MOMENT_FORMAT_STRING) : '';
return (
<>
@@ -62,7 +62,7 @@ class DatePicker extends React.Component {
/>
{this.state.isPickerVisible && (
-
-
-
-
-
-
+
+
+
+
+
);
}
}
diff --git a/src/components/FormAlertWrapper.js b/src/components/FormAlertWrapper.js
index 921a76c771fc..ed6c16810485 100644
--- a/src/components/FormAlertWrapper.js
+++ b/src/components/FormAlertWrapper.js
@@ -3,16 +3,14 @@ import {View} from 'react-native';
import PropTypes from 'prop-types';
import React from 'react';
import {withNetwork} from './OnyxProvider';
-import Icon from './Icon';
-import * as Expensicons from './Icon/Expensicons';
import RenderHTML from './RenderHTML';
-import TextLink from './TextLink';
import Text from './Text';
-import colors from '../styles/colors';
+import TextLink from './TextLink';
import compose from '../libs/compose';
import networkPropTypes from './networkPropTypes';
import styles from '../styles/styles';
import withLocalize, {withLocalizePropTypes} from './withLocalize';
+import FormHelpMessage from './FormHelpMessage';
const propTypes = {
/** Wrapped child components */
@@ -52,38 +50,35 @@ const defaultProps = {
//
// This component takes other components as a child prop. It will then render any wrapped components as a function using "render props",
// and passes it a (bool) isOffline parameter. Child components can then use the isOffline variable to determine offline behavior.
-const FormAlertWrapper = props => (
-
- {props.isAlertVisible && (
-
-
-
- {!_.isEmpty(props.message) && props.isMessageHtml && ${props.message}`} />}
-
- {!_.isEmpty(props.message) && !props.isMessageHtml && {props.message} }
-
- {_.isEmpty(props.message) && (
- <>
-
- {`${props.translate('common.please')} `}
-
-
- {props.translate('common.fixTheErrors')}
-
-
- {` ${props.translate('common.inTheFormBeforeContinuing')}.`}
-
- >
- )}
-
-
- )}
- {props.children(props.network.isOffline)}
-
-);
+const FormAlertWrapper = (props) => {
+ let children;
+ if (_.isEmpty(props.message)) {
+ children = (
+
+ {`${props.translate('common.please')} `}
+
+ {props.translate('common.fixTheErrors')}
+
+ {` ${props.translate('common.inTheFormBeforeContinuing')}.`}
+
+ );
+ } else if (props.isMessageHtml) {
+ children = ${props.message}`} />;
+ }
+ return (
+
+ {props.isAlertVisible && (
+
+ {children}
+
+ )}
+ {props.children(props.network.isOffline)}
+
+ );
+};
FormAlertWrapper.propTypes = propTypes;
FormAlertWrapper.defaultProps = defaultProps;
diff --git a/src/components/FormHelpMessage.js b/src/components/FormHelpMessage.js
new file mode 100644
index 000000000000..3a78b279c962
--- /dev/null
+++ b/src/components/FormHelpMessage.js
@@ -0,0 +1,56 @@
+import React from 'react';
+import _ from 'underscore';
+import PropTypes from 'prop-types';
+import {View} from 'react-native';
+import Icon from './Icon';
+import * as Expensicons from './Icon/Expensicons';
+import Text from './Text';
+import colors from '../styles/colors';
+import styles from '../styles/styles';
+import stylePropTypes from '../styles/stylePropTypes';
+
+const propTypes = {
+ /** Error or hint text. Ignored when children is not empty */
+ message: PropTypes.string,
+
+ /** Children to render next to dot indicator */
+ children: PropTypes.node,
+
+ /** Indicates whether to show error or hint */
+ isError: PropTypes.bool,
+
+ /** Container style props */
+ style: stylePropTypes,
+};
+
+const defaultProps = {
+ message: '',
+ children: null,
+ isError: true,
+ style: [],
+};
+
+const FormHelpMessage = (props) => {
+ if (_.isEmpty(props.message) && _.isEmpty(props.children)) {
+ return null;
+ }
+
+ return (
+
+ {props.isError && }
+
+ {props.children || (
+
+ {props.message}
+
+ )}
+
+
+ );
+};
+
+FormHelpMessage.propTypes = propTypes;
+FormHelpMessage.defaultProps = defaultProps;
+FormHelpMessage.displayName = 'FormHelpMessage';
+
+export default FormHelpMessage;
diff --git a/src/components/HTMLEngineProvider/BaseHTMLEngineProvider.js b/src/components/HTMLEngineProvider/BaseHTMLEngineProvider.js
index 459e904a0bba..c644db26d153 100755
--- a/src/components/HTMLEngineProvider/BaseHTMLEngineProvider.js
+++ b/src/components/HTMLEngineProvider/BaseHTMLEngineProvider.js
@@ -29,7 +29,7 @@ const customHTMLElementModels = {
}),
'muted-text': defaultHTMLElementModels.div.extend({
tagName: 'muted-text',
- mixedUAStyles: styles.mutedTextLabel,
+ mixedUAStyles: {...styles.formError, ...styles.mb0},
}),
comment: defaultHTMLElementModels.div.extend({
tagName: 'comment',
diff --git a/src/components/KYCWall/kycWallPropTypes.js b/src/components/KYCWall/kycWallPropTypes.js
index 5886001c8c92..73e2b550b69f 100644
--- a/src/components/KYCWall/kycWallPropTypes.js
+++ b/src/components/KYCWall/kycWallPropTypes.js
@@ -24,7 +24,7 @@ const propTypes = {
userWallet: userWalletPropTypes,
/** When the button is opened via an IOU, ID for the chatReport that the IOU is linked to */
- chatReportID: PropTypes.number,
+ chatReportID: PropTypes.string,
};
const defaultProps = {
@@ -32,7 +32,7 @@ const defaultProps = {
popoverPlacement: 'top',
shouldListenForResize: false,
isDisabled: false,
- chatReportID: 0,
+ chatReportID: '',
};
export {propTypes, defaultProps};
diff --git a/src/components/Picker/BasePicker/index.js b/src/components/Picker/BasePicker/index.js
index a34b523f383d..8a32ab7738ec 100644
--- a/src/components/Picker/BasePicker/index.js
+++ b/src/components/Picker/BasePicker/index.js
@@ -13,6 +13,26 @@ class BasePicker extends React.Component {
this.executeOnCloseAndOnBlur = this.executeOnCloseAndOnBlur.bind(this);
}
+ componentDidMount() {
+ this.setDefaultValue();
+ }
+
+ componentDidUpdate(prevProps) {
+ if (prevProps.items === this.props.items) {
+ return;
+ }
+ this.setDefaultValue();
+ }
+
+ setDefaultValue() {
+ // When there is only 1 element in the selector, we do the user a favor and automatically select it for them
+ // so they don't have to spend extra time selecting the only possible value.
+ if (this.props.value || !this.props.items || this.props.items.length !== 1 || !this.props.onInputChange) {
+ return;
+ }
+ this.props.onInputChange(this.props.items[0].key);
+ }
+
executeOnCloseAndOnBlur() {
// Picker's onClose is not executed on Web and Desktop, so props.onClose has to be called with onBlur callback.
this.props.onClose();
diff --git a/src/components/Picker/index.js b/src/components/Picker/index.js
index 4dc676966827..d9b6c00a2635 100644
--- a/src/components/Picker/index.js
+++ b/src/components/Picker/index.js
@@ -5,7 +5,7 @@ import PropTypes from 'prop-types';
import BasePicker from './BasePicker';
import Text from '../Text';
import styles from '../../styles/styles';
-import InlineErrorText from '../InlineErrorText';
+import FormHelpMessage from '../FormHelpMessage';
const propTypes = {
/** Picker label */
@@ -95,9 +95,7 @@ class Picker extends PureComponent {
onInputChange={this.onInputChange}
/>
-
- {this.props.errorText}
-
+
>
);
}
diff --git a/src/components/RadioButtonWithLabel.js b/src/components/RadioButtonWithLabel.js
index 630981970c2c..7665cb3f9159 100644
--- a/src/components/RadioButtonWithLabel.js
+++ b/src/components/RadioButtonWithLabel.js
@@ -5,7 +5,7 @@ import _ from 'underscore';
import styles from '../styles/styles';
import RadioButton from './RadioButton';
import Text from './Text';
-import InlineErrorText from './InlineErrorText';
+import FormHelpMessage from './FormHelpMessage';
const propTypes = {
/** Whether the radioButton is checked */
@@ -75,9 +75,7 @@ const RadioButtonWithLabel = (props) => {
{LabelComponent && ( )}
-
- {props.errorText}
-
+
>
);
};
diff --git a/src/components/ReportTransaction.js b/src/components/ReportTransaction.js
index 8e2aaeb165ab..21158e9a94b1 100644
--- a/src/components/ReportTransaction.js
+++ b/src/components/ReportTransaction.js
@@ -1,14 +1,14 @@
import React, {Component} from 'react';
import PropTypes from 'prop-types';
-import lodashGet from 'lodash/get';
import {View} from 'react-native';
-import {withOnyx} from 'react-native-onyx';
-import _ from 'underscore';
-import ONYXKEYS from '../ONYXKEYS';
import styles from '../styles/styles';
+import CONST from '../CONST';
import * as IOU from '../libs/actions/IOU';
+import * as ReportActions from '../libs/actions/ReportActions';
import reportActionPropTypes from '../pages/home/report/reportActionPropTypes';
import ReportActionItemSingle from '../pages/home/report/ReportActionItemSingle';
+import withLocalize, {withLocalizePropTypes} from './withLocalize';
+import OfflineWithFeedback from './OfflineWithFeedback';
import Text from './Text';
import Button from './Button';
@@ -27,17 +27,10 @@ const propTypes = {
/** Can this transaction be rejected? */
canBeRejected: PropTypes.bool,
- /** Text label for the reject transaction button */
- rejectButtonLabelText: PropTypes.string.isRequired,
+ /** Type of the reject transaction button */
+ rejectButtonType: PropTypes.oneOf([CONST.IOU.REPORT_ACTION_TYPE.DECLINE, CONST.IOU.REPORT_ACTION_TYPE.CANCEL]).isRequired,
- /* Onyx Props */
-
- /** List of transactionIDs in process of rejection */
- /* eslint-disable-next-line react/no-unused-prop-types, react/require-default-props */
- transactionsBeingRejected: PropTypes.shape({
- /** IOUTransactionID that's being rejected */
- transactionID: PropTypes.bool,
- }),
+ ...withLocalizePropTypes,
};
const defaultProps = {
@@ -48,62 +41,57 @@ class ReportTransaction extends Component {
constructor(props) {
super(props);
- this.rejectTransaction = this.rejectTransaction.bind(this);
- }
-
- rejectTransaction() {
- IOU.rejectTransaction({
- reportID: this.props.iouReportID,
- chatReportID: this.props.chatReportID,
- transactionID: this.props.action.originalMessage.IOUTransactionID,
- comment: '',
- });
+ this.cancelMoneyRequest = this.cancelMoneyRequest.bind(this);
}
- /**
- * Checks if current IOUTransactionID is being rejected.
- * @returns {boolean} Returns `true` if current IOUtransactionID is being rejected, else `false`.
- */
- isBeingRejected() {
- const IOUTransactionID = lodashGet(this.props.action, 'originalMessage.IOUTransactionID', '');
- const transactionsBeingRejected = lodashGet(this.props, 'transactionsBeingRejected', {});
- if (_.isEmpty(transactionsBeingRejected)) {
- return false;
- }
- return _.has(transactionsBeingRejected, IOUTransactionID);
+ cancelMoneyRequest() {
+ IOU.cancelMoneyRequest(
+ this.props.chatReportID,
+ this.props.iouReportID,
+ this.props.rejectButtonType,
+ this.props.action,
+ );
}
render() {
return (
-
-
-
- {this.props.action.message[0].text}
-
-
- {this.props.canBeRejected && (
-
-
-
- )}
-
+ {
+ if (this.props.action.pendingAction === CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD) {
+ ReportActions.deleteOptimisticReportAction(this.props.chatReportID, this.props.action.sequenceNumber);
+ } else {
+ ReportActions.clearReportActionErrors(this.props.chatReportID, this.props.action.sequenceNumber);
+ }
+ }}
+ pendingAction={this.props.action.pendingAction}
+ errors={this.props.action.errors}
+ errorRowStyles={[styles.ml10, styles.mr2]}
+ >
+
+
+
+ {this.props.action.message[0].text}
+
+
+ {this.props.canBeRejected && (
+
+
+
+ )}
+
+
);
}
}
ReportTransaction.defaultProps = defaultProps;
ReportTransaction.propTypes = propTypes;
-export default withOnyx({
- transactionsBeingRejected: {
- key: ONYXKEYS.TRANSACTIONS_BEING_REJECTED,
- },
-})(ReportTransaction);
+export default withLocalize(ReportTransaction);
diff --git a/src/components/ReportWelcomeText.js b/src/components/ReportWelcomeText.js
index 8ee9718ab1d1..1109d7682901 100644
--- a/src/components/ReportWelcomeText.js
+++ b/src/components/ReportWelcomeText.js
@@ -91,7 +91,7 @@ const ReportWelcomeText = (props) => {
{roomWelcomeMessage.phrase1}
Navigation.navigate(ROUTES.getReportDetailsRoute(props.report.reportID))}>
- {ReportUtils.getReportName(props.report, props.personalDetails, props.policies)}
+ {ReportUtils.getReportName(props.report, props.policies)}
{roomWelcomeMessage.phrase2}
diff --git a/src/components/ScreenWrapper/BaseScreenWrapper.js b/src/components/ScreenWrapper/BaseScreenWrapper.js
index 56a0c30b2ecf..a3ebdd4eb6a2 100644
--- a/src/components/ScreenWrapper/BaseScreenWrapper.js
+++ b/src/components/ScreenWrapper/BaseScreenWrapper.js
@@ -10,7 +10,6 @@ import onScreenTransitionEnd from '../../libs/onScreenTransitionEnd';
import * as StyleUtils from '../../styles/StyleUtils';
import styles from '../../styles/styles';
import HeaderGap from '../HeaderGap';
-import KeyboardShortcutsModal from '../KeyboardShortcutsModal';
import OfflineIndicator from '../OfflineIndicator';
import compose from '../../libs/compose';
import withNavigation from '../withNavigation';
@@ -44,23 +43,6 @@ class BaseScreenWrapper extends React.Component {
});
}
- /**
- * We explicitly want to ignore if props.modal changes, and only want to rerender if
- * any of the other props **used for the rendering output** is changed.
- * @param {Object} nextProps
- * @param {Object} nextState
- * @returns {boolean}
- */
- shouldComponentUpdate(nextProps, nextState) {
- return this.state !== nextState
- || this.props.children !== nextProps.children
- || this.props.network.isOffline !== nextProps.network.isOffline
- || this.props.includePaddingBottom !== nextProps.includePaddingBottom
- || this.props.includePaddingTop !== nextProps.includePaddingTop
- || this.props.isSmallScreenWidth !== nextProps.isSmallScreenWidth
- || this.props.keyboardAvoidingViewBehavior !== nextProps.keyboardAvoidingViewBehavior;
- }
-
componentWillUnmount() {
if (this.unsubscribeEscapeKey) {
this.unsubscribeEscapeKey();
@@ -104,7 +86,6 @@ class BaseScreenWrapper extends React.Component {
})
: this.props.children
}
-
{this.props.isSmallScreenWidth && (
)}
diff --git a/src/components/SettlementButton.js b/src/components/SettlementButton.js
index 316e356b51e3..8b819ba3c8d4 100644
--- a/src/components/SettlementButton.js
+++ b/src/components/SettlementButton.js
@@ -28,7 +28,7 @@ const propTypes = {
network: networkPropTypes.isRequired,
/** When the button is opened via an IOU, ID for the chatReport that the IOU is linked to */
- chatReportID: PropTypes.number,
+ chatReportID: PropTypes.string,
...withLocalizePropTypes,
};
@@ -36,7 +36,7 @@ const propTypes = {
const defaultProps = {
currency: CONST.CURRENCY.USD,
shouldShowPaypal: false,
- chatReportID: 0,
+ chatReportID: '',
};
class SettlementButton extends React.Component {
diff --git a/src/components/TextInput/BaseTextInput.js b/src/components/TextInput/BaseTextInput.js
index 2f970bbb12e4..fe29ff79bf25 100644
--- a/src/components/TextInput/BaseTextInput.js
+++ b/src/components/TextInput/BaseTextInput.js
@@ -18,6 +18,7 @@ import variables from '../../styles/variables';
import Checkbox from '../Checkbox';
import getSecureEntryKeyboardType from '../../libs/getSecureEntryKeyboardType';
import CONST from '../../CONST';
+import FormHelpMessage from '../FormHelpMessage';
class BaseTextInput extends Component {
constructor(props) {
@@ -198,7 +199,6 @@ class BaseTextInput extends Component {
const inputProps = _.omit(this.props, _.keys(baseTextInputPropTypes.propTypes));
const hasLabel = Boolean(this.props.label.length);
const inputHelpText = this.props.errorText || this.props.hint;
- const formHelpStyles = this.props.errorText ? styles.formError : styles.formHelp;
const placeholder = (this.props.prefixCharacter || this.state.isFocused || !hasLabel || (hasLabel && this.props.forceActiveLabel)) ? this.props.placeholder : null;
const textInputContainerStyles = _.reduce([
styles.textInputContainer,
@@ -305,9 +305,7 @@ class BaseTextInput extends Component {
{!_.isEmpty(inputHelpText) && (
-
- {inputHelpText}
-
+
)}
{/*
diff --git a/src/components/TextLink.js b/src/components/TextLink.js
index 8a56af8341ad..55344d987139 100644
--- a/src/components/TextLink.js
+++ b/src/components/TextLink.js
@@ -32,20 +32,37 @@ const defaultProps = {
const TextLink = (props) => {
const additionalStyles = _.isArray(props.style) ? props.style : [props.style];
+
+ /**
+ * @param {Event} event
+ */
+ const openLink = (event) => {
+ event.preventDefault();
+ if (props.onPress) {
+ props.onPress();
+ return;
+ }
+
+ Linking.openURL(props.href);
+ };
+
+ /**
+ * @param {Event} event
+ */
+ const openLinkIfEnterKeyPressed = (event) => {
+ if (event.key !== 'Enter') {
+ return;
+ }
+ openLink(event);
+ };
+
return (
{
- e.preventDefault();
- if (props.onPress) {
- props.onPress();
- return;
- }
-
- Linking.openURL(props.href);
- }}
+ onPress={openLink}
+ onKeyDown={openLinkIfEnterKeyPressed}
>
{props.children}
diff --git a/src/components/Tooltip/TooltipRenderedOnPageBody.js b/src/components/Tooltip/TooltipRenderedOnPageBody.js
index 3bfcc71fd4c9..b3914f70eab1 100644
--- a/src/components/Tooltip/TooltipRenderedOnPageBody.js
+++ b/src/components/Tooltip/TooltipRenderedOnPageBody.js
@@ -77,7 +77,10 @@ class TooltipRenderedOnPageBody extends React.PureComponent {
if (prevProps.text === this.props.text) {
return;
}
- this.updateTooltipTextWidth();
+
+ // Reset the tooltip text width to 0 so that we can measure it again.
+ // eslint-disable-next-line react/no-did-update-set-state
+ this.setState({tooltipTextWidth: 0}, this.updateTooltipTextWidth);
}
updateTooltipTextWidth() {
diff --git a/src/languages/en.js b/src/languages/en.js
index fe300cb94d12..46eba4547f2a 100755
--- a/src/languages/en.js
+++ b/src/languages/en.js
@@ -119,7 +119,7 @@ export default {
chooseFromGallery: 'Choose from gallery',
chooseDocument: 'Choose document',
attachmentTooLarge: 'Attachment too large',
- sizeExceeded: 'Attachment size is larger than 50 MB limit.',
+ sizeExceeded: 'Attachment size is larger than 24 MB limit.',
attachmentTooSmall: 'Attachment too small',
sizeNotMet: 'Attachment size must be greater than 240 bytes',
wrongFileType: 'Attachment is the wrong type',
@@ -262,6 +262,7 @@ export default {
invalidSplit: 'Split amounts do not equal total amount',
other: 'Unexpected error, please try again later',
genericCreateFailureMessage: 'Unexpected error requesting money, please try again later',
+ genericCancelFailureMessage: ({type}) => `Unexpected error ${type === 'decline' ? 'declining' : 'cancelling'} the money request, please try again later`,
},
},
notificationPreferences: {
@@ -302,6 +303,12 @@ export default {
offline: 'Offline',
syncing: 'Syncing',
},
+ displayNamePage: {
+ headerTitle: 'Display name',
+ isShownOnProfile: 'Your display name is shown on your profile.',
+ john: 'John',
+ doe: 'Doe',
+ },
addSecondaryLoginPage: {
addPhoneNumber: 'Add phone number',
addEmailAddress: 'Add email address',
@@ -569,7 +576,6 @@ export default {
addressStreet: 'Please enter a valid street address that is not a PO Box',
addressState: 'Please select a valid state',
incorporationDate: 'Please enter a valid date',
- incorporationDateFuture: 'Incorporation date cannot be in the future',
incorporationState: 'Please enter a valid state',
industryCode: 'Please enter a valid industry classification code. Must be 6 digits.',
restrictedBusiness: 'Please confirm company is not on the list of restricted businesses',
diff --git a/src/languages/es.js b/src/languages/es.js
index 90cc8a5f1e61..39b8b1a427e7 100644
--- a/src/languages/es.js
+++ b/src/languages/es.js
@@ -119,7 +119,7 @@ export default {
chooseFromGallery: 'Elegir de la galería',
chooseDocument: 'Elegir documento',
attachmentTooLarge: 'Archivo adjunto demasiado grande',
- sizeExceeded: 'El archivo adjunto supera el límite de 50 MB.',
+ sizeExceeded: 'El archivo adjunto supera el límite de 24 MB.',
attachmentTooSmall: 'Archivo adjunto demasiado pequeño',
sizeNotMet: 'El archivo adjunto debe ser mas grande que 240 bytes',
wrongFileType: 'El tipo del archivo adjunto es incorrecto',
@@ -262,6 +262,8 @@ export default {
invalidSplit: 'La suma de las partes no equivale al monto total',
other: 'Error inesperado, por favor inténtalo más tarde',
genericCreateFailureMessage: 'Error inesperado solicitando dinero, por favor inténtalo más tarde',
+ genericCancelFailureMessage: ({type}) => `Error inesperado al ${type === 'decline' ? 'rechazar' : 'cancelar'} la solicitud de dinero, por favor inténtalo más tarde`,
+
},
},
notificationPreferences: {
@@ -302,6 +304,12 @@ export default {
offline: 'Desconectado',
syncing: 'Sincronizando',
},
+ displayNamePage: {
+ headerTitle: 'Nombre',
+ isShownOnProfile: 'Este nombre es visible en su perfil.',
+ john: 'Juan',
+ doe: 'Nadie',
+ },
addSecondaryLoginPage: {
addPhoneNumber: 'Agregar número de teléfono',
addEmailAddress: 'Agregar dirección de email',
@@ -569,7 +577,6 @@ export default {
addressStreet: 'Ingresa una calle de dirección válida que no sea un apartado postal',
addressState: 'Por favor, selecciona un estado',
incorporationDate: 'Ingresa una fecha válida',
- incorporationDateFuture: 'La fecha de incorporación no puede ser futura',
incorporationState: 'Ingresa un estado válido',
industryCode: 'Ingresa un código de clasificación de industria válido',
restrictedBusiness: 'Confirma que la empresa no está en la lista de negocios restringidos',
diff --git a/src/libs/API.js b/src/libs/API.js
index 83b0dcd9d159..d86fc099a08a 100644
--- a/src/libs/API.js
+++ b/src/libs/API.js
@@ -105,7 +105,10 @@ function makeRequestWithSideEffects(command, apiCommandParameters = {}, onyxData
* @param {Object} [onyxData.failureData] - Onyx instructions that will be passed to Onyx.update() when the response has jsonCode !== 200.
*/
function read(command, apiCommandParameters, onyxData) {
- makeRequestWithSideEffects(command, apiCommandParameters, onyxData, CONST.API_REQUEST_TYPE.READ);
+ // Ensure all write requests on the sequential queue have finished responding before running read requests.
+ // Responses from read requests can overwrite the optimistic data inserted by
+ // write requests that use the same Onyx keys and haven't responded yet.
+ SequentialQueue.waitForIdle().then(() => makeRequestWithSideEffects(command, apiCommandParameters, onyxData, CONST.API_REQUEST_TYPE.READ));
}
export {
diff --git a/src/libs/Middleware/SaveResponseInOnyx.js b/src/libs/Middleware/SaveResponseInOnyx.js
index 2138ff91108c..08e24c1d7843 100644
--- a/src/libs/Middleware/SaveResponseInOnyx.js
+++ b/src/libs/Middleware/SaveResponseInOnyx.js
@@ -1,5 +1,4 @@
import Onyx from 'react-native-onyx';
-import _ from 'underscore';
/**
* @param {Promise} response
@@ -9,28 +8,26 @@ import _ from 'underscore';
function SaveResponseInOnyx(response, request) {
return response
.then((responseData) => {
- const onyxUpdates = [];
-
// Make sure we have response data (i.e. response isn't a promise being passed down to us by a failed retry request and responseData undefined)
if (!responseData) {
return;
}
- // Handle the request's success/failure data (client-side data)
- if (responseData.jsonCode === 200 && request.successData) {
- onyxUpdates.push(...request.successData);
- } else if (responseData.jsonCode !== 200 && request.failureData) {
- onyxUpdates.push(...request.failureData);
- }
+ // First apply any onyx data updates that are being sent back from the API. We wait for this to complete and then
+ // apply successData or failureData. This ensures that we do not update any pending, loading, or other UI states contained
+ // in successData/failureData until after the component has received and API data.
+ const onyxDataUpdatePromise = responseData.onyxData
+ ? Onyx.update(responseData.onyxData)
+ : Promise.resolve();
- // Add any onyx updates that are being sent back from the API
- if (responseData.onyxData) {
- onyxUpdates.push(...responseData.onyxData);
- }
-
- if (!_.isEmpty(onyxUpdates)) {
- Onyx.update(onyxUpdates);
- }
+ onyxDataUpdatePromise.then(() => {
+ // Handle the request's success/failure data (client-side data)
+ if (responseData.jsonCode === 200 && request.successData) {
+ Onyx.update(request.successData);
+ } else if (responseData.jsonCode !== 200 && request.failureData) {
+ Onyx.update(request.failureData);
+ }
+ });
return responseData;
});
diff --git a/src/libs/Navigation/AppNavigator/ModalStackNavigators.js b/src/libs/Navigation/AppNavigator/ModalStackNavigators.js
index 7a22f47572fc..788e6b49e541 100644
--- a/src/libs/Navigation/AppNavigator/ModalStackNavigators.js
+++ b/src/libs/Navigation/AppNavigator/ModalStackNavigators.js
@@ -217,6 +217,13 @@ const SettingsModalStackNavigator = createModalStackNavigator([
},
name: 'Settings_Profile',
},
+ {
+ getComponent: () => {
+ const SettingsDisplayNamePage = require('../../../pages/settings/Profile/DisplayNamePage').default;
+ return SettingsDisplayNamePage;
+ },
+ name: 'Settings_Display_Name',
+ },
{
getComponent: () => {
const SettingsAddSecondaryLoginPage = require('../../../pages/settings/AddSecondaryLoginPage').default;
diff --git a/src/libs/Navigation/linkingConfig.js b/src/libs/Navigation/linkingConfig.js
index 6e8951bffbcf..dafe15789e54 100644
--- a/src/libs/Navigation/linkingConfig.js
+++ b/src/libs/Navigation/linkingConfig.js
@@ -88,6 +88,10 @@ export default {
path: ROUTES.SETTINGS_PROFILE,
exact: true,
},
+ Settings_Display_Name: {
+ path: ROUTES.SETTINGS_DISPLAY_NAME,
+ exact: true,
+ },
Settings_About: {
path: ROUTES.SETTINGS_ABOUT,
exact: true,
diff --git a/src/libs/Network/SequentialQueue.js b/src/libs/Network/SequentialQueue.js
index fc670d118405..f37eb8422247 100644
--- a/src/libs/Network/SequentialQueue.js
+++ b/src/libs/Network/SequentialQueue.js
@@ -114,9 +114,18 @@ function getCurrentRequest() {
return currentRequest;
}
+/**
+ * Returns a promise that resolves when the sequential queue is done processing all persisted write requests.
+ * @returns {Promise}
+ */
+function waitForIdle() {
+ return isReadyPromise;
+}
+
export {
flush,
getCurrentRequest,
isRunning,
push,
+ waitForIdle,
};
diff --git a/src/libs/OptionsListUtils.js b/src/libs/OptionsListUtils.js
index 6308c4745a45..d23a3e119ce5 100644
--- a/src/libs/OptionsListUtils.js
+++ b/src/libs/OptionsListUtils.js
@@ -293,6 +293,7 @@ function createOption(logins, personalDetails, report, reportActions = {}, {
const personalDetail = personalDetailList[0] || {};
let hasMultipleParticipants = personalDetailList.length > 1;
let subtitle;
+ let reportName;
result.participantsList = personalDetailList;
@@ -349,7 +350,9 @@ function createOption(logins, personalDetails, report, reportActions = {}, {
? lastMessageText
: Str.removeSMSDomain(personalDetail.login);
}
+ reportName = ReportUtils.getReportName(report, policies);
} else {
+ reportName = ReportUtils.getDisplayNameForParticipant(logins[0]);
result.keyForList = personalDetail.login;
result.alternateText = Str.removeSMSDomain(personalDetail.login);
}
@@ -368,7 +371,6 @@ function createOption(logins, personalDetails, report, reportActions = {}, {
result.payPalMeAddress = personalDetail.payPalMeAddress;
}
- const reportName = ReportUtils.getReportName(report, personalDetailMap, policies);
result.text = reportName;
result.searchText = getSearchText(report, reportName, personalDetailList, result.isChatRoom || result.isPolicyExpenseChat);
result.icons = ReportUtils.getIcons(report, personalDetails, policies, personalDetail.avatar);
diff --git a/src/libs/PolicyUtils.js b/src/libs/PolicyUtils.js
index 3def54c19f98..40f54f284847 100644
--- a/src/libs/PolicyUtils.js
+++ b/src/libs/PolicyUtils.js
@@ -48,7 +48,7 @@ function hasCustomUnitsError(policy) {
*/
function getPolicyBrickRoadIndicatorStatus(policy, policyMembers) {
const policyMemberList = lodashGet(policyMembers, `${ONYXKEYS.COLLECTION.POLICY_MEMBER_LIST}${policy.id}`, {});
- if (hasPolicyMemberError(policyMemberList) || hasCustomUnitsError(policy)) {
+ if (hasPolicyMemberError(policyMemberList) || hasCustomUnitsError(policy) || hasPolicyError(policy)) {
return CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR;
}
return '';
diff --git a/src/libs/ReportUtils.js b/src/libs/ReportUtils.js
index c4bd16fd0877..4f2128063d76 100644
--- a/src/libs/ReportUtils.js
+++ b/src/libs/ReportUtils.js
@@ -379,11 +379,13 @@ function canShowReportRecipientLocalTime(personalDetails, report) {
const hasMultipleParticipants = participantsWithoutExpensifyEmails.length > 1;
const reportRecipient = personalDetails[participantsWithoutExpensifyEmails[0]];
const reportRecipientTimezone = lodashGet(reportRecipient, 'timezone', CONST.DEFAULT_TIME_ZONE);
+ const isReportParticipantValidated = lodashGet(reportRecipient, 'validated', false);
return !hasMultipleParticipants
&& !isChatRoom(report)
&& reportRecipient
&& reportRecipientTimezone
- && reportRecipientTimezone.selected;
+ && reportRecipientTimezone.selected
+ && isReportParticipantValidated;
}
/**
@@ -463,27 +465,42 @@ function getIcons(report, personalDetails, policies, defaultIcon = null) {
return _.map(sortedParticipants, item => item.avatar);
}
+/**
+ * Gets the personal details for a login by looking in the ONYXKEYS.PERSONAL_DETAILS Onyx key (stored in the local variable, allPersonalDetails). If it doesn't exist in Onyx,
+ * then a default object is constructed.
+ * @param {String} login
+ * @returns {Object}
+ */
+function getPersonalDetailsForLogin(login) {
+ if (!login) {
+ return {};
+ }
+ return (allPersonalDetails && allPersonalDetails[login]) || {
+ login,
+ displayName: Str.removeSMSDomain(login),
+ avatar: getDefaultAvatar(login),
+ };
+}
+
/**
* Get the displayName for a single report participant.
*
- * @param {Object} participant
- * @param {String} participant.displayName
- * @param {String} participant.firstName
- * @param {String} participant.login
+ * @param {String} login
* @param {Boolean} [shouldUseShortForm]
* @returns {String}
*/
-function getDisplayNameForParticipant(participant, shouldUseShortForm = false) {
- if (!participant) {
+function getDisplayNameForParticipant(login, shouldUseShortForm = false) {
+ if (!login) {
return '';
}
+ const personalDetails = getPersonalDetailsForLogin(login);
- const loginWithoutSMSDomain = Str.removeSMSDomain(participant.login);
- let longName = participant.displayName || loginWithoutSMSDomain;
- if (Str.isSMSLogin(longName)) {
+ const loginWithoutSMSDomain = Str.removeSMSDomain(personalDetails.login);
+ let longName = personalDetails.displayName || loginWithoutSMSDomain;
+ if (longName === loginWithoutSMSDomain && Str.isSMSLogin(longName)) {
longName = LocalePhoneNumber.toLocalPhone(preferredLocale, longName);
}
- const shortName = participant.firstName || longName;
+ const shortName = personalDetails.firstName || longName;
return shouldUseShortForm ? shortName : longName;
}
@@ -495,7 +512,7 @@ function getDisplayNameForParticipant(participant, shouldUseShortForm = false) {
*/
function getDisplayNamesWithTooltips(participants, isMultipleParticipantReport) {
return _.map(participants, (participant) => {
- const displayName = getDisplayNameForParticipant(participant, isMultipleParticipantReport);
+ const displayName = getDisplayNameForParticipant(participant.login, isMultipleParticipantReport);
const tooltip = Str.removeSMSDomain(participant.login);
let pronouns = participant.pronouns;
@@ -516,19 +533,17 @@ function getDisplayNamesWithTooltips(participants, isMultipleParticipantReport)
* Get the title for a report.
*
* @param {Object} report
- * @param {Object} [personalDetailsForParticipants]
* @param {Object} [policies]
* @returns {String}
*/
-function getReportName(report, personalDetailsForParticipants = {}, policies = {}) {
+function getReportName(report, policies = {}) {
let formattedName;
if (isChatRoom(report)) {
formattedName = report.reportName;
}
if (isPolicyExpenseChat(report)) {
- const reportOwnerPersonalDetails = personalDetailsForParticipants[report.ownerEmail];
- const reportOwnerDisplayName = getDisplayNameForParticipant(reportOwnerPersonalDetails) || report.ownerEmail || report.reportName;
+ const reportOwnerDisplayName = getDisplayNameForParticipant(report.ownerEmail) || report.ownerEmail || report.reportName;
formattedName = report.isOwnPolicyExpenseChat ? getPolicyName(report, policies) : reportOwnerDisplayName;
}
@@ -541,10 +556,10 @@ function getReportName(report, personalDetailsForParticipants = {}, policies = {
}
// Not a room or PolicyExpenseChat, generate title from participants
- const participants = _.without(lodashGet(report, 'participants', []), sessionEmail);
- const isMultipleParticipantReport = participants.length > 1;
- const participantsToGetTheNamesOf = _.isEmpty(personalDetailsForParticipants) ? participants : personalDetailsForParticipants;
- return _.map(participantsToGetTheNamesOf, participant => getDisplayNameForParticipant(participant, isMultipleParticipantReport)).join(', ');
+ const participants = (report && report.participants) || [];
+ const participantsWithoutCurrentUser = _.without(participants, sessionEmail);
+ const isMultipleParticipantReport = participantsWithoutCurrentUser.length > 1;
+ return _.map(participantsWithoutCurrentUser, login => getDisplayNameForParticipant(login, isMultipleParticipantReport)).join(', ');
}
/**
@@ -687,19 +702,27 @@ function buildOptimisticIOUReport(ownerEmail, userEmail, total, chatReportID, cu
*/
function getIOUReportActionMessage(type, total, participants, comment, currency) {
const amount = NumberFormatUtils.format(preferredLocale, total / 100, {style: 'currency', currency});
- const isMultipleParticipantReport = participants.length > 1;
- const displayNames = _.map(participants, participant => getDisplayNameForParticipant(allPersonalDetails[participant.login], isMultipleParticipantReport) || participant.login);
- const from = displayNames.length < 3
+ const displayNames = _.map(participants, participant => getDisplayNameForParticipant(participant.login, true));
+ const who = displayNames.length < 3
? displayNames.join(' and ')
: `${displayNames.slice(0, -1).join(', ')}, and ${_.last(displayNames)}`;
let iouMessage;
switch (type) {
case CONST.IOU.REPORT_ACTION_TYPE.CREATE:
- iouMessage = `Requested ${amount} from ${from}${comment && ` for ${comment}`}`;
+ iouMessage = `Requested ${amount} from ${who}${comment && ` for ${comment}`}`;
break;
case CONST.IOU.REPORT_ACTION_TYPE.SPLIT:
- iouMessage = `Split ${amount} with ${from}${comment && ` for ${comment}`}`;
+ iouMessage = `Split ${amount} with ${who}${comment && ` for ${comment}`}`;
+ break;
+ case CONST.IOU.REPORT_ACTION_TYPE.CANCEL:
+ iouMessage = `Cancelled the ${amount} request${comment && ` for ${comment}`}`;
+ break;
+ case CONST.IOU.REPORT_ACTION_TYPE.DECLINE:
+ iouMessage = `Declined the ${amount} request${comment && ` for ${comment}`}`;
+ break;
+ case CONST.IOU.REPORT_ACTION_TYPE.PAY:
+ iouMessage = `Paid ${amount} to ${who}${comment && ` for ${comment}`}`;
break;
default:
break;
@@ -719,7 +742,7 @@ function getIOUReportActionMessage(type, total, participants, comment, currency)
* @param {Number} sequenceNumber - Caller is responsible for providing a best guess at what the next sequenceNumber will be.
* @param {String} type - IOUReportAction type. Can be oneOf(create, decline, cancel, pay, split).
* @param {Number} amount - IOU amount in cents.
- * @param {String} currency - IOU currency.
+ * @param {String} currency
* @param {String} comment - User comment for the IOU.
* @param {Array} participants - An array with participants details.
* @param {String} paymentType - Only required if the IOUReportAction type is 'pay'. Can be oneOf(elsewhere, payPal, Expensify).
@@ -1097,4 +1120,5 @@ export {
shouldReportBeInOptionList,
getChatByParticipants,
getIOUReportActionMessage,
+ getDisplayNameForParticipant,
};
diff --git a/src/libs/SidebarUtils.js b/src/libs/SidebarUtils.js
index 095864ad2fff..b260886f0e7b 100644
--- a/src/libs/SidebarUtils.js
+++ b/src/libs/SidebarUtils.js
@@ -100,11 +100,12 @@ function getOrderedReportIDs(reportIDFromRoute) {
// Get all the display names for our reports in an easy to access property so we don't have to keep
// re-running the logic
const filteredReportsWithReportName = _.map(filteredReports, (report) => {
- const personalDetailMap = OptionsListUtils.getPersonalDetailsForLogins(report.participants, personalDetails);
- return {
- ...report,
- reportDisplayName: ReportUtils.getReportName(report, personalDetailMap, policies),
- };
+ // Normally, the spread operator would be used here to clone the report and prevent the need to reassign the params.
+ // However, this code needs to be very performant to handle thousands of reports, so in the interest of speed, we're just going to disable this lint rule and add
+ // the reportDisplayName property to the report object directly.
+ // eslint-disable-next-line no-param-reassign
+ report.reportDisplayName = ReportUtils.getReportName(report, policies);
+ return report;
});
// Sorting the reports works like this:
@@ -142,10 +143,7 @@ function getOrderedReportIDs(reportIDFromRoute) {
pinnedReportOptions.push(report);
} else if (report.hasOutstandingIOU && !report.isIOUReportOwner) {
iouDebtReportOptions.push(report);
-
- // If the active report has a draft, we do not put it in the group of draft reports because we want it to maintain it's current position. Otherwise the report's position
- // jumps around in the LHN and it's kind of confusing to the user to see the LHN reorder when they start typing a comment on a report.
- } else if (report.hasDraft && report.reportID !== reportIDFromRoute) {
+ } else if (report.hasDraft) {
draftReportOptions.push(report);
} else {
recentReportOptions.push(report);
@@ -296,7 +294,7 @@ function getOptionData(reportID) {
result.payPalMeAddress = personalDetail.payPalMeAddress;
}
- const reportName = ReportUtils.getReportName(report, personalDetailMap, policies);
+ const reportName = ReportUtils.getReportName(report, policies);
result.text = reportName;
result.subtitle = subtitle;
result.participantsList = personalDetailList;
diff --git a/src/libs/actions/App.js b/src/libs/actions/App.js
index a12b2799cf7e..482538eb4993 100644
--- a/src/libs/actions/App.js
+++ b/src/libs/actions/App.js
@@ -117,21 +117,42 @@ AppState.addEventListener('change', (nextAppState) => {
*/
function openApp() {
API.read('OpenApp', {policyIDList}, {
- optimisticData: [{
- onyxMethod: CONST.ONYX.METHOD.MERGE,
- key: ONYXKEYS.IS_LOADING_REPORT_DATA,
- value: true,
- }],
- successData: [{
- onyxMethod: CONST.ONYX.METHOD.MERGE,
- key: ONYXKEYS.IS_LOADING_REPORT_DATA,
- value: false,
- }],
- failureData: [{
- onyxMethod: CONST.ONYX.METHOD.MERGE,
- key: ONYXKEYS.IS_LOADING_REPORT_DATA,
- value: false,
- }],
+ optimisticData: [
+ {
+ onyxMethod: CONST.ONYX.METHOD.MERGE,
+ key: ONYXKEYS.IS_LOADING_REPORT_DATA,
+ value: true,
+ },
+ {
+ onyxMethod: CONST.ONYX.METHOD.MERGE,
+ key: ONYXKEYS.IS_LOADING_INITIAL_APP_DATA,
+ value: true,
+ },
+ ],
+ successData: [
+ {
+ onyxMethod: CONST.ONYX.METHOD.MERGE,
+ key: ONYXKEYS.IS_LOADING_REPORT_DATA,
+ value: false,
+ },
+ {
+ onyxMethod: CONST.ONYX.METHOD.MERGE,
+ key: ONYXKEYS.IS_LOADING_INITIAL_APP_DATA,
+ value: false,
+ },
+ ],
+ failureData: [
+ {
+ onyxMethod: CONST.ONYX.METHOD.MERGE,
+ key: ONYXKEYS.IS_LOADING_REPORT_DATA,
+ value: false,
+ },
+ {
+ onyxMethod: CONST.ONYX.METHOD.MERGE,
+ key: ONYXKEYS.IS_LOADING_INITIAL_APP_DATA,
+ value: false,
+ },
+ ],
});
}
diff --git a/src/libs/actions/BankAccounts.js b/src/libs/actions/BankAccounts.js
index 9f6f808e8cbc..e81e2b863190 100644
--- a/src/libs/actions/BankAccounts.js
+++ b/src/libs/actions/BankAccounts.js
@@ -115,10 +115,9 @@ function connectBankAccountWithPlaid(bankAccountID, selectedPlaidBankAccount) {
* Adds a bank account via Plaid
*
* @param {Object} account
- * @param {String} password
* @TODO offline pattern for this command will have to be added later once the pattern B design doc is complete
*/
-function addPersonalBankAccount(account, password) {
+function addPersonalBankAccount(account) {
const commandName = 'AddPersonalBankAccount';
const parameters = {
@@ -130,7 +129,6 @@ function addPersonalBankAccount(account, password) {
bank: account.bankName,
plaidAccountID: account.plaidAccountID,
plaidAccessToken: account.plaidAccessToken,
- password,
};
const onyxData = {
diff --git a/src/libs/actions/IOU.js b/src/libs/actions/IOU.js
index ab8aba0d546a..d9ac2d1519a1 100644
--- a/src/libs/actions/IOU.js
+++ b/src/libs/actions/IOU.js
@@ -10,14 +10,19 @@ import Navigation from '../Navigation/Navigation';
import Growl from '../Growl';
import * as Localize from '../Localize';
import asyncOpenURL from '../asyncOpenURL';
-import Log from '../Log';
import * as API from '../API';
import * as ReportUtils from '../ReportUtils';
import * as IOUUtils from '../IOUUtils';
import * as OptionsListUtils from '../OptionsListUtils';
-import * as NumberUtils from '../NumberUtils';
import DateUtils from '../DateUtils';
+let chatReports;
+Onyx.connect({
+ key: ONYXKEYS.COLLECTION.REPORT,
+ waitForCollectionCallback: true,
+ callback: val => chatReports = val,
+});
+
let iouReports;
Onyx.connect({
key: ONYXKEYS.COLLECTION.REPORT_IOUS,
@@ -44,7 +49,7 @@ Onyx.connect({
* @param {Number} amount
* @param {String} currency
* @param {String} recipientEmail
- * @param {String} participant
+ * @param {Object} participant
* @param {String} comment
*/
function requestMoney(report, amount, currency, recipientEmail, participant, comment) {
@@ -210,7 +215,7 @@ function requestMoney(report, amount, currency, recipientEmail, participant, com
comment,
iouReportID: iouReport.reportID,
chatReportID: chatReport.reportID,
- transactionID: NumberUtils.rand64(),
+ transactionID: optimisticReportAction.originalMessage.IOUTransactionID,
reportActionID: optimisticReportAction.reportActionID,
clientID: optimisticReportAction.sequenceNumber,
}, {optimisticData, successData, failureData});
@@ -535,41 +540,102 @@ function splitBillAndOpenReport(participants, currentUserLogin, amount, comment,
}
/**
- * Reject an iouReport transaction. Declining and cancelling transactions are done via the same Auth command.
+ * Cancels or declines a transaction in iouReport.
+ * Declining and cancelling transactions are done via the same Auth command.
*
- * @param {Object} params
- * @param {Number} params.reportID
- * @param {Number} params.chatReportID
- * @param {String} params.transactionID
- * @param {String} params.comment
+ * @param {String} chatReportID
+ * @param {String} iouReportID
+ * @param {String} type - cancel|decline
+ * @param {Object} moneyRequestAction - the create IOU reportAction we are cancelling
*/
-function rejectTransaction({
- reportID, chatReportID, transactionID, comment,
-}) {
- Onyx.merge(ONYXKEYS.TRANSACTIONS_BEING_REJECTED, {
- [transactionID]: true,
- });
- DeprecatedAPI.RejectTransaction({
- reportID,
+function cancelMoneyRequest(chatReportID, iouReportID, type, moneyRequestAction) {
+ const chatReport = chatReports[`${ONYXKEYS.COLLECTION.REPORT}${chatReportID}`];
+ const iouReport = iouReports[`${ONYXKEYS.COLLECTION.REPORT_IOUS}${iouReportID}`];
+ const transactionID = moneyRequestAction.originalMessage.IOUTransactionID;
+
+ // Get the amount we are cancelling
+ const amount = moneyRequestAction.originalMessage.amount;
+ const newSequenceNumber = Report.getMaxSequenceNumber(chatReport.reportID) + 1;
+ const optimisticReportAction = ReportUtils.buildOptimisticIOUReportAction(
+ newSequenceNumber,
+ type,
+ amount,
+ moneyRequestAction.originalMessage.currency,
+ moneyRequestAction.originalMessage.comment,
+ [],
+ '',
transactionID,
- comment,
- })
- .then((response) => {
- if (response.jsonCode !== 200) {
- Log.hmmm('Error rejecting transaction', {error: response.error});
- return;
- }
+ iouReportID,
+ );
- const chatReport = response.reports[chatReportID];
- const iouReport = response.reports[reportID];
- Report.syncChatAndIOUReports(chatReport, iouReport);
- })
- .finally(() => {
- // Setting as null deletes the transactionID
- Onyx.merge(ONYXKEYS.TRANSACTIONS_BEING_REJECTED, {
- [transactionID]: null,
- });
- });
+ const currentUserEmail = optimisticReportAction.actorEmail;
+ const updatedIOUReport = IOUUtils.updateIOUOwnerAndTotal(iouReport, currentUserEmail, amount, type);
+
+ chatReport.maxSequenceNumber = newSequenceNumber;
+ chatReport.lastReadSequenceNumber = newSequenceNumber;
+ chatReport.lastMessageText = optimisticReportAction.message[0].text;
+ chatReport.lastMessageHtml = optimisticReportAction.message[0].html;
+ chatReport.hasOutstandingIOU = updatedIOUReport.total !== 0;
+
+ const optimisticData = [
+ {
+ onyxMethod: CONST.ONYX.METHOD.MERGE,
+ key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${chatReportID}`,
+ value: {
+ [optimisticReportAction.sequenceNumber]: {
+ ...optimisticReportAction,
+ pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD,
+ },
+ },
+ },
+ {
+ onyxMethod: CONST.ONYX.METHOD.MERGE,
+ key: `${ONYXKEYS.COLLECTION.REPORT}${chatReportID}`,
+ value: chatReport,
+ },
+ {
+ onyxMethod: CONST.ONYX.METHOD.MERGE,
+ key: `${ONYXKEYS.COLLECTION.REPORT_IOUS}${iouReportID}`,
+ value: updatedIOUReport,
+ },
+ ];
+ const successData = [
+ {
+ onyxMethod: CONST.ONYX.METHOD.MERGE,
+ key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${chatReportID}`,
+ value: {
+ [optimisticReportAction.sequenceNumber]: {
+ pendingAction: null,
+ },
+ },
+ },
+ ];
+ const failureData = [
+ {
+ onyxMethod: CONST.ONYX.METHOD.MERGE,
+ key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${chatReportID}`,
+ value: {
+ [optimisticReportAction.sequenceNumber]: {
+ pendingAction: null,
+ errors: {
+ [DateUtils.getMicroseconds()]: Localize.translateLocal('iou.error.genericCancelFailureMessage', {type}),
+ },
+ },
+ },
+ },
+ ];
+
+ API.write('CancelMoneyRequest', {
+ transactionID,
+ iouReportID: updatedIOUReport.reportID,
+ comment: '',
+ clientID: optimisticReportAction.sequenceNumber,
+ cancelMoneyRequestReportActionID: optimisticReportAction.reportActionID,
+ chatReportID,
+ debtorEmail: chatReport.participants[0],
+ }, {optimisticData, successData, failureData});
+
+ Navigation.navigate(ROUTES.getReportRoute(chatReportID));
}
/**
@@ -655,9 +721,9 @@ function payIOUReport({
}
export {
+ cancelMoneyRequest,
splitBill,
splitBillAndOpenReport,
- rejectTransaction,
requestMoney,
payIOUReport,
setIOUSelectedCurrency,
diff --git a/src/libs/actions/PaymentMethods.js b/src/libs/actions/PaymentMethods.js
index c2d278c46476..dac287fd6f6e 100644
--- a/src/libs/actions/PaymentMethods.js
+++ b/src/libs/actions/PaymentMethods.js
@@ -1,7 +1,6 @@
import _ from 'underscore';
import {createRef} from 'react';
import lodashGet from 'lodash/get';
-import lodashMerge from 'lodash/merge';
import Onyx from 'react-native-onyx';
import ONYXKEYS from '../../ONYXKEYS';
import * as DeprecatedAPI from '../deprecatedAPI';
@@ -316,7 +315,7 @@ function dismissSuccessfulTransferBalancePage() {
* @returns {Boolean}
*/
function hasPaymentMethodError(bankList, cardList) {
- const combinedPaymentMethods = lodashMerge(bankList, cardList);
+ const combinedPaymentMethods = {...bankList, ...cardList};
return _.some(combinedPaymentMethods, item => !_.isEmpty(item.errors));
}
diff --git a/src/libs/actions/PersonalDetails.js b/src/libs/actions/PersonalDetails.js
index 903ec76b4839..25c15217dfdf 100644
--- a/src/libs/actions/PersonalDetails.js
+++ b/src/libs/actions/PersonalDetails.js
@@ -12,6 +12,8 @@ import * as LoginUtils from '../LoginUtils';
import * as ReportUtils from '../ReportUtils';
import Growl from '../Growl';
import * as Localize from '../Localize';
+import Navigation from '../Navigation/Navigation';
+import ROUTES from '../../ROUTES';
let currentUserEmail = '';
Onyx.connect({
@@ -98,6 +100,7 @@ function formatPersonalDetails(personalDetailsList) {
const phoneNumber = details.phoneNumber || '';
const avatar = details.avatar || details.avatarThumbnail || ReportUtils.getDefaultAvatar(login);
const avatarThumbnail = getAvatarThumbnail(details, sanitizedLogin);
+ const validated = details.validated || false;
formattedResult[sanitizedLogin] = {
login: sanitizedLogin,
displayName,
@@ -109,6 +112,7 @@ function formatPersonalDetails(personalDetailsList) {
phoneNumber,
avatar,
avatarThumbnail,
+ validated,
};
});
return formattedResult;
@@ -259,6 +263,12 @@ function setPersonalDetails(details, shouldGrowl) {
});
}
+/**
+ * @param {String} firstName
+ * @param {String} lastName
+ * @param {String} pronouns
+ * @param {Object} timezone
+ */
function updateProfile(firstName, lastName, pronouns, timezone) {
API.write('UpdateProfile', {
firstName,
@@ -285,6 +295,30 @@ function updateProfile(firstName, lastName, pronouns, timezone) {
});
}
+/**
+ * @param {String} firstName
+ * @param {String} lastName
+ */
+function updateDisplayName(firstName, lastName) {
+ API.write('UpdateDisplayName', {firstName, lastName}, {
+ optimisticData: [{
+ onyxMethod: CONST.ONYX.METHOD.MERGE,
+ key: ONYXKEYS.PERSONAL_DETAILS,
+ value: {
+ [currentUserEmail]: {
+ firstName,
+ lastName,
+ displayName: getDisplayName(currentUserEmail, {
+ firstName,
+ lastName,
+ }),
+ },
+ },
+ }],
+ });
+ Navigation.navigate(ROUTES.SETTINGS_PROFILE);
+}
+
/**
* Fetches the local currency based on location and sets currency code/symbol to Onyx
*/
@@ -397,5 +431,6 @@ export {
getMaxCharacterError,
extractFirstAndLastNameFromAvailableDetails,
updateProfile,
+ updateDisplayName,
clearAvatarErrors,
};
diff --git a/src/libs/actions/Policy.js b/src/libs/actions/Policy.js
index 6816e41333bb..3571894df938 100644
--- a/src/libs/actions/Policy.js
+++ b/src/libs/actions/Policy.js
@@ -4,7 +4,6 @@ import lodashGet from 'lodash/get';
import {PUBLIC_DOMAINS} from 'expensify-common/lib/CONST';
import Str from 'expensify-common/lib/str';
import {escapeRegExp} from 'lodash';
-import * as DeprecatedAPI from '../deprecatedAPI';
import * as API from '../API';
import ONYXKEYS from '../../ONYXKEYS';
import CONST from '../../CONST';
@@ -47,56 +46,6 @@ Onyx.connect({
},
});
-/**
- * Simplifies the employeeList response into an object mapping employee email to a default employee list entry
- *
- * @param {Object} employeeList
- * @returns {Object}
- */
-function getSimplifiedEmployeeList(employeeList) {
- return _.chain(employeeList)
- .pluck('email')
- .flatten()
- .unique()
- .reduce((map, email) => ({...map, [email]: {}}), {})
- .value();
-}
-
-/**
- * Takes a full policy that is returned from the policyList and simplifies it so we are only storing
- * the pieces of data that we need to in Onyx
- *
- * @param {Object} fullPolicyOrPolicySummary
- * @param {String} fullPolicyOrPolicySummary.id
- * @param {String} fullPolicyOrPolicySummary.name
- * @param {String} fullPolicyOrPolicySummary.role
- * @param {String} fullPolicyOrPolicySummary.type
- * @param {String} fullPolicyOrPolicySummary.outputCurrency
- * @param {String} [fullPolicyOrPolicySummary.avatar]
- * @param {String} [fullPolicyOrPolicySummary.value.avatar]
- * @param {Object} [fullPolicyOrPolicySummary.value.employeeList]
- * @param {Object} [fullPolicyOrPolicySummary.value.customUnits]
- * @param {Boolean} isFromFullPolicy,
- * @returns {Object}
- */
-function getSimplifiedPolicyObject(fullPolicyOrPolicySummary, isFromFullPolicy) {
- return {
- isFromFullPolicy,
- id: fullPolicyOrPolicySummary.id,
- name: fullPolicyOrPolicySummary.name,
- role: fullPolicyOrPolicySummary.role,
- type: fullPolicyOrPolicySummary.type,
- owner: fullPolicyOrPolicySummary.owner,
- outputCurrency: fullPolicyOrPolicySummary.outputCurrency,
-
- // "GetFullPolicy" and "GetPolicySummaryList" returns different policy objects. If policy is retrieved by "GetFullPolicy",
- // avatar will be nested within the key "value"
- avatar: fullPolicyOrPolicySummary.avatar
- || lodashGet(fullPolicyOrPolicySummary, 'value.avatar', ''),
- customUnits: lodashGet(fullPolicyOrPolicySummary, 'value.customUnits', {}),
- };
-}
-
/**
* Stores in Onyx the policy ID of the last workspace that was accessed by the user
* @param {String|null} policyID
@@ -127,18 +76,22 @@ function deleteWorkspace(policyID, reports) {
value: {
stateNum: CONST.REPORT.STATE_NUM.SUBMITTED,
statusNum: CONST.REPORT.STATUS.CLOSED,
+ hasDraft: false,
},
})),
];
// Restore the old report stateNum and statusNum
const failureData = [
- ..._.map(reports, ({reportID, stateNum, statusNum}) => ({
+ ..._.map(reports, ({
+ reportID, stateNum, statusNum, hasDraft,
+ }) => ({
onyxMethod: CONST.ONYX.METHOD.MERGE,
key: `${ONYXKEYS.COLLECTION.REPORT}${reportID}`,
value: {
stateNum,
statusNum,
+ hasDraft,
},
})),
];
@@ -154,26 +107,6 @@ function deleteWorkspace(policyID, reports) {
}
}
-/**
- * @param {String} policyID
- */
-function loadFullPolicy(policyID) {
- DeprecatedAPI.GetFullPolicy(policyID)
- .then((data) => {
- if (data.jsonCode !== 200) {
- return;
- }
-
- const policy = lodashGet(data, 'policyList[0]', {});
- if (!policy.id) {
- return;
- }
-
- Onyx.merge(`${ONYXKEYS.COLLECTION.POLICY}${policy.id}`, getSimplifiedPolicyObject(policy, true));
- Onyx.merge(`${ONYXKEYS.COLLECTION.POLICY_MEMBER_LIST}${policy.id}`, getSimplifiedEmployeeList(lodashGet(policy, 'value.employeeList', {})));
- });
-}
-
/**
* Is the user an admin of a free policy (aka workspace)?
*
@@ -496,8 +429,9 @@ function hideWorkspaceAlertMessage(policyID) {
* @param {String} policyID
* @param {Object} currentCustomUnit
* @param {Object} newCustomUnit
+ * @param {Number} lastModified
*/
-function updateWorkspaceCustomUnit(policyID, currentCustomUnit, newCustomUnit) {
+function updateWorkspaceCustomUnit(policyID, currentCustomUnit, newCustomUnit, lastModified) {
const optimisticData = [
{
onyxMethod: 'merge',
@@ -549,6 +483,7 @@ function updateWorkspaceCustomUnit(policyID, currentCustomUnit, newCustomUnit) {
API.write('UpdateWorkspaceCustomUnit', {
policyID,
+ lastModified,
customUnit: JSON.stringify(newCustomUnit),
}, {optimisticData, successData, failureData});
}
@@ -558,8 +493,9 @@ function updateWorkspaceCustomUnit(policyID, currentCustomUnit, newCustomUnit) {
* @param {Object} currentCustomUnitRate
* @param {String} customUnitID
* @param {Object} newCustomUnitRate
+ * @param {Number} lastModified
*/
-function updateCustomUnitRate(policyID, currentCustomUnitRate, customUnitID, newCustomUnitRate) {
+function updateCustomUnitRate(policyID, currentCustomUnitRate, customUnitID, newCustomUnitRate, lastModified) {
const optimisticData = [
{
onyxMethod: 'merge',
@@ -622,6 +558,7 @@ function updateCustomUnitRate(policyID, currentCustomUnitRate, customUnitID, new
API.write('UpdateWorkspaceCustomUnitRate', {
policyID,
customUnitID,
+ lastModified,
customUnitRate: JSON.stringify(newCustomUnitRate),
}, {optimisticData, successData, failureData});
}
@@ -665,6 +602,15 @@ function clearDeleteWorkspaceError(policyID) {
});
}
+/**
+ * Removes the workspace after failure to create.
+ *
+ * @param {String} policyID
+ */
+function removeWorkspace(policyID) {
+ Onyx.set(`${ONYXKEYS.COLLECTION.POLICY}${policyID}`, null);
+}
+
/**
* Generate a policy name based on an email and policy list.
* @param {String} [email] the email to base the workspace name on. If not passed, will use the logged in user's email instead
@@ -845,11 +791,6 @@ function createWorkspace(ownerEmail = '', makeMeAdmin = false) {
},
}],
failureData: [{
- onyxMethod: CONST.ONYX.METHOD.SET,
- key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`,
- value: null,
- },
- {
onyxMethod: CONST.ONYX.METHOD.SET,
key: `${ONYXKEYS.COLLECTION.POLICY_MEMBER_LIST}${policyID}`,
value: null,
@@ -927,7 +868,6 @@ function openWorkspaceInvitePage(policyID, clientMemberEmails) {
}
export {
- loadFullPolicy,
removeMembers,
addMembersToWorkspace,
isAdminOfFreePolicy,
@@ -952,4 +892,5 @@ export {
createWorkspace,
openWorkspaceMembersPage,
openWorkspaceInvitePage,
+ removeWorkspace,
};
diff --git a/src/libs/actions/ReimbursementAccount/resetFreePlanBankAccount.js b/src/libs/actions/ReimbursementAccount/resetFreePlanBankAccount.js
index 3ef49fbc854f..021623a51aa9 100644
--- a/src/libs/actions/ReimbursementAccount/resetFreePlanBankAccount.js
+++ b/src/libs/actions/ReimbursementAccount/resetFreePlanBankAccount.js
@@ -5,6 +5,7 @@ import * as store from './store';
import Navigation from '../../Navigation/Navigation';
import ROUTES from '../../../ROUTES';
import * as API from '../../API';
+import BankAccount from '../../models/BankAccount';
/**
* Reset user's reimbursement account. This will delete the bank account.
@@ -24,6 +25,7 @@ function resetFreePlanBankAccount() {
isInSetup: true,
domainLimit: 0,
currentStep: CONST.BANK_ACCOUNT.STEP.BANK_ACCOUNT,
+ state: BankAccount.STATE.DELETED,
};
API.write('RestartBankAccountSetup',
diff --git a/src/libs/actions/Report.js b/src/libs/actions/Report.js
index 1c87c0d5a053..ee240ac8ce67 100644
--- a/src/libs/actions/Report.js
+++ b/src/libs/actions/Report.js
@@ -1384,6 +1384,27 @@ function setIsComposerFullSize(reportID, isComposerFullSize) {
Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT_IS_COMPOSER_FULL_SIZE}${reportID}`, isComposerFullSize);
}
+const defaultNewActionSubscriber = {
+ reportID: '',
+ callback: () => {},
+};
+
+let newActionSubscriber = defaultNewActionSubscriber;
+
+/**
+ * Enables the Report actions file to let the ReportActionsView know that a new comment has arrived in realtime for the current report
+ *
+ * @param {String} reportID
+ * @param {Function} callback
+ * @returns {Function}
+ */
+function subscribeToNewActionEvent(reportID, callback) {
+ newActionSubscriber = {callback, reportID};
+ return () => {
+ newActionSubscriber = defaultNewActionSubscriber;
+ };
+}
+
/**
* @param {String} reportID
* @param {Object} action
@@ -1398,7 +1419,10 @@ function viewNewReportAction(reportID, action) {
if (isFromCurrentUser) {
updatedReportObject.lastVisitedTimestamp = Date.now();
updatedReportObject.lastReadSequenceNumber = action.sequenceNumber;
- updatedReportObject.maxSequenceNumber = action.sequenceNumber;
+ }
+
+ if (reportID === newActionSubscriber.reportID) {
+ newActionSubscriber.callback(isFromCurrentUser, updatedReportObject.maxSequenceNumber);
}
Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT}${reportID}`, updatedReportObject);
@@ -1478,12 +1502,6 @@ Onyx.connect({
return;
}
- // We don't want to process any new actions that have a pendingAction field as this means they are "optimistic" and no notifications
- // should be created for them
- if (!_.isEmpty(action.pendingAction)) {
- return;
- }
-
if (!action.timestamp) {
return;
}
@@ -1536,4 +1554,5 @@ export {
clearPolicyRoomNameErrors,
clearIOUError,
getMaxSequenceNumber,
+ subscribeToNewActionEvent,
};
diff --git a/src/libs/deprecatedAPI.js b/src/libs/deprecatedAPI.js
index 7db326b66713..b5dd9d2b4cd0 100644
--- a/src/libs/deprecatedAPI.js
+++ b/src/libs/deprecatedAPI.js
@@ -1,5 +1,4 @@
import _ from 'underscore';
-import isViaExpensifyCashNative from './isViaExpensifyCashNative';
import requireParameters from './requireParameters';
import * as Request from './Request';
import * as Network from './Network';
@@ -125,34 +124,6 @@ function GetIOUReport(parameters) {
return Network.post(commandName, parameters);
}
-/**
- * @returns {Promise}
- * @param {String} policyID
- */
-function GetFullPolicy(policyID) {
- if (!_.isString(policyID)) {
- throw new Error('[API] Must include a single policyID with calls to API.GetFullPolicy');
- }
-
- const commandName = 'Get';
- const parameters = {
- returnValueList: 'policyList',
- policyIDList: policyID,
- };
- return Network.post(commandName, parameters);
-}
-
-/**
- * @returns {Promise}
- */
-function GetPolicySummaryList() {
- const commandName = 'Get';
- const parameters = {
- returnValueList: 'policySummaryList',
- };
- return Network.post(commandName, parameters);
-}
-
/**
* @param {Object} parameters
* @param {String} parameters.name
@@ -215,43 +186,6 @@ function PersonalDetails_Update(parameters) {
return Network.post(commandName, parameters);
}
-/**
- * @param {Object} parameters
- * @param {Object} parameters.name
- * @param {Object} parameters.value
- * @returns {Promise}
- */
-function PreferredLocale_Update(parameters) {
- const commandName = 'PreferredLocale_Update';
- requireParameters(['name', 'value'],
- parameters, commandName);
- return Network.post(commandName, parameters);
-}
-
-/**
- * @param {Object} parameters
- * @param {Number} parameters.reportID
- * @param {String} parameters.transactionID
- * @returns {Promise}
- */
-function RejectTransaction(parameters) {
- const commandName = 'RejectTransaction';
- requireParameters(['reportID', 'transactionID'], parameters, commandName);
- return Network.post(commandName, parameters);
-}
-
-/**
- * @param {Object} parameters
- * @param {Number} parameters.reportID
- * @returns {Promise}
- */
-function Report_GetHistory(parameters) {
- const commandName = 'Report_GetHistory';
- requireParameters(['reportID'],
- parameters, commandName);
- return Network.post(commandName, parameters);
-}
-
/**
* @param {Object} parameters
* @param {String} parameters.email
@@ -300,17 +234,6 @@ function User_SecondaryLogin_Send(parameters) {
return Network.post(commandName, parameters);
}
-/**
- * @param {Object} parameters
- * @param {File|Object} parameters.file
- * @returns {Promise}
- */
-function User_UploadAvatar(parameters) {
- const commandName = 'User_UploadAvatar';
- requireParameters(['file'], parameters, commandName);
- return Network.post(commandName, parameters);
-}
-
/**
* @param {Object} parameters
* @param {Number} parameters.accountID
@@ -323,24 +246,6 @@ function ValidateEmail(parameters) {
return Network.post(commandName, parameters);
}
-/**
- * @param {String} firstName
- * @param {String} lastName
- * @param {String} dob
- * @returns {Promise}
- */
-function Wallet_GetOnfidoSDKToken(firstName, lastName, dob) {
- return Network.post('Wallet_GetOnfidoSDKToken', {
- // We need to pass this so we can request a token with the correct referrer
- // This value comes from a cross-platform module which returns true for native
- // platforms and false for non-native platforms.
- isViaExpensifyCashNative,
- firstName,
- lastName,
- dob,
- }, CONST.NETWORK.METHOD.POST, true);
-}
-
/**
* @param {Object} parameters
* @param {String} parameters.currentStep
@@ -356,21 +261,6 @@ function Wallet_Activate(parameters) {
return Network.post(commandName, parameters, CONST.NETWORK.METHOD.POST, true);
}
-/**
- * @param {Object} parameters
- * @param {Object[]} parameters.employees
- * @param {String} parameters.welcomeNote
- * @param {String} parameters.policyID
- * @returns {Promise}
- */
-function Policy_Employees_Merge(parameters) {
- const commandName = 'Policy_Employees_Merge';
- requireParameters(['employees', 'welcomeNote', 'policyID'], parameters, commandName);
-
- // Always include returnPersonalDetails to ensure we get the employee's personal details in the response
- return Network.post(commandName, {...parameters, returnPersonalDetails: true});
-}
-
/**
* @param {*} parameters
* @returns {Promise}
@@ -413,74 +303,6 @@ function BankAccount_SetupWithdrawal(parameters) {
);
}
-/**
- * @param {Object} parameters
- * @param {Number} [parameters.latitude]
- * @param {Number} [parameters.longitude]
- * @returns {Promise}
- */
-function GetLocalCurrency(parameters) {
- const commandName = 'GetLocalCurrency';
- return Network.post(commandName, parameters);
-}
-
-/**
- * @returns {Promise}
- */
-function User_IsUsingExpensifyCard() {
- return Network.post('User_IsUsingExpensifyCard', {});
-}
-
-/**
- * @param {Object} parameters
- * @param {String} parameters.policyID
- * @param {String} parameters.customUnitID
- * @param {String} parameters.value
- * @returns {Promise}
- */
-function Policy_CustomUnitRate_Update(parameters) {
- const commandName = 'Policy_CustomUnitRate_Update';
- requireParameters(['policyID', 'customUnitID', 'customUnitRate'], parameters, commandName);
- return Network.post(commandName, parameters);
-}
-
-/**
- * @param {Object} parameters
- * @param {String} [parameters.policyID]
- * @returns {Promise}
- */
-function Policy_Delete(parameters) {
- const commandName = 'Policy_Delete';
- return Network.post(commandName, parameters);
-}
-
-/**
- * @param {Object} parameters
- * @param {String} parameters.policyID
- * @param {Array} parameters.emailList
- * @returns {Promise}
- */
-function Policy_Employees_Remove(parameters) {
- const commandName = 'Policy_Employees_Remove';
- requireParameters(['policyID', 'emailList'], parameters, commandName);
- return Network.post(commandName, parameters);
-}
-
-/**
- * @param {Object} parameters
- * @param {String} parameters.taskID
- * @param {String} parameters.policyID
- * @param {String} parameters.firstName
- * @param {String} parameters.lastName
- * @param {String} parameters.phoneNumber
- * @returns {Promise}
- */
-function Inbox_CallUser(parameters) {
- const commandName = 'Inbox_CallUser';
- requireParameters(['taskID', 'policyID', 'firstName', 'lastName', 'phoneNumber'], parameters, commandName);
- return Network.post(commandName, parameters);
-}
-
/**
* @param {Object} parameters
* @param {String} parameters.reportIDList
@@ -527,32 +349,18 @@ export {
Get,
GetStatementPDF,
GetIOUReport,
- GetFullPolicy,
- GetPolicySummaryList,
GetReportSummaryList,
Graphite_Timer,
- Inbox_CallUser,
PayIOU,
PayWithWallet,
PersonalDetails_GetForEmails,
PersonalDetails_Update,
- Policy_Employees_Merge,
- RejectTransaction,
- Report_GetHistory,
ResendValidateCode,
SetNameValuePair,
SetPassword,
User_SignUp,
- User_IsUsingExpensifyCard,
User_SecondaryLogin_Send,
- User_UploadAvatar,
ValidateEmail,
Wallet_Activate,
- Wallet_GetOnfidoSDKToken,
TransferWalletBalance,
- GetLocalCurrency,
- Policy_CustomUnitRate_Update,
- Policy_Employees_Remove,
- PreferredLocale_Update,
- Policy_Delete,
};
diff --git a/src/libs/isViaExpensifyCashNative/index.js b/src/libs/isViaExpensifyCashNative/index.js
deleted file mode 100644
index 21e5dd254a47..000000000000
--- a/src/libs/isViaExpensifyCashNative/index.js
+++ /dev/null
@@ -1,8 +0,0 @@
-/**
- * The API library has a request for Wallet_GetOnfidoSDKToken which needs to know if the request is coming from
- * the native platform or the non-native platform. This module will return true for the native platforms and false
- * for the non-native platforms
- * @type {boolean}
- */
-const isViaExpensifyCashNative = false;
-export default isViaExpensifyCashNative;
diff --git a/src/libs/isViaExpensifyCashNative/index.native.js b/src/libs/isViaExpensifyCashNative/index.native.js
deleted file mode 100644
index 44d4c5e456d2..000000000000
--- a/src/libs/isViaExpensifyCashNative/index.native.js
+++ /dev/null
@@ -1,8 +0,0 @@
-/**
- * The API library has a request for Wallet_GetOnfidoSDKToken which needs to know if the request is coming from
- * the native platform or the non-native platform. This module will return true for the native platforms and false
- * for the non-native platforms
- * @type {boolean}
- */
-const isViaExpensifyCashNative = true;
-export default isViaExpensifyCashNative;
diff --git a/src/pages/AddPersonalBankAccountPage.js b/src/pages/AddPersonalBankAccountPage.js
index f9a09fa0a4ae..67be90c921f2 100644
--- a/src/pages/AddPersonalBankAccountPage.js
+++ b/src/pages/AddPersonalBankAccountPage.js
@@ -21,8 +21,6 @@ import defaultTheme from '../styles/themes/default';
import Button from '../components/Button';
import FixedFooter from '../components/FixedFooter';
import Form from '../components/Form';
-import TextInput from '../components/TextInput';
-import canFocusInputOnScreenFocus from '../libs/canFocusInputOnScreenFocus/index.native';
import ROUTES from '../ROUTES';
const propTypes = {
@@ -70,30 +68,18 @@ class AddPersonalBankAccountPage extends React.Component {
}
/**
- * @param {Object} values - form input values passed by the Form component
- * @param {Object} values.password The password of the user adding the bank account, for security.
* @returns {Object}
*/
- validate(values) {
- const errors = {};
-
- if (_.isEmpty(values.password)) {
- errors.password = `${this.props.translate('common.password')} ${this.props.translate('common.isRequiredField')}.`;
- }
-
- return errors;
+ validate() {
+ return {};
}
- /**
- * @param {Object} values - form input values passed by the Form component
- * @param {Object} values.password The password of the user adding the bank account, for security.
- */
- submit(values) {
+ submit() {
const selectedPlaidBankAccount = _.findWhere(lodashGet(this.props.plaidData, 'bankAccounts', []), {
plaidAccountID: this.state.selectedPlaidAccountID,
});
- BankAccounts.addPersonalBankAccount(selectedPlaidBankAccount, values.password);
+ BankAccounts.addPersonalBankAccount(selectedPlaidBankAccount);
}
render() {
@@ -153,17 +139,6 @@ class AddPersonalBankAccountPage extends React.Component {
receivedRedirectURI={getPlaidOAuthReceivedRedirectURI()}
selectedPlaidAccountID={this.state.selectedPlaidAccountID}
/>
- {Boolean(this.state.selectedPlaidAccountID) && (
-
- )}
>
)}
diff --git a/src/pages/DetailsPage.js b/src/pages/DetailsPage.js
index dd94fca3f6ee..17ad4f971393 100755
--- a/src/pages/DetailsPage.js
+++ b/src/pages/DetailsPage.js
@@ -20,7 +20,6 @@ import CONST from '../CONST';
import * as ReportUtils from '../libs/ReportUtils';
import DateUtils from '../libs/DateUtils';
import * as Expensicons from '../components/Icon/Expensicons';
-import FullscreenLoadingIndicator from '../components/FullscreenLoadingIndicator';
import MenuItem from '../components/MenuItem';
import AttachmentModal from '../components/AttachmentModal';
import PressableWithoutFocus from '../components/PressableWithoutFocus';
@@ -82,19 +81,23 @@ class DetailsPage extends React.PureComponent {
}
render() {
- const details = lodashGet(this.props.personalDetails, lodashGet(this.props.route.params, 'login'));
+ let details = lodashGet(this.props.personalDetails, lodashGet(this.props.route.params, 'login'));
if (!details) {
- // Personal details have not loaded yet
- return ;
+ const login = lodashGet(this.props.route.params, 'login');
+ details = {
+ login,
+ displayName: ReportUtils.getDisplayNameForParticipant(login),
+ avatar: ReportUtils.getDefaultAvatar(),
+ };
}
const isSMSLogin = Str.isSMSLogin(details.login);
// If we have a reportID param this means that we
// arrived here via the ParticipantsPage and should be allowed to navigate back to it
const shouldShowBackButton = Boolean(this.props.route.params.reportID);
- const timezone = DateUtils.getLocalMomentFromTimestamp(this.props.preferredLocale, null, details.timezone.selected);
- const GMTTime = `${timezone.toString().split(/[+-]/)[0].slice(-3)} ${timezone.zoneAbbr()}`;
- const currentTime = Number.isNaN(Number(timezone.zoneAbbr())) ? timezone.zoneAbbr() : GMTTime;
+ const timezone = details.timezone ? DateUtils.getLocalMomentFromTimestamp(this.props.preferredLocale, null, details.timezone.selected) : null;
+ const GMTTime = timezone ? `${timezone.toString().split(/[+-]/)[0].slice(-3)} ${timezone.zoneAbbr()}` : '';
+ const currentTime = (timezone && Number.isNaN(Number(timezone.zoneAbbr()))) ? timezone.zoneAbbr() : GMTTime;
const shouldShowLocalTime = !ReportUtils.hasExpensifyEmails([details.login]);
let pronouns = details.pronouns;
diff --git a/src/pages/EnablePayments/walletTermsPropTypes.js b/src/pages/EnablePayments/walletTermsPropTypes.js
index db77ecb36883..c5f19cd3a9f2 100644
--- a/src/pages/EnablePayments/walletTermsPropTypes.js
+++ b/src/pages/EnablePayments/walletTermsPropTypes.js
@@ -6,5 +6,5 @@ export default PropTypes.shape({
errors: PropTypes.objectOf(PropTypes.string),
/** When the user accepts the Wallet's terms in order to pay an IOU, this is the ID of the chatReport the IOU is linked to */
- chatReportID: PropTypes.number,
+ chatReportID: PropTypes.string,
});
diff --git a/src/pages/ReimbursementAccount/ACHContractStep.js b/src/pages/ReimbursementAccount/ACHContractStep.js
index a5b131922ac9..f6e21955b9b6 100644
--- a/src/pages/ReimbursementAccount/ACHContractStep.js
+++ b/src/pages/ReimbursementAccount/ACHContractStep.js
@@ -231,6 +231,7 @@ class ACHContractStep extends React.Component {
{this.props.translate('beneficialOwnersStep.additionalOwner')}
this.clearErrorAndSetBeneficialOwnerValues(index, values)}
values={{
diff --git a/src/pages/ReimbursementAccount/CompanyStep.js b/src/pages/ReimbursementAccount/CompanyStep.js
index 281e3f3b9430..bc0c9857714a 100644
--- a/src/pages/ReimbursementAccount/CompanyStep.js
+++ b/src/pages/ReimbursementAccount/CompanyStep.js
@@ -48,6 +48,7 @@ class CompanyStep extends React.Component {
this.submit = this.submit.bind(this);
this.clearErrorAndSetValue = this.clearErrorAndSetValue.bind(this);
this.clearError = inputKey => ReimbursementAccountUtils.clearError(this.props, inputKey);
+ this.clearErrors = inputKeys => ReimbursementAccountUtils.clearErrors(this.props, inputKeys);
this.getErrors = () => ReimbursementAccountUtils.getErrors(this.props);
this.getErrorText = inputKey => ReimbursementAccountUtils.getErrorText(this.props, this.errorTranslationKeys, inputKey);
@@ -93,7 +94,6 @@ class CompanyStep extends React.Component {
website: 'bankAccount.error.website',
companyTaxID: 'bankAccount.error.taxID',
incorporationDate: 'bankAccount.error.incorporationDate',
- incorporationDateFuture: 'bankAccount.error.incorporationDateFuture',
incorporationType: 'bankAccount.error.companyType',
hasNoConnectionToCannabis: 'bankAccount.error.restrictedBusiness',
incorporationState: 'bankAccount.error.incorporationState',
@@ -109,9 +109,6 @@ class CompanyStep extends React.Component {
this.setState(newState);
ReimbursementAccount.updateReimbursementAccountDraft(newState);
this.clearError(inputKey);
- if (inputKey === 'incorporationDate') {
- this.clearError('incorporationDateFuture');
- }
}
/**
@@ -144,12 +141,8 @@ class CompanyStep extends React.Component {
errors.companyTaxID = true;
}
- if (!ValidationUtils.isValidDate(this.state.incorporationDate)) {
- errors.incorporationDate = true;
- }
-
if (!ValidationUtils.isValidPastDate(this.state.incorporationDate)) {
- errors.incorporationDateFuture = true;
+ errors.incorporationDate = true;
}
if (!ValidationUtils.isValidUSPhone(this.state.companyPhone, true)) {
@@ -229,10 +222,14 @@ class CompanyStep extends React.Component {
city: 'addressCity',
zipCode: 'addressZipCode',
};
+ const renamedValues = {};
_.each(values, (value, inputKey) => {
const renamedInputKey = lodashGet(renamedFields, inputKey, inputKey);
- this.clearErrorAndSetValue(renamedInputKey, value);
+ renamedValues[renamedInputKey] = value;
});
+ this.setState(renamedValues);
+ this.clearErrors(_.keys(renamedValues));
+ ReimbursementAccount.updateReimbursementAccountDraft(renamedValues);
}}
/>
this.clearErrorAndSetValue('incorporationDate', value)}
defaultValue={this.state.incorporationDate}
placeholder={this.props.translate('companyStep.incorporationDatePlaceholder')}
- errorText={this.getErrorText('incorporationDate') || this.getErrorText('incorporationDateFuture')}
+ errorText={this.getErrorText('incorporationDate')}
maximumDate={new Date()}
/>
diff --git a/src/pages/ReimbursementAccount/IdentityForm.js b/src/pages/ReimbursementAccount/IdentityForm.js
index 7925133bbf1e..1c06061a44cb 100644
--- a/src/pages/ReimbursementAccount/IdentityForm.js
+++ b/src/pages/ReimbursementAccount/IdentityForm.js
@@ -1,9 +1,9 @@
import React from 'react';
import {View} from 'react-native';
import PropTypes from 'prop-types';
+import _ from 'underscore';
import TextInput from '../../components/TextInput';
import styles from '../../styles/styles';
-import withLocalize, {withLocalizePropTypes} from '../../components/withLocalize';
import CONST from '../../CONST';
import DatePicker from '../../components/DatePicker';
import AddressForm from './AddressForm';
@@ -13,7 +13,7 @@ const propTypes = {
style: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.object), PropTypes.object]),
/** Callback fired when a field changes. Passes args as {[fieldName]: val} */
- onFieldChange: PropTypes.func.isRequired,
+ onFieldChange: PropTypes.func,
/** Form values */
values: PropTypes.shape({
@@ -45,12 +45,39 @@ const propTypes = {
/** Any errors that can arise from form validation */
errors: PropTypes.objectOf(PropTypes.bool),
- ...withLocalizePropTypes,
+ /** The map for inputID of the inputs */
+ inputKeys: PropTypes.shape({
+ firstName: PropTypes.string,
+ lastName: PropTypes.string,
+ dob: PropTypes.string,
+ ssnLast4: PropTypes.string,
+ street: PropTypes.string,
+ city: PropTypes.string,
+ state: PropTypes.string,
+ zipCode: PropTypes.string,
+ }),
+
+ /** Saves a draft of the input value when used in a form */
+ shouldSaveDraft: PropTypes.bool,
+
+ /** Returns translated string for given locale and phrase */
+ translate: PropTypes.func.isRequired,
};
const defaultProps = {
style: {},
values: {
+ firstName: undefined,
+ lastName: undefined,
+ street: undefined,
+ city: undefined,
+ state: undefined,
+ zipCode: undefined,
+ dob: undefined,
+ ssnLast4: undefined,
+ },
+ errors: {},
+ inputKeys: {
firstName: '',
lastName: '',
street: '',
@@ -60,7 +87,8 @@ const defaultProps = {
dob: '',
ssnLast4: '',
},
- errors: {},
+ shouldSaveDraft: false,
+ onFieldChange: () => {},
};
const IdentityForm = (props) => {
@@ -73,6 +101,8 @@ const IdentityForm = (props) => {
props.onFieldChange({firstName: value})}
@@ -81,6 +111,8 @@ const IdentityForm = (props) => {
props.onFieldChange({lastName: value})}
@@ -89,6 +121,8 @@ const IdentityForm = (props) => {
{
maximumDate={new Date()}
/>
{
maxLength={CONST.BANK_ACCOUNT.MAX_LENGTH.SSN}
/>
{
IdentityForm.propTypes = propTypes;
IdentityForm.defaultProps = defaultProps;
IdentityForm.displayName = 'IdentityForm';
-export default withLocalize(IdentityForm);
+export default IdentityForm;
diff --git a/src/pages/ReimbursementAccount/RequestorStep.js b/src/pages/ReimbursementAccount/RequestorStep.js
index 70e00a46b96e..05fc624d61be 100644
--- a/src/pages/ReimbursementAccount/RequestorStep.js
+++ b/src/pages/ReimbursementAccount/RequestorStep.js
@@ -221,6 +221,7 @@ class RequestorStep extends React.Component {
ssnLast4: this.state.ssnLast4,
}}
errors={this.props.reimbursementAccount.errorFields}
+ translate={this.props.translate}
/>
{
return ({
alternateText: userLogin,
displayName: userPersonalDetail.displayName,
- icons: [userPersonalDetail.avatar],
+ icons: userPersonalDetail.avatar ? [userPersonalDetail.avatar] : [ReportUtils.getDefaultAvatar()],
keyForList: userLogin,
login,
text: userPersonalDetail.displayName,
diff --git a/src/pages/home/HeaderView.js b/src/pages/home/HeaderView.js
index 696d8ca5be66..2e048ad18bd8 100644
--- a/src/pages/home/HeaderView.js
+++ b/src/pages/home/HeaderView.js
@@ -61,7 +61,7 @@ const HeaderView = (props) => {
const displayNamesWithTooltips = ReportUtils.getDisplayNamesWithTooltips(participantPersonalDetails, isMultipleParticipant);
const isChatRoom = ReportUtils.isChatRoom(props.report);
const isPolicyExpenseChat = ReportUtils.isPolicyExpenseChat(props.report);
- const title = ReportUtils.getReportName(props.report, participantPersonalDetails, props.policies);
+ const title = ReportUtils.getReportName(props.report, props.policies);
const subtitle = ReportUtils.getChatRoomSubtitle(props.report, props.policies);
const isConcierge = participants.length === 1 && _.contains(participants, CONST.EMAIL.CONCIERGE);
diff --git a/src/pages/home/ReportScreen.js b/src/pages/home/ReportScreen.js
index d85dabdf9dcd..8bb7acdd0457 100644
--- a/src/pages/home/ReportScreen.js
+++ b/src/pages/home/ReportScreen.js
@@ -146,20 +146,20 @@ class ReportScreen extends React.Component {
}
/**
- * When reports change there's a brief time content is not ready to be displayed
- * It Should show the loader if it's the first time we are opening the report
+ * When false the ReportActionsView will completely unmount and we will show a loader until it returns true.
*
* @returns {Boolean}
*/
- shouldShowLoader() {
+ isReportReadyForDisplay() {
const reportIDFromPath = getReportID(this.props.route);
- // This means there are no reportActions at all to display, but it is still in the process of loading the next set of actions.
- const isLoadingInitialReportActions = _.isEmpty(this.props.reportActions) && this.props.report.isLoadingReportActions;
+ // We need to wait for the initial app data to load as it tells us which reports are unread. Waiting will allow the new marker to be set
+ // correctly when the report mounts. If we don't do this, the report may initialize in the "read" state and the marker won't be set at all.
+ const isLoadingInitialAppData = this.props.isLoadingInitialAppData;
// This is necessary so that when we are retrieving the next report data from Onyx the ReportActionsView will remount completely
const isTransitioning = this.props.report && this.props.report.reportID !== reportIDFromPath;
- return !reportIDFromPath || isLoadingInitialReportActions || !this.props.report.reportID || isTransitioning;
+ return reportIDFromPath && this.props.report.reportID && !isTransitioning && !isLoadingInitialAppData;
}
fetchReportIfNeeded() {
@@ -217,6 +217,9 @@ class ReportScreen extends React.Component {
const addWorkspaceRoomOrChatPendingAction = lodashGet(this.props.report, 'pendingFields.addWorkspaceRoom') || lodashGet(this.props.report, 'pendingFields.createChat');
const addWorkspaceRoomOrChatErrors = lodashGet(this.props.report, 'errorFields.addWorkspaceRoom') || lodashGet(this.props.report, 'errorFields.createChat');
const screenWrapperStyle = [styles.appContent, styles.flex1, {marginTop: this.state.viewportOffsetTop}];
+
+ // There are no reportActions at all to display and we are still in the process of loading the next set of actions.
+ const isLoadingInitialReportActions = _.isEmpty(this.props.reportActions) && this.props.report.isLoadingReportActions;
return (
- {this.shouldShowLoader()
- ? (
-
- )
- : (
- <>
-
-
- >
- )}
+ {this.isReportReadyForDisplay() && (
+
+ )}
+
+ {/* Note: The report should be allowed to mount even if the initial report actions are not loaded. If we prevent rendering the report while they are loading then
+ we'll unnecessarily unmount the ReportActionsView which will clear the new marker lines initial state. */}
+ {(!this.isReportReadyForDisplay() || isLoadingInitialReportActions) && (
+
+ )}
+ {this.isReportReadyForDisplay() && !isLoadingInitialReportActions && (
+
+ )}
@@ -351,5 +357,8 @@ export default compose(
personalDetails: {
key: ONYXKEYS.PERSONAL_DETAILS,
},
+ isLoadingInitialAppData: {
+ key: ONYXKEYS.IS_LOADING_INITIAL_APP_DATA,
+ },
}),
)(ReportScreen);
diff --git a/src/pages/home/report/ReportActionItem.js b/src/pages/home/report/ReportActionItem.js
index 6c6a852699af..27302710b665 100644
--- a/src/pages/home/report/ReportActionItem.js
+++ b/src/pages/home/report/ReportActionItem.js
@@ -195,7 +195,7 @@ class ReportActionItem extends Component {
ReportActions.clearReportActionErrors(this.props.report.reportID, this.props.action.sequenceNumber);
}
}}
- pendingAction={this.props.action.pendingAction}
+ pendingAction={this.props.draftMessage ? null : this.props.action.pendingAction}
errors={this.props.action.errors}
errorRowStyles={[styles.ml10, styles.mr2]}
>
diff --git a/src/pages/home/report/ReportActionsView.js b/src/pages/home/report/ReportActionsView.js
index e60546bbcb40..e99a0ed70e0f 100755
--- a/src/pages/home/report/ReportActionsView.js
+++ b/src/pages/home/report/ReportActionsView.js
@@ -7,7 +7,6 @@ import _ from 'underscore';
import lodashGet from 'lodash/get';
import * as Report from '../../../libs/actions/Report';
import reportActionPropTypes from './reportActionPropTypes';
-import * as CollectionUtils from '../../../libs/CollectionUtils';
import Visibility from '../../../libs/Visibility';
import Timing from '../../../libs/actions/Timing';
import CONST from '../../../CONST';
@@ -67,6 +66,7 @@ class ReportActionsView extends React.Component {
super(props);
this.didLayout = false;
+ this.didSubscribeToReportTypingEvents = false;
this.unsubscribeVisibilityListener = null;
@@ -100,7 +100,6 @@ class ReportActionsView extends React.Component {
this.setState({newMarkerSequenceNumber: 0});
});
- Report.subscribeToReportTypingEvents(this.props.report.reportID);
this.keyboardEvent = Keyboard.addListener('keyboardDidShow', () => {
if (!ReportActionComposeFocusManager.isFocused()) {
return;
@@ -111,6 +110,33 @@ class ReportActionsView extends React.Component {
if (this.getIsReportFullyVisible()) {
this.openReportIfNecessary();
}
+
+ // This callback is triggered when a new action arrives via Pusher and the event is emitted from Report.js. This allows us to maintain
+ // a single source of truth for the "new action" event instead of trying to derive that a new action has appeared from looking at props.
+ this.unsubscribeFromNewActionEvent = Report.subscribeToNewActionEvent(this.props.report.reportID, (isFromCurrentUser, currentLastSequenceNumber) => {
+ // If a new comment is added and it's from the current user scroll to the bottom otherwise leave the user positioned where
+ // they are now in the list.
+ if (isFromCurrentUser) {
+ ReportScrollManager.scrollToBottom();
+
+ // If the current user sends a new message in the chat we clear the new marker since they have "read" the report
+ this.setState({newMarkerSequenceNumber: 0});
+ } else if (this.getIsReportFullyVisible()) {
+ // We use the scroll position to determine whether the report should be marked as read and the new line indicator reset.
+ // If the user is scrolled up and no new line marker is set we will set it otherwise we will do nothing so the new marker
+ // stays in it's previous position.
+ if (this.currentScrollOffset === 0) {
+ Report.readNewestAction(this.props.report.reportID);
+ this.setState({newMarkerSequenceNumber: 0});
+ } else if (this.state.newMarkerSequenceNumber === 0) {
+ this.setState({newMarkerSequenceNumber: currentLastSequenceNumber});
+ }
+ } else if (this.state.newMarkerSequenceNumber === 0) {
+ // The report is not in view and we received a comment from another user while the new marker is not set
+ // so we will set the new marker now.
+ this.setState({newMarkerSequenceNumber: currentLastSequenceNumber});
+ }
+ });
}
shouldComponentUpdate(nextProps, nextState) {
@@ -174,37 +200,6 @@ class ReportActionsView extends React.Component {
}
}
- const previousLastSequenceNumber = lodashGet(CollectionUtils.lastItem(prevProps.reportActions), 'sequenceNumber');
- const currentLastSequenceNumber = lodashGet(CollectionUtils.lastItem(this.props.reportActions), 'sequenceNumber');
- const didNewReportActionAppear = previousLastSequenceNumber !== currentLastSequenceNumber;
- if (didNewReportActionAppear) {
- const lastAction = CollectionUtils.lastItem(this.props.reportActions);
- const isLastActionFromCurrentUser = lodashGet(lastAction, 'actorEmail', '') === lodashGet(this.props.session, 'email', '');
-
- // If a new comment is added and it's from the current user scroll to the bottom otherwise leave the user positioned where
- // they are now in the list.
- if (isLastActionFromCurrentUser) {
- ReportScrollManager.scrollToBottom();
-
- // If the current user sends a new message in the chat we clear the new marker since they have "read" the report
- this.setState({newMarkerSequenceNumber: 0});
- } else if (isReportFullyVisible) {
- // We use the scroll position to determine whether the report should be marked as read and the new line indicator reset.
- // If the user is scrolled up and no new line marker is set we will set it otherwise we will do nothing so the new marker
- // stays in it's previous position.
- if (this.currentScrollOffset === 0) {
- Report.readNewestAction(this.props.report.reportID);
- this.setState({newMarkerSequenceNumber: 0});
- } else if (this.state.newMarkerSequenceNumber === 0) {
- this.setState({newMarkerSequenceNumber: currentLastSequenceNumber});
- }
- } else if (this.state.newMarkerSequenceNumber === 0) {
- // The report is not in view and we received a comment from another user while the new marker is not set
- // so we will set the new marker now.
- this.setState({newMarkerSequenceNumber: currentLastSequenceNumber});
- }
- }
-
// If the report was previously hidden by the side bar, or the view is expanded from mobile to desktop layout
// we update the new marker position, mark the report as read, and fetch new report actions
const didSidebarClose = prevProps.isDrawerOpen && !this.props.isDrawerOpen;
@@ -234,6 +229,17 @@ class ReportActionsView extends React.Component {
if (didManuallyMarkReportAsUnread) {
this.setState({newMarkerSequenceNumber: this.props.report.lastReadSequenceNumber + 1});
}
+
+ // Ensures subscription event succeeds when the report/workspace room is created optimistically.
+ // Check if the optimistic `OpenReport` or `AddWorkspaceRoom` has succeeded by confirming
+ // any `pendingFields.createChat` or `pendingFields.addWorkspaceRoom` fields are set to null.
+ // Existing reports created will have empty fields for `pendingFields`.
+ const didCreateReportSuccessfully = !this.props.report.pendingFields
+ || (!this.props.report.pendingFields.addWorkspaceRoom && !this.props.report.pendingFields.createChat);
+ if (!this.didSubscribeToReportTypingEvents && didCreateReportSuccessfully) {
+ Report.subscribeToReportTypingEvents(this.props.report.reportID);
+ this.didSubscribeToReportTypingEvents = true;
+ }
}
componentWillUnmount() {
@@ -245,6 +251,10 @@ class ReportActionsView extends React.Component {
this.unsubscribeVisibilityListener();
}
+ if (this.unsubscribeFromNewActionEvent) {
+ this.unsubscribeFromNewActionEvent();
+ }
+
Report.unsubscribeFromReportChannel(this.props.report.reportID);
}
diff --git a/src/pages/home/sidebar/SidebarScreen/BaseSidebarScreen.js b/src/pages/home/sidebar/SidebarScreen/BaseSidebarScreen.js
index 2f9eb5c4c2bc..49249a9c642a 100644
--- a/src/pages/home/sidebar/SidebarScreen/BaseSidebarScreen.js
+++ b/src/pages/home/sidebar/SidebarScreen/BaseSidebarScreen.js
@@ -1,31 +1,57 @@
import lodashGet from 'lodash/get';
+import _ from 'underscore';
import React, {Component} from 'react';
import {View} from 'react-native';
+import PropTypes from 'prop-types';
import styles from '../../../../styles/styles';
import SidebarLinks from '../SidebarLinks';
+import PopoverMenu from '../../../../components/PopoverMenu';
+import FloatingActionButton from '../../../../components/FloatingActionButton';
import ScreenWrapper from '../../../../components/ScreenWrapper';
import Navigation from '../../../../libs/Navigation/Navigation';
import ROUTES from '../../../../ROUTES';
import Timing from '../../../../libs/actions/Timing';
import CONST from '../../../../CONST';
+import * as Expensicons from '../../../../components/Icon/Expensicons';
+import Permissions from '../../../../libs/Permissions';
+import * as Policy from '../../../../libs/actions/Policy';
import Performance from '../../../../libs/Performance';
import * as Welcome from '../../../../libs/actions/Welcome';
+import {sidebarPropTypes, sidebarDefaultProps} from './sidebarPropTypes';
import withDrawerState from '../../../../components/withDrawerState';
-import withWindowDimensions, {windowDimensionsPropTypes} from '../../../../components/withWindowDimensions';
-import compose from '../../../../libs/compose';
-import sidebarPropTypes from './sidebarPropTypes';
+import KeyboardShortcutsModal from '../../../../components/KeyboardShortcutsModal';
const propTypes = {
+
+ /** Callback function when the menu is shown */
+ onShowCreateMenu: PropTypes.func,
+
+ /** Callback function before the menu is hidden */
+ onHideCreateMenu: PropTypes.func,
+
+ /** reportID in the current navigation state */
+ reportIDFromRoute: PropTypes.string,
+
...sidebarPropTypes,
- ...windowDimensionsPropTypes,
+};
+const defaultProps = {
+ onHideCreateMenu: () => {},
+ onShowCreateMenu: () => {},
+ ...sidebarDefaultProps,
};
class BaseSidebarScreen extends Component {
constructor(props) {
super(props);
+ this.hideCreateMenu = this.hideCreateMenu.bind(this);
this.startTimer = this.startTimer.bind(this);
this.navigateToSettings = this.navigateToSettings.bind(this);
+ this.showCreateMenu = this.showCreateMenu.bind(this);
+
+ this.state = {
+ isCreateMenuActive: false,
+ };
}
componentDidMount() {
@@ -36,6 +62,16 @@ class BaseSidebarScreen extends Component {
Welcome.show({routes, showCreateMenu: this.showCreateMenu});
}
+ /**
+ * Method called when we click the floating action button
+ */
+ showCreateMenu() {
+ this.setState({
+ isCreateMenuActive: true,
+ });
+ this.props.onShowCreateMenu();
+ }
+
/**
* Method called when avatar is clicked
*/
@@ -43,6 +79,18 @@ class BaseSidebarScreen extends Component {
Navigation.navigate(ROUTES.SETTINGS);
}
+ /**
+ * Method called either when:
+ * Pressing the floating action button to open the CreateMenu modal
+ * Selecting an item on CreateMenu or closing it by clicking outside of the modal component
+ */
+ hideCreateMenu() {
+ this.props.onHideCreateMenu();
+ this.setState({
+ isCreateMenuActive: false,
+ });
+ }
+
/**
* Method called when a pinned chat is selected.
*/
@@ -52,22 +100,90 @@ class BaseSidebarScreen extends Component {
}
render() {
+ // Workspaces are policies with type === 'free'
+ const workspaces = _.filter(this.props.allPolicies, policy => policy && policy.type === CONST.POLICY.TYPE.FREE);
return (
{({insets}) => (
-
-
+
+
+
+
+
+ Navigation.navigate(ROUTES.NEW_CHAT),
+ },
+ {
+ icon: Expensicons.Users,
+ text: this.props.translate('sidebarScreen.newGroup'),
+ onSelected: () => Navigation.navigate(ROUTES.NEW_GROUP),
+ },
+ ...(Permissions.canUsePolicyRooms(this.props.betas) && workspaces.length ? [
+ {
+ icon: Expensicons.Hashtag,
+ text: this.props.translate('sidebarScreen.newRoom'),
+ onSelected: () => Navigation.navigate(ROUTES.WORKSPACE_NEW_ROOM),
+ },
+ ] : []),
+ ...(Permissions.canUseIOUSend(this.props.betas) ? [
+ {
+ icon: Expensicons.Send,
+ text: this.props.translate('iou.sendMoney'),
+ onSelected: () => Navigation.navigate(ROUTES.IOU_SEND),
+ },
+ ] : []),
+ ...(Permissions.canUseIOU(this.props.betas) ? [
+ {
+ icon: Expensicons.MoneyCircle,
+ text: this.props.translate('iou.requestMoney'),
+ onSelected: () => Navigation.navigate(ROUTES.IOU_REQUEST),
+ },
+ ] : []),
+ ...(Permissions.canUseIOU(this.props.betas) ? [
+ {
+ icon: Expensicons.Receipt,
+ text: this.props.translate('iou.splitBill'),
+ onSelected: () => Navigation.navigate(ROUTES.IOU_BILL),
+ },
+ ] : []),
+ ...(!Policy.isAdminOfFreePolicy(this.props.allPolicies) ? [
+ {
+ icon: Expensicons.NewWorkspace,
+ iconWidth: 46,
+ iconHeight: 40,
+ text: this.props.translate('workspace.new.newWorkspace'),
+ description: this.props.translate('workspace.new.getTheExpensifyCardAndMore'),
+ onSelected: () => Policy.createWorkspace(),
+ },
+ ] : []),
+ ]}
/>
-
+ >
)}
);
@@ -75,8 +191,6 @@ class BaseSidebarScreen extends Component {
}
BaseSidebarScreen.propTypes = propTypes;
+BaseSidebarScreen.defaultProps = defaultProps;
-export default compose(
- withWindowDimensions,
- withDrawerState,
-)(BaseSidebarScreen);
+export default withDrawerState(BaseSidebarScreen);
diff --git a/src/pages/home/sidebar/SidebarScreen/PopoverModal.js b/src/pages/home/sidebar/SidebarScreen/PopoverModal.js
index 6b62f5875dd2..e69de29bb2d1 100644
--- a/src/pages/home/sidebar/SidebarScreen/PopoverModal.js
+++ b/src/pages/home/sidebar/SidebarScreen/PopoverModal.js
@@ -1,170 +0,0 @@
-import React from 'react';
-import _ from 'underscore';
-import {withOnyx} from 'react-native-onyx';
-import PropTypes from 'prop-types';
-import styles from '../../../../styles/styles';
-import * as Expensicons from '../../../../components/Icon/Expensicons';
-import Navigation from '../../../../libs/Navigation/Navigation';
-import ROUTES from '../../../../ROUTES';
-import Permissions from '../../../../libs/Permissions';
-import * as Policy from '../../../../libs/actions/Policy';
-import PopoverMenu from '../../../../components/PopoverMenu';
-import CONST from '../../../../CONST';
-import FloatingActionButton from '../../../../components/FloatingActionButton';
-import compose from '../../../../libs/compose';
-import withLocalize, {withLocalizePropTypes} from '../../../../components/withLocalize';
-import withWindowDimensions from '../../../../components/withWindowDimensions';
-import ONYXKEYS from '../../../../ONYXKEYS';
-
-const propTypes = {
- /* Callback function when the menu is shown */
- onShowCreateMenu: PropTypes.func,
-
- /* Callback function before the menu is hidden */
- onHideCreateMenu: PropTypes.func,
-
- /** The list of policies the user has access to. */
- allPolicies: PropTypes.shape({
- /** The policy name */
- name: PropTypes.string,
- }),
-
- /* Beta features list */
- betas: PropTypes.arrayOf(PropTypes.string),
-
- ...withLocalizePropTypes,
-};
-const defaultProps = {
- onHideCreateMenu: () => {},
- onShowCreateMenu: () => {},
- allPolicies: {},
- betas: [],
-};
-
-/**
- * Responsible for rendering the {@link PopoverMenu}, and the accompanying
- * FAB that can open or close the menu.
- */
-class PopoverModal extends React.Component {
- constructor(props) {
- super(props);
-
- this.showCreateMenu = this.showCreateMenu.bind(this);
- this.hideCreateMenu = this.hideCreateMenu.bind(this);
-
- this.state = {
- isCreateMenuActive: false,
- };
- }
-
- /**
- * Method called when we click the floating action button
- */
- showCreateMenu() {
- this.setState({
- isCreateMenuActive: true,
- });
- this.props.onShowCreateMenu();
- }
-
- /**
- * Method called either when:
- * - Pressing the floating action button to open the CreateMenu modal
- * - Selecting an item on CreateMenu or closing it by clicking outside of the modal component
- */
- hideCreateMenu() {
- this.props.onHideCreateMenu();
- this.setState({
- isCreateMenuActive: false,
- });
- }
-
- render() {
- // Workspaces are policies with type === 'free'
- const workspaces = _.filter(this.props.allPolicies, policy => policy && policy.type === CONST.POLICY.TYPE.FREE);
-
- return (
- <>
- Navigation.navigate(ROUTES.NEW_CHAT),
- },
- {
- icon: Expensicons.Users,
- text: this.props.translate('sidebarScreen.newGroup'),
- onSelected: () => Navigation.navigate(ROUTES.NEW_GROUP),
- },
- ...(Permissions.canUsePolicyRooms(this.props.betas) && workspaces.length ? [
- {
- icon: Expensicons.Hashtag,
- text: this.props.translate('sidebarScreen.newRoom'),
- onSelected: () => Navigation.navigate(ROUTES.WORKSPACE_NEW_ROOM),
- },
- ] : []),
- ...(Permissions.canUseIOUSend(this.props.betas) ? [
- {
- icon: Expensicons.Send,
- text: this.props.translate('iou.sendMoney'),
- onSelected: () => Navigation.navigate(ROUTES.IOU_SEND),
- },
- ] : []),
- ...(Permissions.canUseIOU(this.props.betas) ? [
- {
- icon: Expensicons.MoneyCircle,
- text: this.props.translate('iou.requestMoney'),
- onSelected: () => Navigation.navigate(ROUTES.IOU_REQUEST),
- },
- ] : []),
- ...(Permissions.canUseIOU(this.props.betas) ? [
- {
- icon: Expensicons.Receipt,
- text: this.props.translate('iou.splitBill'),
- onSelected: () => Navigation.navigate(ROUTES.IOU_BILL),
- },
- ] : []),
- ...(!Policy.isAdminOfFreePolicy(this.props.allPolicies) ? [
- {
- icon: Expensicons.NewWorkspace,
- iconWidth: 46,
- iconHeight: 40,
- text: this.props.translate('workspace.new.newWorkspace'),
- description: this.props.translate('workspace.new.getTheExpensifyCardAndMore'),
- onSelected: () => Policy.createWorkspace(),
- },
- ] : []),
- ]}
- />
-
- >
- );
- }
-}
-
-PopoverModal.propTypes = propTypes;
-PopoverModal.defaultProps = defaultProps;
-
-export default compose(
- withLocalize,
- withWindowDimensions,
- withOnyx({
- allPolicies: {
- key: ONYXKEYS.COLLECTION.POLICY,
- },
- betas: {
- key: ONYXKEYS.BETAS,
- },
- }),
-)(PopoverModal);
diff --git a/src/pages/home/sidebar/SidebarScreen/index.js b/src/pages/home/sidebar/SidebarScreen/index.js
index 75b5e07e7150..584bcc49f8e4 100755
--- a/src/pages/home/sidebar/SidebarScreen/index.js
+++ b/src/pages/home/sidebar/SidebarScreen/index.js
@@ -1,41 +1,52 @@
import React from 'react';
-import sidebarPropTypes from './sidebarPropTypes';
+import {withOnyx} from 'react-native-onyx';
+import compose from '../../../../libs/compose';
+import withWindowDimensions from '../../../../components/withWindowDimensions';
+import withLocalize from '../../../../components/withLocalize';
+import ONYXKEYS from '../../../../ONYXKEYS';
+import {sidebarPropTypes, sidebarDefaultProps} from './sidebarPropTypes';
import BaseSidebarScreen from './BaseSidebarScreen';
-import PopoverModal from './PopoverModal';
const SidebarScreen = (props) => {
- let popoverModal = null;
+ let baseSidebarScreen = null;
/**
* Method create event listener
*/
const createDragoverListener = () => {
- document.addEventListener('dragover', popoverModal.hideCreateMenu);
+ document.addEventListener('dragover', baseSidebarScreen.hideCreateMenu);
};
/**
* Method remove event listener.
*/
const removeDragoverListener = () => {
- document.removeEventListener('dragover', popoverModal.hideCreateMenu);
+ document.removeEventListener('dragover', baseSidebarScreen.hideCreateMenu);
};
-
return (
- <>
-
- popoverModal = el}
- onShowCreateMenu={createDragoverListener}
- onHideCreateMenu={removeDragoverListener}
- />
- >
+ baseSidebarScreen = el}
+ onShowCreateMenu={createDragoverListener}
+ onHideCreateMenu={removeDragoverListener}
+ // eslint-disable-next-line react/jsx-props-no-spreading
+ {...props}
+ />
);
};
SidebarScreen.propTypes = sidebarPropTypes;
+SidebarScreen.defaultProps = sidebarDefaultProps;
SidebarScreen.displayName = 'SidebarScreen';
-export default SidebarScreen;
+export default compose(
+ withLocalize,
+ withWindowDimensions,
+ withOnyx({
+ allPolicies: {
+ key: ONYXKEYS.COLLECTION.POLICY,
+ },
+ betas: {
+ key: ONYXKEYS.BETAS,
+ },
+ }),
+)(SidebarScreen);
diff --git a/src/pages/home/sidebar/SidebarScreen/index.native.js b/src/pages/home/sidebar/SidebarScreen/index.native.js
index cbf0d5c085a0..e2cb2838efe8 100755
--- a/src/pages/home/sidebar/SidebarScreen/index.native.js
+++ b/src/pages/home/sidebar/SidebarScreen/index.native.js
@@ -1,19 +1,28 @@
import React from 'react';
-import sidebarPropTypes from './sidebarPropTypes';
+import {withOnyx} from 'react-native-onyx';
+import compose from '../../../../libs/compose';
+import withWindowDimensions from '../../../../components/withWindowDimensions';
+import withLocalize from '../../../../components/withLocalize';
+import ONYXKEYS from '../../../../ONYXKEYS';
+import {sidebarPropTypes, sidebarDefaultProps} from './sidebarPropTypes';
import BaseSidebarScreen from './BaseSidebarScreen';
-import PopoverModal from './PopoverModal';
-const SidebarScreen = props => (
- <>
-
-
- >
-);
+// eslint-disable-next-line react/jsx-props-no-spreading
+const SidebarScreen = props => ;
SidebarScreen.propTypes = sidebarPropTypes;
+SidebarScreen.defaultProps = sidebarDefaultProps;
SidebarScreen.displayName = 'SidebarScreen';
-export default SidebarScreen;
+export default compose(
+ withLocalize,
+ withWindowDimensions,
+ withOnyx({
+ allPolicies: {
+ key: ONYXKEYS.COLLECTION.POLICY,
+ },
+ betas: {
+ key: ONYXKEYS.BETAS,
+ },
+ }),
+)(SidebarScreen);
diff --git a/src/pages/home/sidebar/SidebarScreen/sidebarPropTypes.js b/src/pages/home/sidebar/SidebarScreen/sidebarPropTypes.js
index 3affaa2d00be..996bba9d676b 100644
--- a/src/pages/home/sidebar/SidebarScreen/sidebarPropTypes.js
+++ b/src/pages/home/sidebar/SidebarScreen/sidebarPropTypes.js
@@ -1,8 +1,26 @@
import PropTypes from 'prop-types';
+import {windowDimensionsPropTypes} from '../../../../components/withWindowDimensions';
+import {withLocalizePropTypes} from '../../../../components/withLocalize';
const sidebarPropTypes = {
- /** reportID in the current navigation state */
- reportIDFromRoute: PropTypes.string,
+ /** The list of policies the user has access to. */
+ allPolicies: PropTypes.shape({
+ /** The policy name */
+ name: PropTypes.string,
+ }),
+
+ /* Beta features list */
+ betas: PropTypes.arrayOf(PropTypes.string),
+
+ ...windowDimensionsPropTypes,
+
+ ...withLocalizePropTypes,
};
-export default sidebarPropTypes;
+
+const sidebarDefaultProps = {
+ allPolicies: {},
+ betas: [],
+};
+
+export {sidebarPropTypes, sidebarDefaultProps};
diff --git a/src/pages/iou/IOUModal.js b/src/pages/iou/IOUModal.js
index 157c21a28195..cb6905b3bc1f 100755
--- a/src/pages/iou/IOUModal.js
+++ b/src/pages/iou/IOUModal.js
@@ -115,6 +115,8 @@ class IOUModal extends Component {
const participantsWithDetails = _.map(OptionsListUtils.getPersonalDetailsForLogins(participants, props.personalDetails), personalDetails => ({
login: personalDetails.login,
text: personalDetails.displayName,
+ firstName: lodashGet(personalDetails, 'firstName', ''),
+ lastName: lodashGet(personalDetails, 'lastName', ''),
alternateText: Str.isSMSLogin(personalDetails.login) ? Str.removeSMSDomain(personalDetails.login) : personalDetails.login,
icons: [personalDetails.avatar],
keyForList: personalDetails.login,
@@ -340,7 +342,6 @@ class IOUModal extends Component {
);
return;
}
-
IOU.requestMoney(this.props.report,
Math.round(this.state.amount * 100),
this.props.iou.selectedCurrencyCode,
diff --git a/src/pages/iou/IOUTransactions.js b/src/pages/iou/IOUTransactions.js
index f57499ffb6ea..af5718303dd8 100644
--- a/src/pages/iou/IOUTransactions.js
+++ b/src/pages/iou/IOUTransactions.js
@@ -4,12 +4,11 @@ import {withOnyx} from 'react-native-onyx';
import _ from 'underscore';
import PropTypes from 'prop-types';
import lodashGet from 'lodash/get';
-import compose from '../../libs/compose';
-import withLocalize, {withLocalizePropTypes} from '../../components/withLocalize';
import styles from '../../styles/styles';
import ONYXKEYS from '../../ONYXKEYS';
import reportActionPropTypes from '../home/report/reportActionPropTypes';
import ReportTransaction from '../../components/ReportTransaction';
+import CONST from '../../CONST';
const propTypes = {
/** Actions from the ChatReport */
@@ -26,8 +25,6 @@ const propTypes = {
/** Is the associated IOU settled? */
isIOUSettled: PropTypes.bool,
-
- ...withLocalizePropTypes,
};
const defaultProps = {
@@ -92,9 +89,7 @@ class IOUTransactions extends Component {
action={reportAction}
key={reportAction.sequenceNumber}
canBeRejected={canBeRejected}
- rejectButtonLabelText={isCurrentUserTransactionCreator
- ? this.props.translate('common.cancel')
- : this.props.translate('common.decline')}
+ rejectButtonType={isCurrentUserTransactionCreator ? CONST.IOU.REPORT_ACTION_TYPE.CANCEL : CONST.IOU.REPORT_ACTION_TYPE.DECLINE}
/>
);
})}
@@ -105,12 +100,9 @@ class IOUTransactions extends Component {
IOUTransactions.defaultProps = defaultProps;
IOUTransactions.propTypes = propTypes;
-export default compose(
- withLocalize,
- withOnyx({
- reportActions: {
- key: ({chatReportID}) => `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${chatReportID}`,
- canEvict: false,
- },
- }),
-)(IOUTransactions);
+export default withOnyx({
+ reportActions: {
+ key: ({chatReportID}) => `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${chatReportID}`,
+ canEvict: false,
+ },
+})(IOUTransactions);
diff --git a/src/pages/settings/AboutPage/AboutPage.js b/src/pages/settings/AboutPage/AboutPage.js
index ad4f0aeddd51..3ac1564a61f9 100644
--- a/src/pages/settings/AboutPage/AboutPage.js
+++ b/src/pages/settings/AboutPage/AboutPage.js
@@ -6,6 +6,7 @@ import Navigation from '../../../libs/Navigation/Navigation';
import ROUTES from '../../../ROUTES';
import styles from '../../../styles/styles';
import Text from '../../../components/Text';
+import TextLink from '../../../components/TextLink';
import CONST from '../../../CONST';
import * as Expensicons from '../../../components/Icon/Expensicons';
import ScreenWrapper from '../../../components/ScreenWrapper';
@@ -116,29 +117,21 @@ const AboutPage = (props) => {
'initialSettingsPage.readTheTermsAndPrivacyPolicy.phrase1',
)}
{' '}
- Link.openExternalLink(CONST.TERMS_URL)}
- >
+
{props.translate(
'initialSettingsPage.readTheTermsAndPrivacyPolicy.phrase2',
)}
-
+
{' '}
{props.translate(
'initialSettingsPage.readTheTermsAndPrivacyPolicy.phrase3',
)}
{' '}
- Link.openExternalLink(CONST.PRIVACY_URL)}
- >
+
{props.translate(
'initialSettingsPage.readTheTermsAndPrivacyPolicy.phrase4',
)}
-
+
.
diff --git a/src/pages/settings/InitialSettingsPage.js b/src/pages/settings/InitialSettingsPage.js
index 1f481e08802d..994ed5e099c7 100755
--- a/src/pages/settings/InitialSettingsPage.js
+++ b/src/pages/settings/InitialSettingsPage.js
@@ -129,7 +129,7 @@ class InitialSettingsPage extends React.Component {
.value();
const policyBrickRoadIndicator = _.chain(this.props.policies)
.filter(policy => policy && policy.type === CONST.POLICY.TYPE.FREE && policy.role === CONST.POLICY.ROLE.ADMIN)
- .find(policy => PolicyUtils.getPolicyBrickRoadIndicatorStatus(policy, this.props.policyMembers))
+ .find(policy => PolicyUtils.hasPolicyError(policy) || PolicyUtils.getPolicyBrickRoadIndicatorStatus(policy, this.props.policyMembers))
.value() ? 'error' : null;
return ([
diff --git a/src/pages/settings/Profile/DisplayNamePage.js b/src/pages/settings/Profile/DisplayNamePage.js
new file mode 100644
index 000000000000..cb4ebaaea35a
--- /dev/null
+++ b/src/pages/settings/Profile/DisplayNamePage.js
@@ -0,0 +1,128 @@
+import lodashGet from 'lodash/get';
+import React, {Component} from 'react';
+import {View} from 'react-native';
+import withCurrentUserPersonalDetails, {withCurrentUserPersonalDetailsPropTypes, withCurrentUserPersonalDetailsDefaultProps} from '../../../components/withCurrentUserPersonalDetails';
+import ScreenWrapper from '../../../components/ScreenWrapper';
+import HeaderWithCloseButton from '../../../components/HeaderWithCloseButton';
+import withLocalize, {withLocalizePropTypes} from '../../../components/withLocalize';
+import * as Localize from '../../../libs/Localize';
+import ROUTES from '../../../ROUTES';
+import Form from '../../../components/Form';
+import ONYXKEYS from '../../../ONYXKEYS';
+import CONST from '../../../CONST';
+import * as ValidationUtils from '../../../libs/ValidationUtils';
+import TextInput from '../../../components/TextInput';
+import Text from '../../../components/Text';
+import styles from '../../../styles/styles';
+import Navigation from '../../../libs/Navigation/Navigation';
+import * as PersonalDetails from '../../../libs/actions/PersonalDetails';
+import compose from '../../../libs/compose';
+
+const propTypes = {
+ ...withLocalizePropTypes,
+ ...withCurrentUserPersonalDetailsPropTypes,
+};
+
+const defaultProps = {
+ ...withCurrentUserPersonalDetailsDefaultProps,
+};
+
+class DisplayNamePage extends Component {
+ constructor(props) {
+ super(props);
+
+ this.validate = this.validate.bind(this);
+ this.updateDisplayName = this.updateDisplayName.bind(this);
+ }
+
+ /**
+ * Submit form to update user's first and last name (and display name)
+ * @param {Object} values
+ * @param {String} values.firstName
+ * @param {String} values.lastName
+ */
+ updateDisplayName(values) {
+ PersonalDetails.updateDisplayName(
+ values.firstName.trim(),
+ values.lastName.trim(),
+ );
+ }
+
+ /**
+ * @param {Object} values
+ * @param {String} values.firstName
+ * @param {String} values.lastName
+ * @returns {Object} - An object containing the errors for each inputID
+ */
+ validate(values) {
+ const errors = {};
+
+ const [hasFirstNameError, hasLastNameError] = ValidationUtils.doesFailCharacterLimitAfterTrim(
+ CONST.FORM_CHARACTER_LIMIT,
+ [values.firstName, values.lastName],
+ );
+
+ if (hasFirstNameError) {
+ errors.firstName = Localize.translateLocal('personalDetails.error.characterLimit', {limit: CONST.FORM_CHARACTER_LIMIT});
+ }
+
+ if (hasLastNameError) {
+ errors.lastName = Localize.translateLocal('personalDetails.error.characterLimit', {limit: CONST.FORM_CHARACTER_LIMIT});
+ }
+
+ return errors;
+ }
+
+ render() {
+ const currentUserDetails = this.props.currentUserPersonalDetails || {};
+
+ return (
+
+ Navigation.navigate(ROUTES.SETTINGS_PROFILE)}
+ onCloseButtonPress={() => Navigation.dismissModal(true)}
+ />
+
+
+ );
+ }
+}
+
+DisplayNamePage.propTypes = propTypes;
+DisplayNamePage.defaultProps = defaultProps;
+
+export default compose(
+ withLocalize,
+ withCurrentUserPersonalDetails,
+)(DisplayNamePage);
diff --git a/src/pages/settings/Profile/ProfilePage.js b/src/pages/settings/Profile/ProfilePage.js
index 30ea23dd1701..84cc1db5df1d 100755
--- a/src/pages/settings/Profile/ProfilePage.js
+++ b/src/pages/settings/Profile/ProfilePage.js
@@ -241,7 +241,7 @@ class ProfilePage extends Component {
/>