diff --git a/.github/workflows/typecheck.yml b/.github/workflows/typecheck.yml
index 156b9764bcca..f20939f9df0a 100644
--- a/.github/workflows/typecheck.yml
+++ b/.github/workflows/typecheck.yml
@@ -30,7 +30,7 @@ jobs:
# - git diff is used to see the files that were added on this branch
# - gh pr view is used to list files touched by this PR. Git diff may give false positives if the branch isn't up-to-date with main
# - wc counts the words in the result of the intersection
- count_new_js=$(comm -1 -2 <(git diff --name-only --diff-filter=A origin/main HEAD -- 'src/*.js') <(gh pr view ${{ github.event.pull_request.number }} --json files | jq -r '.files | map(.path) | .[]') | wc -l)
+ count_new_js=$(comm -1 -2 <(git diff --name-only --diff-filter=A origin/main HEAD -- 'src/*.js' '__mocks__/*.js' '.storybook/*.js' 'assets/*.js' 'config/*.js' 'desktop/*.js' 'jest/*.js' 'scripts/*.js' 'tests/*.js' 'web/*.js' 'workflow_tests/*.js' '.github/libs/*.js' '.github/scripts/*.js') <(gh pr view ${{ github.event.pull_request.number }} --json files | jq -r '.files | map(.path) | .[]') | wc -l)
if [ "$count_new_js" -gt "0" ]; then
echo "ERROR: Found new JavaScript files in the project; use TypeScript instead."
exit 1
diff --git a/android/app/build.gradle b/android/app/build.gradle
index da340184e7c8..32dfb496daa8 100644
--- a/android/app/build.gradle
+++ b/android/app/build.gradle
@@ -98,8 +98,8 @@ android {
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
multiDexEnabled rootProject.ext.multiDexEnabled
- versionCode 1001046210
- versionName "1.4.62-10"
+ versionCode 1001046213
+ versionName "1.4.62-13"
// Supported language variants must be declared here to avoid from being removed during the compilation.
// This also helps us to not include unnecessary language variants in the APK.
resConfigs "en", "es"
diff --git a/docs/articles/expensify-classic/integrations/HR-integrations/Zenefits.md b/docs/articles/expensify-classic/integrations/HR-integrations/Zenefits.md
index e94d915e4dfa..07421553aeb2 100644
--- a/docs/articles/expensify-classic/integrations/HR-integrations/Zenefits.md
+++ b/docs/articles/expensify-classic/integrations/HR-integrations/Zenefits.md
@@ -17,7 +17,7 @@ Expensify's direct integration with Zenefits will automatically:
- Every employee record in Zenefits must have a work email address since we use this as the unique identifier in Expensify.
- Zenefits will add all your employees to one Expensify workspace. If your company uses multiple Expensify workspaces, you'll be given the option to choose which workspace to connect to when you're setting up the integration.
-## To connect your Expensify workspace to Gusto:
+## To connect your Expensify workspace to Zenefits:
1. Navigate to **Settings > Workspaces > Group > _[Workspace Name]_ > Connections**
2. Scroll down to HR Integrations, click the **Connect to Zenefits** radio button, then click **Sync with Zenefits**
diff --git a/ios/NewExpensify/Info.plist b/ios/NewExpensify/Info.plist
index 4dea8203b477..0b59d7e8316d 100644
--- a/ios/NewExpensify/Info.plist
+++ b/ios/NewExpensify/Info.plist
@@ -40,7 +40,7 @@
CFBundleVersion
- 1.4.62.10
+ 1.4.62.13
ITSAppUsesNonExemptEncryption
LSApplicationQueriesSchemes
diff --git a/ios/NewExpensifyTests/Info.plist b/ios/NewExpensifyTests/Info.plist
index 0d1e81ade440..2a6db0634f2f 100644
--- a/ios/NewExpensifyTests/Info.plist
+++ b/ios/NewExpensifyTests/Info.plist
@@ -19,6 +19,6 @@
CFBundleSignature
????
CFBundleVersion
- 1.4.62.10
+ 1.4.62.13
diff --git a/ios/NotificationServiceExtension/Info.plist b/ios/NotificationServiceExtension/Info.plist
index a2dfb017df48..50171f3eb050 100644
--- a/ios/NotificationServiceExtension/Info.plist
+++ b/ios/NotificationServiceExtension/Info.plist
@@ -13,7 +13,7 @@
CFBundleShortVersionString
1.4.62
CFBundleVersion
- 1.4.62.10
+ 1.4.62.13
NSExtension
NSExtensionPointIdentifier
diff --git a/ios/Podfile.lock b/ios/Podfile.lock
index 634aeca6465b..ac5f3fdd397e 100644
--- a/ios/Podfile.lock
+++ b/ios/Podfile.lock
@@ -1236,7 +1236,7 @@ PODS:
- React-Codegen
- React-Core
- ReactCommon/turbomodule/core
- - react-native-geolocation (3.0.6):
+ - react-native-geolocation (3.2.1):
- glog
- hermes-engine
- RCT-Folly (= 2022.05.16.00)
@@ -1793,24 +1793,7 @@ PODS:
- React-Core
- RNFBApp
- RNFlashList (1.6.3):
- - glog
- - hermes-engine
- - RCT-Folly (= 2022.05.16.00)
- - RCTRequired
- - RCTTypeSafety
- - React-Codegen
- React-Core
- - React-debug
- - React-Fabric
- - React-graphics
- - React-ImageManager
- - React-NativeModulesApple
- - React-RCTFabric
- - React-rendererdebug
- - React-utils
- - ReactCommon/turbomodule/bridging
- - ReactCommon/turbomodule/core
- - Yoga
- RNFS (2.20.0):
- React-Core
- RNGestureHandler (2.14.1):
@@ -2512,7 +2495,7 @@ SPEC CHECKSUMS:
react-native-cameraroll: 95ce0d1a7d2d1fe55bf627ab806b64de6c3e69e9
react-native-config: 5ce986133b07fc258828b20b9506de0e683efc1c
react-native-document-picker: 8532b8af7c2c930f9e202aac484ac785b0f4f809
- react-native-geolocation: dcc37809bc117ffdb5946fecc127d62319ccd4a9
+ react-native-geolocation: c1c21a8cda4abae6724a322458f64ac6889b8c2b
react-native-image-picker: f8a13ff106bcc7eb00c71ce11fdc36aac2a44440
react-native-key-command: 74d18ad516037536c2f671ef0914bcce7739b2f5
react-native-launch-arguments: 5f41e0abf88a15e3c5309b8875d6fd5ac43df49d
@@ -2560,7 +2543,7 @@ SPEC CHECKSUMS:
RNFBApp: 729c0666395b1953198dc4a1ec6deb8fbe1c302e
RNFBCrashlytics: 2061ca863e8e2fa1aae9b12477d7dfa8e88ca0f9
RNFBPerf: 389914cda4000fe0d996a752532a591132cbf3f9
- RNFlashList: 5b0e8311e4cf1ad91e410fd7c8526a89fb5826d1
+ RNFlashList: 4b4b6b093afc0df60ae08f9cbf6ccd4c836c667a
RNFS: 4ac0f0ea233904cb798630b3c077808c06931688
RNGestureHandler: 1190c218cdaaf029ee1437076a3fbbc3297d89fb
RNGoogleSignin: ccaa4a81582cf713eea562c5dd9dc1961a715fd0
diff --git a/package-lock.json b/package-lock.json
index 697736a153b7..478ae3c12b3c 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,19 +1,19 @@
{
"name": "new.expensify",
- "version": "1.4.62-10",
+ "version": "1.4.62-13",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "new.expensify",
- "version": "1.4.62-10",
+ "version": "1.4.62-13",
"hasInstallScript": true,
"license": "MIT",
"dependencies": {
"@babel/plugin-proposal-private-methods": "^7.18.6",
"@babel/plugin-proposal-private-property-in-object": "^7.21.11",
"@dotlottie/react-player": "^1.6.3",
- "@expensify/react-native-live-markdown": "0.1.47",
+ "@expensify/react-native-live-markdown": "^0.1.49",
"@expo/metro-runtime": "~3.1.1",
"@formatjs/intl-datetimeformat": "^6.10.0",
"@formatjs/intl-listformat": "^7.2.2",
@@ -28,7 +28,7 @@
"@react-native-async-storage/async-storage": "1.21.0",
"@react-native-camera-roll/camera-roll": "7.4.0",
"@react-native-clipboard/clipboard": "^1.13.2",
- "@react-native-community/geolocation": "^3.0.6",
+ "@react-native-community/geolocation": "3.2.1",
"@react-native-community/netinfo": "11.2.1",
"@react-native-firebase/analytics": "^12.3.0",
"@react-native-firebase/app": "^12.3.0",
@@ -3570,9 +3570,9 @@
}
},
"node_modules/@expensify/react-native-live-markdown": {
- "version": "0.1.47",
- "resolved": "https://registry.npmjs.org/@expensify/react-native-live-markdown/-/react-native-live-markdown-0.1.47.tgz",
- "integrity": "sha512-zUfwgg6qq47MnGuynamDpdHSlBYwVKFV4Zc/2wlVzFcBndQOjOyFu04Ns8YDB4Gl80LyGvfAuBT/sU+kvmMU6g==",
+ "version": "0.1.49",
+ "resolved": "https://registry.npmjs.org/@expensify/react-native-live-markdown/-/react-native-live-markdown-0.1.49.tgz",
+ "integrity": "sha512-5l+/NtUTuSxWkdsT2JOlhKD5NW1hZ+nQcmgrCSz5e/TNIcfkYjJNiW/nEf8qmBV54afiTmTTwKYrh2DwM/BQ0g==",
"engines": {
"node": ">= 18.0.0"
},
@@ -8790,8 +8790,12 @@
"license": "MIT"
},
"node_modules/@react-native-community/geolocation": {
- "version": "3.0.6",
- "license": "MIT",
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/@react-native-community/geolocation/-/geolocation-3.2.1.tgz",
+ "integrity": "sha512-/+HNzuRl4UCMma7KK+KYL8k2nxAGuW+DGxqmqfpiqKBlCkCUbuFHaZZdqVD6jpsn9r/ghe583ECLmd9SV9I4Bw==",
+ "engines": {
+ "node": ">=18.0.0"
+ },
"peerDependencies": {
"react": "*",
"react-native": "*"
diff --git a/package.json b/package.json
index 8b17cf4daf27..e5092e132eae 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "new.expensify",
- "version": "1.4.62-10",
+ "version": "1.4.62-13",
"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.",
@@ -64,7 +64,7 @@
"@babel/plugin-proposal-private-methods": "^7.18.6",
"@babel/plugin-proposal-private-property-in-object": "^7.21.11",
"@dotlottie/react-player": "^1.6.3",
- "@expensify/react-native-live-markdown": "0.1.47",
+ "@expensify/react-native-live-markdown": "0.1.49",
"@expo/metro-runtime": "~3.1.1",
"@formatjs/intl-datetimeformat": "^6.10.0",
"@formatjs/intl-listformat": "^7.2.2",
@@ -79,7 +79,7 @@
"@react-native-async-storage/async-storage": "1.21.0",
"@react-native-camera-roll/camera-roll": "7.4.0",
"@react-native-clipboard/clipboard": "^1.13.2",
- "@react-native-community/geolocation": "^3.0.6",
+ "@react-native-community/geolocation": "3.2.1",
"@react-native-community/netinfo": "11.2.1",
"@react-native-firebase/analytics": "^12.3.0",
"@react-native-firebase/app": "^12.3.0",
diff --git a/patches/@react-native-community+geolocation+3.1.0.patch b/patches/@react-native-community+geolocation+3.1.0.patch
deleted file mode 100644
index 5afa0b8e0897..000000000000
--- a/patches/@react-native-community+geolocation+3.1.0.patch
+++ /dev/null
@@ -1,38 +0,0 @@
-diff --git a/node_modules/@react-native-community/geolocation/react-native-geolocation.podspec b/node_modules/@react-native-community/geolocation/react-native-geolocation.podspec
-index a319e73..c1ea11c 100644
---- a/node_modules/@react-native-community/geolocation/react-native-geolocation.podspec
-+++ b/node_modules/@react-native-community/geolocation/react-native-geolocation.podspec
-@@ -1,8 +1,6 @@
- require 'json'
-
- package = JSON.parse(File.read(File.join(__dir__, 'package.json')))
--folly_version = '2021.07.22.00'
--folly_compiler_flags = '-DFOLLY_NO_CONFIG -DFOLLY_MOBILE=1 -DFOLLY_USE_LIBCPP=1 -Wno-comma -Wno-shorten-64-to-32'
-
- Pod::Spec.new do |s|
- s.name = "react-native-geolocation"
-@@ -17,20 +15,11 @@ Pod::Spec.new do |s|
- s.source = { :git => "https://github.com/react-native-community/react-native-geolocation.git", :tag => "v#{s.version}" }
- s.source_files = "ios/**/*.{h,m,mm}"
-
-- s.dependency 'React-Core'
- s.frameworks = 'CoreLocation'
-
-- if ENV['RCT_NEW_ARCH_ENABLED'] == '1' then
-- s.compiler_flags = folly_compiler_flags + " -DRCT_NEW_ARCH_ENABLED=1"
-- s.pod_target_xcconfig = {
-- "HEADER_SEARCH_PATHS" => "\"$(PODS_ROOT)/boost\"",
-- "CLANG_CXX_LANGUAGE_STANDARD" => "c++17"
-- }
--
-- s.dependency "React-Codegen"
-- s.dependency "RCT-Folly", folly_version
-- s.dependency "RCTRequired"
-- s.dependency "RCTTypeSafety"
-- s.dependency "ReactCommon/turbomodule/core"
-+ if defined?(install_modules_dependencies()) != nil
-+ install_modules_dependencies(s)
-+ else
-+ s.dependency "React-Core"
- end
- end
diff --git a/patches/@shopify+flash-list+1.6.3.patch b/patches/@shopify+flash-list+1.6.3.patch
index 4910bb20b4ec..92308913026b 100644
--- a/patches/@shopify+flash-list+1.6.3.patch
+++ b/patches/@shopify+flash-list+1.6.3.patch
@@ -1,700 +1,3 @@
-diff --git a/node_modules/@shopify/flash-list/CHANGELOG.md b/node_modules/@shopify/flash-list/CHANGELOG.md
-deleted file mode 100644
-index 9c6bc58..0000000
---- a/node_modules/@shopify/flash-list/CHANGELOG.md
-+++ /dev/null
-@@ -1,279 +0,0 @@
--# Changelog
--
--All notable changes to this project will be documented in this file.
--
--The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
--and adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
--
--## [Unreleased]
--
--## [1.6.3] - 2023-11-09
--
--- Changes for RN 0.73 support
-- - https://github.com/Shopify/flash-list/pull/930
--
--## [1.6.2] - 2023-10-19
--
--- Move shouldRefreshWithAnchoring configuration so it is possible to disable it from outside FlashList by invalidating layout
-- - https://github.com/Shopify/flash-list/pull/935
--
--## [1.6.1] - 2023-09-14
--
--- Prevent an expired layout provider from being used again
-- - https://github.com/Shopify/flash-list/pull/915
--
--## [1.6.0] - 2023-09-13
--
--- Update types to match `react-native@0.72` view types.
-- - https://github.com/Shopify/flash-list/pull/890
--- Add option to clear cached layouts on update
-- - https://github.com/Shopify/flash-list/pull/910
--
--## [1.5.0] - 2023-07-12
--
--- Update kotlin version to 1.8.10 for RN 0.72 compatibility
-- - https://github.com/Shopify/flash-list/pull/865
--
--## [1.4.3] - 2023-04-24
--
--- Fix definition conflicts with previous value
-- - https://github.com/Shopify/flash-list/pull/795
--- Fix Android unit test
-- - https://github.com/Shopify/flash-list/pull/815
--- Fix performance issues with inverted lists on Android
-- - https://github.com/Shopify/flash-list/pull/819
--
--## [1.4.2] - 2023-03-20
--
--- Apply layout correction only to consecutive cells
-- - https://github.com/Shopify/flash-list/pull/788
--
--## [1.4.1] - 2023-01-24
--
--- Prevent overflow of sticky headers
-- - https://github.com/Shopify/flash-list/pull/714
--- Skip footer correction when layout correction is skipped
-- - https://github.com/Shopify/flash-list/pull/743
--
--## [1.4.0] - 2022-11-07
--
--- Add content padding support to FlashList
-- - https://github.com/Shopify/flash-list/pull/626
--- Upgrade recyclerlistview to v4.2.0
-- - https://github.com/Shopify/flash-list/pull/660
--
--## [1.3.1] - 2022-10-11
--
--- Expose `columnIndex` and `columnSpan` to `MasonryFlashList.renderItem`
-- - https://github.com/Shopify/flash-list/pull/625
--
--## [1.3.0] - 2022-09-26
--
--- Added `MasonryFlashList` which adds support for rendering masonry layouts
-- - https://github.com/Shopify/flash-list/pull/587
--
--## [1.2.2] - 2022-09-06
--
--- Fixes type checking error in `AutoLayoutView` due to `children` not being an explicit type
-- - https://github.com/Shopify/flash-list/pull/567
--
--## [1.2.1] - 2022-08-03
--
--- Fixed crash when `estimatedListSize` is used in an empty list
-- - https://github.com/Shopify/flash-list/pull/546
--
--## [1.2.0] - 2022-07-18
--
--- Fixed out of bound read from data
-- - https://github.com/Shopify/flash-list/pull/523
--- Added JS only fallbacks for unsupported platforms
-- - https://github.com/Shopify/flash-list/pull/518
--- Added footer correction in AutoLayoutView
-- - https://github.com/Shopify/flash-list/pull/519
--- Added `viewPosition` and `viewOffset` support scrollTo methods
-- - https://github.com/Shopify/flash-list/pull/521
--- Fix inverted mode while being horizontal
-- - https://github.com/Shopify/flash-list/pull/520
--- Upgrade recyclerlistview to v4.1.1
-- - https://github.com/Shopify/flash-list/pull/526
--
--## [1.1.0] - 2022-07-06
--
--- Added render target info to `renderItem` callback
-- - https://github.com/Shopify/flash-list/pull/454
--- Add Apple TV support
-- - https://github.com/Shopify/flash-list/pull/511
--- Clarify installation instructions in Expo projects
-- - https://github.com/Shopify/flash-list/pull/497
--- Upgrade recyclerlistview to v4.0.1
-- - https://github.com/Shopify/flash-list/pull/507
--- Add tslib as a dependency
-- - https://github.com/Shopify/flash-list/pull/514
--
--## [1.0.4] - 2022-07-02
--
--- Build fix for Android projects having `kotlinVersion` defined in `build.gradle`.
--- Allow providing an external scrollview.
-- - https://github.com/Shopify/flash-list/pull/502
--
--## [1.0.3] - 2022-07-01
--
--- Add kotlin-gradle-plugin to buildscript in project build.gradle
-- - https://github.com/Shopify/flash-list/pull/481
--
--## [1.0.2] - 2022-06-30
--
--- Minor changes
--
--## [1.0.1] - 2022-06-30
--
--- `data` prop change will force update items only if `renderItem` is also updated
-- - https://github.com/Shopify/flash-list/pull/453
--
--## [1.0.0] - 2022-06-17
--
--- Upgrade recyclerlistview to v3.3.0-beta.2
-- - https://github.com/Shopify/flash-list/pull/445
--- Added web support
-- - https://github.com/Shopify/flash-list/pull/444
--- Added `disableAutoLayout` prop to prevent conflicts with custom `CellRendererComponent`
-- - https://github.com/Shopify/flash-list/pull/452
--
--## [0.6.1] - 2022-05-26
--
--- Fix amending layout on iOS
-- - https://github.com/Shopify/flash-list/pull/412
--- Define `FlashList` props previously inherited from `VirtualizedList` and `FlatList` explicitly
-- - https://github.com/Shopify/flash-list/pull/386
--- Make `estimatedItemSize` optional
-- - https://github.com/Shopify/flash-list/pull/378
--- Change `overrideItemType` prop name to `getItemType`
-- - https://github.com/Shopify/flash-list/pull/369
--- Added `useBlankAreaTracker` hook for tracking blank area in production
-- - https://github.com/Shopify/flash-list/pull/411
--- Added `CellRendererComponent` prop
-- - https://github.com/Shopify/flash-list/pull/362
--- Added automatic height measurement for horizontal lists even when parent isn't deterministic
-- - https://github.com/Shopify/flash-list/pull/409
--
--## [0.5.0] - 2022-04-29
--
--- Fix finding props with testId
-- - https://github.com/Shopify/flash-list/pull/357
--- Reuse cached layouts on orientation change
-- - https://github.com/Shopify/flash-list/pull/319
--
--## [0.4.6] - 2022-04-13
--
--- Match FlashList's empty list behavior with FlatList
-- - https://github.com/Shopify/flash-list/pull/312
--
--## [0.4.5] - 2022-04-13
--
--- Upgrade recyclerlistview to v3.2.0-beta.4
--
-- - https://github.com/Shopify/flash-list/pull/315
--
--- Add viewability callbacks
--
-- - https://github.com/Shopify/flash-list/pull/301
--
--- Calculate average item sizes automatically
-- - https://github.com/Shopify/flash-list/pull/296
--
--## [0.4.4] - 2022-04-06
--
--- Fix `FlashList` mock when no data is provided
-- - https://github.com/Shopify/flash-list/pull/295
--
--## [0.4.3] - 2022-04-04
--
--- Reduce number of render item calls
--
-- - https://github.com/Shopify/flash-list/pull/253
--
--- Upgrade recyclerlistview to v3.2.0-beta.2
-- - https://github.com/Shopify/flash-list/pull/284
--
--## [0.4.2] - 2022-04-04
--
--- Minor changes
--
--## [0.4.1] - 2022-03-29
--
--- Crash fix for android activity switching (#256)
--
-- - https://github.com/Shopify/flash-list/pull/257
--
--- initialScrollIndex, scrollTo methods will now account for size of header
--
-- - https://github.com/Shopify/flash-list/pull/194
--
--- Added a new mock for easier testing of components with `FlashList`
-- - https://github.com/Shopify/flash-list/pull/236
--
--## [0.4.0] - 2022-03-23
--
--- Add support for layout animations
--
-- - https://github.com/Shopify/flash-list/pull/183
--
--- Suppress recyclerlistview's bounded size exception for some missing cases.
--
-- - https://github.com/Shopify/flash-list/pull/192
--
--- Expose reference to recyclerlistview and firstItemOffset
--
-- - https://github.com/Shopify/flash-list/pull/217
--
--- recyclerlistview upgraded to v3.1.0-alpha.9
-- - https://github.com/Shopify/flash-list/pull/227
--
--## [0.3.3] - 2022-03-16
--
--- Prevent implicit scroll to top on device orientation change
--- Change recyclerlistview's bounded size exception to a warning
-- - https://github.com/Shopify/flash-list/pull/187
--
--## [0.3.2] - 2022-03-15
--
--- Minor changes
--
--## [0.3.1] - 2022-03-15
--
--- Revert react-native-safe-area upgrade and minSdkVersion bump
-- - https://github.com/Shopify/flash-list/pull/184
--
--## [0.3.0] - 2022-03-15
--
--- Fixed untranspiled library code by enforcing stricter TS rules.
-- - https://github.com/Shopify/flash-list/pull/181
--
--## [0.2.4] - 2022-03-14
--
--- Added `onLoad` event that is called once the list has rendered items. This is required because FlashList doesn't render items in the first cycle.
-- - https://github.com/Shopify/flash-list/pull/180
--
--## [0.2.3] - 2022-03-10
--
--- Fixing publish steps for transpiled code
-- - https://github.com/Shopify/flash-list/pull/150
--
--## [0.2.2] - 2022-03-10
--
--- Fixing publish steps for transpiled code
-- - https://github.com/Shopify/flash-list/pull/149
--
--## [0.2.1] - 2022-03-09
--
--- Bug fix for style and last separator
-- - https://github.com/Shopify/flash-list/pull/141
--
--## [0.2.0] - 2022-03-08
--
--- Rename the component from `RecyclerFlatList` to `FlashList`
-- - https://github.com/Shopify/flash-list/pull/140
--
--## [0.1.0] - 2022-03-02
--
--- Initial release
-diff --git a/node_modules/@shopify/flash-list/RNFlashList.podspec b/node_modules/@shopify/flash-list/RNFlashList.podspec
-index 38ff029..a749f6c 100644
---- a/node_modules/@shopify/flash-list/RNFlashList.podspec
-+++ b/node_modules/@shopify/flash-list/RNFlashList.podspec
-@@ -9,14 +9,20 @@ Pod::Spec.new do |s|
- s.homepage = package['homepage']
- s.license = package['license']
- s.author = package['author']
-- s.platforms = { :ios => '11.0', :tvos => '12.0' }
- s.source = { git: 'https://github.com/shopify/flash-list.git', tag: "v#{s.version}" }
- s.source_files = 'ios/Sources/**/*'
- s.requires_arc = true
- s.swift_version = '5.0'
-+ s.pod_target_xcconfig = { 'OTHER_SWIFT_FLAGS' => '-D RCT_NEW_ARCH_ENABLED', }
-
-- # Dependencies
-- s.dependency 'React-Core'
-+ if defined?(install_modules_dependencies()) != nil
-+ install_modules_dependencies(s)
-+ s.ios.deployment_target = "12.4"
-+ s.platforms = { :ios => '12.4', :tvos => '12.0' }
-+ else
-+ s.dependency "React-Core"
-+ s.platforms = { :ios => '11.0', :tvos => '12.0' }
-+ end
-
- # Tests spec
- s.test_spec 'Tests' do |test_spec|
-diff --git a/node_modules/@shopify/flash-list/android/build.gradle b/node_modules/@shopify/flash-list/android/build.gradle
-index bed08cd..bad4465 100644
---- a/node_modules/@shopify/flash-list/android/build.gradle
-+++ b/node_modules/@shopify/flash-list/android/build.gradle
-@@ -1,7 +1,14 @@
--apply plugin: 'com.android.library'
-+def isNewArchitectureEnabled() {
-+ return project.hasProperty("newArchEnabled") && project.newArchEnabled == "true"
-+}
-
-+apply plugin: 'com.android.library'
- apply plugin: 'kotlin-android'
-
-+if (isNewArchitectureEnabled()) {
-+ apply plugin: 'com.facebook.react'
-+}
-+
- def _ext = rootProject.ext
-
- def _reactNativeVersion = _ext.has('reactNative') ? _ext.reactNative : '+'
-@@ -40,11 +47,19 @@ android {
- debug.java.srcDirs += 'src/debug/kotlin'
- test.java.srcDirs += 'src/test/kotlin'
- androidTest.java.srcDirs += 'src/androidTest/kotlin'
-+
-+ if (isNewArchitectureEnabled()) {
-+ main.java.srcDirs += ["${project.buildDir}/generated/source/codegen/java"]
-+ main.java.srcDirs += ["src/fabric/java"]
-+ } else {
-+ main.java.srcDirs += ['src/paper/java']
-+ }
- }
-
- defaultConfig {
- minSdkVersion _minSdkVersion
- targetSdkVersion _targetSdkVersion
-+ buildConfigField "boolean", "IS_NEW_ARCHITECTURE_ENABLED", isNewArchitectureEnabled().toString()
- versionCode 1
- versionName "1.0"
- testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
-@@ -61,7 +76,7 @@ android {
-
- dependencies {
- compileOnly "com.facebook.react:react-native:${_reactNativeVersion}"
-- implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:${_kotlinVersion}"
-+ implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:${_kotlinVersion}"
- testImplementation "junit:junit:${_junitVersion}"
- testImplementation "org.mockito.kotlin:mockito-kotlin:${_mockitoVersion}"
- testImplementation "org.mockito:mockito-inline:${_mockitoVersion}"
-diff --git a/node_modules/@shopify/flash-list/android/src/fabric/java/com/shopify/reactnative/flash_list/ReactContextExtensions.kt b/node_modules/@shopify/flash-list/android/src/fabric/java/com/shopify/reactnative/flash_list/ReactContextExtensions.kt
-new file mode 100644
-index 0000000..6e850fe
---- /dev/null
-+++ b/node_modules/@shopify/flash-list/android/src/fabric/java/com/shopify/reactnative/flash_list/ReactContextExtensions.kt
-@@ -0,0 +1,12 @@
-+package com.shopify.reactnative.flash_list
-+
-+import com.facebook.react.bridge.ReactContext
-+import com.facebook.react.fabric.FabricUIManager
-+import com.facebook.react.uimanager.UIManagerHelper
-+import com.facebook.react.uimanager.common.UIManagerType
-+import com.facebook.react.bridge.WritableMap
-+
-+fun ReactContext.dispatchEvent(nativeTag: Int, eventName: String, event: WritableMap) {
-+ val fabricUIManager = UIManagerHelper.getUIManager(this, UIManagerType.FABRIC) as FabricUIManager
-+ fabricUIManager.receiveEvent(nativeTag, eventName, event)
-+}
-diff --git a/node_modules/@shopify/flash-list/android/src/main/kotlin/com/shopify/reactnative/flash_list/AutoLayoutView.kt b/node_modules/@shopify/flash-list/android/src/main/kotlin/com/shopify/reactnative/flash_list/AutoLayoutView.kt
-index 4571798..c6c3cce 100644
---- a/node_modules/@shopify/flash-list/android/src/main/kotlin/com/shopify/reactnative/flash_list/AutoLayoutView.kt
-+++ b/node_modules/@shopify/flash-list/android/src/main/kotlin/com/shopify/reactnative/flash_list/AutoLayoutView.kt
-@@ -2,8 +2,6 @@ package com.shopify.reactnative.flash_list
-
- import android.content.Context
- import android.graphics.Canvas
--import android.util.DisplayMetrics
--import android.util.Log
- import android.view.View
- import android.view.ViewGroup
- import android.widget.HorizontalScrollView
-@@ -11,7 +9,6 @@ import android.widget.ScrollView
- import com.facebook.react.bridge.Arguments
- import com.facebook.react.bridge.ReactContext
- import com.facebook.react.bridge.WritableMap
--import com.facebook.react.uimanager.events.RCTEventEmitter
- import com.facebook.react.views.view.ReactViewGroup
-
-
-@@ -142,9 +139,8 @@ class AutoLayoutView(context: Context) : ReactViewGroup(context) {
- val event: WritableMap = Arguments.createMap()
- event.putDouble("offsetStart", alShadow.blankOffsetAtStart / pixelDensity)
- event.putDouble("offsetEnd", alShadow.blankOffsetAtEnd / pixelDensity)
-+
- val reactContext = context as ReactContext
-- reactContext
-- .getJSModule(RCTEventEmitter::class.java)
-- .receiveEvent(id, "onBlankAreaEvent", event)
-+ reactContext.dispatchEvent(id, "onBlankAreaEvent", event)
- }
- }
-diff --git a/node_modules/@shopify/flash-list/android/src/main/kotlin/com/shopify/reactnative/flash_list/AutoLayoutViewManager.kt b/node_modules/@shopify/flash-list/android/src/main/kotlin/com/shopify/reactnative/flash_list/AutoLayoutViewManager.kt
-index b646f09..7bda0ea 100644
---- a/node_modules/@shopify/flash-list/android/src/main/kotlin/com/shopify/reactnative/flash_list/AutoLayoutViewManager.kt
-+++ b/node_modules/@shopify/flash-list/android/src/main/kotlin/com/shopify/reactnative/flash_list/AutoLayoutViewManager.kt
-@@ -3,15 +3,22 @@ package com.shopify.reactnative.flash_list
- import com.facebook.react.module.annotations.ReactModule
- import com.facebook.react.uimanager.ThemedReactContext
- import com.facebook.react.uimanager.annotations.ReactProp
--import com.facebook.react.views.view.ReactViewGroup
--import com.facebook.react.views.view.ReactViewManager
-+import com.facebook.react.uimanager.ViewGroupManager
-+import com.facebook.react.uimanager.ViewManagerDelegate
-+import com.facebook.react.viewmanagers.AutoLayoutViewManagerDelegate
-+import com.facebook.react.viewmanagers.AutoLayoutViewManagerInterface
- import com.facebook.react.common.MapBuilder
- import kotlin.math.roundToInt
-
- /** ViewManager for AutoLayoutView - Container for all RecyclerListView children. Automatically removes all gaps and overlaps for GridLayouts with flexible spans.
- * Note: This cannot work for masonry layouts i.e, pinterest like layout */
- @ReactModule(name = AutoLayoutViewManager.REACT_CLASS)
--class AutoLayoutViewManager: ReactViewManager() {
-+class AutoLayoutViewManager: ViewGroupManager(), AutoLayoutViewManagerInterface {
-+ private val mDelegate: ViewManagerDelegate
-+
-+ init {
-+ mDelegate = AutoLayoutViewManagerDelegate(this)
-+ }
-
- companion object {
- const val REACT_CLASS = "AutoLayoutView"
-@@ -21,45 +28,42 @@ class AutoLayoutViewManager: ReactViewManager() {
- return REACT_CLASS
- }
-
-- override fun createViewInstance(context: ThemedReactContext): ReactViewGroup {
-+ override fun createViewInstance(context: ThemedReactContext): AutoLayoutView {
- return AutoLayoutView(context).also { it.pixelDensity = context.resources.displayMetrics.density.toDouble() }
- }
-
-- override fun getExportedCustomDirectEventTypeConstants(): MutableMap {
-- return MapBuilder.builder().put(
-- "onBlankAreaEvent",
-- MapBuilder.of(
-- "registrationName", "onBlankAreaEvent")
-- ).build();
-- }
-+ override fun getExportedCustomDirectEventTypeConstants() = mutableMapOf(
-+ "onBlankAreaEvent" to mutableMapOf("registrationName" to "onBlankAreaEvent"),
-+ "topOnBlankAreaEvent" to mutableMapOf("registrationName" to "onBlankAreaEvent"),
-+ )
-
- @ReactProp(name = "horizontal")
-- fun setHorizontal(view: AutoLayoutView, isHorizontal: Boolean) {
-+ override fun setHorizontal(view: AutoLayoutView, isHorizontal: Boolean) {
- view.alShadow.horizontal = isHorizontal
- }
-
- @ReactProp(name = "disableAutoLayout")
-- fun setDisableAutoLayout(view: AutoLayoutView, disableAutoLayout: Boolean) {
-+ override fun setDisableAutoLayout(view: AutoLayoutView, disableAutoLayout: Boolean) {
- view.disableAutoLayout = disableAutoLayout
- }
-
- @ReactProp(name = "scrollOffset")
-- fun setScrollOffset(view: AutoLayoutView, scrollOffset: Double) {
-+ override fun setScrollOffset(view: AutoLayoutView, scrollOffset: Double) {
- view.alShadow.scrollOffset = convertToPixelLayout(scrollOffset, view.pixelDensity)
- }
-
- @ReactProp(name = "windowSize")
-- fun setWindowSize(view: AutoLayoutView, windowSize: Double) {
-+ override fun setWindowSize(view: AutoLayoutView, windowSize: Double) {
- view.alShadow.windowSize = convertToPixelLayout(windowSize, view.pixelDensity)
- }
-
- @ReactProp(name = "renderAheadOffset")
-- fun setRenderAheadOffset(view: AutoLayoutView, renderOffset: Double) {
-+ override fun setRenderAheadOffset(view: AutoLayoutView, renderOffset: Double) {
- view.alShadow.renderOffset = convertToPixelLayout(renderOffset, view.pixelDensity)
- }
-
- @ReactProp(name = "enableInstrumentation")
-- fun setEnableInstrumentation(view: AutoLayoutView, enableInstrumentation: Boolean) {
-+ override fun setEnableInstrumentation(view: AutoLayoutView, enableInstrumentation: Boolean) {
- view.enableInstrumentation = enableInstrumentation
- }
-
-diff --git a/node_modules/@shopify/flash-list/android/src/main/kotlin/com/shopify/reactnative/flash_list/CellContainerManager.kt b/node_modules/@shopify/flash-list/android/src/main/kotlin/com/shopify/reactnative/flash_list/CellContainerManager.kt
-index 1434caa..590ba1d 100644
---- a/node_modules/@shopify/flash-list/android/src/main/kotlin/com/shopify/reactnative/flash_list/CellContainerManager.kt
-+++ b/node_modules/@shopify/flash-list/android/src/main/kotlin/com/shopify/reactnative/flash_list/CellContainerManager.kt
-@@ -2,12 +2,20 @@ package com.shopify.reactnative.flash_list
-
- import com.facebook.react.module.annotations.ReactModule
- import com.facebook.react.uimanager.ThemedReactContext
-+import com.facebook.react.uimanager.ViewGroupManager
-+import com.facebook.react.uimanager.ViewManagerDelegate
- import com.facebook.react.uimanager.annotations.ReactProp
--import com.facebook.react.views.view.ReactViewGroup
--import com.facebook.react.views.view.ReactViewManager
-+import com.facebook.react.viewmanagers.CellContainerManagerDelegate
-+import com.facebook.react.viewmanagers.CellContainerManagerInterface
-
- @ReactModule(name = AutoLayoutViewManager.REACT_CLASS)
--class CellContainerManager: ReactViewManager() {
-+class CellContainerManager: ViewGroupManager(), CellContainerManagerInterface {
-+ private val mDelegate: ViewManagerDelegate
-+
-+ init {
-+ mDelegate = CellContainerManagerDelegate(this);
-+ }
-+
- companion object {
- const val REACT_CLASS = "CellContainer"
- }
-@@ -16,12 +24,12 @@ class CellContainerManager: ReactViewManager() {
- return REACT_CLASS
- }
-
-- override fun createViewInstance(context: ThemedReactContext): ReactViewGroup {
-+ override fun createViewInstance(context: ThemedReactContext): CellContainerImpl {
- return CellContainerImpl(context)
- }
-
- @ReactProp(name = "index")
-- fun setIndex(view: CellContainerImpl, index: Int) {
-+ override fun setIndex(view: CellContainerImpl, index: Int) {
- view.index = index
- }
- }
-diff --git a/node_modules/@shopify/flash-list/android/src/paper/java/com/facebook/react/viewmanagers/AutoLayoutViewManagerDelegate.java b/node_modules/@shopify/flash-list/android/src/paper/java/com/facebook/react/viewmanagers/AutoLayoutViewManagerDelegate.java
-new file mode 100644
-index 0000000..4c90807
---- /dev/null
-+++ b/node_modules/@shopify/flash-list/android/src/paper/java/com/facebook/react/viewmanagers/AutoLayoutViewManagerDelegate.java
-@@ -0,0 +1,46 @@
-+/**
-+* This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
-+*
-+* Do not edit this file as changes may cause incorrect behavior and will be lost
-+* once the code is regenerated.
-+*
-+* @generated by codegen project: GeneratePropsJavaDelegate.js
-+*/
-+
-+package com.facebook.react.viewmanagers;
-+
-+import android.view.View;
-+import androidx.annotation.Nullable;
-+import com.facebook.react.uimanager.BaseViewManagerDelegate;
-+import com.facebook.react.uimanager.BaseViewManagerInterface;
-+
-+public class AutoLayoutViewManagerDelegate & AutoLayoutViewManagerInterface> extends BaseViewManagerDelegate {
-+ public AutoLayoutViewManagerDelegate(U viewManager) {
-+ super(viewManager);
-+ }
-+ @Override
-+ public void setProperty(T view, String propName, @Nullable Object value) {
-+ switch (propName) {
-+ case "horizontal":
-+ mViewManager.setHorizontal(view, value == null ? false : (boolean) value);
-+ break;
-+ case "scrollOffset":
-+ mViewManager.setScrollOffset(view, value == null ? 0f : ((Double) value).doubleValue());
-+ break;
-+ case "windowSize":
-+ mViewManager.setWindowSize(view, value == null ? 0f : ((Double) value).doubleValue());
-+ break;
-+ case "renderAheadOffset":
-+ mViewManager.setRenderAheadOffset(view, value == null ? 0f : ((Double) value).doubleValue());
-+ break;
-+ case "enableInstrumentation":
-+ mViewManager.setEnableInstrumentation(view, value == null ? false : (boolean) value);
-+ break;
-+ case "disableAutoLayout":
-+ mViewManager.setDisableAutoLayout(view, value == null ? false : (boolean) value);
-+ break;
-+ default:
-+ super.setProperty(view, propName, value);
-+ }
-+ }
-+}
-diff --git a/node_modules/@shopify/flash-list/android/src/paper/java/com/facebook/react/viewmanagers/AutoLayoutViewManagerInterface.java b/node_modules/@shopify/flash-list/android/src/paper/java/com/facebook/react/viewmanagers/AutoLayoutViewManagerInterface.java
-new file mode 100644
-index 0000000..8ad2622
---- /dev/null
-+++ b/node_modules/@shopify/flash-list/android/src/paper/java/com/facebook/react/viewmanagers/AutoLayoutViewManagerInterface.java
-@@ -0,0 +1,21 @@
-+/**
-+* This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
-+*
-+* Do not edit this file as changes may cause incorrect behavior and will be lost
-+* once the code is regenerated.
-+*
-+* @generated by codegen project: GeneratePropsJavaInterface.js
-+*/
-+
-+package com.facebook.react.viewmanagers;
-+
-+import android.view.View;
-+
-+public interface AutoLayoutViewManagerInterface {
-+ void setHorizontal(T view, boolean value);
-+ void setScrollOffset(T view, double value);
-+ void setWindowSize(T view, double value);
-+ void setRenderAheadOffset(T view, double value);
-+ void setEnableInstrumentation(T view, boolean value);
-+ void setDisableAutoLayout(T view, boolean value);
-+}
-diff --git a/node_modules/@shopify/flash-list/android/src/paper/java/com/facebook/react/viewmanagers/CellContainerManagerDelegate.java b/node_modules/@shopify/flash-list/android/src/paper/java/com/facebook/react/viewmanagers/CellContainerManagerDelegate.java
-new file mode 100644
-index 0000000..2b64af7
---- /dev/null
-+++ b/node_modules/@shopify/flash-list/android/src/paper/java/com/facebook/react/viewmanagers/CellContainerManagerDelegate.java
-@@ -0,0 +1,31 @@
-+/**
-+* This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
-+*
-+* Do not edit this file as changes may cause incorrect behavior and will be lost
-+* once the code is regenerated.
-+*
-+* @generated by codegen project: GeneratePropsJavaDelegate.js
-+*/
-+
-+package com.facebook.react.viewmanagers;
-+
-+import android.view.View;
-+import androidx.annotation.Nullable;
-+import com.facebook.react.uimanager.BaseViewManagerDelegate;
-+import com.facebook.react.uimanager.BaseViewManagerInterface;
-+
-+public class CellContainerManagerDelegate & CellContainerManagerInterface> extends BaseViewManagerDelegate {
-+ public CellContainerManagerDelegate(U viewManager) {
-+ super(viewManager);
-+ }
-+ @Override
-+ public void setProperty(T view, String propName, @Nullable Object value) {
-+ switch (propName) {
-+ case "index":
-+ mViewManager.setIndex(view, value == null ? 0 : ((Double) value).intValue());
-+ break;
-+ default:
-+ super.setProperty(view, propName, value);
-+ }
-+ }
-+}
-diff --git a/node_modules/@shopify/flash-list/android/src/paper/java/com/facebook/react/viewmanagers/CellContainerManagerInterface.java b/node_modules/@shopify/flash-list/android/src/paper/java/com/facebook/react/viewmanagers/CellContainerManagerInterface.java
-new file mode 100644
-index 0000000..b37ddbd
---- /dev/null
-+++ b/node_modules/@shopify/flash-list/android/src/paper/java/com/facebook/react/viewmanagers/CellContainerManagerInterface.java
-@@ -0,0 +1,16 @@
-+/**
-+* This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
-+*
-+* Do not edit this file as changes may cause incorrect behavior and will be lost
-+* once the code is regenerated.
-+*
-+* @generated by codegen project: GeneratePropsJavaInterface.js
-+*/
-+
-+package com.facebook.react.viewmanagers;
-+
-+import android.view.View;
-+
-+public interface CellContainerManagerInterface {
-+ void setIndex(T view, int value);
-+}
-diff --git a/node_modules/@shopify/flash-list/android/src/paper/java/com/shopify/reactnative/flash_list/ReactContextExtensions.kt b/node_modules/@shopify/flash-list/android/src/paper/java/com/shopify/reactnative/flash_list/ReactContextExtensions.kt
-new file mode 100644
-index 0000000..b867c18
---- /dev/null
-+++ b/node_modules/@shopify/flash-list/android/src/paper/java/com/shopify/reactnative/flash_list/ReactContextExtensions.kt
-@@ -0,0 +1,10 @@
-+package com.shopify.reactnative.flash_list
-+
-+import com.facebook.react.bridge.ReactContext
-+import com.facebook.react.uimanager.events.RCTEventEmitter
-+import com.facebook.react.bridge.WritableMap
-+
-+fun ReactContext.dispatchEvent(nativeTag: Int, eventName: String, event: WritableMap) {
-+ this.getJSModule(RCTEventEmitter::class.java)
-+ .receiveEvent(nativeTag, eventName, event)
-+}
diff --git a/node_modules/@shopify/flash-list/dist/FlashList.d.ts b/node_modules/@shopify/flash-list/dist/FlashList.d.ts
index ed81d7d..1e24103 100644
--- a/node_modules/@shopify/flash-list/dist/FlashList.d.ts
@@ -707,15 +10,6 @@ index ed81d7d..1e24103 100644
/**
* Allows access to internal recyclerlistview. This is useful for enabling access to its public APIs.
* Warning: We may swap recyclerlistview for something else in the future. Use with caution.
-diff --git a/node_modules/@shopify/flash-list/dist/FlashList.d.ts.map b/node_modules/@shopify/flash-list/dist/FlashList.d.ts.map
-index 97c8cc6..a915a05 100644
---- a/node_modules/@shopify/flash-list/dist/FlashList.d.ts.map
-+++ b/node_modules/@shopify/flash-list/dist/FlashList.d.ts.map
-@@ -1 +1 @@
--{"version":3,"file":"FlashList.d.ts","sourceRoot":"","sources":["../src/FlashList.tsx"],"names":[],"mappings":"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"}
-\ No newline at end of file
-+{"version":3,"file":"FlashList.d.ts","sourceRoot":"","sources":["../src/FlashList.tsx"],"names":[],"mappings":"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"}
-\ No newline at end of file
diff --git a/node_modules/@shopify/flash-list/dist/FlashList.js b/node_modules/@shopify/flash-list/dist/FlashList.js
index 1a5d026..37852b8 100644
--- a/node_modules/@shopify/flash-list/dist/FlashList.js
@@ -733,569 +27,6 @@ index 1a5d026..37852b8 100644
Object.defineProperty(FlashList.prototype, "recyclerlistview_unsafe", {
/**
* Allows access to internal recyclerlistview. This is useful for enabling access to its public APIs.
-diff --git a/node_modules/@shopify/flash-list/dist/FlashList.js.map b/node_modules/@shopify/flash-list/dist/FlashList.js.map
-index 375f7fc..8fc9c3f 100644
---- a/node_modules/@shopify/flash-list/dist/FlashList.js.map
-+++ b/node_modules/@shopify/flash-list/dist/FlashList.js.map
-@@ -1 +1 @@
--{"version":3,"file":"FlashList.js","sourceRoot":"","sources":["../src/FlashList.tsx"],"names":[],"mappings":"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"}
-\ No newline at end of file
-+{"version":3,"file":"FlashList.js","sourceRoot":"","sources":["../src/FlashList.tsx"],"names":[],"mappings":"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"}
-\ No newline at end of file
-diff --git a/node_modules/@shopify/flash-list/dist/fabric/AutoLayoutNativeComponent.d.ts b/node_modules/@shopify/flash-list/dist/fabric/AutoLayoutNativeComponent.d.ts
-new file mode 100644
-index 0000000..661dc81
---- /dev/null
-+++ b/node_modules/@shopify/flash-list/dist/fabric/AutoLayoutNativeComponent.d.ts
-@@ -0,0 +1,18 @@
-+import type { ViewProps } from "react-native";
-+import type { Int32, Double, DirectEventHandler } from "react-native/Libraries/Types/CodegenTypes";
-+declare type BlankAreaEvent = Readonly<{
-+ offsetStart: Int32;
-+ offsetEnd: Int32;
-+}>;
-+interface NativeProps extends ViewProps {
-+ horizontal?: boolean;
-+ scrollOffset?: Double;
-+ windowSize?: Double;
-+ renderAheadOffset?: Double;
-+ enableInstrumentation?: boolean;
-+ disableAutoLayout?: boolean;
-+ onBlankAreaEvent?: DirectEventHandler;
-+}
-+declare const _default: import("react-native/Libraries/Utilities/codegenNativeComponent").NativeComponentType;
-+export default _default;
-+//# sourceMappingURL=AutoLayoutNativeComponent.d.ts.map
-\ No newline at end of file
-diff --git a/node_modules/@shopify/flash-list/dist/fabric/AutoLayoutNativeComponent.d.ts.map b/node_modules/@shopify/flash-list/dist/fabric/AutoLayoutNativeComponent.d.ts.map
-new file mode 100644
-index 0000000..25297b9
---- /dev/null
-+++ b/node_modules/@shopify/flash-list/dist/fabric/AutoLayoutNativeComponent.d.ts.map
-@@ -0,0 +1 @@
-+{"version":3,"file":"AutoLayoutNativeComponent.d.ts","sourceRoot":"","sources":["../../src/fabric/AutoLayoutNativeComponent.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EACV,KAAK,EACL,MAAM,EACN,kBAAkB,EACnB,MAAM,2CAA2C,CAAC;AAEnD,aAAK,cAAc,GAAG,QAAQ,CAAC;IAC7B,WAAW,EAAE,KAAK,CAAC;IACnB,SAAS,EAAE,KAAK,CAAC;CAClB,CAAC,CAAC;AAEH,UAAU,WAAY,SAAQ,SAAS;IACrC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,gBAAgB,CAAC,EAAE,kBAAkB,CAAC,cAAc,CAAC,CAAC;CACvD;;AAED,wBAAqE"}
-\ No newline at end of file
-diff --git a/node_modules/@shopify/flash-list/dist/fabric/AutoLayoutNativeComponent.js b/node_modules/@shopify/flash-list/dist/fabric/AutoLayoutNativeComponent.js
-new file mode 100644
-index 0000000..c69ba24
---- /dev/null
-+++ b/node_modules/@shopify/flash-list/dist/fabric/AutoLayoutNativeComponent.js
-@@ -0,0 +1,6 @@
-+"use strict";
-+Object.defineProperty(exports, "__esModule", { value: true });
-+var tslib_1 = require("tslib");
-+var codegenNativeComponent_1 = tslib_1.__importDefault(require("react-native/Libraries/Utilities/codegenNativeComponent"));
-+exports.default = (0, codegenNativeComponent_1.default)("AutoLayoutView");
-+//# sourceMappingURL=AutoLayoutNativeComponent.js.map
-\ No newline at end of file
-diff --git a/node_modules/@shopify/flash-list/dist/fabric/AutoLayoutNativeComponent.js.map b/node_modules/@shopify/flash-list/dist/fabric/AutoLayoutNativeComponent.js.map
-new file mode 100644
-index 0000000..890db63
---- /dev/null
-+++ b/node_modules/@shopify/flash-list/dist/fabric/AutoLayoutNativeComponent.js.map
-@@ -0,0 +1 @@
-+{"version":3,"file":"AutoLayoutNativeComponent.js","sourceRoot":"","sources":["../../src/fabric/AutoLayoutNativeComponent.ts"],"names":[],"mappings":";;;AAAA,2HAA6F;AAuB7F,kBAAe,IAAA,gCAAsB,EAAc,gBAAgB,CAAC,CAAC"}
-\ No newline at end of file
-diff --git a/node_modules/@shopify/flash-list/dist/fabric/CellContainerNativeComponent.d.ts b/node_modules/@shopify/flash-list/dist/fabric/CellContainerNativeComponent.d.ts
-new file mode 100644
-index 0000000..bb8f63b
---- /dev/null
-+++ b/node_modules/@shopify/flash-list/dist/fabric/CellContainerNativeComponent.d.ts
-@@ -0,0 +1,8 @@
-+import type { Int32 } from "react-native/Libraries/Types/CodegenTypes";
-+import type { ViewProps } from "react-native";
-+interface NativeProps extends ViewProps {
-+ index?: Int32;
-+}
-+declare const _default: import("react-native/Libraries/Utilities/codegenNativeComponent").NativeComponentType;
-+export default _default;
-+//# sourceMappingURL=CellContainerNativeComponent.d.ts.map
-\ No newline at end of file
-diff --git a/node_modules/@shopify/flash-list/dist/fabric/CellContainerNativeComponent.d.ts.map b/node_modules/@shopify/flash-list/dist/fabric/CellContainerNativeComponent.d.ts.map
-new file mode 100644
-index 0000000..993a2c3
---- /dev/null
-+++ b/node_modules/@shopify/flash-list/dist/fabric/CellContainerNativeComponent.d.ts.map
-@@ -0,0 +1 @@
-+{"version":3,"file":"CellContainerNativeComponent.d.ts","sourceRoot":"","sources":["../../src/fabric/CellContainerNativeComponent.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,2CAA2C,CAAC;AACvE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C,UAAU,WAAY,SAAQ,SAAS;IACrC,KAAK,CAAC,EAAE,KAAK,CAAC;CACf;;AAED,wBAAoE"}
-\ No newline at end of file
-diff --git a/node_modules/@shopify/flash-list/dist/fabric/CellContainerNativeComponent.js b/node_modules/@shopify/flash-list/dist/fabric/CellContainerNativeComponent.js
-new file mode 100644
-index 0000000..b21acb7
---- /dev/null
-+++ b/node_modules/@shopify/flash-list/dist/fabric/CellContainerNativeComponent.js
-@@ -0,0 +1,6 @@
-+"use strict";
-+Object.defineProperty(exports, "__esModule", { value: true });
-+var tslib_1 = require("tslib");
-+var codegenNativeComponent_1 = tslib_1.__importDefault(require("react-native/Libraries/Utilities/codegenNativeComponent"));
-+exports.default = (0, codegenNativeComponent_1.default)("CellContainer");
-+//# sourceMappingURL=CellContainerNativeComponent.js.map
-\ No newline at end of file
-diff --git a/node_modules/@shopify/flash-list/dist/fabric/CellContainerNativeComponent.js.map b/node_modules/@shopify/flash-list/dist/fabric/CellContainerNativeComponent.js.map
-new file mode 100644
-index 0000000..d7c2469
---- /dev/null
-+++ b/node_modules/@shopify/flash-list/dist/fabric/CellContainerNativeComponent.js.map
-@@ -0,0 +1 @@
-+{"version":3,"file":"CellContainerNativeComponent.js","sourceRoot":"","sources":["../../src/fabric/CellContainerNativeComponent.ts"],"names":[],"mappings":";;;AAAA,2HAA6F;AAQ7F,kBAAe,IAAA,gCAAsB,EAAc,eAAe,CAAC,CAAC"}
-\ No newline at end of file
-diff --git a/node_modules/@shopify/flash-list/dist/tsconfig.tsbuildinfo b/node_modules/@shopify/flash-list/dist/tsconfig.tsbuildinfo
-deleted file mode 100644
-index 023b94a..0000000
---- a/node_modules/@shopify/flash-list/dist/tsconfig.tsbuildinfo
-+++ /dev/null
-@@ -1 +0,0 @@
--{"program":{"fileNames":["../node_modules/typescript/lib/lib.es5.d.ts","../node_modules/typescript/lib/lib.es2015.d.ts","../node_modules/typescript/lib/lib.es2016.d.ts","../node_modules/typescript/lib/lib.es2017.d.ts","../node_modules/typescript/lib/lib.es2018.d.ts","../node_modules/typescript/lib/lib.es2019.d.ts","../node_modules/typescript/lib/lib.es2020.d.ts","../node_modules/typescript/lib/lib.dom.d.ts","../node_modules/typescript/lib/lib.dom.iterable.d.ts","../node_modules/typescript/lib/lib.es2015.core.d.ts","../node_modules/typescript/lib/lib.es2015.collection.d.ts","../node_modules/typescript/lib/lib.es2015.generator.d.ts","../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../node_modules/typescript/lib/lib.es2015.promise.d.ts","../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../node_modules/typescript/lib/lib.es2017.object.d.ts","../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../node_modules/typescript/lib/lib.es2017.string.d.ts","../node_modules/typescript/lib/lib.es2017.intl.d.ts","../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../node_modules/typescript/lib/lib.es2018.intl.d.ts","../node_modules/typescript/lib/lib.es2018.promise.d.ts","../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../node_modules/typescript/lib/lib.es2019.array.d.ts","../node_modules/typescript/lib/lib.es2019.object.d.ts","../node_modules/typescript/lib/lib.es2019.string.d.ts","../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../node_modules/typescript/lib/lib.es2020.date.d.ts","../node_modules/typescript/lib/lib.es2020.promise.d.ts","../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../node_modules/typescript/lib/lib.es2020.string.d.ts","../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../node_modules/typescript/lib/lib.es2020.intl.d.ts","../node_modules/typescript/lib/lib.es2020.number.d.ts","../node_modules/typescript/lib/lib.esnext.intl.d.ts","../node_modules/tslib/tslib.d.ts","../node_modules/@types/react-native/modules/BatchedBridge.d.ts","../node_modules/@types/react-native/modules/Codegen.d.ts","../node_modules/@types/react-native/modules/Devtools.d.ts","../node_modules/@types/react-native/modules/globals.d.ts","../node_modules/@types/react-native/modules/LaunchScreen.d.ts","../node_modules/@types/react/global.d.ts","../node_modules/csstype/index.d.ts","../node_modules/@types/prop-types/index.d.ts","../node_modules/@types/scheduler/tracing.d.ts","../node_modules/@types/react/index.d.ts","../node_modules/@types/react-native/private/Utilities.d.ts","../node_modules/@types/react-native/public/Insets.d.ts","../node_modules/@types/react-native/Libraries/ReactNative/RendererProxy.d.ts","../node_modules/@types/react-native/public/ReactNativeTypes.d.ts","../node_modules/@types/react-native/Libraries/Types/CoreEventTypes.d.ts","../node_modules/@types/react-native/public/ReactNativeRenderer.d.ts","../node_modules/@types/react-native/Libraries/Components/Touchable/Touchable.d.ts","../node_modules/@types/react-native/Libraries/Components/View/ViewAccessibility.d.ts","../node_modules/@types/react-native/Libraries/Components/View/ViewPropTypes.d.ts","../node_modules/@types/react-native/Libraries/Components/RefreshControl/RefreshControl.d.ts","../node_modules/@types/react-native/Libraries/Components/ScrollView/ScrollView.d.ts","../node_modules/@types/react-native/Libraries/Components/View/View.d.ts","../node_modules/@types/react-native/Libraries/Image/ImageResizeMode.d.ts","../node_modules/@types/react-native/Libraries/Image/ImageSource.d.ts","../node_modules/@types/react-native/Libraries/Image/Image.d.ts","../node_modules/@react-native/virtualized-lists/Lists/VirtualizedList.d.ts","../node_modules/@react-native/virtualized-lists/index.d.ts","../node_modules/@types/react-native/Libraries/Lists/FlatList.d.ts","../node_modules/@types/react-native/Libraries/Lists/SectionList.d.ts","../node_modules/@types/react-native/Libraries/Text/Text.d.ts","../node_modules/@types/react-native/Libraries/Animated/Animated.d.ts","../node_modules/@types/react-native/Libraries/StyleSheet/StyleSheetTypes.d.ts","../node_modules/@types/react-native/Libraries/StyleSheet/StyleSheet.d.ts","../node_modules/@types/react-native/Libraries/StyleSheet/processColor.d.ts","../node_modules/@types/react-native/Libraries/ActionSheetIOS/ActionSheetIOS.d.ts","../node_modules/@types/react-native/Libraries/Alert/Alert.d.ts","../node_modules/@types/react-native/Libraries/Animated/Easing.d.ts","../node_modules/@types/react-native/Libraries/Animated/useAnimatedValue.d.ts","../node_modules/@types/react-native/Libraries/vendor/emitter/EventEmitter.d.ts","../node_modules/@types/react-native/Libraries/EventEmitter/RCTDeviceEventEmitter.d.ts","../node_modules/@types/react-native/Libraries/EventEmitter/RCTNativeAppEventEmitter.d.ts","../node_modules/@types/react-native/Libraries/AppState/AppState.d.ts","../node_modules/@types/react-native/Libraries/BatchedBridge/NativeModules.d.ts","../node_modules/@types/react-native/Libraries/Components/AccessibilityInfo/AccessibilityInfo.d.ts","../node_modules/@types/react-native/Libraries/Components/ActivityIndicator/ActivityIndicator.d.ts","../node_modules/@types/react-native/Libraries/Components/Clipboard/Clipboard.d.ts","../node_modules/@types/react-native/Libraries/Components/DrawerAndroid/DrawerLayoutAndroid.d.ts","../node_modules/@types/react-native/Libraries/EventEmitter/NativeEventEmitter.d.ts","../node_modules/@types/react-native/Libraries/Components/Keyboard/Keyboard.d.ts","../node_modules/@types/react-native/private/TimerMixin.d.ts","../node_modules/@types/react-native/Libraries/Components/Keyboard/KeyboardAvoidingView.d.ts","../node_modules/@types/react-native/Libraries/Components/Pressable/Pressable.d.ts","../node_modules/@types/react-native/Libraries/Components/ProgressBarAndroid/ProgressBarAndroid.d.ts","../node_modules/@types/react-native/Libraries/Components/SafeAreaView/SafeAreaView.d.ts","../node_modules/@types/react-native/Libraries/Components/StatusBar/StatusBar.d.ts","../node_modules/@types/react-native/Libraries/Components/Switch/Switch.d.ts","../node_modules/@types/react-native/Libraries/Components/TextInput/InputAccessoryView.d.ts","../node_modules/@types/react-native/Libraries/Components/TextInput/TextInput.d.ts","../node_modules/@types/react-native/Libraries/Components/ToastAndroid/ToastAndroid.d.ts","../node_modules/@types/react-native/Libraries/Components/Touchable/TouchableWithoutFeedback.d.ts","../node_modules/@types/react-native/Libraries/Components/Touchable/TouchableHighlight.d.ts","../node_modules/@types/react-native/Libraries/Components/Touchable/TouchableOpacity.d.ts","../node_modules/@types/react-native/Libraries/Components/Touchable/TouchableNativeFeedback.d.ts","../node_modules/@types/react-native/Libraries/Components/Button.d.ts","../node_modules/@types/react-native/Libraries/DevToolsSettings/DevToolsSettingsManager.d.ts","../node_modules/@types/react-native/Libraries/Interaction/InteractionManager.d.ts","../node_modules/@types/react-native/Libraries/Interaction/PanResponder.d.ts","../node_modules/@types/react-native/Libraries/LayoutAnimation/LayoutAnimation.d.ts","../node_modules/@types/react-native/Libraries/Linking/Linking.d.ts","../node_modules/@types/react-native/Libraries/LogBox/LogBox.d.ts","../node_modules/@types/react-native/Libraries/Modal/Modal.d.ts","../node_modules/@types/react-native/Libraries/Performance/Systrace.d.ts","../node_modules/@types/react-native/Libraries/PermissionsAndroid/PermissionsAndroid.d.ts","../node_modules/@types/react-native/Libraries/PushNotificationIOS/PushNotificationIOS.d.ts","../node_modules/@types/react-native/Libraries/Utilities/IPerformanceLogger.d.ts","../node_modules/@types/react-native/Libraries/ReactNative/AppRegistry.d.ts","../node_modules/@types/react-native/Libraries/ReactNative/I18nManager.d.ts","../node_modules/@types/react-native/Libraries/ReactNative/RootTag.d.ts","../node_modules/@types/react-native/Libraries/ReactNative/UIManager.d.ts","../node_modules/@types/react-native/Libraries/ReactNative/requireNativeComponent.d.ts","../node_modules/@types/react-native/Libraries/Settings/Settings.d.ts","../node_modules/@types/react-native/Libraries/Share/Share.d.ts","../node_modules/@types/react-native/Libraries/StyleSheet/PlatformColorValueTypesIOS.d.ts","../node_modules/@types/react-native/Libraries/StyleSheet/PlatformColorValueTypes.d.ts","../node_modules/@types/react-native/Libraries/TurboModule/RCTExport.d.ts","../node_modules/@types/react-native/Libraries/TurboModule/TurboModuleRegistry.d.ts","../node_modules/@types/react-native/Libraries/Utilities/Appearance.d.ts","../node_modules/@types/react-native/Libraries/Utilities/BackHandler.d.ts","../node_modules/@types/react-native/Libraries/Utilities/DevSettings.d.ts","../node_modules/@types/react-native/Libraries/Utilities/Dimensions.d.ts","../node_modules/@types/react-native/Libraries/Utilities/PixelRatio.d.ts","../node_modules/@types/react-native/Libraries/Utilities/Platform.d.ts","../node_modules/@types/react-native/Libraries/Vibration/Vibration.d.ts","../node_modules/@types/react-native/Libraries/YellowBox/YellowBoxDeprecated.d.ts","../node_modules/@types/react-native/Libraries/vendor/core/ErrorUtils.d.ts","../node_modules/@types/react-native/public/DeprecatedPropertiesAlias.d.ts","../node_modules/@types/react-native/index.d.ts","../node_modules/recyclerlistview/dist/reactnative/core/dependencies/ContextProvider.d.ts","../node_modules/recyclerlistview/dist/reactnative/core/dependencies/DataProvider.d.ts","../node_modules/recyclerlistview/dist/reactnative/core/layoutmanager/LayoutManager.d.ts","../node_modules/recyclerlistview/dist/reactnative/core/dependencies/LayoutProvider.d.ts","../node_modules/recyclerlistview/dist/reactnative/core/dependencies/GridLayoutProvider.d.ts","../node_modules/recyclerlistview/dist/reactnative/core/scrollcomponent/BaseScrollView.d.ts","../node_modules/recyclerlistview/dist/reactnative/core/ViewabilityTracker.d.ts","../node_modules/recyclerlistview/dist/reactnative/core/VirtualRenderer.d.ts","../node_modules/recyclerlistview/dist/reactnative/core/ItemAnimator.d.ts","../node_modules/recyclerlistview/dist/reactnative/utils/ComponentCompat.d.ts","../node_modules/recyclerlistview/dist/reactnative/core/RecyclerListView.d.ts","../node_modules/recyclerlistview/dist/reactnative/utils/AutoScroll.d.ts","../node_modules/recyclerlistview/dist/reactnative/core/layoutmanager/GridLayoutManager.d.ts","../node_modules/recyclerlistview/dist/reactnative/core/ProgressiveListView.d.ts","../node_modules/recyclerlistview/dist/reactnative/core/devutils/debughandlers/resize/ResizeDebugHandler.d.ts","../node_modules/recyclerlistview/dist/reactnative/core/devutils/debughandlers/DebugHandlers.d.ts","../node_modules/recyclerlistview/dist/reactnative/index.d.ts","../node_modules/recyclerlistview/dist/reactnative/core/StickyContainer.d.ts","../node_modules/recyclerlistview/sticky/index.d.ts","../src/native/auto-layout/AutoLayoutViewNativeComponentProps.ts","../src/native/auto-layout/AutoLayoutViewNativeComponent.ts","../src/native/auto-layout/AutoLayoutView.tsx","../src/native/cell-container/CellContainer.tsx","../src/PureComponentWrapper.tsx","../src/viewability/ViewToken.ts","../src/FlashListProps.ts","../src/utils/AverageWindow.ts","../src/utils/ContentContainerUtils.ts","../src/GridLayoutProviderWithProps.ts","../src/errors/CustomError.ts","../src/errors/ExceptionList.ts","../src/errors/Warnings.ts","../src/viewability/ViewabilityHelper.ts","../src/viewability/ViewabilityManager.ts","../node_modules/recyclerlistview/dist/reactnative/platform/reactnative/itemanimators/defaultjsanimator/DefaultJSItemAnimator.d.ts","../src/native/config/PlatformHelper.ts","../src/FlashList.tsx","../src/AnimatedFlashList.ts","../src/MasonryFlashList.tsx","../src/benchmark/AutoScrollHelper.ts","../src/benchmark/roundToDecimalPlaces.ts","../src/benchmark/JSFPSMonitor.ts","../src/benchmark/useBlankAreaTracker.ts","../src/benchmark/useBenchmark.ts","../src/benchmark/useDataMultiplier.ts","../src/benchmark/useFlatListBenchmark.ts","../src/index.ts","../src/__tests__/AverageWindow.test.ts","../src/__tests__/ContentContainerUtils.test.ts","../node_modules/@quilted/react-testing/build/typescript/types.d.ts","../node_modules/@quilted/react-testing/build/typescript/matchers/index.d.ts","../node_modules/@quilted/react-testing/build/typescript/environment.d.ts","../node_modules/@quilted/react-testing/build/typescript/implementations/test-renderer.d.ts","../node_modules/@quilted/react-testing/build/typescript/index.d.ts","../src/__tests__/helpers/mountFlashList.tsx","../src/__tests__/FlashList.test.tsx","../src/__tests__/GridLayoutProviderWithProps.test.ts","../src/__tests__/helpers/mountMasonryFlashList.tsx","../src/__tests__/MasonryFlashList.test.ts","../src/native/config/PlatformHelper.web.ts","../src/__tests__/PlatformHelper.web.test.ts","../src/__tests__/ViewabilityHelper.test.ts","../src/__tests__/useBlankAreaTracker.test.tsx","../src/native/auto-layout/AutoLayoutViewNativeComponent.android.ts","../src/native/auto-layout/AutoLayoutViewNativeComponent.ios.ts","../src/native/cell-container/CellContainer.android.ts","../src/native/cell-container/CellContainer.ios.ts","../src/native/cell-container/CellContainer.web.tsx","../src/native/config/PlatformHelper.android.ts","../src/native/config/PlatformHelper.ios.ts","../node_modules/@babel/types/lib/index.d.ts","../node_modules/@types/babel__generator/index.d.ts","../node_modules/@babel/parser/typings/babel-parser.d.ts","../node_modules/@types/babel__template/index.d.ts","../node_modules/@types/babel__traverse/index.d.ts","../node_modules/@types/babel__core/index.d.ts","../node_modules/@types/node/assert.d.ts","../node_modules/@types/node/assert/strict.d.ts","../node_modules/@types/node/globals.d.ts","../node_modules/@types/node/async_hooks.d.ts","../node_modules/@types/node/buffer.d.ts","../node_modules/@types/node/child_process.d.ts","../node_modules/@types/node/cluster.d.ts","../node_modules/@types/node/console.d.ts","../node_modules/@types/node/constants.d.ts","../node_modules/@types/node/crypto.d.ts","../node_modules/@types/node/dgram.d.ts","../node_modules/@types/node/diagnostics_channel.d.ts","../node_modules/@types/node/dns.d.ts","../node_modules/@types/node/dns/promises.d.ts","../node_modules/@types/node/domain.d.ts","../node_modules/@types/node/events.d.ts","../node_modules/@types/node/fs.d.ts","../node_modules/@types/node/fs/promises.d.ts","../node_modules/@types/node/http.d.ts","../node_modules/@types/node/http2.d.ts","../node_modules/@types/node/https.d.ts","../node_modules/@types/node/inspector.d.ts","../node_modules/@types/node/module.d.ts","../node_modules/@types/node/net.d.ts","../node_modules/@types/node/os.d.ts","../node_modules/@types/node/path.d.ts","../node_modules/@types/node/perf_hooks.d.ts","../node_modules/@types/node/process.d.ts","../node_modules/@types/node/punycode.d.ts","../node_modules/@types/node/querystring.d.ts","../node_modules/@types/node/readline.d.ts","../node_modules/@types/node/repl.d.ts","../node_modules/@types/node/stream.d.ts","../node_modules/@types/node/stream/promises.d.ts","../node_modules/@types/node/stream/consumers.d.ts","../node_modules/@types/node/stream/web.d.ts","../node_modules/@types/node/string_decoder.d.ts","../node_modules/@types/node/timers.d.ts","../node_modules/@types/node/timers/promises.d.ts","../node_modules/@types/node/tls.d.ts","../node_modules/@types/node/trace_events.d.ts","../node_modules/@types/node/tty.d.ts","../node_modules/@types/node/url.d.ts","../node_modules/@types/node/util.d.ts","../node_modules/@types/node/v8.d.ts","../node_modules/@types/node/vm.d.ts","../node_modules/@types/node/wasi.d.ts","../node_modules/@types/node/worker_threads.d.ts","../node_modules/@types/node/zlib.d.ts","../node_modules/@types/node/globals.global.d.ts","../node_modules/@types/node/index.d.ts","../node_modules/@types/graceful-fs/index.d.ts","../node_modules/@types/istanbul-lib-coverage/index.d.ts","../node_modules/@types/istanbul-lib-report/index.d.ts","../node_modules/@types/istanbul-reports/index.d.ts","../node_modules/chalk/index.d.ts","../node_modules/@sinclair/typebox/typebox.d.ts","../node_modules/@jest/schemas/build/index.d.ts","../node_modules/pretty-format/build/index.d.ts","../node_modules/jest-diff/build/index.d.ts","../node_modules/jest-matcher-utils/build/index.d.ts","../node_modules/@types/jest/index.d.ts","../node_modules/@types/json-schema/index.d.ts","../node_modules/@types/json5/index.d.ts","../node_modules/@types/parse-json/index.d.ts","../node_modules/@types/prettier/index.d.ts","../node_modules/@types/react-test-renderer/index.d.ts","../node_modules/@types/scheduler/index.d.ts","../node_modules/@types/stack-utils/index.d.ts","../node_modules/@types/websocket/index.d.ts","../node_modules/@types/yargs-parser/index.d.ts","../node_modules/@types/yargs/index.d.ts"],"fileInfos":[{"version":"f5c28122bee592cfaf5c72ed7bcc47f453b79778ffa6e301f45d21a0970719d4","affectsGlobalScope":true},"dc47c4fa66b9b9890cf076304de2a9c5201e94b740cffdf09f87296d877d71f6","7a387c58583dfca701b6c85e0adaf43fb17d590fb16d5b2dc0a2fbd89f35c467","8a12173c586e95f4433e0c6dc446bc88346be73ffe9ca6eec7aa63c8f3dca7f9","5f4e733ced4e129482ae2186aae29fde948ab7182844c3a5a51dd346182c7b06","e6b724280c694a9f588847f754198fb96c43d805f065c3a5b28bbc9594541c84","1fc5ab7a764205c68fa10d381b08417795fc73111d6dd16b5b1ed36badb743d9",{"version":"3f149f903dd20dfeb7c80e228b659f0e436532de772469980dbd00702cc05cc1","affectsGlobalScope":true},{"version":"1272277fe7daa738e555eb6cc45ded42cc2d0f76c07294142283145d49e96186","affectsGlobalScope":true},{"version":"adb996790133eb33b33aadb9c09f15c2c575e71fb57a62de8bf74dbf59ec7dfb","affectsGlobalScope":true},{"version":"43fb1d932e4966a39a41b464a12a81899d9ae5f2c829063f5571b6b87e6d2f9c","affectsGlobalScope":true},{"version":"cdccba9a388c2ee3fd6ad4018c640a471a6c060e96f1232062223063b0a5ac6a","affectsGlobalScope":true},{"version":"c5c05907c02476e4bde6b7e76a79ffcd948aedd14b6a8f56e4674221b0417398","affectsGlobalScope":true},{"version":"0d5f52b3174bee6edb81260ebcd792692c32c81fd55499d69531496f3f2b25e7","affectsGlobalScope":true},{"version":"810627a82ac06fb5166da5ada4159c4ec11978dfbb0805fe804c86406dab8357","affectsGlobalScope":true},{"version":"181f1784c6c10b751631b24ce60c7f78b20665db4550b335be179217bacc0d5f","affectsGlobalScope":true},{"version":"3013574108c36fd3aaca79764002b3717da09725a36a6fc02eac386593110f93","affectsGlobalScope":true},{"version":"75ec0bdd727d887f1b79ed6619412ea72ba3c81d92d0787ccb64bab18d261f14","affectsGlobalScope":true},{"version":"3be5a1453daa63e031d266bf342f3943603873d890ab8b9ada95e22389389006","affectsGlobalScope":true},{"version":"17bb1fc99591b00515502d264fa55dc8370c45c5298f4a5c2083557dccba5a2a","affectsGlobalScope":true},{"version":"7ce9f0bde3307ca1f944119f6365f2d776d281a393b576a18a2f2893a2d75c98","affectsGlobalScope":true},{"version":"6a6b173e739a6a99629a8594bfb294cc7329bfb7b227f12e1f7c11bc163b8577","affectsGlobalScope":true},{"version":"12a310447c5d23c7d0d5ca2af606e3bd08afda69100166730ab92c62999ebb9d","affectsGlobalScope":true},{"version":"b0124885ef82641903d232172577f2ceb5d3e60aed4da1153bab4221e1f6dd4e","affectsGlobalScope":true},{"version":"0eb85d6c590b0d577919a79e0084fa1744c1beba6fd0d4e951432fa1ede5510a","affectsGlobalScope":true},{"version":"da233fc1c8a377ba9e0bed690a73c290d843c2c3d23a7bd7ec5cd3d7d73ba1e0","affectsGlobalScope":true},{"version":"d154ea5bb7f7f9001ed9153e876b2d5b8f5c2bb9ec02b3ae0d239ec769f1f2ae","affectsGlobalScope":true},{"version":"bb2d3fb05a1d2ffbca947cc7cbc95d23e1d053d6595391bd325deb265a18d36c","affectsGlobalScope":true},{"version":"c80df75850fea5caa2afe43b9949338ce4e2de086f91713e9af1a06f973872b8","affectsGlobalScope":true},{"version":"9d57b2b5d15838ed094aa9ff1299eecef40b190722eb619bac4616657a05f951","affectsGlobalScope":true},{"version":"6c51b5dd26a2c31dbf37f00cfc32b2aa6a92e19c995aefb5b97a3a64f1ac99de","affectsGlobalScope":true},{"version":"6e7997ef61de3132e4d4b2250e75343f487903ddf5370e7ce33cf1b9db9a63ed","affectsGlobalScope":true},{"version":"2ad234885a4240522efccd77de6c7d99eecf9b4de0914adb9a35c0c22433f993","affectsGlobalScope":true},{"version":"09aa50414b80c023553090e2f53827f007a301bc34b0495bfb2c3c08ab9ad1eb","affectsGlobalScope":true},{"version":"d7f680a43f8cd12a6b6122c07c54ba40952b0c8aa140dcfcf32eb9e6cb028596","affectsGlobalScope":true},{"version":"3787b83e297de7c315d55d4a7c546ae28e5f6c0a361b7a1dcec1f1f50a54ef11","affectsGlobalScope":true},{"version":"e7e8e1d368290e9295ef18ca23f405cf40d5456fa9f20db6373a61ca45f75f40","affectsGlobalScope":true},{"version":"faf0221ae0465363c842ce6aa8a0cbda5d9296940a8e26c86e04cc4081eea21e","affectsGlobalScope":true},{"version":"06393d13ea207a1bfe08ec8d7be562549c5e2da8983f2ee074e00002629d1871","affectsGlobalScope":true},{"version":"cd483c056da900716879771893a3c9772b66c3c88f8943b4205aec738a94b1d0","affectsGlobalScope":true},{"version":"b248e32ca52e8f5571390a4142558ae4f203ae2f94d5bac38a3084d529ef4e58","affectsGlobalScope":true},{"version":"c37f8a49593a0030eecb51bbfa270e709bec9d79a6cc3bb851ef348d4e6b26f8","affectsGlobalScope":true},"14a84fbe4ec531dcbaf5d2594fd95df107258e60ae6c6a076404f13c3f66f28e",{"version":"1c0e04c54479b57b49fec4e93556974b3d071b65d0b750897e07b3b7d2145fc5","affectsGlobalScope":true},"bc1852215dc1488e6747ca43ae0605041de22ab9a6eeef39542d29837919c414","ae6da60c852e7bacc4a49ff14a42dc1a3fdbb44e11bd9b4acb1bf3d58866ee71",{"version":"0dab023e564abb43c817779fff766e125017e606db344f9633fdba330c970532","affectsGlobalScope":true},"4cbd76eafece5844dc0a32807e68047aecbdd8d863edba651f34c050624f18df",{"version":"ecf78e637f710f340ec08d5d92b3f31b134a46a4fcf2e758690d8c46ce62cba6","affectsGlobalScope":true},"ea0aa24a32c073b8639aa1f3130ba0add0f0f2f76b314d9ba988a5cb91d7e3c4","f7b46d22a307739c145e5fddf537818038fdfffd580d79ed717f4d4d37249380","f5a8b384f182b3851cec3596ccc96cb7464f8d3469f48c74bf2befb782a19de5",{"version":"29b8a3a533884705024eab54e56465614ad167f5dd87fdc2567d8e451f747224","affectsGlobalScope":true},"4f2490e3f420ea6345cade9aee5eada76888848e053726956aaf2af8705477ea","b3ac03d0c853c0ac076a10cfef4dc21d810f54dac5899ade2b1c628c35263533","d17a689ac1bd689f37d6f0d3d9a21afac349e60633844044f7a7b7b9d6f7fd83","019650941b03d4978f62d21ae874788a665c02b54e3268ef2029b02d3b4f7561","ae591c8a4d5c7f7fa44b6965016391457d9c1fd763475f68340599a2a2987a24","fbdef0c642b82cc1713b965f07b4da8005bbbb2c026039bfdc15ca2d20769e38","c2c004e7f1a150541d06bc4a408b96e45ac1f08e0b1b35dfd07fc0f678205f95","1f2081eb2cbeb0828f9baa1dd12cf6d207f8104ae0b085ab9975d11adc7f7e6f","cda9069fc4c312ff484c1373455e4297a02d38ae3bd7d0959aad772a2809623c","c028d20108bcaa3b1fdf3514956a8a90ccf680f18672fa3c92ce5acf81d7ab23","1054f6e8774a75aaf17e7cfea4899344f69590b2db1e06da21048ed1e063c693","9533301b8f75664e1b40a8484a4fd9c77efc04aef526409c2447aab7d12ddc63","b78b5b3fdb4e30976c4263c66c0ad38fb81edcc8075a4160a39d99c6dedd35be","032b51d656feaece529823992f5a39fe9e24d44dfa21b3a149982f7787fc7bdf","5bbfdfb694b019cb2a2022fba361a7a857efc1fc2b77a892c92ebc1349b7e984","46bc25e3501d321a70d0878e82a1d47b16ab77bdf017c8fecc76343f50806a0d","42bacb33cddecbcfe3e043ee1117ba848801749e44f947626765b3e0aec74b1c","49dba0d7a37268e6ae2026e84ad4362eac7e776d816756abf649be7fa177dcd5","5f2b5ab209daae571eb9acc1fd2067ccc94e2a13644579a245875bc4f02b562f","f072acf9547f89b814b9fdb3e72f4ebb1649191591cec99db43d35383906f87f","42450dba65ba1307f27c914a8e45e0b602c6f8f78773c052e42b0b87562f081e","f5870d0ca7b0dfb7e2b9ba9abad3a2e2bffe5c711b53dab2e6e76ca2df58302b","aeb20169389e9f508b1a4eb2a30371b64d64bb7c8543120bc39a3c6b78adfcc9","2a3d3acbab8567057a943f9f56113c0144f5fc561623749fbd6bb5c2b33bf738","9cf21fdcd1beb5142a514887133fa59057e06275bb3070713f3b6d51e830ffa0","0ad4f0b67db47064b404df89c50f99552ce12d6c4bb6154255be61eb6beed094","f8a464b9999126fe1095968c266c0d9c6174612cf256379a1ed1993a87bccdc6","49f981ca657ac160b5de5919ee5602d48bc8f8aac0805107c2ce4fd41dc9a2a1","56e4e08d95a3a7886266a2b4f66b67065c340480d9f1beb73ed7578aa83c639a","eb4360d3818dcd879ee965ae2f4b3fdfdc4149db921b6be338cb7dc7c2bd6710","1c1275f325f13af001aa5873418cb497a26b4b8271f9ad20a45e33f61ea3f9d9","b33e8426136c4f9b349b02c940d23310d350179f790899733aa097ed76457061","05aab001669a230a88820be09a54031c45d9af2488b27d53d4a9c8880ce73e8f","d93a066d4b8b33335dfff910fb25abb8979f8814f8ba45ea902a1360907da1f6","41e97e42d182b4d5f0733ebaad69294faaa507d95e595f317168b8f2325da9ca","debc734fc99b6e1684ed565946bad008913c769d4d2e400d8722c0c23d079c06","5a9f7e087aacb01fa0cdbc36b703a60367239f62beed2507a507199e4c417549","c7c23798fbf564983ed69c1ced3371970d986aaed4801a6e0fb41862550dc034","921f5bce372610ae8948ade7d82decbd2cf56d263de578976189585edd0abac0","ac11f8b13beef593e2f097450a7e214b23dca0d428babd570a2f39582f10e9ab","2499beb5d3e2b4c606977bcc2e08b6ef77b2ecda70e78e0622f5af3bed95c9ba","a11057410396907b84051cbdb8b0cd7f7049d72b58d2b6ac1c14ac2608191a52","bb630c26d487cc45ed107f4f2d3c2a95434716f6367f059de734c40d288c31eb","67cbce0ccdfa96b25de478a93cc493266c152e256c3c96b3d16d1f811e3d881f","19905c928bc4c016d05d915625bb08568447266c4661232faf89f7ddc4417ccc","26204eb4c326e8c975f1b789cbf345c6820205bded6d72e57246a83918d3bc84","618f25b2d41a99216e71817a3bc578991eee86c858c3f0f62a9e70707f4d279d","4cd2947878536ec078e4115b7d53cdcd4dcecd3a8288760caa79098db4f8f61f","2129e984399e94c82b77a32b975f3371ca5ee96341ab9f123474f1a5a1a9921f","798120aaa4952d68cd4b43d6625524c62a135c2f5a3eb705caee98de2355230d","6047365397173788c34bd71fea2bf07a9036d981212efd059b33e52d2c405e97","d7e25d7c03ccf8b10972c2a3a57e29a8d9024e6dbc4ac223baf633a6e8c7145c","6c2e2dead2d80007ee44c429b925d0a7b86f8f3d4c237b2197f7db9f39545dc6","38fbc8f9610fbf4bf619854b26e28c4fbbab16dc1944c4317a4af9bf1ac08d8e","1bd0470a72e6869c330e6e978f15ef32ba2c245249aca097b410448152e8a06b","dd05d7970a92b789f7df3b2252574b2e60f1b9a3758e2839e167b498b8f77159","7092be1889127b2f319efd5d9bdcc0b5cf6fe0740e47247ed039446045518898","0a3d5dbf7c2091017e697ebf9af0a727571f5d99cb4c19e6856212a745c6c355","d05f9c767924db6fb89f6075acb64c042cebdb12779bbd1aaca12c850b772d49","d032678e20ff0f4b8ef6f1e4823b6ae37931b776e8381676dc9141999909b3d7","3e4ab0e8e96e968ac84a2484104892c881ded1757acd81b5e969b6229851f54c","d43a36641f5812794a3b4a941e3dfb5fa070f9fff64cfd6daf5291cb962c8b05","32468df81188116040636844517fbe4f67fc37af4fe565c7592353df8e11d2f3","c12b5f9bf412c891cad443ef00a378ad2d3f1301f140943414308665a7d90af8","cf1b65c20036885ed99ce1c18aa0a0ed66f42acd6d415e99b48a8fa4105c23ed","173aec8be1be982c8244df6f94880d77a9b766c8c1ec3eb0af662c8dc6da7f2e","08188020373062e07955835a996fda1aff97a89e57d469edc6b9210bd9c8926f","cad5c2c0085a3e3b74f58aa199944b25ed8d24f93f51c99ebe2463e4f1694785","3e2d93a797c41ab081fbcd80e959b7c30d5d1c358f091c22a6ebe416ef7c5e19","c440df5735a3305e7db118bf821efb597c8318910861f735372846db9f7b506b","d6d8de719a75e5d2ed9dd9d6a99296d1337259e1c96166579db50797edd72ede","32b4c732e183bf5d123f88d526ac21b71a681089c18d2d761be342df31179d94","212d16020e7dce1b5509f3b9813de73612de57c6a3d74536714eb88787b96dc3","1a63d5212341783aa49cf78d667bf2a6cd03208ea09620b2fc3e647ae07f4e0d","84ea58841272970e6e3247cba4dbb326cf22764c2f4bbcb03f1c634315bbbcb5","86f9fbecdd848d02c90f861cc9839d8f3449c518a77e77ea65362f6a4126c63b","ecdaf317a4a1e7e3540e2f1b6aae38acd78dd99d564b52f98eea7358ac74416d","c30430960f1a0552b3cdaf1ef8164fdd4f289c782a8912df5180d57bc9ddfc03","a348081c01502c9f87d39d9e4b5dd58e1111b34c62686d6e569c595a0417bb35","eff69aee13c76502a16b756cde9c451fb4b5c4234052f3b3bee9dbfe92e1b1d5","9943f44400939f4ff008a882ff71162f70ba0c2f735c9743fd4645ef5c925fc4","b7836eba6c5173a1683aee8aa1771ff339e795cb9c21411590edb910274febe4","6fe447aa7e6fabc4f6c536f2997e3b1116b7f73dbe5bf3fc8d958bad434e4a84","15d3908d453d14be4dae760122ed5d74ad789a19f1fec2edd4034e57217436e9","ef00bc701f382da70870ab7721ed8f6552a38e332e60370b93cf340b6470845c","18891a02fa046e57b43a543dddc7212086fcb04ae6c8e8f28f8605dd3ccf57ed",{"version":"5980a888624dce1b0937a0d21c623f97056501bb61a8da29cbe07f1a0be2c9a8","affectsGlobalScope":true},"590a41ccab332c66a6aa62746612b03ceb2e92cc1da58c140e90fb7ff6e8c851","dc1d2996f23fe7f0da0b2c843e05c0ac170a36b51da11e58de089d344de93c3b","78ff01b50e7e9761f239527ec70b96171bccc28a08d909243e193db03b6f6983","ed18472ee2247563a26d754dd4c8bd66383013df13ce7c2927b03cab1a27b7e8","28ac9ac1fa163e5f2321fafa49b9931908c0076216ed3c82646d79abdf79775e","07dd4bed8ddab685f82a2125bf3aa41b42e36f28c16a5aec7357b727649076fb","fc15a2216f29b825747c0c3a54d6989518dd0f4aa0b580520e5526b4a47bec8f","c656d5baf3d4a8f358fc083db04b0fda8cb8503a613a9ba42327ecbd7909773c","397c2c81eaeae1388f7459699d7606feecfc304b212eb9113407c1315746a578","c2d923e9adc26a3efe5186f3a4a72413d24c80f03b306c68c30fa146690fb101","d34782833b7d5f72486a5fb926d3d96198706ed76aeaf1d435c748ebcf9169fc","b093e56054755189dd891ea832dec40d729d110a0a3f432fff5ea5ab1078cdde","98affe620e6230a3888b445c32376e4edbf6b1b376a71f2bf9c07bee11fcdd65","1e05491bef32ff48393d605d557152735899da3d9b111ba3588a1800f2927f4a","1ff7813974b1b9a0524c1e5a99aa52a05e79fc7df7749ada75ded8c53fe1b7e0","cd8c517f54d4ff3475755b290d741c8799df3265ce73d454d8fafe423f8ff749","bf431147b104ae92d61de6b43e9f25d27e8d3eaeaffd612e0c0d3bb8e2423926","f0f21604ae8f880c0ab529f00303806fdeadc943e32a25ca063fc8fea0fa063c","8dc4f45212fba9381e1674e8bd934a588730efbb8a6681b661cad8cd09b081c5",{"version":"52bf774bd30177ebb3e450c808d8d46f67896848a942e6203ae78b65b33d0106","signature":"688c437017a53e69ff66aac2036a0d7f6263082f676a408c9998cbd87ea2ec73"},{"version":"8b6ee36fd764378c62dca37041c5a12fd5a77b9e853c78908b7ed1c90dc149e4","signature":"03846acca031c757d910dbc017d846c87574faf90bde82316fb9b8537896d5ee"},{"version":"0d089d33f31b56697d142aa7395738c0323cf761b4c79fd6bf65a54ab1ddf02f","signature":"027c87e1cb049497d4f185bc9b922ce91cad59832da8faf3411e6b298b9deb78"},{"version":"ec0982b9e7d6c1b6c80e2829c5909eefb9ecee687e60621e0bb937e8ad5d1d43","signature":"8478b617a5be940f1b4b4d19d2fc6149c21ac69c4a7e00c8a7db2c2c21aa2274"},{"version":"84c5fc9d0d22f4566791b88d5fc2c24f56508b50c9ce894ac549ebaa158b1fca","signature":"677ea66c6fa02f1cebf82df19f416a8302c7a7d10e2de265b162760fcd865eef"},{"version":"8455135ea42310a73404fa2513e212d170af1191584061f583ec1e0f6b75dd91","signature":"83e4298f0b6834e955ee6a76569d3e5b3192065d47f1daf4535bb9edb16e88cb"},{"version":"73529962207605bdc5285d5e745919b8d57b776daa0f22a14b75cd8a92d63af9","signature":"422fcd2a7fd87f05efdfaa6eab382ca607d5d54e1f175ba2efccd4aacd5433ef"},{"version":"ebe927d8a9739c9d32ef4df28c1c36cf82daa9abba7cdf3f79e320c5e99e99d8","signature":"2421f9c6b1ecedd50818719090a77e9d2748c2339c33f3d4817beebf7a39d211"},{"version":"165c56632fea46c85e2a62f1b4eae600b846ea0deacd3c137fde9bacb845c30e","signature":"79bf9e3846b43e706d181c00f3c1c50ae8fc60e587c97a16e521adc150317624"},{"version":"866e1d2cf16a41851b056a2cc0cdc5f0f00df0435376cc2c723a8c609f61fbd0","signature":"5f5bbca60f0bfed6ff714163c4e962a5e260e59db754c89ee2063403accd03e3"},{"version":"ecfa1b63e3829b310ac968b2cc1cc7016ba76ffb8532439aebecbcbc57173b99","signature":"2f1dda63ade2bd085704674523b56ede942bc8c2c37fe8ed9b9b0fdfd69b1262"},{"version":"51d2f746d7e599a5549f5a946565934b4556bb9155be1eed2c474e25f1474872","signature":"c15585fe8935ed5cfedec39b7d41ec49990973f40faaba4b3e14278861643d79"},{"version":"b1d1378906c54a2f4d230ad69d212beedd2552afe3f7ad171b7eacb4cecc26d7","signature":"f9e60e8f79a7f606f19e02e2d39a24995719767dbe587f564f970bb24e3ca29d"},{"version":"f5a156e5b3783ea0399ac0326b7ab31a00e8874c5fa9b5e26fac217da8b5adfd","signature":"cfa7179e0306fc04d93f062c96e7ae8bad58d0cc4a7aa0dd4494ff9d262b101c"},{"version":"3c9fefca9303bcfd5712de11a3cbda20b3d6e85f29019bc75cab24690fb0f90d","signature":"306683152ff5a6038cf05b03ddff85a15b1bc8e18ef268aad26b02fd8e0e8b9d"},"a11c3e55d22d6379fe0949793e2638a6b43aa6e9def4f7452c3e352a296ef8da",{"version":"2770956c9437d7d66650084891c559ff6bb94200b7e2820940fd5d5dd0efa489","signature":"2faaf4f254008bf5be0e145be10dba35dccfac7116e9083f9d697a476a8e7076"},{"version":"ceee917fd557b841b93f7e13103dfdad79d38fe9962408f538f27db03dc9368d","signature":"15003ff6ed10d259dca775c7e5f7a64b272a9c370b6085db2d42a2d4a1d81579"},{"version":"a1691ae6d70af82f3e26d9e2e021dc5063021bd9c335bfdb40dc97d3574d1b3f","signature":"cd1c566b611a70ff987a79d0465da67649a8ed7e7668feddfcdf6dceb01c09a8"},{"version":"a105417dd540f1a400f0665c877e5d7e48e2efe08f01c2e5c7272256e644faa5","signature":"b3a6ee392811d6cddb38378ebaa373d4a39aa7dc4ecac73497c6b33627e6430b"},{"version":"581b44cf6122e3ad267d6bda2428c214fef3d38b6d7249df9fa6bc240a880a78","signature":"0ca09d92d6469d906a3d1c7192a6294c7f65b75f4f7eb8072bbd1b68c7f021e1"},{"version":"2e6426c1a1ff8561aa5f01d9398426bf06e55307f688464939de3196f0d4c143","signature":"5357bd09c9816a9765e617f86a9b49f85133d0bc0f9c5e29e834f2f8e6d52acb"},{"version":"508279c48de5627ae6c30a0aee01f4391bf32450335d7f09d5dd82acbc4d13c5","signature":"11d546a505f70f9c5f8092916027d8045c280a817b709fcaf2c4e63fa026c89c"},{"version":"557f2e0a4e5ac8a59b7c3068b2b30162fb963d72d50152482ab8c414e81caf37","signature":"008eaae28119118f1c589a1e29ea7fd17277f2280d2d3bfddeacd71fd1671bb5"},{"version":"f45c172ca54fb28d64b2dd04e495f17038034e20f37bd286a9f3eeb286cf1388","signature":"75a8761564c8fc5581b062dd339ea698921baf60e52eae055c8177dfa89eba90"},{"version":"ea696a0517ad69afea472e47eb1f904aba1667f54d4557eb98b8c766469d56a2","signature":"7e125d9abc19f62d1480f6c04a45d7bb2c89153316245ae8b8e5a0234b078c4e"},{"version":"902937c505f88d8b5b32829b4c14243eb740013fd0e2f58e6485324bbfe197a6","signature":"dc7de7650e5a64fc010387db18e84d48fe8f562dbd9caac01e54f83681ac976b"},{"version":"842accda78bb1b6f494f264aae307b84d933486d607e91f6e1d3a4d2e4851783","signature":"430d9683c8e5aaab71f0e3b271c4240cd5120a91191f953722985499af51d7e6"},{"version":"45b1a895868587c78a2ddff937967669b4e1968ea72c01e1c2b6dd5993f53b36","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"99cab9373415bac71e9d2c84279782c0a361b59551d0ca8dfaee8d4c08ed3247","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},"ba1fed463e8a21ffddb67a53df3f0d818b351991723736e167d065e2de1c7183",{"version":"22e311fec88bcc49b2b1fb3c9a7c082cd84b3388c9bcc7b9ef08253f6fa74e26","affectsGlobalScope":true},"c186097fd9b86681981cdeba08c0b6bbfcd8b562ab490c25656d85fef8f10c79","0b0c483e991e81c3f26e5f2da53ff26a15994c98c8b89cda1e4156dfc2428111","3340eb7b30bdee5f0349107d4068fd6f2f4712e11a2ba68e203b2f2489350317",{"version":"2000d60bd5195730ffff0d4ce9389003917928502c455ed2a9e296d3bf1a4b42","signature":"56335d3c9b867cc8654c05e633c508dd8de0038157f9958eb8794b7c123bb90e"},{"version":"dfceb5b9355a4a9002a7c291b1c3315511977c73cb23d9c123a72567783a18c0","signature":"b1802850887a3ea11a06df1fc1c65c6579332eefba1e63b3967a73dc937a2574"},{"version":"384fc0e3fa5966f524c96f1782b9d7a005346ba1621c43d0d1d819bf39077fbc","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"7fde517b3f03bb21ec3a46ba5f85c6797f8abf27deacb862183126e2f072788e","signature":"8b310edcfec83da25bc4f3adb20a7583bc5dae56d7d06c5b1431b76d390c1b72"},{"version":"894d93831d2afcd26f7362347e4960dd6d53f4153dad08813f3670e1327e387c","signature":"b1802850887a3ea11a06df1fc1c65c6579332eefba1e63b3967a73dc937a2574"},{"version":"8f9eac2c3ae305c25d4ffeff800b9811c8d3ec6a11b142fe96d08a2bc40f6440","signature":"08d6a2d1b004bbcac4249cd5baf6e9c662adc6139939c266b42e0422ef0c68b3"},{"version":"ac8980bdd810c30c444b59cca584c9b61d5ab274fa9474d778970537f3090240","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"1c024431c672cf9c6dcdb4d30c5b625435d81a5423b9d45e8de0082e969af8a8","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"eee1b57475023853cd09dd79b8d0d6639b6b82c3baee5863c2f2022b710f4102","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"377ba49d29102653a4b0c72b3870f9c599575df7db3a3fae7a21be5327ff84e2","signature":"c47f5db4df0a5031ed84bc6ee192c412b9e2d4d5e94681af77ccdcc25c851839"},{"version":"377ba49d29102653a4b0c72b3870f9c599575df7db3a3fae7a21be5327ff84e2","signature":"c47f5db4df0a5031ed84bc6ee192c412b9e2d4d5e94681af77ccdcc25c851839"},{"version":"39833acf7547216b2f31b2279dcfec3ed1359dec8adc9d1cb87c695ebf9bff94","signature":"7292d4dc9dac6d815dc30245a4a4a4959845d3a2b84ba0166857e4b23f2d033f"},{"version":"39833acf7547216b2f31b2279dcfec3ed1359dec8adc9d1cb87c695ebf9bff94","signature":"7292d4dc9dac6d815dc30245a4a4a4959845d3a2b84ba0166857e4b23f2d033f"},{"version":"529dd364d169ab3dbbb177ccdc4987c4a6f69187f553f3d36460ab65879ad998","signature":"3919e9d5911da2254732c31942e2cdc0057056ebfc2a16d34041c76a9b58d447"},{"version":"ebea587ca6477b9db29baf75d359924c55ab490fecdc38d7c0f16e589f0d27f9","signature":"0688c25f38e78e052338305d23046c7841074b3da5709a8f9e598ed705b9932b"},{"version":"de411013305dbe5c7a1ac13d2ea16dc36e52e6efd255b4e912fe53862058c649","signature":"2faaf4f254008bf5be0e145be10dba35dccfac7116e9083f9d697a476a8e7076"},"e432b56911b58550616fc4d54c1606f65fe98c74875b81d74601f5f965767c60","cc957354aa3c94c9961ebf46282cfde1e81d107fc5785a61f62c67f1dd3ac2eb","a46a2e69d12afe63876ec1e58d70e5dbee6d3e74132f4468f570c3d69f809f1c","93de1c6dab503f053efe8d304cb522bb3a89feab8c98f307a674a4fae04773e9","3b043cf9a81854a72963fdb57d1884fc4da1cf5be69b5e0a4c5b751e58cb6d88","dd5647a9ccccb2b074dca8a02b00948ac293091ebe73fdf2e6e98f718819f669","0cba3a5d7b81356222594442753cf90dd2892e5ccfe1d262aaca6896ba6c1380","a69c09dbea52352f479d3e7ac949fde3d17b195abe90b045d619f747b38d6d1a",{"version":"c2ab70bbc7a24c42a790890739dd8a0ba9d2e15038b40dff8163a97a5d148c00","affectsGlobalScope":true},"422dbb183fdced59425ca072c8bd09efaa77ce4e2ab928ec0d8a1ce062d2a45a",{"version":"712ba0d43b44d144dfd01593f61af6e2e21cfae83e834d297643e7973e55ed61","affectsGlobalScope":true},"1dab5ab6bcf11de47ab9db295df8c4f1d92ffa750e8f095e88c71ce4c3299628","f71f46ccd5a90566f0a37b25b23bc4684381ab2180bdf6733f4e6624474e1894",{"version":"54e65985a3ee3cec182e6a555e20974ea936fc8b8d1738c14e8ed8a42bd921d4","affectsGlobalScope":true},"82408ed3e959ddc60d3e9904481b5a8dc16469928257af22a3f7d1a3bc7fd8c4","98a3ebfa494b46265634a73459050befba5da8fdc6ca0ef9b7269421780f4ff3","34e5de87d983bc6aefef8b17658556e3157003e8d9555d3cb098c6bef0b5fbc8","cc0b61316c4f37393f1f9595e93b673f4184e9d07f4c127165a490ec4a928668","f27371653aded82b2b160f7a7033fb4a5b1534b6f6081ef7be1468f0f15327d3","c762cd6754b13a461c54b59d0ae0ab7aeef3c292c6cf889873f786ee4d8e75c9","f4ea7d5df644785bd9fbf419930cbaec118f0d8b4160037d2339b8e23c059e79",{"version":"bfea28e6162ed21a0aeed181b623dcf250aa79abf49e24a6b7e012655af36d81","affectsGlobalScope":true},"7a5459efa09ea82088234e6533a203d528c594b01787fb90fba148885a36e8b6","ae97e20f2e10dbeec193d6a2f9cd9a367a1e293e7d6b33b68bacea166afd7792","10d4796a130577d57003a77b95d8723530bbec84718e364aa2129fa8ffba0378","ad41bb744149e92adb06eb953da195115620a3f2ad48e7d3ae04d10762dae197","bf73c576885408d4a176f44a9035d798827cc5020d58284cb18d7573430d9022","7ae078ca42a670445ae0c6a97c029cb83d143d62abd1730efb33f68f0b2c0e82",{"version":"e8b18c6385ff784228a6f369694fcf1a6b475355ba89090a88de13587a9391d5","affectsGlobalScope":true},"5d0a9ea09d990b5788f867f1c79d4878f86f7384cb7dab38eecbf22f9efd063d","12eea70b5e11e924bb0543aea5eadc16ced318aa26001b453b0d561c2fd0bd1e","08777cd9318d294646b121838574e1dd7acbb22c21a03df84e1f2c87b1ad47f2","08a90bcdc717df3d50a2ce178d966a8c353fd23e5c392fd3594a6e39d9bb6304",{"version":"4cd4cff679c9b3d9239fd7bf70293ca4594583767526916af8e5d5a47d0219c7","affectsGlobalScope":true},"2a12d2da5ac4c4979401a3f6eaafa874747a37c365e4bc18aa2b171ae134d21b","002b837927b53f3714308ecd96f72ee8a053b8aeb28213d8ec6de23ed1608b66","1dc9c847473bb47279e398b22c740c83ea37a5c88bf66629666e3cf4c5b9f99c","a9e4a5a24bf2c44de4c98274975a1a705a0abbaad04df3557c2d3cd8b1727949","00fa7ce8bc8acc560dc341bbfdf37840a8c59e6a67c9bfa3fa5f36254df35db2","1b952304137851e45bc009785de89ada562d9376177c97e37702e39e60c2f1ff",{"version":"806ef4cac3b3d9fa4a48d849c8e084d7c72fcd7b16d76e06049a9ed742ff79c0","affectsGlobalScope":true},"44b8b584a338b190a59f4f6929d072431950c7bd92ec2694821c11bce180c8a5","5f0ed51db151c2cdc4fa3bb0f44ce6066912ad001b607a34e65a96c52eb76248",{"version":"3345c276cab0e76dda86c0fb79104ff915a4580ba0f3e440870e183b1baec476","affectsGlobalScope":true},"664d8f2d59164f2e08c543981453893bc7e003e4dfd29651ce09db13e9457980","e383ff72aabf294913f8c346f5da1445ae6ad525836d28efd52cbadc01a361a6","f52fbf64c7e480271a9096763c4882d356b05cab05bf56a64e68a95313cd2ce2","59bdb65f28d7ce52ccfc906e9aaf422f8b8534b2d21c32a27d7819be5ad81df7",{"version":"3a2da34079a2567161c1359316a32e712404b56566c45332ac9dcee015ecce9f","affectsGlobalScope":true},"28a2e7383fd898c386ffdcacedf0ec0845e5d1a86b5a43f25b86bc315f556b79","3aff9c8c36192e46a84afe7b926136d520487155154ab9ba982a8b544ea8fc95","a880cf8d85af2e4189c709b0fea613741649c0e40fffb4360ec70762563d5de0","85bbf436a15bbeda4db888be3062d47f99c66fd05d7c50f0f6473a9151b6a070","9f9c49c95ecd25e0cb2587751925976cf64fd184714cb11e213749c80cf0f927","f0c75c08a71f9212c93a719a25fb0320d53f2e50ca89a812640e08f8ad8c408c",{"version":"ab9b9a36e5284fd8d3bf2f7d5fcbc60052f25f27e4d20954782099282c60d23e","affectsGlobalScope":true},"9cafe917bf667f1027b2bb62e2de454ecd2119c80873ad76fc41d941089753b8","3ebae8c00411116a66fca65b08228ea0cf0b72724701f9b854442100aab55aba","8b06ac3faeacb8484d84ddb44571d8f410697f98d7bfa86c0fda60373a9f5215","7eb06594824ada538b1d8b48c3925a83e7db792f47a081a62cf3e5c4e23cf0ee","f5638f7c2f12a9a1a57b5c41b3c1ea7db3876c003bab68e6a57afd6bcc169af0","0d14fa22c41fdc7277e6f71473b20ebc07f40f00e38875142335d5b63cdfc9d2","7980bf9d2972585cdf76b5a72105f7817be0723ccb2256090f6335f45b462abe","301d7466eb591139c7d456958f732153b3400f3243f68d3321956b43a64769e9","22f13de9e2fe5f0f4724797abd3d34a1cdd6e47ef81fc4933fea3b8bf4ad524b","e3ba509d3dce019b3190ceb2f3fc88e2610ab717122dabd91a9efaa37804040d","cda0cb09b995489b7f4c57f168cd31b83dcbaa7aad49612734fb3c9c73f6e4f2",{"version":"2abad7477cf6761b55c18bea4c21b5a5dcf319748c13696df3736b35f8ac149e","affectsGlobalScope":true},"d38e588a10943bbab1d4ce03d94759bf065ff802a9a72fc57aa75a72f1725b71","96d14f21b7652903852eef49379d04dbda28c16ed36468f8c9fa08f7c14c9538","2b8264b2fefd7367e0f20e2c04eed5d3038831fe00f5efbc110ff0131aab899b","6209c901f30cc321f4b86800d11fad3d67e73a3308f19946b1bc642af0280298","60aaac5fb1858fbd4c4eb40e01706eb227eed9eca5c665564bd146971280dbd3","74b0245c42990ed8a849df955db3f4362c81b13f799ebc981b7bec2d5b414a57","b0d10e46cfe3f6c476b69af02eaa38e4ccc7430221ce3109ae84bb9fb8282298","4266ccd2cf1d6a281efd9c7ddf9efd7daecf76575364148bd233e18919cac3ed","70e9a18da08294f75bf23e46c7d69e67634c0765d355887b9b41f0d959e1426e","105b9a2234dcb06ae922f2cd8297201136d416503ff7d16c72bfc8791e9895c1"],"options":{"composite":true,"declaration":true,"declarationMap":true,"downlevelIteration":true,"esModuleInterop":true,"experimentalDecorators":true,"importHelpers":true,"jsx":2,"noEmitOnError":false,"noImplicitAny":true,"noUnusedLocals":true,"outDir":"./","rootDir":"../src","skipLibCheck":true,"sourceMap":true,"strictNullChecks":true,"target":1,"tsBuildInfoFile":"./tsconfig.tsbuildinfo"},"fileIdsList":[[211,260],[260],[260,273],[53,190,260],[192,194,260],[190,192,193,260],[53,260],[53,140,260],[69,260],[211,212,213,214,215,260],[211,213,260],[233,260,267],[260,269],[260,270],[260,275,277],[217,260],[220,260],[221,226,260],[222,232,233,240,249,259,260],[222,223,232,240,260],[224,260],[225,226,233,241,260],[226,249,256,260],[227,229,232,240,260],[228,260],[229,230,260],[231,232,260],[232,260],[232,233,234,249,259,260],[232,233,234,249,260],[235,240,249,259,260],[232,233,235,236,240,249,256,259,260],[235,237,249,256,259,260],[217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266],[232,238,260],[239,259,260],[229,232,240,249,260],[241,260],[242,260],[220,243,260],[244,258,260,264],[245,260],[246,260],[232,247,260],[247,248,260,262],[232,249,250,251,260],[249,251,260],[249,250,260],[252,260],[253,260],[232,254,255,260],[254,255,260],[226,240,249,256,260],[257,260],[240,258,260],[221,235,246,259,260],[226,260],[249,260,261],[260,262],[260,263],[221,226,232,234,243,249,259,260,262,264],[249,260,265],[76,77,260],[53,58,64,65,68,71,72,73,76,260],[74,260],[84,260],[53,57,82,260],[53,54,57,58,62,75,76,260],[53,76,105,106,260],[53,54,57,58,62,76,260],[82,91,260],[53,54,62,75,76,93,260],[53,55,58,61,62,65,75,76,260],[53,54,57,62,76,260],[53,54,57,62,260],[53,54,55,58,60,62,63,75,76,260],[53,76,260],[53,75,76,260],[53,54,57,58,61,62,75,76,82,93,260],[53,55,58,260],[53,54,57,60,75,76,93,103,260],[53,54,60,76,103,105,260],[53,54,57,60,62,93,103,260],[53,54,55,58,60,61,75,76,93,260],[58,260],[53,55,58,59,60,61,75,76,260],[82,260],[83,260],[53,54,55,57,58,61,66,67,75,76,260],[58,59,260],[53,64,65,70,75,76,260],[53,56,64,70,75,76,260],[53,58,62,260],[53,118,260],[53,57,260],[57,260],[76,260],[75,260],[66,74,76,260],[53,54,57,58,61,75,76,260],[128,260],[53,56,57,260],[91,260],[44,45,46,47,48,55,56,57,58,59,60,61,62,63,64,65,66,67,68,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,260],[140,260],[46,260],[49,50,51,52,260],[232,235,237,240,259,260,267],[260,287],[260,275],[260,272,276],[260,274],[151,260],[53,141,142,143,144,146,147,148,149,150,157,260],[53,140,147,150,151,260],[143,144,260],[142,143,144,147,260],[143,260],[155,260],[157,260],[144,260],[53,144,260],[141,142,143,144,145,146,147,149,150,151,152,153,154,156,260],[149,260],[158,260],[43,140,166,177,260],[43,53,140,157,159,162,163,164,166,168,169,170,171,172,174,176,260],[43,53,140,162,165,260],[43,157,166,167,168,260],[43,53,140,165,166,168,170,171,177,260],[43,53,260],[43,167,260],[43,168,260],[43,53,140,157,162,163,166,172,191,195,260],[43,140,157,177,195,260],[43,53,140,157,177,179,191,198,260],[43,200,260],[43,157,170,171,173,260],[43,53,140,166,177,191,194,260],[43,53,140,166,179,191,194,260],[43,53,177,183,194,195,260],[43,260],[43,181,260],[43,53,177,180,181,182,183,260],[43,53,157,162,177,260],[43,53,140,180,182,184,260],[43,162,163,165,166,177,178,179,180,182,183,184,185,186,260],[43,53,140,160,161,260],[43,140,160,260],[43,140,260],[43,53,140,260],[43,157,260],[43,157,175,260],[43,53,140,157,175,260],[43,140,157,166,260],[43,140,157,170,171,260],[43,140,165,173,177,260],[53,140,166],[53,157,166,169],[53,140,162,165],[157,166],[53,140,166,177],[53],[191],[53,166,177,191,194],[53,166,179,191,194],[53,177,182,183,187],[53,162,177],[140,184],[162,163,165,166,177,178,179,180,182,183,184,185,186],[53,140],[140,160],[140],[157],[53,157],[140,157,166],[140,157],[177]],"referencedMap":[[213,1],[211,2],[274,3],[192,4],[193,5],[194,6],[191,4],[190,7],[69,8],[70,9],[273,2],[216,10],[212,1],[214,11],[215,1],[268,12],[269,2],[270,13],[271,14],[278,15],[279,2],[280,2],[217,16],[218,16],[220,17],[221,18],[222,19],[223,20],[224,21],[225,22],[226,23],[227,24],[228,25],[229,26],[230,26],[231,27],[232,28],[233,29],[234,30],[219,2],[266,2],[235,31],[236,32],[237,33],[267,34],[238,35],[239,36],[240,37],[241,38],[242,39],[243,40],[244,41],[245,42],[246,43],[247,44],[248,45],[249,46],[251,47],[250,48],[252,49],[253,50],[254,51],[255,52],[256,53],[257,54],[258,55],[259,56],[260,57],[261,58],[262,59],[263,60],[264,61],[265,62],[281,2],[282,2],[51,2],[78,63],[79,2],[74,64],[80,2],[81,65],[85,66],[86,2],[87,67],[88,68],[107,69],[89,2],[90,70],[92,71],[94,72],[95,73],[96,74],[63,74],[97,75],[64,76],[98,77],[99,68],[100,78],[101,79],[102,2],[60,80],[104,81],[106,82],[105,83],[103,84],[65,75],[61,85],[62,86],[108,2],[91,87],[83,87],[84,88],[68,89],[66,2],[67,2],[109,87],[110,90],[111,2],[112,71],[71,91],[72,92],[113,2],[114,93],[115,2],[116,2],[117,2],[119,94],[120,2],[56,7],[121,7],[122,95],[123,96],[124,2],[125,97],[127,97],[126,97],[76,98],[75,99],[77,97],[73,100],[128,2],[129,101],[58,102],[130,66],[131,66],[132,103],[133,87],[118,2],[134,2],[135,2],[136,2],[137,7],[138,2],[82,2],[140,104],[44,2],[45,105],[46,106],[48,2],[47,2],[93,2],[54,2],[139,105],[55,2],[59,85],[57,7],[283,7],[49,2],[53,107],[284,2],[52,2],[285,2],[286,108],[287,2],[288,109],[272,2],[50,2],[276,110],[277,111],[275,112],[149,2],[154,113],[151,114],[158,115],[147,116],[148,117],[141,2],[142,2],[145,116],[144,118],[156,119],[155,120],[153,116],[143,121],[146,122],[157,123],[175,124],[152,2],[150,7],[159,125],[43,2],[8,2],[9,2],[11,2],[10,2],[2,2],[12,2],[13,2],[14,2],[15,2],[16,2],[17,2],[18,2],[19,2],[3,2],[4,2],[23,2],[20,2],[21,2],[22,2],[24,2],[25,2],[26,2],[5,2],[27,2],[28,2],[29,2],[30,2],[6,2],[31,2],[32,2],[33,2],[34,2],[7,2],[35,2],[40,2],[41,2],[36,2],[37,2],[38,2],[39,2],[1,2],[42,2],[178,126],[177,127],[166,128],[169,129],[179,130],[164,131],[188,132],[189,133],[196,134],[197,135],[199,136],[201,137],[202,138],[195,139],[198,140],[203,141],[180,142],[182,143],[181,142],[184,144],[183,145],[185,142],[186,146],[170,142],[171,142],[172,142],[187,147],[162,148],[204,149],[205,149],[161,149],[160,131],[206,150],[207,150],[163,151],[208,131],[209,152],[210,152],[176,153],[200,154],[167,142],[168,155],[165,142],[173,156],[174,157]],"exportedModulesMap":[[213,1],[211,2],[274,3],[192,4],[193,5],[194,6],[191,4],[190,7],[69,8],[70,9],[273,2],[216,10],[212,1],[214,11],[215,1],[268,12],[269,2],[270,13],[271,14],[278,15],[279,2],[280,2],[217,16],[218,16],[220,17],[221,18],[222,19],[223,20],[224,21],[225,22],[226,23],[227,24],[228,25],[229,26],[230,26],[231,27],[232,28],[233,29],[234,30],[219,2],[266,2],[235,31],[236,32],[237,33],[267,34],[238,35],[239,36],[240,37],[241,38],[242,39],[243,40],[244,41],[245,42],[246,43],[247,44],[248,45],[249,46],[251,47],[250,48],[252,49],[253,50],[254,51],[255,52],[256,53],[257,54],[258,55],[259,56],[260,57],[261,58],[262,59],[263,60],[264,61],[265,62],[281,2],[282,2],[51,2],[78,63],[79,2],[74,64],[80,2],[81,65],[85,66],[86,2],[87,67],[88,68],[107,69],[89,2],[90,70],[92,71],[94,72],[95,73],[96,74],[63,74],[97,75],[64,76],[98,77],[99,68],[100,78],[101,79],[102,2],[60,80],[104,81],[106,82],[105,83],[103,84],[65,75],[61,85],[62,86],[108,2],[91,87],[83,87],[84,88],[68,89],[66,2],[67,2],[109,87],[110,90],[111,2],[112,71],[71,91],[72,92],[113,2],[114,93],[115,2],[116,2],[117,2],[119,94],[120,2],[56,7],[121,7],[122,95],[123,96],[124,2],[125,97],[127,97],[126,97],[76,98],[75,99],[77,97],[73,100],[128,2],[129,101],[58,102],[130,66],[131,66],[132,103],[133,87],[118,2],[134,2],[135,2],[136,2],[137,7],[138,2],[82,2],[140,104],[44,2],[45,105],[46,106],[48,2],[47,2],[93,2],[54,2],[139,105],[55,2],[59,85],[57,7],[283,7],[49,2],[53,107],[284,2],[52,2],[285,2],[286,108],[287,2],[288,109],[272,2],[50,2],[276,110],[277,111],[275,112],[149,2],[154,113],[151,114],[158,115],[147,116],[148,117],[141,2],[142,2],[145,116],[144,118],[156,119],[155,120],[153,116],[143,121],[146,122],[157,123],[175,124],[152,2],[150,7],[159,125],[43,2],[8,2],[9,2],[11,2],[10,2],[2,2],[12,2],[13,2],[14,2],[15,2],[16,2],[17,2],[18,2],[19,2],[3,2],[4,2],[23,2],[20,2],[21,2],[22,2],[24,2],[25,2],[26,2],[5,2],[27,2],[28,2],[29,2],[30,2],[6,2],[31,2],[32,2],[33,2],[34,2],[7,2],[35,2],[40,2],[41,2],[36,2],[37,2],[38,2],[39,2],[1,2],[42,2],[178,158],[177,159],[166,160],[169,161],[179,162],[164,163],[196,164],[199,164],[195,165],[198,166],[184,167],[183,168],[186,169],[187,170],[162,171],[204,172],[205,172],[161,172],[160,163],[206,173],[207,173],[163,171],[208,163],[209,174],[210,174],[176,174],[200,175],[168,176],[173,177],[174,178]],"semanticDiagnosticsPerFile":[213,211,274,192,193,194,191,190,69,70,273,216,212,214,215,268,269,270,271,278,279,280,217,218,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,219,266,235,236,237,267,238,239,240,241,242,243,244,245,246,247,248,249,251,250,252,253,254,255,256,257,258,259,260,261,262,263,264,265,281,282,51,78,79,74,80,81,85,86,87,88,107,89,90,92,94,95,96,63,97,64,98,99,100,101,102,60,104,106,105,103,65,61,62,108,91,83,84,68,66,67,109,110,111,112,71,72,113,114,115,116,117,119,120,56,121,122,123,124,125,127,126,76,75,77,73,128,129,58,130,131,132,133,118,134,135,136,137,138,82,140,44,45,46,48,47,93,54,139,55,59,57,283,49,53,284,52,285,286,287,288,272,50,276,277,275,149,154,151,158,147,148,141,142,145,144,156,155,153,143,146,157,175,152,150,159,43,8,9,11,10,2,12,13,14,15,16,17,18,19,3,4,23,20,21,22,24,25,26,5,27,28,29,30,6,31,32,33,34,7,35,40,41,36,37,38,39,1,42,178,177,166,169,179,164,188,189,196,197,199,201,202,195,198,203,180,182,181,184,183,185,186,170,171,172,187,162,204,205,161,160,206,207,163,208,209,210,176,200,167,168,165,173,174]},"version":"4.7.4"}
-\ No newline at end of file
-diff --git a/node_modules/@shopify/flash-list/ios/Sources/AutoLayoutView.swift b/node_modules/@shopify/flash-list/ios/Sources/AutoLayoutView.swift
-index f18e92c..af1903c 100644
---- a/node_modules/@shopify/flash-list/ios/Sources/AutoLayoutView.swift
-+++ b/node_modules/@shopify/flash-list/ios/Sources/AutoLayoutView.swift
-@@ -4,31 +4,35 @@ import UIKit
-
- /// Container for all RecyclerListView children. This will automatically remove all gaps and overlaps for GridLayouts with flexible spans.
- /// Note: This cannot work for masonry layouts i.e, pinterest like layout
--@objc class AutoLayoutView: UIView {
-+@objc public class AutoLayoutView: UIView {
-+ #if RCT_NEW_ARCH_ENABLED
-+ @objc public var onBlankAreaEventHandler: ((CGFloat, CGFloat) -> Void)?
-+ #endif
-+
- @objc(onBlankAreaEvent)
- var onBlankAreaEvent: RCTDirectEventBlock?
-
-- @objc func setHorizontal(_ horizontal: Bool) {
-+ @objc public func setHorizontal(_ horizontal: Bool) {
- self.horizontal = horizontal
- }
-
-- @objc func setScrollOffset(_ scrollOffset: Int) {
-+ @objc public func setScrollOffset(_ scrollOffset: Int) {
- self.scrollOffset = CGFloat(scrollOffset)
- }
-
-- @objc func setWindowSize(_ windowSize: Int) {
-+ @objc public func setWindowSize(_ windowSize: Int) {
- self.windowSize = CGFloat(windowSize)
- }
-
-- @objc func setRenderAheadOffset(_ renderAheadOffset: Int) {
-+ @objc public func setRenderAheadOffset(_ renderAheadOffset: Int) {
- self.renderAheadOffset = CGFloat(renderAheadOffset)
- }
-
-- @objc func setEnableInstrumentation(_ enableInstrumentation: Bool) {
-+ @objc public func setEnableInstrumentation(_ enableInstrumentation: Bool) {
- self.enableInstrumentation = enableInstrumentation
- }
-
-- @objc func setDisableAutoLayout(_ disableAutoLayout: Bool) {
-+ @objc public func setDisableAutoLayout(_ disableAutoLayout: Bool) {
- self.disableAutoLayout = disableAutoLayout
- }
-
-@@ -46,7 +50,15 @@ import UIKit
- /// Tracks where first pixel is drawn in the visible window
- private var lastMinBound: CGFloat = 0
-
-- override func layoutSubviews() {
-+ private var viewsToLayout: [UIView] {
-+ #if RCT_NEW_ARCH_ENABLED
-+ return superview?.subviews ?? []
-+ #else
-+ return subviews
-+ #endif
-+ }
-+
-+ override public func layoutSubviews() {
- fixLayout()
- super.layoutSubviews()
-
-@@ -69,12 +81,16 @@ import UIKit
- distanceFromWindowEnd: distanceFromWindowEnd
- )
-
-+ #if RCT_NEW_ARCH_ENABLED
-+ onBlankAreaEventHandler?(blankOffsetStart, blankOffsetEnd)
-+ #else
- onBlankAreaEvent?(
- [
- "offsetStart": blankOffsetStart,
- "offsetEnd": blankOffsetEnd,
- ]
- )
-+ #endif
- }
-
- func getScrollView() -> UIScrollView? {
-@@ -85,15 +101,21 @@ import UIKit
- /// Performance: Sort is needed. Given relatively low number of views in RecyclerListView render tree this should be a non issue.
- private func fixLayout() {
- guard
-- subviews.count > 1,
-+ viewsToLayout.count > 1,
- // Fixing layout during animation can interfere with it.
- layer.animationKeys()?.isEmpty ?? true,
- !disableAutoLayout
- else { return }
-- let cellContainers = subviews
-- .compactMap { subview -> CellContainer? in
-- if let cellContainer = subview as? CellContainer {
-+ let cellContainers = viewsToLayout
-+ .compactMap { subview -> CellContainerComponentView? in
-+ if let cellContainer = subview as? CellContainerComponentView {
- return cellContainer
-+ } else if subview is AutoLayoutView {
-+ // On Fabric, due to view flattening children of AutoLayoutView are moved one level up, so they appear
-+ // as children of AutoLayoutViewComponentView in view hierarchy. viewsToLayout property takes it under
-+ // consideration, returning children of AutoLayoutViewComponentView when on Fabric. Because of that
-+ // AutoLayoutView may be on the list, in which case we want to ignore it.
-+ return nil
- } else {
- assertionFailure("CellRendererComponent outer view should always be CellContainer. Learn more here: https://shopify.github.io/flash-list/docs/usage#cellrenderercomponent.")
- return nil
-@@ -106,7 +128,7 @@ import UIKit
-
- /// Checks for overlaps or gaps between adjacent items and then applies a correction.
- /// Performance: RecyclerListView renders very small number of views and this is not going to trigger multiple layouts on the iOS side.
-- private func clearGaps(for cellContainers: [CellContainer]) {
-+ private func clearGaps(for cellContainers: [CellContainerComponentView]) {
- var maxBound: CGFloat = 0
- var minBound: CGFloat = CGFloat(Int.max)
- var maxBoundNextCell: CGFloat = 0
-@@ -192,7 +214,7 @@ import UIKit
- lastMinBound = minBound
- }
-
-- private func updateLastMaxBoundOverall(currentCell: CellContainer, nextCell: CellContainer) {
-+ private func updateLastMaxBoundOverall(currentCell: CellContainerComponentView, nextCell: CellContainerComponentView) {
- lastMaxBoundOverall = max(lastMaxBoundOverall, horizontal ? currentCell.frame.maxX : currentCell.frame.maxY, horizontal ? nextCell.frame.maxX : nextCell.frame.maxY)
- }
-
-@@ -217,7 +239,7 @@ import UIKit
-
- /// It's important to avoid correcting views outside the render window. An item that isn't being recycled might still remain in the view tree. If views outside get considered then gaps between unused items will cause algorithm to fail.
- func isWithinBounds(
-- _ cellContainer: CellContainer,
-+ _ cellContainer: CellContainerComponentView,
- scrollOffset: CGFloat,
- renderAheadOffset: CGFloat,
- windowSize: CGFloat,
-@@ -260,10 +282,10 @@ import UIKit
- }
-
- private func footerDiff() -> CGFloat {
-- if subviews.count == 0 {
-+ if viewsToLayout.count == 0 {
- lastMaxBoundOverall = 0
-- } else if subviews.count == 1 {
-- let firstChild = subviews[0]
-+ } else if viewsToLayout.count == 1 {
-+ let firstChild = viewsToLayout[0]
- lastMaxBoundOverall = horizontal ? firstChild.frame.maxX : firstChild.frame.maxY
- }
- let autoLayoutEnd = horizontal ? frame.width : frame.height
-@@ -271,6 +293,13 @@ import UIKit
- }
-
- private func footer() -> UIView? {
-- return superview?.subviews.first(where:{($0 as? CellContainer)?.index == -1})
-+ // On Fabric, AutoLayoutView is wrapped with AutoLayoutViewComponentView, so we need to go up one more level
-+ #if RCT_NEW_ARCH_ENABLED
-+ let parentSubviews = superview?.superview?.subviews
-+ #else
-+ let parentSubviews = superview?.subviews
-+ #endif
-+
-+ return parentSubviews?.first(where:{($0 as? CellContainerComponentView)?.index == -1})
- }
- }
-diff --git a/node_modules/@shopify/flash-list/ios/Sources/AutoLayoutViewComponentView.h b/node_modules/@shopify/flash-list/ios/Sources/AutoLayoutViewComponentView.h
-new file mode 100644
-index 0000000..1ae0b66
---- /dev/null
-+++ b/node_modules/@shopify/flash-list/ios/Sources/AutoLayoutViewComponentView.h
-@@ -0,0 +1,16 @@
-+#ifndef AutoLayoutViewComponentView_h
-+#define AutoLayoutViewComponentView_h
-+
-+#ifdef RCT_NEW_ARCH_ENABLED
-+
-+#import
-+#import
-+
-+@interface AutoLayoutViewComponentView : RCTViewComponentView
-+
-+@end
-+
-+
-+#endif /* RCT_NEW_ARCH_ENABLED */
-+
-+#endif /* AutoLayoutViewComponentView_h */
-diff --git a/node_modules/@shopify/flash-list/ios/Sources/AutoLayoutViewComponentView.mm b/node_modules/@shopify/flash-list/ios/Sources/AutoLayoutViewComponentView.mm
-new file mode 100644
-index 0000000..2d4295c
---- /dev/null
-+++ b/node_modules/@shopify/flash-list/ios/Sources/AutoLayoutViewComponentView.mm
-@@ -0,0 +1,80 @@
-+#ifdef RCT_NEW_ARCH_ENABLED
-+#import "AutoLayoutViewComponentView.h"
-+#import
-+#import
-+
-+#import
-+#import
-+#import
-+#import
-+
-+#import "RCTFabricComponentsPlugins.h"
-+#import
-+
-+using namespace facebook::react;
-+
-+@interface AutoLayoutViewComponentView ()
-+@end
-+
-+@implementation AutoLayoutViewComponentView
-+{
-+ AutoLayoutView *_autoLayoutView;
-+}
-+
-+- (instancetype)initWithFrame:(CGRect)frame
-+{
-+ if (self = [super initWithFrame:frame]) {
-+ static const auto defaultProps = std::make_shared();
-+ _props = defaultProps;
-+ _autoLayoutView = [[AutoLayoutView alloc] initWithFrame:self.bounds];
-+
-+ // Due to view flattening, AutoLayoutView's children get moved to its parent (AutoLayoutViewComponentView) and
-+ // AutoLayoutView is positioned above them consuming all events. Turning off userInteraction prevents that.
-+ _autoLayoutView.userInteractionEnabled = false;
-+
-+ self.contentView = _autoLayoutView;
-+
-+ __weak AutoLayoutViewComponentView* weakSelf = self;
-+ _autoLayoutView.onBlankAreaEventHandler = ^(CGFloat start, CGFloat end) {
-+ AutoLayoutViewComponentView *strongSelf = weakSelf;
-+ if (strongSelf != nullptr && strongSelf->_eventEmitter != nullptr) {
-+ std::dynamic_pointer_cast(strongSelf->_eventEmitter)
-+ ->onBlankAreaEvent(facebook::react::AutoLayoutViewEventEmitter::OnBlankAreaEvent{
-+ .offsetStart = (int) floor(start),
-+ .offsetEnd = (int) floor(end),
-+ });
-+ }
-+ };
-+ }
-+
-+ return self;
-+}
-+
-+#pragma mark - RCTComponentViewProtocol
-+
-++ (ComponentDescriptorProvider)componentDescriptorProvider
-+{
-+ return concreteComponentDescriptorProvider();
-+}
-+
-+- (void)updateProps:(const Props::Shared &)props oldProps:(const Props::Shared &)oldProps
-+{
-+ const auto &newProps = *std::static_pointer_cast(props);
-+
-+ [_autoLayoutView setHorizontal:newProps.horizontal];
-+ [_autoLayoutView setScrollOffset:newProps.scrollOffset];
-+ [_autoLayoutView setWindowSize:newProps.windowSize];
-+ [_autoLayoutView setRenderAheadOffset:newProps.renderAheadOffset];
-+ [_autoLayoutView setEnableInstrumentation:newProps.enableInstrumentation];
-+ [_autoLayoutView setDisableAutoLayout:newProps.disableAutoLayout];
-+
-+ [super updateProps:props oldProps:oldProps];
-+}
-+@end
-+
-+Class AutoLayoutViewCls(void)
-+{
-+ return AutoLayoutViewComponentView.class;
-+}
-+
-+#endif /* RCT_NEW_ARCH_ENABLED */
-diff --git a/node_modules/@shopify/flash-list/ios/Sources/AutoLayoutViewManager.m b/node_modules/@shopify/flash-list/ios/Sources/AutoLayoutViewManager.mm
-similarity index 100%
-rename from node_modules/@shopify/flash-list/ios/Sources/AutoLayoutViewManager.m
-rename to node_modules/@shopify/flash-list/ios/Sources/AutoLayoutViewManager.mm
-diff --git a/node_modules/@shopify/flash-list/ios/Sources/CellContainer.swift b/node_modules/@shopify/flash-list/ios/Sources/CellContainer.swift
-deleted file mode 100644
-index 7f09ce7..0000000
---- a/node_modules/@shopify/flash-list/ios/Sources/CellContainer.swift
-+++ /dev/null
-@@ -1,9 +0,0 @@
--import Foundation
--
--@objc class CellContainer: UIView {
-- var index: Int = -1
--
-- @objc func setIndex(_ index: Int) {
-- self.index = index
-- }
--}
-diff --git a/node_modules/@shopify/flash-list/ios/Sources/CellContainerComponentView.h b/node_modules/@shopify/flash-list/ios/Sources/CellContainerComponentView.h
-new file mode 100644
-index 0000000..ca1cbfe
---- /dev/null
-+++ b/node_modules/@shopify/flash-list/ios/Sources/CellContainerComponentView.h
-@@ -0,0 +1,18 @@
-+#ifndef CellContainer_h
-+#define CellContainer_h
-+
-+#import
-+
-+#ifdef RCT_NEW_ARCH_ENABLED
-+#import
-+
-+@interface CellContainerComponentView : RCTViewComponentView
-+#else
-+@interface CellContainerComponentView : UIView
-+#endif
-+
-+@property int64_t index;
-+
-+@end
-+
-+#endif /* CellContainer_h */
-diff --git a/node_modules/@shopify/flash-list/ios/Sources/CellContainerComponentView.mm b/node_modules/@shopify/flash-list/ios/Sources/CellContainerComponentView.mm
-new file mode 100644
-index 0000000..3a1c57e
---- /dev/null
-+++ b/node_modules/@shopify/flash-list/ios/Sources/CellContainerComponentView.mm
-@@ -0,0 +1,57 @@
-+#import "CellContainerComponentView.h"
-+
-+#ifdef RCT_NEW_ARCH_ENABLED
-+#import
-+
-+#import
-+#import
-+#import
-+#import
-+
-+#import "RCTFabricComponentsPlugins.h"
-+#import
-+
-+using namespace facebook::react;
-+
-+@interface CellContainerComponentView ()
-+@end
-+
-+@implementation CellContainerComponentView
-+
-+- (instancetype)initWithFrame:(CGRect)frame
-+{
-+ if (self = [super initWithFrame:frame]) {
-+ static const auto defaultProps = std::make_shared();
-+ _props = defaultProps;
-+
-+ self.userInteractionEnabled = true;
-+ }
-+
-+ return self;
-+}
-+
-+#pragma mark - RCTComponentViewProtocol
-+
-++ (ComponentDescriptorProvider)componentDescriptorProvider
-+{
-+ return concreteComponentDescriptorProvider();
-+}
-+
-+- (void)updateProps:(const Props::Shared &)props oldProps:(const Props::Shared &)oldProps
-+{
-+ const auto &newProps = *std::static_pointer_cast(props);
-+
-+ self.index = newProps.index;
-+
-+ [super updateProps:props oldProps:oldProps];
-+}
-+@end
-+
-+Class CellContainerCls(void)
-+{
-+ return CellContainerComponentView.class;
-+}
-+#else
-+@implementation CellContainerComponentView
-+@end
-+#endif /* RCT_NEW_ARCH_ENABLED */
-diff --git a/node_modules/@shopify/flash-list/ios/Sources/CellContainerManager.m b/node_modules/@shopify/flash-list/ios/Sources/CellContainerManager.mm
-similarity index 100%
-rename from node_modules/@shopify/flash-list/ios/Sources/CellContainerManager.m
-rename to node_modules/@shopify/flash-list/ios/Sources/CellContainerManager.mm
-diff --git a/node_modules/@shopify/flash-list/ios/Sources/CellContainerManager.swift b/node_modules/@shopify/flash-list/ios/Sources/CellContainerManager.swift
-index a36fccd..dbe6c14 100644
---- a/node_modules/@shopify/flash-list/ios/Sources/CellContainerManager.swift
-+++ b/node_modules/@shopify/flash-list/ios/Sources/CellContainerManager.swift
-@@ -3,7 +3,7 @@ import Foundation
- @objc(CellContainerManager)
- class CellContainerManager: RCTViewManager {
- override func view() -> UIView! {
-- return CellContainer()
-+ return CellContainerComponentView()
- }
-
- override static func requiresMainQueueSetup() -> Bool {
-diff --git a/node_modules/@shopify/flash-list/ios/Sources/FlatListPro-Bridging-Header.h b/node_modules/@shopify/flash-list/ios/Sources/FlatListPro-Bridging-Header.h
-index e3e23d5..7ed83ce 100644
---- a/node_modules/@shopify/flash-list/ios/Sources/FlatListPro-Bridging-Header.h
-+++ b/node_modules/@shopify/flash-list/ios/Sources/FlatListPro-Bridging-Header.h
-@@ -4,5 +4,8 @@
- #import
- #import
- #import
-+#import
-+
-+#import "CellContainerComponentView.h"
-
- #endif /* FlatListPro_Bridging_Header_h */
-diff --git a/node_modules/@shopify/flash-list/package.json b/node_modules/@shopify/flash-list/package.json
-index b90c287..ccca16d 100644
---- a/node_modules/@shopify/flash-list/package.json
-+++ b/node_modules/@shopify/flash-list/package.json
-@@ -25,6 +25,7 @@
- "author": "shopify",
- "license": "MIT",
- "homepage": "https://shopify.github.io/flash-list/",
-+ "react-native": "src/index.ts",
- "main": "dist/index.js",
- "types": "dist/index.d.ts",
- "scripts": {
-@@ -64,7 +65,7 @@
- "@react-native-community/eslint-config": "^3.0.3",
- "@shopify/eslint-plugin": "^41.3.1",
- "@types/jest": "^28.1.3",
-- "@types/react-native": "0.72.2",
-+ "@types/react-native": "^0.72.2",
- "babel-jest": "^28.1.1",
- "enhanced-resolve": "^5.9.3",
- "eslint": "8.18.0",
-@@ -74,7 +75,7 @@
- "prettier": "^2.7.1",
- "react": "17.0.2",
- "react-native": "0.68.5",
-- "typescript": "^4.7.4"
-+ "typescript": "4.8.4"
- },
- "files": [
- "android",
-@@ -87,5 +88,10 @@
- "dependencies": {
- "recyclerlistview": "4.2.0",
- "tslib": "2.4.0"
-+ },
-+ "codegenConfig": {
-+ "name": "rnflashlist",
-+ "type": "components",
-+ "jsSrcsDir": "./src/fabric"
- }
- }
diff --git a/node_modules/@shopify/flash-list/src/FlashList.tsx b/node_modules/@shopify/flash-list/src/FlashList.tsx
index 64748fe..87dea16 100644
--- a/node_modules/@shopify/flash-list/src/FlashList.tsx
@@ -1313,48 +44,3 @@ index 64748fe..87dea16 100644
/**
* Allows access to internal recyclerlistview. This is useful for enabling access to its public APIs.
* Warning: We may swap recyclerlistview for something else in the future. Use with caution.
-diff --git a/node_modules/@shopify/flash-list/src/fabric/AutoLayoutNativeComponent.ts b/node_modules/@shopify/flash-list/src/fabric/AutoLayoutNativeComponent.ts
-new file mode 100644
-index 0000000..93750de
---- /dev/null
-+++ b/node_modules/@shopify/flash-list/src/fabric/AutoLayoutNativeComponent.ts
-@@ -0,0 +1,24 @@
-+import codegenNativeComponent from "react-native/Libraries/Utilities/codegenNativeComponent";
-+import type { ViewProps } from "react-native";
-+import type {
-+ Int32,
-+ Double,
-+ DirectEventHandler,
-+} from "react-native/Libraries/Types/CodegenTypes";
-+
-+type BlankAreaEvent = Readonly<{
-+ offsetStart: Int32;
-+ offsetEnd: Int32;
-+}>;
-+
-+interface NativeProps extends ViewProps {
-+ horizontal?: boolean;
-+ scrollOffset?: Double;
-+ windowSize?: Double;
-+ renderAheadOffset?: Double;
-+ enableInstrumentation?: boolean;
-+ disableAutoLayout?: boolean;
-+ onBlankAreaEvent?: DirectEventHandler;
-+}
-+
-+export default codegenNativeComponent("AutoLayoutView");
-diff --git a/node_modules/@shopify/flash-list/src/fabric/CellContainerNativeComponent.ts b/node_modules/@shopify/flash-list/src/fabric/CellContainerNativeComponent.ts
-new file mode 100644
-index 0000000..dd284ac
---- /dev/null
-+++ b/node_modules/@shopify/flash-list/src/fabric/CellContainerNativeComponent.ts
-@@ -0,0 +1,9 @@
-+import codegenNativeComponent from "react-native/Libraries/Utilities/codegenNativeComponent";
-+import type { Int32 } from "react-native/Libraries/Types/CodegenTypes";
-+import type { ViewProps } from "react-native";
-+
-+interface NativeProps extends ViewProps {
-+ index?: Int32;
-+}
-+
-+export default codegenNativeComponent("CellContainer");
diff --git a/react-native.config.js b/react-native.config.js
index 6d6dd3f5805f..b941493529e7 100644
--- a/react-native.config.js
+++ b/react-native.config.js
@@ -1,7 +1,9 @@
module.exports = {
project: {
- ios: {sourceDir: 'ios'},
- android: {},
+ ios: {sourceDir: 'ios', unstable_reactLegacyComponentNames: ['AutoLayoutView', 'CellContainer']},
+ android: {
+ unstable_reactLegacyComponentNames: ['AutoLayoutView', 'CellContainer'],
+ },
},
assets: ['./assets/fonts/native'],
};
diff --git a/src/CONST.ts b/src/CONST.ts
index 74e722cdba59..d47800f69308 100755
--- a/src/CONST.ts
+++ b/src/CONST.ts
@@ -633,9 +633,10 @@ const CONST = {
LIMIT: 50,
// OldDot Actions render getMessage from Web-Expensify/lib/Report/Action PHP files via getMessageOfOldDotReportAction in ReportActionsUtils.ts
TYPE: {
+ ACTIONABLEJOINREQUEST: 'ACTIONABLEJOINREQUEST',
ACTIONABLEMENTIONWHISPER: 'ACTIONABLEMENTIONWHISPER',
+ ACTIONABLETRACKEXPENSEWHISPER: 'ACTIONABLETRACKEXPENSEWHISPER',
ADDCOMMENT: 'ADDCOMMENT',
- ACTIONABLEJOINREQUEST: 'ACTIONABLEJOINREQUEST',
APPROVED: 'APPROVED',
CHANGEFIELD: 'CHANGEFIELD', // OldDot Action
CHANGEPOLICY: 'CHANGEPOLICY', // OldDot Action
@@ -768,6 +769,9 @@ const CONST = {
INVITE: 'invited',
NOTHING: 'nothing',
},
+ ACTIONABLE_TRACK_EXPENSE_WHISPER_RESOLUTION: {
+ NOTHING: 'nothing',
+ },
ACTIONABLE_MENTION_JOIN_WORKSPACE_RESOLUTION: {
ACCEPT: 'accept',
DECLINE: 'decline',
@@ -1407,6 +1411,9 @@ const CONST = {
ACTION: {
EDIT: 'edit',
CREATE: 'create',
+ MOVE: 'move',
+ CATEGORIZE: 'categorize',
+ SHARE: 'share',
},
DEFAULT_AMOUNT: 0,
TYPE: {
@@ -1429,6 +1436,7 @@ const CONST = {
DELETE: 'delete',
APPROVE: 'approve',
TRACK: 'track',
+ MOVE: 'move',
},
AMOUNT_MAX_LENGTH: 10,
RECEIPT_STATE: {
@@ -1448,6 +1456,11 @@ const CONST = {
CANCEL_REASON: {
PAYMENT_EXPIRED: 'CANCEL_REASON_PAYMENT_EXPIRED',
},
+ SHARE: {
+ ROLE: {
+ ACCOUNTANT: 'accountant',
+ },
+ },
},
GROWL: {
diff --git a/src/ROUTES.ts b/src/ROUTES.ts
index df5c510ca954..ec2bf11957e1 100644
--- a/src/ROUTES.ts
+++ b/src/ROUTES.ts
@@ -301,8 +301,8 @@ const ROUTES = {
getRoute: (reportID: string) => `r/${reportID}/members` as const,
},
ROOM_INVITE: {
- route: 'r/:reportID/invite',
- getRoute: (reportID: string) => `r/${reportID}/invite` as const,
+ route: 'r/:reportID/invite/:role?',
+ getRoute: (reportID: string, role?: string) => `r/${reportID}/invite/${role}` as const,
},
MONEY_REQUEST_PARTICIPANTS: {
route: ':iouType/new/participants/:reportID?',
@@ -376,9 +376,9 @@ const ROUTES = {
getUrlWithBackToParam(`${action}/${iouType}/merchant/${transactionID}/${reportID}`, backTo),
},
MONEY_REQUEST_STEP_PARTICIPANTS: {
- route: 'create/:iouType/participants/:transactionID/:reportID',
- getRoute: (iouType: ValueOf, transactionID: string, reportID: string, backTo = '') =>
- getUrlWithBackToParam(`create/${iouType}/participants/${transactionID}/${reportID}`, backTo),
+ route: ':action/:iouType/participants/:transactionID/:reportID',
+ getRoute: (iouType: ValueOf, transactionID: string, reportID: string, backTo = '', action: ValueOf = 'create') =>
+ getUrlWithBackToParam(`${action}/${iouType}/participants/${transactionID}/${reportID}`, backTo),
},
MONEY_REQUEST_STEP_SCAN: {
route: ':action/:iouType/scan/:transactionID/:reportID',
diff --git a/src/components/AvatarWithDisplayName.tsx b/src/components/AvatarWithDisplayName.tsx
index f6afb4dae2d6..c7a4ece0de97 100644
--- a/src/components/AvatarWithDisplayName.tsx
+++ b/src/components/AvatarWithDisplayName.tsx
@@ -65,7 +65,6 @@ function AvatarWithDisplayName({
const ownerPersonalDetails = OptionsListUtils.getPersonalDetailsForAccountIDs(report?.ownerAccountID ? [report.ownerAccountID] : [], personalDetails);
const displayNamesWithTooltips = ReportUtils.getDisplayNamesWithTooltips(Object.values(ownerPersonalDetails) as PersonalDetails[], false);
const shouldShowSubscriptAvatar = ReportUtils.shouldReportShowSubscript(report);
- const isExpenseRequest = ReportUtils.isExpenseRequest(report);
const avatarBorderColor = isAnonymous ? theme.highlightBG : theme.componentBG;
const actorAccountID = useRef(null);
@@ -128,7 +127,7 @@ function AvatarWithDisplayName({
/>
)}
-
+
;
};
const getTaxAmount = (transaction: OnyxEntry, defaultTaxValue: string) => {
@@ -205,6 +208,7 @@ function MoneyTemporaryForRefactorRequestConfirmationList({
onToggleBillable,
hasSmartScanFailed,
reportActionID,
+ action = CONST.IOU.ACTION.CREATE,
}: MoneyRequestConfirmationListProps) {
const theme = useTheme();
const styles = useThemeStyles();
@@ -248,9 +252,9 @@ function MoneyTemporaryForRefactorRequestConfirmationList({
// A flag for showing the billable field
const shouldShowBillable = policy?.disabledFields?.defaultBillable === false;
-
+ const isMovingTransactionFromTrackExpense = IOUUtils.isMovingTransactionFromTrackExpense(action);
const hasRoute = TransactionUtils.hasRoute(transaction);
- const isDistanceRequestWithPendingRoute = isDistanceRequest && (!hasRoute || !rate);
+ const isDistanceRequestWithPendingRoute = isDistanceRequest && (!hasRoute || !rate) && !isMovingTransactionFromTrackExpense;
const formattedAmount = isDistanceRequestWithPendingRoute
? ''
: CurrencyUtils.convertToDisplayString(
@@ -452,7 +456,7 @@ function MoneyTemporaryForRefactorRequestConfirmationList({
}, [selectedParticipants, hasMultipleParticipants, personalDetailsOfPayee]);
useEffect(() => {
- if (!isDistanceRequest) {
+ if (!isDistanceRequest || isMovingTransactionFromTrackExpense) {
return;
}
@@ -465,7 +469,7 @@ function MoneyTemporaryForRefactorRequestConfirmationList({
const distanceMerchant = DistanceRequestUtils.getDistanceMerchant(hasRoute, distance, unit, rate ?? 0, currency ?? 'USD', translate, toLocaleDigit);
IOU.setMoneyRequestMerchant(transaction?.transactionID ?? '', distanceMerchant, true);
- }, [isDistanceRequestWithPendingRoute, hasRoute, distance, unit, rate, currency, translate, toLocaleDigit, isDistanceRequest, transaction]);
+ }, [isDistanceRequestWithPendingRoute, hasRoute, distance, unit, rate, currency, translate, toLocaleDigit, isDistanceRequest, transaction, action, isMovingTransactionFromTrackExpense]);
// Auto select the category if there is only one enabled category and it is required
useEffect(() => {
@@ -474,7 +478,8 @@ function MoneyTemporaryForRefactorRequestConfirmationList({
return;
}
IOU.setMoneyRequestCategory(transaction?.transactionID ?? '', enabledCategories[0].name);
- }, [iouCategory, shouldShowCategories, policyCategories, transaction, isCategoryRequired]);
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [shouldShowCategories, policyCategories, isCategoryRequired]);
// Auto select the tag if there is only one enabled tag and it is required
useEffect(() => {
@@ -490,7 +495,8 @@ function MoneyTemporaryForRefactorRequestConfirmationList({
if (updatedTagsString !== TransactionUtils.getTag(transaction) && updatedTagsString) {
IOU.setMoneyRequestTag(transaction?.transactionID ?? '', updatedTagsString);
}
- }, [policyTagLists, transaction, policyTags, canUseViolations]);
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [policyTagLists, policyTags, canUseViolations]);
/**
*/
@@ -656,9 +662,7 @@ function MoneyTemporaryForRefactorRequestConfirmationList({
Navigation.navigate(ROUTES.EDIT_SPLIT_BILL.getRoute(reportID, reportActionID ?? '', CONST.EDIT_REQUEST_FIELD.AMOUNT));
return;
}
- Navigation.navigate(
- ROUTES.MONEY_REQUEST_STEP_AMOUNT.getRoute(CONST.IOU.ACTION.CREATE, iouType, transaction?.transactionID ?? '', reportID, Navigation.getActiveRouteWithoutParams()),
- );
+ Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_AMOUNT.getRoute(action, iouType, transaction?.transactionID ?? '', reportID, Navigation.getActiveRouteWithoutParams()));
}}
style={[styles.moneyRequestMenuItem, styles.mt2]}
titleStyle={styles.moneyRequestConfirmationAmount}
@@ -680,13 +684,7 @@ function MoneyTemporaryForRefactorRequestConfirmationList({
description={translate('common.description')}
onPress={() => {
Navigation.navigate(
- ROUTES.MONEY_REQUEST_STEP_DESCRIPTION.getRoute(
- CONST.IOU.ACTION.CREATE,
- iouType,
- transaction?.transactionID ?? '',
- reportID,
- Navigation.getActiveRouteWithoutParams(),
- ),
+ ROUTES.MONEY_REQUEST_STEP_DESCRIPTION.getRoute(action, iouType, transaction?.transactionID ?? '', reportID, Navigation.getActiveRouteWithoutParams()),
);
}}
style={[styles.moneyRequestMenuItem]}
@@ -703,25 +701,20 @@ function MoneyTemporaryForRefactorRequestConfirmationList({
item: (
Navigation.navigate(
- ROUTES.MONEY_REQUEST_STEP_DISTANCE.getRoute(
- CONST.IOU.ACTION.CREATE,
- iouType,
- transaction?.transactionID ?? '',
- reportID,
- Navigation.getActiveRouteWithoutParams(),
- ),
+ ROUTES.MONEY_REQUEST_STEP_DISTANCE.getRoute(action, iouType, transaction?.transactionID ?? '', reportID, Navigation.getActiveRouteWithoutParams()),
)
}
// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
disabled={didConfirm}
- interactive={!isReadOnly}
+ // todo: handle edit for transaction while moving from track expense
+ interactive={!isReadOnly && !isMovingTransactionFromTrackExpense}
/>
),
shouldShow: isDistanceRequest,
@@ -738,13 +731,7 @@ function MoneyTemporaryForRefactorRequestConfirmationList({
titleStyle={styles.flex1}
onPress={() => {
Navigation.navigate(
- ROUTES.MONEY_REQUEST_STEP_MERCHANT.getRoute(
- CONST.IOU.ACTION.CREATE,
- iouType,
- transaction?.transactionID ?? '',
- reportID,
- Navigation.getActiveRouteWithoutParams(),
- ),
+ ROUTES.MONEY_REQUEST_STEP_MERCHANT.getRoute(action, iouType, transaction?.transactionID ?? '', reportID, Navigation.getActiveRouteWithoutParams()),
);
}}
disabled={didConfirm}
@@ -768,9 +755,7 @@ function MoneyTemporaryForRefactorRequestConfirmationList({
style={[styles.moneyRequestMenuItem]}
titleStyle={styles.flex1}
onPress={() => {
- Navigation.navigate(
- ROUTES.MONEY_REQUEST_STEP_DATE.getRoute(CONST.IOU.ACTION.CREATE, iouType, transaction?.transactionID ?? '', reportID, Navigation.getActiveRouteWithoutParams()),
- );
+ Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_DATE.getRoute(action, iouType, transaction?.transactionID ?? '', reportID, Navigation.getActiveRouteWithoutParams()));
}}
disabled={didConfirm}
interactive={!isReadOnly}
@@ -791,13 +776,7 @@ function MoneyTemporaryForRefactorRequestConfirmationList({
numberOfLinesTitle={2}
onPress={() =>
Navigation.navigate(
- ROUTES.MONEY_REQUEST_STEP_CATEGORY.getRoute(
- CONST.IOU.ACTION.CREATE,
- iouType,
- transaction?.transactionID ?? '',
- reportID,
- Navigation.getActiveRouteWithoutParams(),
- ),
+ ROUTES.MONEY_REQUEST_STEP_CATEGORY.getRoute(action, iouType, transaction?.transactionID ?? '', reportID, Navigation.getActiveRouteWithoutParams()),
)
}
style={[styles.moneyRequestMenuItem]}
@@ -808,7 +787,7 @@ function MoneyTemporaryForRefactorRequestConfirmationList({
/>
),
shouldShow: shouldShowCategories,
- isSupplementary: !isCategoryRequired,
+ isSupplementary: action === CONST.IOU.ACTION.CATEGORIZE ? false : !isCategoryRequired,
},
...policyTagLists.map(({name, required}, index) => {
const isTagRequired = required === undefined ? false : canUseViolations && required;
@@ -822,14 +801,7 @@ function MoneyTemporaryForRefactorRequestConfirmationList({
numberOfLinesTitle={2}
onPress={() =>
Navigation.navigate(
- ROUTES.MONEY_REQUEST_STEP_TAG.getRoute(
- CONST.IOU.ACTION.CREATE,
- iouType,
- index,
- transaction?.transactionID ?? '',
- reportID,
- Navigation.getActiveRouteWithoutParams(),
- ),
+ ROUTES.MONEY_REQUEST_STEP_TAG.getRoute(action, iouType, index, transaction?.transactionID ?? '', reportID, Navigation.getActiveRouteWithoutParams()),
)
}
style={[styles.moneyRequestMenuItem]}
@@ -853,13 +825,7 @@ function MoneyTemporaryForRefactorRequestConfirmationList({
titleStyle={styles.flex1}
onPress={() =>
Navigation.navigate(
- ROUTES.MONEY_REQUEST_STEP_TAX_RATE.getRoute(
- CONST.IOU.ACTION.CREATE,
- iouType,
- transaction?.transactionID ?? '',
- reportID,
- Navigation.getActiveRouteWithoutParams(),
- ),
+ ROUTES.MONEY_REQUEST_STEP_TAX_RATE.getRoute(action, iouType, transaction?.transactionID ?? '', reportID, Navigation.getActiveRouteWithoutParams()),
)
}
disabled={didConfirm}
@@ -880,13 +846,7 @@ function MoneyTemporaryForRefactorRequestConfirmationList({
titleStyle={styles.flex1}
onPress={() =>
Navigation.navigate(
- ROUTES.MONEY_REQUEST_STEP_TAX_AMOUNT.getRoute(
- CONST.IOU.ACTION.CREATE,
- iouType,
- transaction?.transactionID ?? '',
- reportID,
- Navigation.getActiveRouteWithoutParams(),
- ),
+ ROUTES.MONEY_REQUEST_STEP_TAX_AMOUNT.getRoute(action, iouType, transaction?.transactionID ?? '', reportID, Navigation.getActiveRouteWithoutParams()),
)
}
disabled={didConfirm}
@@ -926,12 +886,15 @@ function MoneyTemporaryForRefactorRequestConfirmationList({
isLocalFile,
} = receiptPath && receiptFilename ? ReceiptUtils.getThumbnailAndImageURIs(transaction ?? null, receiptPath, receiptFilename) : ({} as ReceiptUtils.ThumbnailAndImageURI);
+ const resolvedThumbnail = isLocalFile ? receiptThumbnail : tryResolveUrlFromApiRoot(receiptThumbnail ?? '');
+ const resolvedReceiptImage = isLocalFile ? receiptImage : tryResolveUrlFromApiRoot(receiptImage ?? '');
+
const receiptThumbnailContent = useMemo(
() =>
isLocalFile && Str.isPDF(receiptFilename) ? (
),
- [isLocalFile, receiptFilename, receiptImage, styles.moneyRequestImage, isAttachmentInvalid, isThumbnail, receiptThumbnail, fileExtension],
+ [isLocalFile, receiptFilename, resolvedThumbnail, styles.moneyRequestImage, isAttachmentInvalid, isThumbnail, resolvedReceiptImage, receiptThumbnail, fileExtension],
);
return (
@@ -978,9 +941,9 @@ function MoneyTemporaryForRefactorRequestConfirmationList({
)}
- {
+ {(!isMovingTransactionFromTrackExpense || !hasRoute) &&
// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
- receiptImage || receiptThumbnail
+ (receiptImage || receiptThumbnail
? receiptThumbnailContent
: // The empty receipt component should only show for IOU Requests of a paid policy ("Team" or "Corporate")
PolicyUtils.isPaidGroupPolicy(policy) &&
@@ -999,8 +962,7 @@ function MoneyTemporaryForRefactorRequestConfirmationList({
)
}
/>
- )
- }
+ ))}
{primaryFields}
{!shouldShowAllFields && (
diff --git a/src/components/ReportActionItem/ActionableItemButtons.tsx b/src/components/ReportActionItem/ActionableItemButtons.tsx
index 6ead20d3e643..8e5590537f51 100644
--- a/src/components/ReportActionItem/ActionableItemButtons.tsx
+++ b/src/components/ReportActionItem/ActionableItemButtons.tsx
@@ -10,10 +10,12 @@ type ActionableItem = {
key: string;
onPress: () => void;
text: TranslationPaths;
+ isMediumSized?: boolean;
};
type ActionableItemButtonsProps = {
items: ActionableItem[];
+ layout?: 'horizontal' | 'vertical';
};
function ActionableItemButtons(props: ActionableItemButtonsProps) {
@@ -21,14 +23,14 @@ function ActionableItemButtons(props: ActionableItemButtonsProps) {
const {translate} = useLocalize();
return (
-
+
{props.items?.map((item) => (
))}
diff --git a/src/components/SelectionList/BaseListItem.tsx b/src/components/SelectionList/BaseListItem.tsx
index 5f4438f18f60..fe9ccc55711b 100644
--- a/src/components/SelectionList/BaseListItem.tsx
+++ b/src/components/SelectionList/BaseListItem.tsx
@@ -29,6 +29,7 @@ function BaseListItem({
children,
isFocused,
onFocus = () => {},
+ hoverStyle,
}: BaseListItemProps) {
const theme = useTheme();
const styles = useThemeStyles();
@@ -68,7 +69,7 @@ function BaseListItem({
accessibilityLabel={item.text ?? ''}
role={CONST.ROLE.BUTTON}
hoverDimmingValue={1}
- hoverStyle={!item.isDisabled && !item.isSelected && styles.hoveredComponentBG}
+ hoverStyle={[!item.isDisabled && styles.hoveredComponentBG, hoverStyle]}
dataSet={{[CONST.SELECTION_SCRAPER_HIDDEN_ELEMENT]: true}}
onMouseDown={shouldPreventDefaultFocusOnSelectRow ? (e) => e.preventDefault() : undefined}
nativeID={keyForList ?? ''}
diff --git a/src/components/SelectionList/TableListItem.tsx b/src/components/SelectionList/TableListItem.tsx
index c2680c92780a..d2fc231b5ac6 100644
--- a/src/components/SelectionList/TableListItem.tsx
+++ b/src/components/SelectionList/TableListItem.tsx
@@ -58,6 +58,7 @@ function TableListItem({
pendingAction={item.pendingAction}
keyForList={item.keyForList}
onFocus={onFocus}
+ hoverStyle={item.isSelected && styles.activeComponentBG}
>
{(hovered) => (
<>
diff --git a/src/components/SelectionList/types.ts b/src/components/SelectionList/types.ts
index d89f4d5b92f3..119634c61fd8 100644
--- a/src/components/SelectionList/types.ts
+++ b/src/components/SelectionList/types.ts
@@ -147,6 +147,7 @@ type BaseListItemProps = CommonListItemProps & {
pendingAction?: PendingAction | null;
FooterComponent?: ReactElement;
children?: ReactElement> | ((hovered: boolean) => ReactElement>);
+ hoverStyle?: StyleProp;
};
type UserListItemProps = ListItemProps & {
diff --git a/src/hooks/useViewportOffsetTop/index.ts b/src/hooks/useViewportOffsetTop/index.ts
index da2325a7e13f..6f617aa38121 100644
--- a/src/hooks/useViewportOffsetTop/index.ts
+++ b/src/hooks/useViewportOffsetTop/index.ts
@@ -18,7 +18,7 @@ export default function useViewportOffsetTop(shouldAdjustScrollView = false): nu
if (Browser.isMobileSafari() && shouldAdjustScrollView && window.visualViewport) {
const clientHeight = document.body.clientHeight;
- const adjustScrollY = Math.round(clientHeight - window.visualViewport.height);
+ const adjustScrollY = clientHeight - window.visualViewport.height;
if (cachedDefaultOffsetTop.current === 0) {
cachedDefaultOffsetTop.current = targetOffsetTop;
}
@@ -43,7 +43,7 @@ export default function useViewportOffsetTop(shouldAdjustScrollView = false): nu
if (!shouldAdjustScrollView) {
return;
}
- window.scrollTo({top: viewportOffsetTop, behavior: 'instant'});
+ window.scrollTo({top: viewportOffsetTop, behavior: 'smooth'});
}, [shouldAdjustScrollView, viewportOffsetTop]);
return viewportOffsetTop;
diff --git a/src/languages/en.ts b/src/languages/en.ts
index 9451407c822f..07a540e5180d 100755
--- a/src/languages/en.ts
+++ b/src/languages/en.ts
@@ -619,6 +619,8 @@ export default {
addToSplit: 'Add to split',
splitBill: 'Split bill',
request: 'Request',
+ categorize: 'Categorize',
+ share: 'Share',
participants: 'Participants',
requestMoney: 'Request money',
sendMoney: 'Send money',
@@ -2575,6 +2577,12 @@ export default {
accept: 'Accept',
decline: 'Decline',
},
+ actionableMentionTrackExpense: {
+ request: 'Request someone to pay it',
+ categorize: 'Categorize it',
+ share: 'Share it with my accountant',
+ nothing: 'Nothing for now',
+ },
teachersUnitePage: {
teachersUnite: 'Teachers Unite',
joinExpensifyOrg: 'Join Expensify.org in eliminating injustice around the world and help teachers split their expenses for classrooms in need!',
diff --git a/src/languages/es.ts b/src/languages/es.ts
index a56c8ac2739d..14827cb5c6b2 100644
--- a/src/languages/es.ts
+++ b/src/languages/es.ts
@@ -615,6 +615,8 @@ export default {
addToSplit: 'Añadir para dividir',
splitBill: 'Dividir factura',
request: 'Solicitar',
+ categorize: 'Categorizar',
+ share: 'Compartir',
participants: 'Participantes',
requestMoney: 'Pedir dinero',
sendMoney: 'Enviar dinero',
@@ -3045,6 +3047,12 @@ export default {
accept: 'Aceptar',
decline: 'Rechazar',
},
+ actionableMentionTrackExpense: {
+ request: 'Pedirle a alguien que lo pague',
+ categorize: 'Categorizarlo',
+ share: 'Compartirlo con mi contador',
+ nothing: 'Por ahora, nada',
+ },
moderation: {
flagDescription: 'Todos los mensajes marcados se enviarán a un moderador para su revisión.',
chooseAReason: 'Elige abajo un motivo para reportarlo:',
diff --git a/src/libs/API/parameters/CategorizeTrackedExpenseParams.ts b/src/libs/API/parameters/CategorizeTrackedExpenseParams.ts
new file mode 100644
index 000000000000..78eb0adecc5e
--- /dev/null
+++ b/src/libs/API/parameters/CategorizeTrackedExpenseParams.ts
@@ -0,0 +1,25 @@
+import type {Receipt} from '@src/types/onyx/Transaction';
+
+type CategorizeTrackedExpenseParams = {
+ amount: number;
+ currency: string;
+ comment: string;
+ created: string;
+ merchant: string;
+ policyID: string;
+ transactionID: string;
+ moneyRequestPreviewReportActionID: string;
+ moneyRequestReportID: string;
+ moneyRequestCreatedReportActionID: string;
+ actionableWhisperReportActionID: string;
+ modifiedExpenseReportActionID: string;
+ reportPreviewReportActionID: string;
+ category?: string;
+ tag?: string;
+ receipt?: Receipt;
+ taxCode: string;
+ taxAmount: number;
+ billable?: boolean;
+};
+
+export default CategorizeTrackedExpenseParams;
diff --git a/src/libs/API/parameters/ConvertTrackedExpenseToRequestParams.ts b/src/libs/API/parameters/ConvertTrackedExpenseToRequestParams.ts
new file mode 100644
index 000000000000..c51161b043a8
--- /dev/null
+++ b/src/libs/API/parameters/ConvertTrackedExpenseToRequestParams.ts
@@ -0,0 +1,21 @@
+import type {Receipt} from '@src/types/onyx/Transaction';
+
+type ConvertTrackedExpenseToRequestParams = {
+ amount: number;
+ currency: string;
+ created: string;
+ comment?: string;
+ merchant?: string;
+ payerAccountID: number;
+ chatReportID: string;
+ transactionID: string;
+ actionableWhisperReportActionID: string;
+ createdChatReportActionID: string;
+ receipt?: Receipt;
+ moneyRequestReportID: string;
+ moneyRequestCreatedReportActionID: string;
+ moneyRequestPreviewReportActionID: string;
+ reportPreviewReportActionID: string;
+};
+
+export default ConvertTrackedExpenseToRequestParams;
diff --git a/src/libs/API/parameters/DismissTrackExpenseActionableWhisperParams.ts b/src/libs/API/parameters/DismissTrackExpenseActionableWhisperParams.ts
new file mode 100644
index 000000000000..e441d100784d
--- /dev/null
+++ b/src/libs/API/parameters/DismissTrackExpenseActionableWhisperParams.ts
@@ -0,0 +1,5 @@
+type DismissTrackExpenseActionableWhisperParams = {
+ reportActionID: string;
+};
+
+export default DismissTrackExpenseActionableWhisperParams;
diff --git a/src/libs/API/parameters/ShareTrackedExpenseParams.ts b/src/libs/API/parameters/ShareTrackedExpenseParams.ts
new file mode 100644
index 000000000000..cee4bc40d9ac
--- /dev/null
+++ b/src/libs/API/parameters/ShareTrackedExpenseParams.ts
@@ -0,0 +1,25 @@
+import type {Receipt} from '@src/types/onyx/Transaction';
+
+type ShareTrackedExpenseParams = {
+ amount: number;
+ currency: string;
+ comment: string;
+ created: string;
+ merchant: string;
+ policyID: string;
+ transactionID: string;
+ moneyRequestPreviewReportActionID: string;
+ moneyRequestReportID: string;
+ moneyRequestCreatedReportActionID: string;
+ actionableWhisperReportActionID: string;
+ modifiedExpenseReportActionID: string;
+ reportPreviewReportActionID: string;
+ category?: string;
+ tag?: string;
+ receipt?: Receipt;
+ taxCode: string;
+ taxAmount: number;
+ billable?: boolean;
+};
+
+export default ShareTrackedExpenseParams;
diff --git a/src/libs/API/parameters/index.ts b/src/libs/API/parameters/index.ts
index 385aabf8acff..7af57cbd83fa 100644
--- a/src/libs/API/parameters/index.ts
+++ b/src/libs/API/parameters/index.ts
@@ -205,4 +205,8 @@ export type {default as SetPolicyForeignCurrencyDefaultParams} from './SetPolicy
export type {default as SetPolicyCurrencyDefaultParams} from './SetPolicyCurrencyDefaultParams';
export type {default as UpdatePolicyConnectionConfigParams} from './UpdatePolicyConnectionConfigParams';
export type {default as RenamePolicyTaxParams} from './RenamePolicyTaxParams';
+export type {default as DismissTrackExpenseActionableWhisperParams} from './DismissTrackExpenseActionableWhisperParams';
+export type {default as ConvertTrackedExpenseToRequestParams} from './ConvertTrackedExpenseToRequestParams';
+export type {default as ShareTrackedExpenseParams} from './ShareTrackedExpenseParams';
+export type {default as CategorizeTrackedExpenseParams} from './CategorizeTrackedExpenseParams';
export type {default as LeavePolicyParams} from './LeavePolicyParams';
diff --git a/src/libs/API/types.ts b/src/libs/API/types.ts
index 91b95dd6327e..446c093a69e7 100644
--- a/src/libs/API/types.ts
+++ b/src/libs/API/types.ts
@@ -205,6 +205,10 @@ const WRITE_COMMANDS = {
UPDATE_POLICY_DISTANCE_RATE_VALUE: 'UpdatePolicyDistanceRateValue',
SET_POLICY_DISTANCE_RATES_ENABLED: 'SetPolicyDistanceRatesEnabled',
DELETE_POLICY_DISTANCE_RATES: 'DeletePolicyDistanceRates',
+ DISMISS_TRACK_EXPENSE_ACTIONABLE_WHISPER: 'DismissActionableWhisper',
+ CONVERT_TRACKED_EXPENSE_TO_REQUEST: 'ConvertTrackedExpenseToRequest',
+ CATEGORIZE_TRACKED_EXPENSE: 'CategorizeTrackedExpense',
+ SHARE_TRACKED_EXPENSE: 'ShareTrackedExpense',
LEAVE_POLICY: 'LeavePolicy',
} as const;
@@ -410,6 +414,10 @@ type WriteCommandParameters = {
[WRITE_COMMANDS.UPDATE_POLICY_DISTANCE_RATE_VALUE]: Parameters.UpdatePolicyDistanceRateValueParams;
[WRITE_COMMANDS.SET_POLICY_DISTANCE_RATES_ENABLED]: Parameters.SetPolicyDistanceRatesEnabledParams;
[WRITE_COMMANDS.DELETE_POLICY_DISTANCE_RATES]: Parameters.DeletePolicyDistanceRatesParams;
+ [WRITE_COMMANDS.DISMISS_TRACK_EXPENSE_ACTIONABLE_WHISPER]: Parameters.DismissTrackExpenseActionableWhisperParams;
+ [WRITE_COMMANDS.CONVERT_TRACKED_EXPENSE_TO_REQUEST]: Parameters.ConvertTrackedExpenseToRequestParams;
+ [WRITE_COMMANDS.CATEGORIZE_TRACKED_EXPENSE]: Parameters.CategorizeTrackedExpenseParams;
+ [WRITE_COMMANDS.SHARE_TRACKED_EXPENSE]: Parameters.ShareTrackedExpenseParams;
[WRITE_COMMANDS.LEAVE_POLICY]: Parameters.LeavePolicyParams;
};
diff --git a/src/libs/CardUtils.ts b/src/libs/CardUtils.ts
index c4d67adcd54a..9e3a7f66131a 100644
--- a/src/libs/CardUtils.ts
+++ b/src/libs/CardUtils.ts
@@ -127,7 +127,7 @@ function maskCard(lastFour = ''): string {
* @returns a physical card object (or undefined if none is found)
*/
function findPhysicalCard(cards: Card[]) {
- return cards.find((card) => !card.isVirtual);
+ return cards.find((card) => !card.nameValuePairs?.isVirtual);
}
/**
diff --git a/src/libs/DateUtils.ts b/src/libs/DateUtils.ts
index 44c7682b47f2..9b96bfa009dc 100644
--- a/src/libs/DateUtils.ts
+++ b/src/libs/DateUtils.ts
@@ -1,6 +1,7 @@
import {
addDays,
addHours,
+ addMilliseconds,
addMinutes,
eachDayOfInterval,
eachMonthOfInterval,
@@ -392,6 +393,13 @@ function subtractMillisecondsFromDateTime(dateTime: string, milliseconds: number
return getDBTime(newTimestamp);
}
+function addMillisecondsFromDateTime(dateTime: string, milliseconds: number): string {
+ const date = zonedTimeToUtc(dateTime, 'UTC');
+ const newTimestamp = addMilliseconds(date, milliseconds).valueOf();
+
+ return getDBTime(newTimestamp);
+}
+
/**
* @param isoTimestamp example: 2023-05-16 05:34:14.388
* @returns example: 2023-05-16
@@ -784,6 +792,7 @@ const DateUtils = {
getDBTimeWithSkew,
setLocale,
subtractMillisecondsFromDateTime,
+ addMillisecondsFromDateTime,
getDateStringFromISOTimestamp,
getThirtyMinutesFromNow,
getEndOfToday,
diff --git a/src/libs/IOUUtils.ts b/src/libs/IOUUtils.ts
index 415872750243..27af031d19a8 100644
--- a/src/libs/IOUUtils.ts
+++ b/src/libs/IOUUtils.ts
@@ -8,7 +8,17 @@ import * as CurrencyUtils from './CurrencyUtils';
import Navigation from './Navigation/Navigation';
import * as TransactionUtils from './TransactionUtils';
-function navigateToStartMoneyRequestStep(requestType: IOURequestType, iouType: ValueOf, transactionID: string, reportID: string) {
+function navigateToStartMoneyRequestStep(
+ requestType: IOURequestType,
+ iouType: ValueOf,
+ transactionID: string,
+ reportID: string,
+ iouAction?: ValueOf,
+): void {
+ if (iouAction === CONST.IOU.ACTION.CATEGORIZE || iouAction === CONST.IOU.ACTION.MOVE) {
+ Navigation.goBack();
+ return;
+ }
// If the participants were automatically added to the transaction, then the user needs taken back to the starting step
switch (requestType) {
case CONST.IOU.REQUEST_TYPE.DISTANCE:
@@ -124,4 +134,20 @@ function insertTagIntoTransactionTagsString(transactionTags: string, tag: string
return tagArray.join(CONST.COLON).replace(/:*$/, '');
}
-export {calculateAmount, updateIOUOwnerAndTotal, isIOUReportPendingCurrencyConversion, isValidMoneyRequestType, navigateToStartMoneyRequestStep, insertTagIntoTransactionTagsString};
+function isMovingTransactionFromTrackExpense(action?: ValueOf) {
+ if (action === CONST.IOU.ACTION.MOVE || action === CONST.IOU.ACTION.SHARE || action === CONST.IOU.ACTION.CATEGORIZE) {
+ return true;
+ }
+
+ return false;
+}
+
+export {
+ calculateAmount,
+ updateIOUOwnerAndTotal,
+ isIOUReportPendingCurrencyConversion,
+ isValidMoneyRequestType,
+ navigateToStartMoneyRequestStep,
+ insertTagIntoTransactionTagsString,
+ isMovingTransactionFromTrackExpense,
+};
diff --git a/src/libs/Navigation/types.ts b/src/libs/Navigation/types.ts
index 89bcddfe6daf..8273278f971e 100644
--- a/src/libs/Navigation/types.ts
+++ b/src/libs/Navigation/types.ts
@@ -361,6 +361,7 @@ type RoomMembersNavigatorParamList = {
type RoomInviteNavigatorParamList = {
[SCREENS.ROOM_INVITE_ROOT]: {
reportID: string;
+ role?: 'accountant';
};
};
@@ -477,6 +478,7 @@ type MoneyRequestNavigatorParamList = {
currency?: string;
};
[SCREENS.MONEY_REQUEST.STEP_PARTICIPANTS]: {
+ action: ValueOf;
iouType: ValueOf;
transactionID: string;
reportID: string;
diff --git a/src/libs/NextStepUtils.ts b/src/libs/NextStepUtils.ts
index 0e76596ba8fa..3b8fce748f45 100644
--- a/src/libs/NextStepUtils.ts
+++ b/src/libs/NextStepUtils.ts
@@ -230,7 +230,7 @@ function buildNextStep(
};
// Self review & another reviewer
- if (isOwner) {
+ if (!isSelfApproval || (isSelfApproval && isOwner)) {
optimisticNextStep.message = [
{
text: 'Waiting for ',
diff --git a/src/libs/ReportActionsUtils.ts b/src/libs/ReportActionsUtils.ts
index e8f2189f5f7d..32972a81bcb5 100644
--- a/src/libs/ReportActionsUtils.ts
+++ b/src/libs/ReportActionsUtils.ts
@@ -1080,6 +1080,10 @@ function isActionableJoinRequest(reportAction: OnyxEntry): boolean
return reportAction?.actionName === CONST.REPORT.ACTIONS.TYPE.ACTIONABLEJOINREQUEST;
}
+function isActionableTrackExpense(reportAction: OnyxEntry): boolean {
+ return reportAction?.actionName === CONST.REPORT.ACTIONS.TYPE.ACTIONABLETRACKEXPENSEWHISPER;
+}
+
/**
* Checks if any report actions correspond to a join request action that is still pending.
* @param reportID
@@ -1163,6 +1167,7 @@ export {
isCurrentActionUnread,
isActionableJoinRequest,
isActionableJoinRequestPending,
+ isActionableTrackExpense,
};
export type {LastVisibleMessage};
diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts
index f237334de9ba..fbeb2081b5f7 100644
--- a/src/libs/ReportUtils.ts
+++ b/src/libs/ReportUtils.ts
@@ -53,6 +53,7 @@ import type {Receipt, TransactionChanges, WaypointCollection} from '@src/types/o
import type {EmptyObject} from '@src/types/utils/EmptyObject';
import {isEmptyObject} from '@src/types/utils/EmptyObject';
import type IconAsset from '@src/types/utils/IconAsset';
+import * as IOU from './actions/IOU';
import * as store from './actions/ReimbursementAccount/store';
import * as CollectionUtils from './CollectionUtils';
import * as CurrencyUtils from './CurrencyUtils';
@@ -190,6 +191,8 @@ type OptimisticIOUReportAction = Pick<
| 'receipt'
| 'whisperedToAccountIDs'
| 'childReportID'
+ | 'childVisibleActionCount'
+ | 'childCommenterCount'
>;
type ReportRouteParams = {
@@ -3524,6 +3527,7 @@ function buildOptimisticIOUReportAction(
receipt: Receipt = {},
isOwnPolicyExpenseChat = false,
created = DateUtils.getDBTime(),
+ linkedExpenseReportAction: ReportAction | EmptyObject = {},
): OptimisticIOUReportAction {
const IOUReportID = iouReportID || generateReportID();
@@ -3568,6 +3572,7 @@ function buildOptimisticIOUReportAction(
}
return {
+ ...linkedExpenseReportAction,
actionName: CONST.REPORT.ACTIONS.TYPE.IOU,
actorAccountID: currentUserAccountID,
automatic: false,
@@ -3780,6 +3785,44 @@ function buildOptimisticModifiedExpenseReportAction(
};
}
+/**
+ * Builds an optimistic modified expense action for a tracked expense move with a randomly generated reportActionID.
+ * @param transactionThreadID - The reportID of the transaction thread
+ * @param movedToReportID - The reportID of the report the transaction is moved to
+ */
+function buildOptimisticMovedTrackedExpenseModifiedReportAction(transactionThreadID: string, movedToReportID: string): OptimisticModifiedExpenseReportAction {
+ return {
+ actionName: CONST.REPORT.ACTIONS.TYPE.MODIFIEDEXPENSE,
+ actorAccountID: currentUserAccountID,
+ automatic: false,
+ avatar: getCurrentUserAvatarOrDefault(),
+ created: DateUtils.getDBTime(),
+ isAttachment: false,
+ message: [
+ {
+ // Currently we are composing the message from the originalMessage and message is only used in OldDot and not in the App
+ text: 'You',
+ style: 'strong',
+ type: CONST.REPORT.MESSAGE.TYPE.TEXT,
+ },
+ ],
+ originalMessage: {
+ movedToReportID,
+ },
+ person: [
+ {
+ style: 'strong',
+ text: currentUserPersonalDetails?.displayName ?? String(currentUserAccountID),
+ type: 'TEXT',
+ },
+ ],
+ pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD,
+ reportActionID: NumberUtils.rand64(),
+ reportID: transactionThreadID,
+ shouldShow: true,
+ };
+}
+
/**
* Updates a report preview action that exists for an IOU report.
*
@@ -4063,7 +4106,7 @@ function buildOptimisticHoldReportAction(created = DateUtils.getDBTime()): Optim
function buildOptimisticHoldReportActionComment(comment: string, created = DateUtils.getDBTime()): OptimisticHoldReportAction {
return {
reportActionID: NumberUtils.rand64(),
- actionName: CONST.REPORT.ACTIONS.TYPE.HOLDCOMMENT,
+ actionName: CONST.REPORT.ACTIONS.TYPE.ADDCOMMENT,
pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD,
actorAccountID: currentUserAccountID,
message: [
@@ -4339,8 +4382,25 @@ function buildOptimisticTaskReport(
* @param reportAction - the parent IOU report action from which to create the thread
* @param moneyRequestReport - the report which the report action belongs to
*/
-function buildTransactionThread(reportAction: OnyxEntry, moneyRequestReport: OnyxEntry): OptimisticChatReport {
+function buildTransactionThread(
+ reportAction: OnyxEntry,
+ moneyRequestReport: OnyxEntry,
+ existingTransactionThreadReportID?: string,
+): OptimisticChatReport {
const participantAccountIDs = [...new Set([currentUserAccountID, Number(reportAction?.actorAccountID)])].filter(Boolean) as number[];
+ const existingTransactionThreadReport = getReport(existingTransactionThreadReportID);
+
+ if (existingTransactionThreadReportID && existingTransactionThreadReport) {
+ return {
+ ...existingTransactionThreadReport,
+ isOptimisticReport: true,
+ parentReportActionID: reportAction?.reportActionID,
+ parentReportID: moneyRequestReport?.reportID,
+ reportName: getTransactionReportName(reportAction),
+ policyID: moneyRequestReport?.policyID,
+ };
+ }
+
return buildOptimisticChatReport(
participantAccountIDs,
getTransactionReportName(reportAction),
@@ -4354,6 +4414,8 @@ function buildTransactionThread(reportAction: OnyxEntry, reportID: st
const isDeletedAction = ReportActionsUtils.isDeletedAction(reportAction);
const isReportPreviewAction = ReportActionsUtils.isReportPreviewAction(reportAction);
const isIOUAction = ReportActionsUtils.isMoneyRequestAction(reportAction);
- const isWhisperAction = ReportActionsUtils.isWhisperAction(reportAction);
+ const isWhisperAction = ReportActionsUtils.isWhisperAction(reportAction) || ReportActionsUtils.isActionableTrackExpense(reportAction);
const isArchivedReport = isArchivedRoom(getReport(reportID));
return (
@@ -5872,6 +5938,31 @@ function getReportActionActorAccountID(reportAction: OnyxEntry, io
}
}
+function createDraftTransactionAndNavigateToParticipantSelector(transactionID: string, reportID: string, actionName: ValueOf, reportActionID: string): void {
+ const transaction = allTransactions?.[`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`] ?? ({} as Transaction);
+ const reportActions = reportActionsByReport?.[reportID] ?? ([] as ReportAction[]);
+
+ if (!transaction || !reportActions) {
+ return;
+ }
+
+ const linkedTrackedExpenseReportAction = Object.values(reportActions).find((action) => (action.originalMessage as IOUMessage)?.IOUTransactionID === transactionID);
+
+ const transactionAmount = Math.abs(transaction.amount);
+ const transactionCreated = format(new Date(transaction.created), CONST.DATE.FNS_FORMAT_STRING);
+
+ IOU.createDraftTransaction({
+ ...transaction,
+ actionableWhisperReportActionID: reportActionID,
+ linkedTrackedExpenseReportAction,
+ linkedTrackedExpenseReportID: reportID,
+ amount: transactionAmount,
+ created: transactionCreated,
+ } as Transaction);
+
+ Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_PARTICIPANTS.getRoute(CONST.IOU.TYPE.REQUEST, transactionID, reportID, undefined, actionName));
+}
+
/**
* @returns the object to update `report.hasOutstandingChildRequest`
*/
@@ -5990,6 +6081,7 @@ export {
buildOptimisticMoneyRequestEntities,
buildOptimisticReportPreview,
buildOptimisticModifiedExpenseReportAction,
+ buildOptimisticMovedTrackedExpenseModifiedReportAction,
buildOptimisticCancelPaymentReportAction,
updateReportPreview,
buildOptimisticTaskReportAction,
@@ -6132,6 +6224,7 @@ export {
isGroupChat,
isTrackExpenseReport,
hasActionsWithErrors,
+ createDraftTransactionAndNavigateToParticipantSelector,
getReportActionActorAccountID,
getGroupChatName,
canLeavePolicyExpenseChat,
diff --git a/src/libs/TransactionUtils.ts b/src/libs/TransactionUtils.ts
index 95e2ec8a11b5..89b89ff7b584 100644
--- a/src/libs/TransactionUtils.ts
+++ b/src/libs/TransactionUtils.ts
@@ -275,9 +275,9 @@ function getDescription(transaction: OnyxEntry): string {
/**
* Return the amount field from the transaction, return the modifiedAmount if present.
*/
-function getAmount(transaction: OnyxEntry, isFromExpenseReport = false): number {
+function getAmount(transaction: OnyxEntry, isFromExpenseReport = false, isFromTrackedExpense = false): number {
// IOU requests cannot have negative values, but they can be stored as negative values, let's return absolute value
- if (!isFromExpenseReport) {
+ if (!isFromExpenseReport || isFromTrackedExpense) {
const amount = transaction?.modifiedAmount ?? 0;
if (amount) {
return Math.abs(amount);
diff --git a/src/libs/actions/IOU.ts b/src/libs/actions/IOU.ts
index e3472f1361cc..869ff3f614f7 100644
--- a/src/libs/actions/IOU.ts
+++ b/src/libs/actions/IOU.ts
@@ -53,7 +53,7 @@ import ROUTES from '@src/ROUTES';
import type * as OnyxTypes from '@src/types/onyx';
import type {Participant, Split} from '@src/types/onyx/IOU';
import type {ErrorFields, Errors} from '@src/types/onyx/OnyxCommon';
-import type {PaymentMethodType} from '@src/types/onyx/OriginalMessage';
+import type {IOUMessage, PaymentMethodType} from '@src/types/onyx/OriginalMessage';
import type ReportAction from '@src/types/onyx/ReportAction';
import type {OnyxData} from '@src/types/onyx/Request';
import type {Comment, Receipt, ReceiptSource, TransactionChanges, WaypointCollection} from '@src/types/onyx/Transaction';
@@ -282,6 +282,20 @@ function getPolicy(policyID: string | undefined): OnyxTypes.Policy | EmptyObject
return allPolicies[`${ONYXKEYS.COLLECTION.POLICY}${policyID}`] ?? {};
}
+/**
+ * Find the report preview action from given chat report and iou report
+ */
+function getReportPreviewAction(chatReportID: string, iouReportID: string): OnyxEntry {
+ const reportActions = reportActionsByReport?.[chatReportID] ?? {};
+
+ // Find the report preview action from the chat report
+ return (
+ Object.values(reportActions).find(
+ (reportAction) => reportAction && reportAction.actionName === CONST.REPORT.ACTIONS.TYPE.REPORTPREVIEW && reportAction.originalMessage.linkedReportID === iouReportID,
+ ) ?? null
+ );
+}
+
/**
* Initialize money request info
* @param reportID to attach the transaction to
@@ -326,6 +340,18 @@ function initMoneyRequest(reportID: string, policy: OnyxEntry,
});
}
+function createDraftTransaction(transaction: OnyxTypes.Transaction) {
+ if (!transaction) {
+ return;
+ }
+
+ const newTransaction = {
+ ...transaction,
+ };
+
+ Onyx.set(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transaction.transactionID}`, newTransaction);
+}
+
function clearMoneyRequest(transactionID: string) {
Onyx.set(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transactionID}`, null);
}
@@ -466,14 +492,15 @@ function buildOnyxDataForMoneyRequest(
optimisticPolicyRecentlyUsedCategories: string[],
optimisticPolicyRecentlyUsedTags: OnyxTypes.RecentlyUsedTags,
isNewChatReport: boolean,
- transactionThreadReport: OptimisticChatReport,
- transactionThreadCreatedReportAction: OptimisticCreatedReportAction,
+ transactionThreadReport: OptimisticChatReport | EmptyObject,
+ transactionThreadCreatedReportAction: OptimisticCreatedReportAction | EmptyObject,
shouldCreateNewMoneyRequestReport: boolean,
policy?: OnyxEntry,
policyTagList?: OnyxEntry,
policyCategories?: OnyxEntry,
optimisticNextStep?: OnyxTypes.ReportNextStep | null,
isOneOnOneSplit = false,
+ existingTransactionThreadReportID?: string,
): [OnyxUpdate[], OnyxUpdate[], OnyxUpdate[]] {
const isScanRequest = TransactionUtils.isScanRequest(transaction);
const outstandingChildRequest = ReportUtils.getOutstandingChildRequest(iouReport);
@@ -483,6 +510,7 @@ function buildOnyxDataForMoneyRequest(
if (TransactionUtils.isDistanceRequest(transaction)) {
newQuickAction = CONST.QUICK_ACTIONS.REQUEST_DISTANCE;
}
+ const existingTransactionThreadReport = allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${existingTransactionThreadReportID}`] ?? null;
if (chatReport) {
optimisticData.push({
@@ -552,20 +580,11 @@ function buildOnyxDataForMoneyRequest(
[iouAction.reportActionID]: iouAction as OnyxTypes.ReportAction,
},
},
-
{
onyxMethod: Onyx.METHOD.MERGE,
key: `${ONYXKEYS.COLLECTION.REPORT}${transactionThreadReport.reportID}`,
value: transactionThreadReport,
},
- {
- onyxMethod: Onyx.METHOD.MERGE,
- key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${transactionThreadReport.reportID}`,
- value: {
- [transactionThreadCreatedReportAction.reportActionID]: transactionThreadCreatedReportAction,
- },
- },
-
// Remove the temporary transaction used during the creation flow
{
onyxMethod: Onyx.METHOD.SET,
@@ -574,6 +593,16 @@ function buildOnyxDataForMoneyRequest(
},
);
+ if (!isEmptyObject(transactionThreadCreatedReportAction)) {
+ optimisticData.push({
+ onyxMethod: Onyx.METHOD.MERGE,
+ key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${transactionThreadReport.reportID}`,
+ value: {
+ [transactionThreadCreatedReportAction.reportActionID]: transactionThreadCreatedReportAction,
+ },
+ });
+ }
+
if (!isOneOnOneSplit) {
optimisticData.push({
onyxMethod: Onyx.METHOD.SET,
@@ -693,7 +722,10 @@ function buildOnyxDataForMoneyRequest(
},
},
},
- {
+ );
+
+ if (!isEmptyObject(transactionThreadCreatedReportAction)) {
+ successData.push({
onyxMethod: Onyx.METHOD.MERGE,
key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${transactionThreadReport.reportID}`,
value: {
@@ -702,8 +734,8 @@ function buildOnyxDataForMoneyRequest(
errors: null,
},
},
- },
- );
+ });
+ }
const errorKey = DateUtils.getMicroseconds();
@@ -739,9 +771,11 @@ function buildOnyxDataForMoneyRequest(
onyxMethod: Onyx.METHOD.MERGE,
key: `${ONYXKEYS.COLLECTION.REPORT}${transactionThreadReport.reportID}`,
value: {
- errorFields: {
- createChat: ErrorUtils.getMicroSecondOnyxError('report.genericCreateReportFailureMessage'),
- },
+ errorFields: existingTransactionThreadReport
+ ? null
+ : {
+ createChat: ErrorUtils.getMicroSecondOnyxError('report.genericCreateReportFailureMessage'),
+ },
},
},
{
@@ -777,16 +811,19 @@ function buildOnyxDataForMoneyRequest(
}),
},
},
- {
+ ];
+
+ if (!isEmptyObject(transactionThreadCreatedReportAction)) {
+ failureData.push({
onyxMethod: Onyx.METHOD.MERGE,
key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${transactionThreadReport.reportID}`,
value: {
[transactionThreadCreatedReportAction.reportActionID]: {
- errors: ErrorUtils.getMicroSecondOnyxError('iou.error.genericCreateFailureMessage', false, errorKey),
+ errors: ErrorUtils.getMicroSecondOnyxError('iou.error.genericCreateFailureMessage'),
},
},
- },
- ];
+ });
+ }
// We don't need to compute violations unless we're on a paid policy
if (!policy || !PolicyUtils.isPaidGroupPolicy(policy)) {
@@ -815,16 +852,18 @@ function buildOnyxDataForTrackExpense(
iouCreatedAction: OptimisticCreatedReportAction,
iouAction: OptimisticIOUReportAction,
reportPreviewAction: OnyxEntry,
- transactionThreadReport: OptimisticChatReport,
- transactionThreadCreatedReportAction: OptimisticCreatedReportAction,
+ transactionThreadReport: OptimisticChatReport | EmptyObject,
+ transactionThreadCreatedReportAction: OptimisticCreatedReportAction | EmptyObject,
shouldCreateNewMoneyRequestReport: boolean,
policy?: OnyxEntry,
policyTagList?: OnyxEntry,
policyCategories?: OnyxEntry,
+ existingTransactionThreadReportID?: string,
): [OnyxUpdate[], OnyxUpdate[], OnyxUpdate[]] {
const isScanRequest = TransactionUtils.isScanRequest(transaction);
const clearedPendingFields = Object.fromEntries(Object.keys(transaction.pendingFields ?? {}).map((key) => [key, null]));
const optimisticData: OnyxUpdate[] = [];
+ const existingTransactionThreadReport = allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${existingTransactionThreadReportID}`] ?? null;
if (chatReport) {
optimisticData.push({
@@ -899,14 +938,6 @@ function buildOnyxDataForTrackExpense(
key: `${ONYXKEYS.COLLECTION.REPORT}${transactionThreadReport.reportID}`,
value: transactionThreadReport,
},
- {
- onyxMethod: Onyx.METHOD.MERGE,
- key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${transactionThreadReport.reportID}`,
- value: {
- [transactionThreadCreatedReportAction.reportActionID]: transactionThreadCreatedReportAction,
- },
- },
-
// Remove the temporary transaction used during the creation flow
{
onyxMethod: Onyx.METHOD.SET,
@@ -915,6 +946,16 @@ function buildOnyxDataForTrackExpense(
},
);
+ if (!isEmptyObject(transactionThreadCreatedReportAction)) {
+ optimisticData.push({
+ onyxMethod: Onyx.METHOD.MERGE,
+ key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${transactionThreadReport.reportID}`,
+ value: {
+ [transactionThreadCreatedReportAction.reportActionID]: transactionThreadCreatedReportAction,
+ },
+ });
+ }
+
const successData: OnyxUpdate[] = [];
if (iouReport) {
@@ -984,7 +1025,10 @@ function buildOnyxDataForTrackExpense(
pendingFields: clearedPendingFields,
},
},
- {
+ );
+
+ if (!isEmptyObject(transactionThreadCreatedReportAction)) {
+ successData.push({
onyxMethod: Onyx.METHOD.MERGE,
key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${transactionThreadReport.reportID}`,
value: {
@@ -993,8 +1037,8 @@ function buildOnyxDataForTrackExpense(
errors: null,
},
},
- },
- );
+ });
+ }
const failureData: OnyxUpdate[] = [];
@@ -1063,9 +1107,11 @@ function buildOnyxDataForTrackExpense(
onyxMethod: Onyx.METHOD.MERGE,
key: `${ONYXKEYS.COLLECTION.REPORT}${transactionThreadReport.reportID}`,
value: {
- errorFields: {
- createChat: ErrorUtils.getMicroSecondOnyxError('report.genericCreateReportFailureMessage'),
- },
+ errorFields: existingTransactionThreadReport
+ ? null
+ : {
+ createChat: ErrorUtils.getMicroSecondOnyxError('report.genericCreateReportFailureMessage'),
+ },
},
},
{
@@ -1107,6 +1153,170 @@ function buildOnyxDataForTrackExpense(
return [optimisticData, successData, failureData];
}
+function getDeleteTrackExpenseInformation(
+ chatReportID: string,
+ transactionID: string,
+ reportAction: OnyxTypes.ReportAction,
+ shouldDeleteTransactionFromOnyx = true,
+ isMovingTransactionFromTrackExpense = false,
+) {
+ // STEP 1: Get all collections we're updating
+ const chatReport = allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${chatReportID}`] ?? null;
+ const transaction = allTransactions[`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`];
+ const transactionViolations = allTransactionViolations[`${ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS}${transactionID}`];
+ const transactionThreadID = reportAction.childReportID;
+ let transactionThread = null;
+ if (transactionThreadID) {
+ transactionThread = allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${transactionThreadID}`] ?? null;
+ }
+
+ // STEP 2: Decide if we need to:
+ // 1. Delete the transactionThread - delete if there are no visible comments in the thread and we're not moving the transaction
+ // 2. Update the moneyRequestPreview to show [Deleted request] - update if the transactionThread exists AND it isn't being deleted and we're not moving the transaction
+ const shouldDeleteTransactionThread = !isMovingTransactionFromTrackExpense && (transactionThreadID ? (reportAction?.childVisibleActionCount ?? 0) === 0 : false);
+
+ const shouldShowDeletedRequestMessage = !isMovingTransactionFromTrackExpense && !!transactionThreadID && !shouldDeleteTransactionThread;
+
+ // STEP 3: Update the IOU reportAction.
+ const updatedReportAction = {
+ [reportAction.reportActionID]: {
+ pendingAction: shouldShowDeletedRequestMessage ? CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE : CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE,
+ previousMessage: reportAction.message,
+ message: [
+ {
+ type: 'COMMENT',
+ html: '',
+ text: '',
+ isEdited: true,
+ isDeletedParentAction: shouldShowDeletedRequestMessage,
+ },
+ ],
+ originalMessage: {
+ IOUTransactionID: null,
+ },
+ errors: undefined,
+ },
+ } as OnyxTypes.ReportActions;
+
+ const lastVisibleAction = ReportActionsUtils.getLastVisibleAction(chatReport?.reportID ?? '', updatedReportAction);
+ const reportLastMessageText = ReportActionsUtils.getLastVisibleMessage(chatReport?.reportID ?? '', updatedReportAction).lastMessageText;
+
+ // STEP 4: Build Onyx data
+ const optimisticData: OnyxUpdate[] = [];
+
+ if (shouldDeleteTransactionFromOnyx) {
+ optimisticData.push({
+ onyxMethod: Onyx.METHOD.SET,
+ key: `${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`,
+ value: null,
+ });
+ }
+
+ if (Permissions.canUseViolations(betas)) {
+ optimisticData.push({
+ onyxMethod: Onyx.METHOD.SET,
+ key: `${ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS}${transactionID}`,
+ value: null,
+ });
+ }
+
+ if (shouldDeleteTransactionThread) {
+ optimisticData.push(
+ {
+ onyxMethod: Onyx.METHOD.SET,
+ key: `${ONYXKEYS.COLLECTION.REPORT}${transactionThreadID}`,
+ value: null,
+ },
+ {
+ onyxMethod: Onyx.METHOD.SET,
+ key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${transactionThreadID}`,
+ value: null,
+ },
+ );
+ }
+
+ optimisticData.push(
+ {
+ onyxMethod: Onyx.METHOD.MERGE,
+ key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${chatReport?.reportID}`,
+ value: updatedReportAction,
+ },
+ {
+ onyxMethod: Onyx.METHOD.MERGE,
+ key: `${ONYXKEYS.COLLECTION.REPORT}${chatReport?.reportID}`,
+ value: {
+ lastMessageText: reportLastMessageText,
+ lastVisibleActionCreated: lastVisibleAction?.created,
+ },
+ },
+ );
+
+ const successData: OnyxUpdate[] = [
+ {
+ onyxMethod: Onyx.METHOD.MERGE,
+ key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${chatReport?.reportID}`,
+ value: {
+ [reportAction.reportActionID]: {
+ pendingAction: null,
+ errors: null,
+ },
+ },
+ },
+ ];
+
+ const failureData: OnyxUpdate[] = [];
+
+ if (shouldDeleteTransactionFromOnyx) {
+ failureData.push({
+ onyxMethod: Onyx.METHOD.SET,
+ key: `${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`,
+ value: transaction,
+ });
+ }
+
+ if (Permissions.canUseViolations(betas)) {
+ failureData.push({
+ onyxMethod: Onyx.METHOD.SET,
+ key: `${ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS}${transactionID}`,
+ value: transactionViolations,
+ });
+ }
+
+ if (shouldDeleteTransactionThread) {
+ failureData.push({
+ onyxMethod: Onyx.METHOD.SET,
+ key: `${ONYXKEYS.COLLECTION.REPORT}${transactionThreadID}`,
+ value: transactionThread,
+ });
+ }
+
+ failureData.push(
+ {
+ onyxMethod: Onyx.METHOD.MERGE,
+ key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${chatReport?.reportID}`,
+ value: {
+ [reportAction.reportActionID]: {
+ ...reportAction,
+ pendingAction: null,
+ errors: ErrorUtils.getMicroSecondOnyxError('iou.error.genericDeleteFailureMessage'),
+ },
+ },
+ },
+ {
+ onyxMethod: Onyx.METHOD.MERGE,
+ key: `${ONYXKEYS.COLLECTION.REPORT}${chatReport?.reportID}`,
+ value: chatReport,
+ },
+ );
+
+ const parameters: DeleteMoneyRequestParams = {
+ transactionID,
+ reportActionID: reportAction.reportActionID,
+ };
+
+ return {parameters, optimisticData, successData, failureData, shouldDeleteTransactionThread, chatReport};
+}
+
/**
* Gathers all the data needed to make a money request. It attempts to find existing reports, iouReports, and receipts. If it doesn't find them, then
* it creates optimistic versions of them and uses those instead
@@ -1130,6 +1340,7 @@ function getMoneyRequestInformation(
payeeAccountID = userAccountID,
payeeEmail = currentUserEmail,
moneyRequestReportID = '',
+ linkedTrackedExpenseReportAction?: OnyxTypes.ReportAction,
): MoneyRequestInformation {
const payerEmail = PhoneNumber.addSMSDomainIfPhoneNumber(participant.login ?? '');
const payerAccountID = Number(participant.accountID);
@@ -1179,7 +1390,6 @@ function getMoneyRequestInformation(
} else {
iouReport = IOUUtils.updateIOUOwnerAndTotal(iouReport, payeeAccountID, amount, currency);
}
-
// STEP 3: Build optimistic receipt and transaction
const receiptObject: Receipt = {};
let filename;
@@ -1188,7 +1398,7 @@ function getMoneyRequestInformation(
receiptObject.state = receipt.state ?? CONST.IOU.RECEIPT_STATE.SCANREADY;
filename = receipt.name;
}
- const existingTransaction = allTransactionDrafts[`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${CONST.IOU.OPTIMISTIC_TRANSACTION_ID}`];
+ const existingTransaction = allTransactionDrafts[`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${existingTransactionID ?? CONST.IOU.OPTIMISTIC_TRANSACTION_ID}`];
const isDistanceRequest = existingTransaction && existingTransaction.iouRequestType === CONST.IOU.REQUEST_TYPE.DISTANCE;
let optimisticTransaction = TransactionUtils.buildOptimisticTransaction(
ReportUtils.isExpenseReport(iouReport) ? -amount : amount,
@@ -1242,9 +1452,13 @@ function getMoneyRequestInformation(
false,
receiptObject,
false,
+ undefined,
+ linkedTrackedExpenseReportAction?.childReportID,
+ linkedTrackedExpenseReportAction,
);
- let reportPreviewAction = shouldCreateNewMoneyRequestReport ? null : ReportActionsUtils.getReportPreviewAction(chatReport.reportID, iouReport.reportID);
+ let reportPreviewAction = shouldCreateNewMoneyRequestReport ? null : getReportPreviewAction(chatReport.reportID, iouReport.reportID);
+
if (reportPreviewAction) {
reportPreviewAction = ReportUtils.updateReportPreview(iouReport, reportPreviewAction, false, comment, optimisticTransaction);
} else {
@@ -1286,8 +1500,8 @@ function getMoneyRequestInformation(
optimisticPolicyRecentlyUsedCategories,
optimisticPolicyRecentlyUsedTags,
isNewChatReport,
- optimisticTransactionThread,
- optimisticCreatedActionForTransactionThread,
+ optimisticTransactionThread ?? {},
+ optimisticCreatedActionForTransactionThread ?? {},
shouldCreateNewMoneyRequestReport,
policy,
policyTagList,
@@ -1305,8 +1519,8 @@ function getMoneyRequestInformation(
createdChatReportActionID: isNewChatReport ? optimisticCreatedActionForChat.reportActionID : '0',
createdIOUReportActionID: shouldCreateNewMoneyRequestReport ? optimisticCreatedActionForIOUReport.reportActionID : '0',
reportPreviewAction,
- transactionThreadReportID: optimisticTransactionThread.reportID,
- createdReportActionIDForThread: optimisticCreatedActionForTransactionThread.reportActionID,
+ transactionThreadReportID: optimisticTransactionThread?.reportID ?? '0',
+ createdReportActionIDForThread: optimisticCreatedActionForTransactionThread?.reportActionID ?? '0',
onyxData: {
optimisticData,
successData,
@@ -1337,6 +1551,8 @@ function getTrackExpenseInformation(
payeeEmail = currentUserEmail,
payeeAccountID = userAccountID,
moneyRequestReportID = '',
+ linkedTrackedExpenseReportAction?: OnyxTypes.ReportAction,
+ existingTransactionID?: string,
): TrackExpenseInformation | EmptyObject {
const isPolicyExpenseChat = participant.isPolicyExpenseChat;
@@ -1392,7 +1608,7 @@ function getTrackExpenseInformation(
receiptObject.state = receipt.state ?? CONST.IOU.RECEIPT_STATE.SCANREADY;
filename = receipt.name;
}
- const existingTransaction = allTransactionDrafts[`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${CONST.IOU.OPTIMISTIC_TRANSACTION_ID}`];
+ const existingTransaction = allTransactionDrafts[`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${existingTransactionID ?? CONST.IOU.OPTIMISTIC_TRANSACTION_ID}`];
const isDistanceRequest = existingTransaction && existingTransaction.iouRequestType === CONST.IOU.REQUEST_TYPE.DISTANCE;
let optimisticTransaction = TransactionUtils.buildOptimisticTransaction(
ReportUtils.isExpenseReport(iouReport) ? -amount : amount,
@@ -1405,7 +1621,7 @@ function getTrackExpenseInformation(
merchant,
receiptObject,
filename,
- null,
+ existingTransactionID ?? null,
category,
tag,
billable,
@@ -1442,16 +1658,18 @@ function getTrackExpenseInformation(
receiptObject,
false,
!shouldUseMoneyReport,
+ linkedTrackedExpenseReportAction?.childReportID,
+ linkedTrackedExpenseReportAction,
);
let reportPreviewAction: OnyxEntry = null;
if (shouldUseMoneyReport && iouReport) {
- reportPreviewAction = shouldCreateNewMoneyRequestReport ? null : ReportActionsUtils.getReportPreviewAction(chatReport.reportID, iouReport.reportID);
+ reportPreviewAction = shouldCreateNewMoneyRequestReport ? null : getReportPreviewAction(chatReport.reportID, iouReport.reportID);
+
if (reportPreviewAction) {
reportPreviewAction = ReportUtils.updateReportPreview(iouReport, reportPreviewAction, false, comment, optimisticTransaction);
} else {
reportPreviewAction = ReportUtils.buildOptimisticReportPreview(chatReport, iouReport, comment, optimisticTransaction);
-
// Generated ReportPreview action is a parent report action of the iou report.
// We are setting the iou report's parentReportActionID to display subtitle correctly in IOU page when offline.
iouReport.parentReportActionID = reportPreviewAction.reportActionID;
@@ -1466,8 +1684,8 @@ function getTrackExpenseInformation(
optimisticCreatedActionForIOUReport,
iouAction,
reportPreviewAction,
- optimisticTransactionThread,
- optimisticCreatedActionForTransactionThread,
+ optimisticTransactionThread ?? {},
+ (optimisticCreatedActionForTransactionThread as OptimisticCreatedReportAction) ?? {}, // Add type assertion here
shouldCreateNewMoneyRequestReport,
policy,
policyTagList,
@@ -2241,28 +2459,308 @@ function updateMoneyRequestDescription(
const transactionChanges: TransactionChanges = {
comment,
};
- const transactionThreadReport = allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${transactionThreadReportID}`] ?? null;
- let data: UpdateMoneyRequestData;
- if (ReportUtils.isTrackExpenseReport(transactionThreadReport)) {
- data = getUpdateTrackExpenseParams(transactionID, transactionThreadReportID, transactionChanges, true, policy);
- } else {
- data = getUpdateMoneyRequestParams(transactionID, transactionThreadReportID, transactionChanges, policy, policyTagList, policyCategories, true);
- }
- const {params, onyxData} = data;
- API.write(WRITE_COMMANDS.UPDATE_MONEY_REQUEST_DESCRIPTION, params, onyxData);
-}
+ const transactionThreadReport = allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${transactionThreadReportID}`] ?? null;
+ let data: UpdateMoneyRequestData;
+ if (ReportUtils.isTrackExpenseReport(transactionThreadReport)) {
+ data = getUpdateTrackExpenseParams(transactionID, transactionThreadReportID, transactionChanges, true, policy);
+ } else {
+ data = getUpdateMoneyRequestParams(transactionID, transactionThreadReportID, transactionChanges, policy, policyTagList, policyCategories, true);
+ }
+ const {params, onyxData} = data;
+ API.write(WRITE_COMMANDS.UPDATE_MONEY_REQUEST_DESCRIPTION, params, onyxData);
+}
+
+/** Edits an existing distance request */
+function updateDistanceRequest(
+ transactionID: string,
+ transactionThreadReportID: string,
+ transactionChanges: TransactionChanges,
+ policy: OnyxTypes.Policy,
+ policyTagList: OnyxTypes.PolicyTagList,
+ policyCategories: OnyxTypes.PolicyCategories,
+) {
+ const {params, onyxData} = getUpdateMoneyRequestParams(transactionID, transactionThreadReportID, transactionChanges, policy, policyTagList, policyCategories, false);
+ API.write(WRITE_COMMANDS.UPDATE_DISTANCE_REQUEST, params, onyxData);
+}
+
+const getConvertTrackedExpenseInformation = (
+ transactionID: string,
+ actionableWhisperReportActionID: string,
+ moneyRequestReportID: string,
+ linkedTrackedExpenseReportAction: OnyxTypes.ReportAction,
+ linkedTrackedExpenseReportID: string,
+ transactionThreadReportID: string,
+) => {
+ const optimisticData: OnyxUpdate[] = [];
+ const successData: OnyxUpdate[] = [];
+ const failureData: OnyxUpdate[] = [];
+
+ // Delete the transaction from the track expense report
+ const {
+ optimisticData: deleteOptimisticData,
+ successData: deleteSuccessData,
+ failureData: deleteFailureData,
+ } = getDeleteTrackExpenseInformation(linkedTrackedExpenseReportID, transactionID, linkedTrackedExpenseReportAction, false, true);
+
+ optimisticData?.push(...deleteOptimisticData);
+ successData?.push(...deleteSuccessData);
+ failureData?.push(...deleteFailureData);
+
+ // Build modified expense report action with the transaction changes
+ const modifiedExpenseReportAction = ReportUtils.buildOptimisticMovedTrackedExpenseModifiedReportAction(transactionThreadReportID, moneyRequestReportID);
+
+ optimisticData?.push({
+ onyxMethod: Onyx.METHOD.MERGE,
+ key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${transactionThreadReportID}`,
+ value: {
+ [modifiedExpenseReportAction.reportActionID]: modifiedExpenseReportAction as OnyxTypes.ReportAction,
+ },
+ });
+ successData?.push({
+ onyxMethod: Onyx.METHOD.MERGE,
+ key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${transactionThreadReportID}`,
+ value: {
+ [modifiedExpenseReportAction.reportActionID]: {pendingAction: null},
+ },
+ });
+ failureData?.push({
+ onyxMethod: Onyx.METHOD.MERGE,
+ key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${transactionThreadReportID}`,
+ value: {
+ [modifiedExpenseReportAction.reportActionID]: {
+ ...(modifiedExpenseReportAction as OnyxTypes.ReportAction),
+ errors: ErrorUtils.getMicroSecondOnyxError('iou.error.genericEditFailureMessage'),
+ },
+ },
+ });
+
+ // Resolve actionable whisper message
+ optimisticData?.push({
+ onyxMethod: Onyx.METHOD.MERGE,
+ key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${linkedTrackedExpenseReportID}`,
+ value: {
+ [actionableWhisperReportActionID]: {
+ originalMessage: {
+ resolution: CONST.REPORT.ACTIONABLE_MENTION_WHISPER_RESOLUTION.NOTHING,
+ },
+ },
+ },
+ });
+
+ failureData?.push({
+ onyxMethod: Onyx.METHOD.MERGE,
+ key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${linkedTrackedExpenseReportID}`,
+ value: {
+ [actionableWhisperReportActionID]: {
+ originalMessage: {
+ resolution: null,
+ },
+ },
+ },
+ });
+
+ return {optimisticData, successData, failureData, modifiedExpenseReportActionID: modifiedExpenseReportAction.reportActionID};
+};
+
+function convertTrackedExpenseToRequest(
+ payerAccountID: number,
+ chatReportID: string,
+ transactionID: string,
+ actionableWhisperReportActionID: string,
+ createdChatReportActionID: string,
+ moneyRequestReportID: string,
+ moneyRequestCreatedReportActionID: string,
+ moneyRequestPreviewReportActionID: string,
+ linkedTrackedExpenseReportAction: OnyxTypes.ReportAction,
+ linkedTrackedExpenseReportID: string,
+ transactionThreadReportID: string,
+ reportPreviewReportActionID: string,
+ onyxData: OnyxData,
+ amount: number,
+ currency: string,
+ comment: string,
+ merchant: string,
+ created: string,
+ receipt?: Receipt,
+) {
+ const {optimisticData, successData, failureData} = onyxData;
+
+ const {
+ optimisticData: moveTransactionOptimisticData,
+ successData: moveTransactionSuccessData,
+ failureData: moveTransactionFailureData,
+ modifiedExpenseReportActionID,
+ } = getConvertTrackedExpenseInformation(
+ transactionID,
+ actionableWhisperReportActionID,
+ moneyRequestReportID,
+ linkedTrackedExpenseReportAction,
+ linkedTrackedExpenseReportID,
+ transactionThreadReportID,
+ );
+
+ optimisticData?.push(...moveTransactionOptimisticData);
+ successData?.push(...moveTransactionSuccessData);
+ failureData?.push(...moveTransactionFailureData);
+
+ const parameters = {
+ amount,
+ currency,
+ comment,
+ created,
+ merchant,
+ receipt,
+ payerAccountID,
+ chatReportID,
+ transactionID,
+ actionableWhisperReportActionID,
+ createdChatReportActionID,
+ moneyRequestReportID,
+ moneyRequestCreatedReportActionID,
+ moneyRequestPreviewReportActionID,
+ transactionThreadReportID,
+ modifiedExpenseReportActionID,
+ reportPreviewReportActionID,
+ };
+ API.write(WRITE_COMMANDS.CONVERT_TRACKED_EXPENSE_TO_REQUEST, parameters, {optimisticData, successData, failureData});
+}
+
+function categorizeTrackedExpense(
+ policyID: string,
+ transactionID: string,
+ moneyRequestPreviewReportActionID: string,
+ moneyRequestReportID: string,
+ moneyRequestCreatedReportActionID: string,
+ actionableWhisperReportActionID: string,
+ linkedTrackedExpenseReportAction: OnyxTypes.ReportAction,
+ linkedTrackedExpenseReportID: string,
+ transactionThreadReportID: string,
+ reportPreviewReportActionID: string,
+ onyxData: OnyxData,
+ amount: number,
+ currency: string,
+ comment: string,
+ merchant: string,
+ created: string,
+ category?: string,
+ tag?: string,
+ taxCode = '',
+ taxAmount = 0,
+ billable?: boolean,
+ receipt?: Receipt,
+) {
+ const {optimisticData, successData, failureData} = onyxData;
+
+ const {
+ optimisticData: moveTransactionOptimisticData,
+ successData: moveTransactionSuccessData,
+ failureData: moveTransactionFailureData,
+ modifiedExpenseReportActionID,
+ } = getConvertTrackedExpenseInformation(
+ transactionID,
+ actionableWhisperReportActionID,
+ moneyRequestReportID,
+ linkedTrackedExpenseReportAction,
+ linkedTrackedExpenseReportID,
+ transactionThreadReportID,
+ );
+
+ optimisticData?.push(...moveTransactionOptimisticData);
+ successData?.push(...moveTransactionSuccessData);
+ failureData?.push(...moveTransactionFailureData);
+
+ const parameters = {
+ policyID,
+ transactionID,
+ moneyRequestPreviewReportActionID,
+ moneyRequestReportID,
+ moneyRequestCreatedReportActionID,
+ actionableWhisperReportActionID,
+ modifiedExpenseReportActionID,
+ reportPreviewReportActionID,
+ amount,
+ currency,
+ comment,
+ merchant,
+ category,
+ tag,
+ taxCode,
+ taxAmount,
+ billable,
+ created,
+ receipt,
+ };
+
+ API.write(WRITE_COMMANDS.CATEGORIZE_TRACKED_EXPENSE, parameters, {optimisticData, successData, failureData});
+}
+
+function shareTrackedExpense(
+ policyID: string,
+ transactionID: string,
+ moneyRequestPreviewReportActionID: string,
+ moneyRequestReportID: string,
+ moneyRequestCreatedReportActionID: string,
+ actionableWhisperReportActionID: string,
+ linkedTrackedExpenseReportAction: OnyxTypes.ReportAction,
+ linkedTrackedExpenseReportID: string,
+ transactionThreadReportID: string,
+ reportPreviewReportActionID: string,
+ onyxData: OnyxData,
+ amount: number,
+ currency: string,
+ comment: string,
+ merchant: string,
+ created: string,
+ category?: string,
+ tag?: string,
+ taxCode = '',
+ taxAmount = 0,
+ billable?: boolean,
+ receipt?: Receipt,
+) {
+ const {optimisticData, successData, failureData} = onyxData;
+
+ const {
+ optimisticData: moveTransactionOptimisticData,
+ successData: moveTransactionSuccessData,
+ failureData: moveTransactionFailureData,
+ modifiedExpenseReportActionID,
+ } = getConvertTrackedExpenseInformation(
+ transactionID,
+ actionableWhisperReportActionID,
+ moneyRequestReportID,
+ linkedTrackedExpenseReportAction,
+ linkedTrackedExpenseReportID,
+ transactionThreadReportID,
+ );
+
+ optimisticData?.push(...moveTransactionOptimisticData);
+ successData?.push(...moveTransactionSuccessData);
+ failureData?.push(...moveTransactionFailureData);
+
+ const parameters = {
+ policyID,
+ transactionID,
+ moneyRequestPreviewReportActionID,
+ moneyRequestReportID,
+ moneyRequestCreatedReportActionID,
+ actionableWhisperReportActionID,
+ modifiedExpenseReportActionID,
+ reportPreviewReportActionID,
+ amount,
+ currency,
+ comment,
+ merchant,
+ created,
+ category,
+ tag,
+ taxCode,
+ taxAmount,
+ billable,
+ receipt,
+ };
-/** Edits an existing distance request */
-function updateDistanceRequest(
- transactionID: string,
- transactionThreadReportID: string,
- transactionChanges: TransactionChanges,
- policy: OnyxTypes.Policy,
- policyTagList: OnyxTypes.PolicyTagList,
- policyCategories: OnyxTypes.PolicyCategories,
-) {
- const {params, onyxData} = getUpdateMoneyRequestParams(transactionID, transactionThreadReportID, transactionChanges, policy, policyTagList, policyCategories, false);
- API.write(WRITE_COMMANDS.UPDATE_DISTANCE_REQUEST, params, onyxData);
+ API.write(WRITE_COMMANDS.SHARE_TRACKED_EXPENSE, parameters, {optimisticData, successData, failureData});
}
/**
@@ -2288,12 +2786,18 @@ function requestMoney(
policyTagList?: OnyxEntry,
policyCategories?: OnyxEntry,
gpsPoints?: GPSPoint,
+ action?: ValueOf,
+ actionableWhisperReportActionID?: string,
+ linkedTrackedExpenseReportAction?: OnyxTypes.ReportAction,
+ linkedTrackedExpenseReportID?: string,
) {
// If the report is iou or expense report, we should get the linked chat report to be passed to the getMoneyRequestInformation function
const isMoneyRequestReport = ReportUtils.isMoneyRequestReport(report);
const currentChatReport = isMoneyRequestReport ? ReportUtils.getReport(report?.chatReportID) : report;
const moneyRequestReportID = isMoneyRequestReport ? report?.reportID : '';
const currentCreated = DateUtils.enrichMoneyRequestTimestamp(created);
+ const isMovingTransactionFromTrackExpense = IOUUtils.isMovingTransactionFromTrackExpense(action);
+
const {
payerAccountID,
payerEmail,
@@ -2308,7 +2812,7 @@ function requestMoney(
createdReportActionIDForThread,
onyxData,
} = getMoneyRequestInformation(
- currentChatReport,
+ isMovingTransactionFromTrackExpense ? {} : currentChatReport,
participant,
comment,
amount,
@@ -2316,7 +2820,7 @@ function requestMoney(
currentCreated,
merchant,
receipt,
- undefined,
+ isMovingTransactionFromTrackExpense ? (linkedTrackedExpenseReportAction?.originalMessage as IOUMessage)?.IOUTransactionID : undefined,
category,
tag,
billable,
@@ -2326,39 +2830,74 @@ function requestMoney(
payeeAccountID,
payeeEmail,
moneyRequestReportID,
+ linkedTrackedExpenseReportAction,
);
const activeReportID = isMoneyRequestReport ? report?.reportID : chatReport.reportID;
- const parameters: RequestMoneyParams = {
- debtorEmail: payerEmail,
- debtorAccountID: payerAccountID,
- amount,
- currency,
- comment,
- created: currentCreated,
- merchant,
- iouReportID: iouReport.reportID,
- chatReportID: chatReport.reportID,
- transactionID: transaction.transactionID,
- reportActionID: iouAction.reportActionID,
- createdChatReportActionID,
- createdIOUReportActionID,
- reportPreviewReportActionID: reportPreviewAction.reportActionID,
- receipt,
- receiptState: receipt?.state,
- category,
- tag,
- taxCode,
- taxAmount,
- billable,
- // This needs to be a string of JSON because of limitations with the fetch() API and nested objects
- gpsPoints: gpsPoints ? JSON.stringify(gpsPoints) : undefined,
- transactionThreadReportID,
- createdReportActionIDForThread,
- };
+ switch (action) {
+ case CONST.IOU.ACTION.MOVE: {
+ if (!linkedTrackedExpenseReportAction || !actionableWhisperReportActionID || !linkedTrackedExpenseReportID) {
+ return;
+ }
+
+ convertTrackedExpenseToRequest(
+ payerAccountID,
+ chatReport.reportID,
+ transaction.transactionID,
+ actionableWhisperReportActionID,
+ createdChatReportActionID,
+ iouReport.reportID,
+ createdIOUReportActionID,
+ iouAction.reportActionID,
+ linkedTrackedExpenseReportAction,
+ linkedTrackedExpenseReportID,
+ transactionThreadReportID,
+ reportPreviewAction.reportActionID,
+ onyxData,
+ amount,
+ currency,
+ comment,
+ merchant,
+ currentCreated,
+ receipt,
+ );
+ break;
+ }
+ default: {
+ const parameters: RequestMoneyParams = {
+ debtorEmail: payerEmail,
+ debtorAccountID: payerAccountID,
+ amount,
+ currency,
+ comment,
+ created: currentCreated,
+ merchant,
+ iouReportID: iouReport.reportID,
+ chatReportID: chatReport.reportID,
+ transactionID: transaction.transactionID,
+ reportActionID: iouAction.reportActionID,
+ createdChatReportActionID,
+ createdIOUReportActionID,
+ reportPreviewReportActionID: reportPreviewAction.reportActionID,
+ receipt,
+ receiptState: receipt?.state,
+ category,
+ tag,
+ taxCode,
+ taxAmount,
+ billable,
+ // This needs to be a string of JSON because of limitations with the fetch() API and nested objects
+ gpsPoints: gpsPoints ? JSON.stringify(gpsPoints) : undefined,
+ transactionThreadReportID,
+ createdReportActionIDForThread,
+ };
+
+ // eslint-disable-next-line rulesdir/no-multiple-api-calls
+ API.write(WRITE_COMMANDS.REQUEST_MONEY, parameters, onyxData);
+ resetMoneyRequestInfo();
+ }
+ }
- API.write(WRITE_COMMANDS.REQUEST_MONEY, parameters, onyxData);
- resetMoneyRequestInfo();
Navigation.dismissModal(activeReportID);
if (activeReportID) {
Report.notifyNewAction(activeReportID, payeeAccountID);
@@ -2389,10 +2928,15 @@ function trackExpense(
policyCategories?: OnyxEntry,
gpsPoints?: GPSPoint,
validWaypoints?: WaypointCollection,
+ action?: ValueOf,
+ actionableWhisperReportActionID?: string,
+ linkedTrackedExpenseReportAction?: OnyxTypes.ReportAction,
+ linkedTrackedExpenseReportID?: string,
) {
const isMoneyRequestReport = ReportUtils.isMoneyRequestReport(report);
const currentChatReport = isMoneyRequestReport ? ReportUtils.getReport(report.chatReportID) : report;
const moneyRequestReportID = isMoneyRequestReport ? report.reportID : '';
+ const isMovingTransactionFromTrackExpense = IOUUtils.isMovingTransactionFromTrackExpense(action);
const currentCreated = DateUtils.enrichMoneyRequestTimestamp(created);
const {
@@ -2424,39 +2968,110 @@ function trackExpense(
payeeEmail,
payeeAccountID,
moneyRequestReportID,
+ linkedTrackedExpenseReportAction,
+ isMovingTransactionFromTrackExpense ? (linkedTrackedExpenseReportAction?.originalMessage as IOUMessage)?.IOUTransactionID : undefined,
);
const activeReportID = isMoneyRequestReport ? report.reportID : chatReport.reportID;
- const parameters: TrackExpenseParams = {
- amount,
- currency,
- comment,
- created: currentCreated,
- merchant,
- iouReportID: iouReport?.reportID,
- chatReportID: chatReport.reportID,
- transactionID: transaction.transactionID,
- reportActionID: iouAction.reportActionID,
- createdChatReportActionID,
- createdIOUReportActionID,
- reportPreviewReportActionID: reportPreviewAction?.reportActionID,
- receipt,
- receiptState: receipt?.state,
- category,
- tag,
- taxCode,
- taxAmount,
- billable,
- // This needs to be a string of JSON because of limitations with the fetch() API and nested objects
- gpsPoints: gpsPoints ? JSON.stringify(gpsPoints) : undefined,
- transactionThreadReportID,
- createdReportActionIDForThread,
- waypoints: validWaypoints ? JSON.stringify(validWaypoints) : undefined,
- };
+ switch (action) {
+ case CONST.IOU.ACTION.CATEGORIZE: {
+ if (!linkedTrackedExpenseReportAction || !actionableWhisperReportActionID || !linkedTrackedExpenseReportID) {
+ return;
+ }
+ categorizeTrackedExpense(
+ chatReport.policyID ?? '',
+ transaction.transactionID,
+ iouAction.reportActionID,
+ iouReport?.reportID ?? '',
+ createdIOUReportActionID ?? '',
+ actionableWhisperReportActionID,
+ linkedTrackedExpenseReportAction,
+ linkedTrackedExpenseReportID,
+ transactionThreadReportID,
+ reportPreviewAction?.reportActionID ?? '',
+ onyxData,
+ amount,
+ currency,
+ comment,
+ merchant,
+ currentCreated,
+ category,
+ tag,
+ taxCode,
+ taxAmount,
+ billable,
+ receipt,
+ );
+ break;
+ }
+ case CONST.IOU.ACTION.SHARE: {
+ if (!linkedTrackedExpenseReportAction || !actionableWhisperReportActionID || !linkedTrackedExpenseReportID) {
+ return;
+ }
+ shareTrackedExpense(
+ chatReport.policyID ?? '',
+ transaction.transactionID,
+ iouAction.reportActionID,
+ iouReport?.reportID ?? '',
+ createdIOUReportActionID ?? '',
+ actionableWhisperReportActionID,
+ linkedTrackedExpenseReportAction,
+ linkedTrackedExpenseReportID,
+ transactionThreadReportID,
+ reportPreviewAction?.reportActionID ?? '',
+ onyxData,
+ amount,
+ currency,
+ comment,
+ merchant,
+ currentCreated,
+ category,
+ tag,
+ taxCode,
+ taxAmount,
+ billable,
+ receipt,
+ );
+ break;
+ }
+ default: {
+ const parameters: TrackExpenseParams = {
+ amount,
+ currency,
+ comment,
+ created: currentCreated,
+ merchant,
+ iouReportID: iouReport?.reportID,
+ chatReportID: chatReport.reportID,
+ transactionID: transaction.transactionID,
+ reportActionID: iouAction.reportActionID,
+ createdChatReportActionID,
+ createdIOUReportActionID,
+ reportPreviewReportActionID: reportPreviewAction?.reportActionID,
+ receipt,
+ receiptState: receipt?.state,
+ category,
+ tag,
+ taxCode,
+ taxAmount,
+ billable,
+ // This needs to be a string of JSON because of limitations with the fetch() API and nested objects
+ gpsPoints: gpsPoints ? JSON.stringify(gpsPoints) : undefined,
+ transactionThreadReportID,
+ createdReportActionIDForThread,
+ waypoints: validWaypoints ? JSON.stringify(validWaypoints) : undefined,
+ };
+
+ API.write(WRITE_COMMANDS.TRACK_EXPENSE, parameters, onyxData);
+ resetMoneyRequestInfo();
+ }
+ }
+ if (action === CONST.IOU.ACTION.SHARE) {
+ Navigation.navigate(ROUTES.ROOM_INVITE.getRoute(activeReportID ?? '', CONST.IOU.SHARE.ROLE.ACCOUNTANT));
+ } else {
+ Navigation.dismissModal(activeReportID);
+ }
- API.write(WRITE_COMMANDS.TRACK_EXPENSE, parameters, onyxData);
- resetMoneyRequestInfo();
- Navigation.dismissModal(activeReportID);
Report.notifyNewAction(activeReportID, payeeAccountID);
}
@@ -2803,7 +3418,7 @@ function createSplitsAndOnyxData(
}
: {};
- let oneOnOneReportPreviewAction = ReportActionsUtils.getReportPreviewAction(oneOnOneChatReport.reportID, oneOnOneIOUReport.reportID);
+ let oneOnOneReportPreviewAction = getReportPreviewAction(oneOnOneChatReport.reportID, oneOnOneIOUReport.reportID);
if (oneOnOneReportPreviewAction) {
oneOnOneReportPreviewAction = ReportUtils.updateReportPreview(oneOnOneIOUReport, oneOnOneReportPreviewAction);
} else {
@@ -3472,7 +4087,7 @@ function completeSplitBill(chatReportID: string, reportAction: OnyxTypes.ReportA
undefined,
);
- let oneOnOneReportPreviewAction = ReportActionsUtils.getReportPreviewAction(oneOnOneChatReport?.reportID ?? '', oneOnOneIOUReport?.reportID ?? '');
+ let oneOnOneReportPreviewAction = getReportPreviewAction(oneOnOneChatReport?.reportID ?? '', oneOnOneIOUReport?.reportID ?? '');
if (oneOnOneReportPreviewAction) {
oneOnOneReportPreviewAction = ReportUtils.updateReportPreview(oneOnOneIOUReport, oneOnOneReportPreviewAction);
} else {
@@ -3874,7 +4489,7 @@ function deleteMoneyRequest(transactionID: string, reportAction: OnyxTypes.Repor
const iouReportID = reportAction?.actionName === CONST.REPORT.ACTIONS.TYPE.IOU ? reportAction.originalMessage.IOUReportID : '';
const iouReport = allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${iouReportID}`] ?? null;
const chatReport = allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${iouReport?.chatReportID}`];
- const reportPreviewAction = ReportActionsUtils.getReportPreviewAction(iouReport?.chatReportID ?? '', iouReport?.reportID ?? '');
+ const reportPreviewAction = getReportPreviewAction(iouReport?.chatReportID ?? '', iouReport?.reportID ?? '');
const transaction = allTransactions[`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`];
const transactionViolations = allTransactionViolations[`${ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS}${transactionID}`];
const transactionThreadID = reportAction.childReportID;
@@ -4181,152 +4796,7 @@ function deleteTrackExpense(chatReportID: string, transactionID: string, reportA
return deleteMoneyRequest(transactionID, reportAction, isSingleTransactionView);
}
- const transaction = allTransactions[`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`];
- const transactionViolations = allTransactionViolations[`${ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS}${transactionID}`];
- const transactionThreadID = reportAction.childReportID;
- let transactionThread = null;
- if (transactionThreadID) {
- transactionThread = allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${transactionThreadID}`] ?? null;
- }
-
- // STEP 2: Decide if we need to:
- // 1. Delete the transactionThread - delete if there are no visible comments in the thread
- // 2. Update the moneyRequestPreview to show [Deleted request] - update if the transactionThread exists AND it isn't being deleted
- const shouldDeleteTransactionThread = transactionThreadID ? (reportAction?.childVisibleActionCount ?? 0) === 0 : false;
- const shouldShowDeletedRequestMessage = !!transactionThreadID && !shouldDeleteTransactionThread;
-
- // STEP 3: Update the IOU reportAction.
- const updatedReportAction = {
- [reportAction.reportActionID]: {
- pendingAction: shouldShowDeletedRequestMessage ? CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE : CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE,
- previousMessage: reportAction.message,
- message: [
- {
- type: 'COMMENT',
- html: '',
- text: '',
- isEdited: true,
- isDeletedParentAction: shouldShowDeletedRequestMessage,
- },
- ],
- originalMessage: {
- IOUTransactionID: null,
- },
- errors: undefined,
- },
- } as OnyxTypes.ReportActions;
-
- const lastVisibleAction = ReportActionsUtils.getLastVisibleAction(chatReport?.reportID ?? '', updatedReportAction);
- const reportLastMessageText = ReportActionsUtils.getLastVisibleMessage(chatReport?.reportID ?? '', updatedReportAction).lastMessageText;
-
- // STEP 4: Build Onyx data
- const optimisticData: OnyxUpdate[] = [
- {
- onyxMethod: Onyx.METHOD.SET,
- key: `${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`,
- value: null,
- },
- ];
-
- if (Permissions.canUseViolations(betas)) {
- optimisticData.push({
- onyxMethod: Onyx.METHOD.SET,
- key: `${ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS}${transactionID}`,
- value: null,
- });
- }
-
- if (shouldDeleteTransactionThread) {
- optimisticData.push(
- {
- onyxMethod: Onyx.METHOD.SET,
- key: `${ONYXKEYS.COLLECTION.REPORT}${transactionThreadID}`,
- value: null,
- },
- {
- onyxMethod: Onyx.METHOD.SET,
- key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${transactionThreadID}`,
- value: null,
- },
- );
- }
-
- optimisticData.push(
- {
- onyxMethod: Onyx.METHOD.MERGE,
- key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${chatReport?.reportID}`,
- value: updatedReportAction,
- },
- {
- onyxMethod: Onyx.METHOD.MERGE,
- key: `${ONYXKEYS.COLLECTION.REPORT}${chatReport?.reportID}`,
- value: {
- lastMessageText: reportLastMessageText,
- lastVisibleActionCreated: lastVisibleAction?.created,
- },
- },
- );
-
- const successData: OnyxUpdate[] = [
- {
- onyxMethod: Onyx.METHOD.MERGE,
- key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${chatReport?.reportID}`,
- value: {
- [reportAction.reportActionID]: {
- pendingAction: null,
- errors: null,
- },
- },
- },
- ];
-
- const failureData: OnyxUpdate[] = [
- {
- onyxMethod: Onyx.METHOD.SET,
- key: `${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`,
- value: transaction,
- },
- ];
-
- if (Permissions.canUseViolations(betas)) {
- failureData.push({
- onyxMethod: Onyx.METHOD.SET,
- key: `${ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS}${transactionID}`,
- value: transactionViolations,
- });
- }
-
- if (shouldDeleteTransactionThread) {
- failureData.push({
- onyxMethod: Onyx.METHOD.SET,
- key: `${ONYXKEYS.COLLECTION.REPORT}${transactionThreadID}`,
- value: transactionThread,
- });
- }
-
- failureData.push(
- {
- onyxMethod: Onyx.METHOD.MERGE,
- key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${chatReport?.reportID}`,
- value: {
- [reportAction.reportActionID]: {
- ...reportAction,
- pendingAction: null,
- errors: ErrorUtils.getMicroSecondOnyxError('iou.error.genericDeleteFailureMessage'),
- },
- },
- },
- {
- onyxMethod: Onyx.METHOD.MERGE,
- key: `${ONYXKEYS.COLLECTION.REPORT}${chatReport?.reportID}`,
- value: chatReport,
- },
- );
-
- const parameters: DeleteMoneyRequestParams = {
- transactionID,
- reportActionID: reportAction.reportActionID,
- };
+ const {parameters, optimisticData, successData, failureData, shouldDeleteTransactionThread} = getDeleteTrackExpenseInformation(chatReportID, transactionID, reportAction);
// STEP 6: Make the API request
API.write(WRITE_COMMANDS.DELETE_MONEY_REQUEST, parameters, {optimisticData, successData, failureData});
@@ -4654,7 +5124,7 @@ function getPayMoneyRequestParams(
// In some instances, the report preview action might not be available to the payer (only whispered to the requestor)
// hence we need to make the updates to the action safely.
let optimisticReportPreviewAction = null;
- const reportPreviewAction = ReportActionsUtils.getReportPreviewAction(chatReport.reportID, iouReport.reportID);
+ const reportPreviewAction = getReportPreviewAction(chatReport.reportID, iouReport.reportID);
if (reportPreviewAction) {
optimisticReportPreviewAction = ReportUtils.updateReportPreview(iouReport, reportPreviewAction, true);
}
@@ -5381,8 +5851,9 @@ function setShownHoldUseExplanation() {
* Put money request on HOLD
*/
function putOnHold(transactionID: string, comment: string, reportID: string) {
- const createdReportAction = ReportUtils.buildOptimisticHoldReportAction();
- const createdReportActionComment = ReportUtils.buildOptimisticHoldReportActionComment(comment);
+ const currentTime = DateUtils.getDBTime();
+ const createdReportAction = ReportUtils.buildOptimisticHoldReportAction(currentTime);
+ const createdReportActionComment = ReportUtils.buildOptimisticHoldReportActionComment(comment, DateUtils.addMillisecondsFromDateTime(currentTime, 1));
const optimisticData: OnyxUpdate[] = [
{
@@ -5591,4 +6062,5 @@ export {
trackExpense,
canIOUBePaid,
canApproveIOU,
+ createDraftTransaction,
};
diff --git a/src/libs/actions/Report.ts b/src/libs/actions/Report.ts
index 1e59cf21f542..2478d3815039 100644
--- a/src/libs/actions/Report.ts
+++ b/src/libs/actions/Report.ts
@@ -1041,7 +1041,12 @@ function markCommentAsUnread(reportID: string, reportActionCreated: string) {
// Find the latest report actions from other users
const latestReportActionFromOtherUsers = Object.values(reportActions ?? {}).reduce((latest: ReportAction | null, current: ReportAction) => {
- if (current.actorAccountID !== currentUserAccountID && (!latest || current.created > latest.created)) {
+ if (
+ current.actorAccountID !== currentUserAccountID &&
+ (!latest || current.created > latest.created) &&
+ // Whisper action doesn't affect lastVisibleActionCreated, so skip whisper action except actionable mention whisper
+ (!ReportActionsUtils.isWhisperAction(current) || current.actionName === CONST.REPORT.ACTIONS.TYPE.ACTIONABLEMENTIONWHISPER)
+ ) {
return current;
}
return latest;
@@ -3172,6 +3177,54 @@ function resolveActionableMentionWhisper(reportId: string, reportAction: OnyxEnt
API.write(WRITE_COMMANDS.RESOLVE_ACTIONABLE_MENTION_WHISPER, parameters, {optimisticData, failureData});
}
+function dismissTrackExpenseActionableWhisper(reportID: string, reportAction: OnyxEntry): void {
+ const message = reportAction?.message?.[0];
+ if (!message) {
+ return;
+ }
+
+ const updatedMessage: Message = {
+ ...message,
+ resolution: CONST.REPORT.ACTIONABLE_TRACK_EXPENSE_WHISPER_RESOLUTION.NOTHING,
+ };
+
+ const optimisticData: OnyxUpdate[] = [
+ {
+ onyxMethod: Onyx.METHOD.MERGE,
+ key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${reportID}`,
+ value: {
+ [reportAction.reportActionID]: {
+ message: [updatedMessage],
+ originalMessage: {
+ resolution: CONST.REPORT.ACTIONABLE_TRACK_EXPENSE_WHISPER_RESOLUTION.NOTHING,
+ },
+ },
+ },
+ },
+ ];
+
+ const failureData: OnyxUpdate[] = [
+ {
+ onyxMethod: Onyx.METHOD.MERGE,
+ key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${reportID}`,
+ value: {
+ [reportAction.reportActionID]: {
+ message: [message],
+ originalMessage: {
+ resolution: null,
+ },
+ },
+ },
+ },
+ ];
+
+ const params = {
+ reportActionID: reportAction.reportActionID,
+ };
+
+ API.write(WRITE_COMMANDS.DISMISS_TRACK_EXPENSE_ACTIONABLE_WHISPER, params, {optimisticData, failureData});
+}
+
function setGroupDraft(newGroupDraft: Partial) {
Onyx.merge(ONYXKEYS.NEW_GROUP_CHAT_DRAFT, newGroupDraft);
}
@@ -3248,6 +3301,7 @@ export {
clearReportFieldErrors,
resolveActionableMentionWhisper,
updateRoomVisibility,
+ dismissTrackExpenseActionableWhisper,
setGroupDraft,
clearGroupChat,
startNewChat,
diff --git a/src/libs/migrateOnyx.ts b/src/libs/migrateOnyx.ts
index 412a8e00f052..3b0829ad9ba3 100644
--- a/src/libs/migrateOnyx.ts
+++ b/src/libs/migrateOnyx.ts
@@ -4,6 +4,7 @@ import KeyReportActionsDraftByReportActionID from './migrations/KeyReportActions
import NVPMigration from './migrations/NVPMigration';
import PronounsMigration from './migrations/PronounsMigration';
import RemoveEmptyReportActionsDrafts from './migrations/RemoveEmptyReportActionsDrafts';
+import RenameCardIsVirtual from './migrations/RenameCardIsVirtual';
import RenameReceiptFilename from './migrations/RenameReceiptFilename';
import TransactionBackupsToCollection from './migrations/TransactionBackupsToCollection';
@@ -14,6 +15,7 @@ export default function () {
return new Promise((resolve) => {
// Add all migrations to an array so they are executed in order
const migrationPromises = [
+ RenameCardIsVirtual,
CheckForPreviousReportActionID,
RenameReceiptFilename,
KeyReportActionsDraftByReportActionID,
diff --git a/src/libs/migrations/RenameCardIsVirtual.ts b/src/libs/migrations/RenameCardIsVirtual.ts
new file mode 100644
index 000000000000..4d03a9687a70
--- /dev/null
+++ b/src/libs/migrations/RenameCardIsVirtual.ts
@@ -0,0 +1,52 @@
+import Onyx from 'react-native-onyx';
+import type {NullishDeep, OnyxEntry} from 'react-native-onyx';
+import Log from '@libs/Log';
+import ONYXKEYS from '@src/ONYXKEYS';
+import type {Card} from '@src/types/onyx';
+import {isEmptyObject} from '@src/types/utils/EmptyObject';
+
+type OldCard = Card & {isVirtual?: boolean};
+
+// This migration changes the property name on each card from card list from isVirtual to nameValuePairs.isVirtual
+export default function () {
+ return new Promise((resolve) => {
+ const connectionID = Onyx.connect({
+ key: ONYXKEYS.CARD_LIST,
+ callback: (cardList: OnyxEntry>) => {
+ Onyx.disconnect(connectionID);
+
+ if (!cardList || isEmptyObject(cardList)) {
+ Log.info('[Migrate Onyx] Skipped migration RenameCardIsVirtual because there are no cards linked to the account');
+ return resolve();
+ }
+ const cardsWithIsVirtualProp = Object.values(cardList).filter((card) => card.isVirtual !== undefined);
+ if (!cardsWithIsVirtualProp.length) {
+ Log.info('[Migrate Onyx] Skipped migration RenameCardIsVirtual because there were no cards with the isVirtual property');
+ return resolve();
+ }
+
+ Log.info('[Migrate Onyx] Running RenameCardIsVirtual migration');
+ const dataToSave: Record> = cardsWithIsVirtualProp.reduce((result, card) => {
+ if (!card) {
+ return result;
+ }
+ return {
+ ...result,
+ [card.cardID]: {
+ nameValuePairs: {
+ isVirtual: card.isVirtual,
+ },
+ isVirtual: undefined,
+ },
+ };
+ }, {});
+
+ // eslint-disable-next-line rulesdir/prefer-actions-set-data
+ Onyx.merge(ONYXKEYS.CARD_LIST, dataToSave).then(() => {
+ Log.info(`[Migrate Onyx] Ran migration RenameCardIsVirtual and renamed ${Object.keys(dataToSave)?.length} properties`);
+ resolve();
+ });
+ },
+ });
+ });
+}
diff --git a/src/pages/EditReportFieldText.tsx b/src/pages/EditReportFieldText.tsx
index d89724f0228b..0649d59cd2ee 100644
--- a/src/pages/EditReportFieldText.tsx
+++ b/src/pages/EditReportFieldText.tsx
@@ -1,10 +1,10 @@
-import React, {useCallback, useRef} from 'react';
+import React, {useCallback} from 'react';
import {View} from 'react-native';
import FormProvider from '@components/Form/FormProvider';
import InputWrapper from '@components/Form/InputWrapper';
import type {FormInputErrors, FormOnyxValues} from '@components/Form/types';
-import type {AnimatedTextInputRef} from '@components/RNTextInput';
import TextInput from '@components/TextInput';
+import useAutoFocusInput from '@hooks/useAutoFocusInput';
import useLocalize from '@hooks/useLocalize';
import useThemeStyles from '@hooks/useThemeStyles';
import CONST from '@src/CONST';
@@ -30,7 +30,7 @@ type EditReportFieldTextPageProps = {
function EditReportFieldTextPage({fieldName, onSubmit, fieldValue, isRequired, fieldKey}: EditReportFieldTextPageProps) {
const styles = useThemeStyles();
const {translate} = useLocalize();
- const inputRef = useRef(null);
+ const {inputCallbackRef} = useAutoFocusInput();
const validate = useCallback(
(values: FormOnyxValues) => {
@@ -61,7 +61,7 @@ function EditReportFieldTextPage({fieldName, onSubmit, fieldValue, isRequired, f
label={fieldName}
accessibilityLabel={fieldName}
role={CONST.ROLE.PRESENTATION}
- ref={inputRef}
+ ref={inputCallbackRef}
/>
diff --git a/src/pages/ReportParticipantsPage.tsx b/src/pages/ReportParticipantsPage.tsx
index f635499a286f..f6415ae9fa7d 100755
--- a/src/pages/ReportParticipantsPage.tsx
+++ b/src/pages/ReportParticipantsPage.tsx
@@ -1,4 +1,5 @@
-import React, {useCallback, useMemo, useRef, useState} from 'react';
+import {useIsFocused} from '@react-navigation/native';
+import React, {useCallback, useEffect, useMemo, useRef, useState} from 'react';
import {InteractionManager, View} from 'react-native';
import type {TextInput} from 'react-native';
import type {OnyxEntry} from 'react-native-onyx';
@@ -58,6 +59,14 @@ function ReportParticipantsPage({report, personalDetails, session}: ReportPartic
const currentUserAccountID = Number(session?.accountID);
const isCurrentUserAdmin = ReportUtils.isGroupChatAdmin(report, currentUserAccountID);
const isGroupChat = useMemo(() => ReportUtils.isGroupChat(report), [report]);
+ const isFocused = useIsFocused();
+
+ useEffect(() => {
+ if (isFocused) {
+ return;
+ }
+ setSelectedMembers([]);
+ }, [isFocused]);
const getUsers = useCallback((): MemberOption[] => {
let result: MemberOption[] = [];
diff --git a/src/pages/RoomInvitePage.tsx b/src/pages/RoomInvitePage.tsx
index ab5bd10317be..b540dfb5f4e9 100644
--- a/src/pages/RoomInvitePage.tsx
+++ b/src/pages/RoomInvitePage.tsx
@@ -1,3 +1,4 @@
+import type {StackScreenProps} from '@react-navigation/stack';
import Str from 'expensify-common/lib/str';
import React, {useCallback, useEffect, useMemo, useState} from 'react';
import type {SectionListData} from 'react-native';
@@ -22,20 +23,29 @@ import * as PersonalDetailsUtils from '@libs/PersonalDetailsUtils';
import * as PhoneNumber from '@libs/PhoneNumber';
import * as PolicyUtils from '@libs/PolicyUtils';
import * as ReportUtils from '@libs/ReportUtils';
+import type {RoomInviteNavigatorParamList} from '@navigation/types';
import * as Report from '@userActions/Report';
import CONST from '@src/CONST';
import ROUTES from '@src/ROUTES';
+import type SCREENS from '@src/SCREENS';
import type {Policy} from '@src/types/onyx';
import {isEmptyObject} from '@src/types/utils/EmptyObject';
import type {WithReportOrNotFoundProps} from './home/report/withReportOrNotFound';
import withReportOrNotFound from './home/report/withReportOrNotFound';
import SearchInputManager from './workspace/SearchInputManager';
-type RoomInvitePageProps = WithReportOrNotFoundProps & WithNavigationTransitionEndProps;
+type RoomInvitePageProps = WithReportOrNotFoundProps & WithNavigationTransitionEndProps & StackScreenProps;
type Sections = Array>>;
-function RoomInvitePage({betas, report, policies}: RoomInvitePageProps) {
+function RoomInvitePage({
+ betas,
+ report,
+ policies,
+ route: {
+ params: {role},
+ },
+}: RoomInvitePageProps) {
const styles = useThemeStyles();
const {translate} = useLocalize();
const [searchTerm, setSearchTerm] = useState('');
@@ -147,7 +157,12 @@ function RoomInvitePage({betas, report, policies}: RoomInvitePageProps) {
// Non policy members should not be able to view the participants of a room
const reportID = report?.reportID;
const isPolicyMember = useMemo(() => (report?.policyID ? PolicyUtils.isPolicyMember(report.policyID, policies as Record) : false), [report?.policyID, policies]);
- const backRoute = useMemo(() => reportID && (isPolicyMember ? ROUTES.ROOM_MEMBERS.getRoute(reportID) : ROUTES.REPORT_WITH_ID_DETAILS.getRoute(reportID)), [isPolicyMember, reportID]);
+ const backRoute = useMemo(() => {
+ if (role === CONST.IOU.SHARE.ROLE.ACCOUNTANT) {
+ return ROUTES.REPORT_WITH_ID.getRoute(reportID);
+ }
+ return reportID && (isPolicyMember ? ROUTES.ROOM_MEMBERS.getRoute(reportID) : ROUTES.REPORT_WITH_ID_DETAILS.getRoute(reportID));
+ }, [isPolicyMember, reportID, role]);
const reportName = useMemo(() => ReportUtils.getReportName(report), [report]);
const inviteUsers = useCallback(() => {
if (!validate()) {
@@ -228,7 +243,7 @@ function RoomInvitePage({betas, report, policies}: RoomInvitePageProps) {
isDisabled={!selectedOptions.length}
buttonText={translate('common.invite')}
onSubmit={inviteUsers}
- containerStyles={[styles.flexReset, styles.flexGrow0, styles.flexShrink0, styles.flexBasisAuto, styles.mb5]}
+ containerStyles={[styles.flexReset, styles.flexGrow0, styles.flexShrink0, styles.flexBasisAuto, styles.mb5, styles.ph5]}
enabledWhenOffline
disablePressOnEnter
isAlertVisible={false}
diff --git a/src/pages/home/report/AnimatedEmptyStateBackground.tsx b/src/pages/home/report/AnimatedEmptyStateBackground.tsx
index 4199ebe5937f..7ddbdaef687b 100644
--- a/src/pages/home/report/AnimatedEmptyStateBackground.tsx
+++ b/src/pages/home/report/AnimatedEmptyStateBackground.tsx
@@ -1,15 +1,11 @@
import React from 'react';
-import Animated, {clamp, SensorType, useAnimatedSensor, useAnimatedStyle, useReducedMotion, useSharedValue, withSpring} from 'react-native-reanimated';
+import {Image} from 'react-native';
import useStyleUtils from '@hooks/useStyleUtils';
import useThemeIllustrations from '@hooks/useThemeIllustrations';
import useWindowDimensions from '@hooks/useWindowDimensions';
import variables from '@styles/variables';
import CONST from '@src/CONST';
-// Maximum horizontal and vertical shift in pixels on sensor value change
-const IMAGE_OFFSET_X = 30;
-const IMAGE_OFFSET_Y = 20;
-
function AnimatedEmptyStateBackground() {
const StyleUtils = useStyleUtils();
const {windowWidth, isSmallScreenWidth} = useWindowDimensions();
@@ -18,36 +14,10 @@ function AnimatedEmptyStateBackground() {
// If window width is greater than the max background width, repeat the background image
const maxBackgroundWidth = variables.sideBarWidth + CONST.EMPTY_STATE_BACKGROUND.ASPECT_RATIO * CONST.EMPTY_STATE_BACKGROUND.WIDE_SCREEN.IMAGE_HEIGHT;
- // Get data from phone rotation sensor and prep other variables for animation
- const animatedSensor = useAnimatedSensor(SensorType.GYROSCOPE);
- const xOffset = useSharedValue(0);
- const yOffset = useSharedValue(0);
- const isReducedMotionEnabled = useReducedMotion();
-
- // Apply data to create style object
- const animatedStyles = useAnimatedStyle(() => {
- if (!isSmallScreenWidth || isReducedMotionEnabled) {
- return {};
- }
- /*
- * We use x and y gyroscope velocity and add it to position offset to move background based on device movements.
- * Position the phone was in while entering the screen is the initial position for background image.
- */
- const {x, y} = animatedSensor.sensor.value;
- // The x vs y here seems wrong but is the way to make it feel right to the user
- xOffset.value = clamp(xOffset.value + y * CONST.ANIMATION_GYROSCOPE_VALUE, -IMAGE_OFFSET_X, IMAGE_OFFSET_X);
- yOffset.value = clamp(yOffset.value - x * CONST.ANIMATION_GYROSCOPE_VALUE, -IMAGE_OFFSET_Y, IMAGE_OFFSET_Y);
- return {
- // On Android, scroll view sub views gets clipped beyond container bounds. Set the top position so that image wouldn't get clipped
- top: IMAGE_OFFSET_Y,
- transform: [{translateX: withSpring(xOffset.value)}, {translateY: withSpring(yOffset.value, {overshootClamping: true})}, {scale: 1.15}],
- };
- }, [isReducedMotionEnabled]);
-
return (
- maxBackgroundWidth ? 'repeat' : 'cover'}
/>
);
diff --git a/src/pages/home/report/ContextMenu/ContextMenuActions.tsx b/src/pages/home/report/ContextMenu/ContextMenuActions.tsx
index b5cb9d911ef5..4f9d5e2788e6 100644
--- a/src/pages/home/report/ContextMenu/ContextMenuActions.tsx
+++ b/src/pages/home/report/ContextMenu/ContextMenuActions.tsx
@@ -171,7 +171,7 @@ const ContextMenuActions: ContextMenuAction[] = [
successIcon: Expensicons.Download,
shouldShow: (type, reportAction, isArchivedRoom, betas, menuTarget, isChronosReport, reportID, isPinnedChat, isUnreadChat, isOffline): reportAction is ReportAction => {
const isAttachment = ReportActionsUtils.isReportActionAttachment(reportAction);
- const messageHtml = reportAction?.message?.at(0)?.html;
+ const messageHtml = getActionHtml(reportAction);
return (
isAttachment && messageHtml !== CONST.ATTACHMENT_UPLOADING_MESSAGE_HTML && !!reportAction?.reportActionID && !ReportActionsUtils.isMessageDeleted(reportAction) && !isOffline
);
@@ -384,6 +384,8 @@ const ContextMenuActions: ContextMenuAction[] = [
} else if (ReportActionsUtils.isActionableMentionWhisper(reportAction)) {
const mentionWhisperMessage = ReportActionsUtils.getActionableMentionWhisperMessage(reportAction);
setClipboardMessage(mentionWhisperMessage);
+ } else if (ReportActionsUtils.isActionableTrackExpense(reportAction)) {
+ setClipboardMessage('What would you like to do with this expense?');
} else if (reportAction?.actionName === CONST.REPORT.ACTIONS.TYPE.HOLD) {
Clipboard.setString(Localize.translateLocal('iou.heldRequest'));
} else if (reportAction?.actionName === CONST.REPORT.ACTIONS.TYPE.UNHOLD) {
diff --git a/src/pages/home/report/ReportActionCompose/SuggestionEmoji.tsx b/src/pages/home/report/ReportActionCompose/SuggestionEmoji.tsx
index 0ae45d2d705d..b23c0be72592 100644
--- a/src/pages/home/report/ReportActionCompose/SuggestionEmoji.tsx
+++ b/src/pages/home/report/ReportActionCompose/SuggestionEmoji.tsx
@@ -227,7 +227,7 @@ function SuggestionEmoji(
{
- if (index !== 0 || !ReportActionsUtils.isActionableMentionWhisper(action)) {
+ const isActionableWhisper = ReportActionsUtils.isActionableMentionWhisper(action) || ReportActionsUtils.isActionableTrackExpense(action);
+ if (index !== 0 || !isActionableWhisper) {
return;
}
@@ -376,10 +377,53 @@ function ReportActionItem({
const isWhisperResolution = (action?.originalMessage as OriginalMessageActionableMentionWhisper['originalMessage'])?.resolution !== null;
const isJoinChoice = (action?.originalMessage as OriginalMessageJoinPolicyChangeLog['originalMessage'])?.choice === '';
- if (!((ReportActionsUtils.isActionableMentionWhisper(action) && isWhisperResolution) || (ReportActionsUtils.isActionableJoinRequest(action) && isJoinChoice))) {
+ if (
+ !(
+ ((ReportActionsUtils.isActionableMentionWhisper(action) || ReportActionsUtils.isActionableTrackExpense(action)) && isWhisperResolution) ||
+ (ReportActionsUtils.isActionableJoinRequest(action) && isJoinChoice)
+ )
+ ) {
return [];
}
+ if (ReportActionsUtils.isActionableTrackExpense(action)) {
+ const transactionID = (action?.originalMessage as OriginalMessageActionableTrackedExpenseWhisper['originalMessage'])?.transactionID;
+ return [
+ {
+ text: 'actionableMentionTrackExpense.request',
+ key: `${action.reportActionID}-actionableMentionTrackExpense-request`,
+ onPress: () => {
+ ReportUtils.createDraftTransactionAndNavigateToParticipantSelector(transactionID, report.reportID, CONST.IOU.ACTION.MOVE, action.reportActionID);
+ },
+ isMediumSized: true,
+ },
+ {
+ text: 'actionableMentionTrackExpense.categorize',
+ key: `${action.reportActionID}-actionableMentionTrackExpense-categorize`,
+ onPress: () => {
+ ReportUtils.createDraftTransactionAndNavigateToParticipantSelector(transactionID, report.reportID, CONST.IOU.ACTION.CATEGORIZE, action.reportActionID);
+ },
+ isMediumSized: true,
+ },
+ {
+ text: 'actionableMentionTrackExpense.share',
+ key: `${action.reportActionID}-actionableMentionTrackExpense-share`,
+ onPress: () => {
+ ReportUtils.createDraftTransactionAndNavigateToParticipantSelector(transactionID, report.reportID, CONST.IOU.ACTION.SHARE, action.reportActionID);
+ },
+ isMediumSized: true,
+ },
+ {
+ text: 'actionableMentionTrackExpense.nothing',
+ key: `${action.reportActionID}-actionableMentionTrackExpense-nothing`,
+ onPress: () => {
+ Report.dismissTrackExpenseActionableWhisper(report.reportID, action);
+ },
+ isMediumSized: true,
+ },
+ ];
+ }
+
if (ReportActionsUtils.isActionableJoinRequest(action)) {
return [
{
@@ -570,7 +614,12 @@ function ReportActionItem({
for example: Invite a user mentioned but not a member of the room
https://github.com/Expensify/App/issues/32741
*/}
- {actionableItemButtons.length > 0 && }
+ {actionableItemButtons.length > 0 && (
+
+ )}
) : (
whisperedToAccountIDs.includes(details?.accountID ?? -1)) as OnyxTypes.PersonalDetails[])
: [];
const displayNamesWithTooltips = isWhisper ? ReportUtils.getDisplayNamesWithTooltips(whisperedToPersonalDetails, isMultipleParticipant) : [];
+
return (
{
// Do not fetch private notes if isLoadingPrivateNotes is already defined, or if network is offline.
@@ -62,13 +62,13 @@ export default function (pageTitle: TranslationPaths) {
}
// Don't show not found view if the notes are still loading, or if the notes are non-empty.
- if (shouldShowFullScreenLoadingIndicator || !isPrivateNotesEmpty || isReconnecting) {
+ if (shouldShowFullScreenLoadingIndicator || !isPrivateNotesUndefined || isReconnecting) {
return false;
}
// As notes being empty and not loading is a valid case, show not found view only in offline mode.
return isOffline;
- }, [report, isOtherUserNote, shouldShowFullScreenLoadingIndicator, isPrivateNotesEmpty, isReconnecting, isOffline]);
+ }, [report, isOtherUserNote, shouldShowFullScreenLoadingIndicator, isPrivateNotesUndefined, isReconnecting, isOffline]);
if (shouldShowFullScreenLoadingIndicator) {
return ;
diff --git a/src/pages/home/sidebar/SidebarScreen/FloatingActionButtonAndPopover.tsx b/src/pages/home/sidebar/SidebarScreen/FloatingActionButtonAndPopover.tsx
index 26859bf66304..212bf93166a1 100644
--- a/src/pages/home/sidebar/SidebarScreen/FloatingActionButtonAndPopover.tsx
+++ b/src/pages/home/sidebar/SidebarScreen/FloatingActionButtonAndPopover.tsx
@@ -181,6 +181,15 @@ function FloatingActionButtonAndPopover(
case CONST.QUICK_ACTIONS.ASSIGN_TASK:
Task.clearOutTaskInfoAndNavigate(quickAction?.chatReportID, quickActionReport, quickAction.targetAccountID ?? 0);
break;
+ case CONST.QUICK_ACTIONS.TRACK_MANUAL:
+ IOU.startMoneyRequest(CONST.IOU.TYPE.TRACK_EXPENSE, quickAction?.chatReportID ?? '', CONST.IOU.REQUEST_TYPE.MANUAL);
+ break;
+ case CONST.QUICK_ACTIONS.TRACK_SCAN:
+ IOU.startMoneyRequest(CONST.IOU.TYPE.TRACK_EXPENSE, quickAction?.chatReportID ?? '', CONST.IOU.REQUEST_TYPE.SCAN);
+ break;
+ case CONST.QUICK_ACTIONS.TRACK_DISTANCE:
+ IOU.startMoneyRequest(CONST.IOU.TYPE.TRACK_EXPENSE, quickAction?.chatReportID ?? '', CONST.IOU.REQUEST_TYPE.DISTANCE);
+ break;
default:
}
};
diff --git a/src/pages/iou/request/MoneyTemporaryForRefactorRequestParticipantsSelector.js b/src/pages/iou/request/MoneyTemporaryForRefactorRequestParticipantsSelector.js
index c2c815bb770e..87883972f84f 100644
--- a/src/pages/iou/request/MoneyTemporaryForRefactorRequestParticipantsSelector.js
+++ b/src/pages/iou/request/MoneyTemporaryForRefactorRequestParticipantsSelector.js
@@ -3,8 +3,11 @@ import PropTypes from 'prop-types';
import React, {memo, useCallback, useEffect, useMemo} from 'react';
import {useOnyx} from 'react-native-onyx';
import _ from 'underscore';
+import BlockingView from '@components/BlockingViews/BlockingView';
import Button from '@components/Button';
import FormHelpMessage from '@components/FormHelpMessage';
+import * as Illustrations from '@components/Icon/Illustrations';
+import OfflineIndicator from '@components/OfflineIndicator';
import {usePersonalDetails} from '@components/OnyxProvider';
import {useOptionsList} from '@components/OptionListContextProvider';
import {PressableWithFeedback} from '@components/Pressable';
@@ -19,11 +22,15 @@ import useNetwork from '@hooks/useNetwork';
import usePermissions from '@hooks/usePermissions';
import useScreenWrapperTranstionStatus from '@hooks/useScreenWrapperTransitionStatus';
import useThemeStyles from '@hooks/useThemeStyles';
+import useWindowDimensions from '@hooks/useWindowDimensions';
import * as DeviceCapabilities from '@libs/DeviceCapabilities';
+import Navigation from '@libs/Navigation/Navigation';
import * as OptionsListUtils from '@libs/OptionsListUtils';
+import variables from '@styles/variables';
import * as Report from '@userActions/Report';
import CONST from '@src/CONST';
import ONYXKEYS from '@src/ONYXKEYS';
+import ROUTES from '@src/ROUTES';
const propTypes = {
/** Callback to request parent modal to go to next step, which should be split */
@@ -48,13 +55,17 @@ const propTypes = {
/** The request type, ie. manual, scan, distance */
iouRequestType: PropTypes.oneOf(_.values(CONST.IOU.REQUEST_TYPE)).isRequired,
+
+ /** The action of the IOU, i.e. create, split, move */
+ action: PropTypes.oneOf(_.values(CONST.IOU.ACTION)),
};
const defaultProps = {
participants: [],
+ action: CONST.IOU.ACTION.CREATE,
};
-function MoneyTemporaryForRefactorRequestParticipantsSelector({participants, onFinish, onParticipantsAdded, iouType, iouRequestType}) {
+function MoneyTemporaryForRefactorRequestParticipantsSelector({participants, onFinish, onParticipantsAdded, iouType, iouRequestType, action}) {
const {translate} = useLocalize();
const styles = useThemeStyles();
const [searchTerm, debouncedSearchTerm, setSearchTerm] = useDebouncedState('');
@@ -72,6 +83,7 @@ function MoneyTemporaryForRefactorRequestParticipantsSelector({participants, onF
const offlineMessage = isOffline ? [`${translate('common.youAppearToBeOffline')} ${translate('search.resultsAreLimited')}`, {isTranslated: true}] : '';
const maxParticipantsReached = participants.length === CONST.REPORT.MAXIMUM_PARTICIPANTS;
+ const {isSmallScreenWidth} = useWindowDimensions();
useEffect(() => {
Report.searchInServer(debouncedSearchTerm.trim());
@@ -97,9 +109,9 @@ function MoneyTemporaryForRefactorRequestParticipantsSelector({participants, onF
// If we are using this component in the "Request money" flow then we pass the includeOwnedWorkspaceChats argument so that the current user
// sees the option to request money from their admin on their own Workspace Chat.
- iouType === CONST.IOU.TYPE.REQUEST,
+ iouType === CONST.IOU.TYPE.REQUEST && action !== CONST.IOU.ACTION.MOVE,
- canUseP2PDistanceRequests || iouRequestType !== CONST.IOU.REQUEST_TYPE.DISTANCE,
+ (canUseP2PDistanceRequests || iouRequestType !== CONST.IOU.REQUEST_TYPE.DISTANCE) && ![CONST.IOU.ACTION.CATEGORIZE, CONST.IOU.ACTION.SHARE].includes(action),
false,
{},
[],
@@ -132,11 +144,13 @@ function MoneyTemporaryForRefactorRequestParticipantsSelector({participants, onF
shouldShow: !_.isEmpty(chatOptions.recentReports),
});
- newSections.push({
- title: translate('common.contacts'),
- data: chatOptions.personalDetails,
- shouldShow: !_.isEmpty(chatOptions.personalDetails),
- });
+ if (![CONST.IOU.ACTION.CATEGORIZE, CONST.IOU.ACTION.SHARE].includes(action)) {
+ newSections.push({
+ title: translate('common.contacts'),
+ data: chatOptions.personalDetails,
+ shouldShow: !_.isEmpty(chatOptions.personalDetails),
+ });
+ }
if (chatOptions.userToInvite && !OptionsListUtils.isCurrentUser(chatOptions.userToInvite)) {
newSections.push({
@@ -158,6 +172,7 @@ function MoneyTemporaryForRefactorRequestParticipantsSelector({participants, onF
debouncedSearchTerm,
participants,
iouType,
+ action,
canUseP2PDistanceRequests,
iouRequestType,
maxParticipantsReached,
@@ -248,7 +263,11 @@ function MoneyTemporaryForRefactorRequestParticipantsSelector({participants, onF
const shouldShowSplitBillErrorMessage = participants.length > 1 && hasPolicyExpenseChatParticipant;
// canUseP2PDistanceRequests is true if the iouType is track expense, but we don't want to allow splitting distance with track expense yet
- const isAllowedToSplit = (canUseP2PDistanceRequests || iouRequestType !== CONST.IOU.REQUEST_TYPE.DISTANCE) && iouType !== CONST.IOU.TYPE.SEND && iouType !== CONST.IOU.TYPE.TRACK_EXPENSE;
+ const isAllowedToSplit =
+ (canUseP2PDistanceRequests || iouRequestType !== CONST.IOU.REQUEST_TYPE.DISTANCE) &&
+ iouType !== CONST.IOU.TYPE.SEND &&
+ iouType !== CONST.IOU.TYPE.TRACK_EXPENSE &&
+ ![CONST.IOU.ACTION.SHARE, CONST.IOU.ACTION.MOVE, CONST.IOU.ACTION.CATEGORIZE].includes(action);
const handleConfirmSelection = useCallback(
(keyEvent, option) => {
@@ -337,6 +356,32 @@ function MoneyTemporaryForRefactorRequestParticipantsSelector({participants, onF
[addParticipantToSelection, isAllowedToSplit, styles, translate],
);
+ const renderEmptyWorkspaceView = () => (
+ <>
+
+
)}
diff --git a/src/pages/iou/request/step/IOURequestStepDate.tsx b/src/pages/iou/request/step/IOURequestStepDate.tsx
index 682204a4510f..1b108b8f3597 100644
--- a/src/pages/iou/request/step/IOURequestStepDate.tsx
+++ b/src/pages/iou/request/step/IOURequestStepDate.tsx
@@ -79,7 +79,9 @@ function IOURequestStepDate({
return;
}
- IOU.setMoneyRequestCreated(transaction?.transactionID ?? '0', newCreated, action === CONST.IOU.ACTION.CREATE);
+ const isTransactionDraft = action === CONST.IOU.ACTION.CREATE || IOUUtils.isMovingTransactionFromTrackExpense(action);
+
+ IOU.setMoneyRequestCreated(transaction?.transactionID ?? '0', newCreated, isTransactionDraft);
if (isEditing) {
IOU.updateMoneyRequestDate(transaction?.transactionID ?? '0', reportID, newCreated, policy, policyTags, policyCategories);
diff --git a/src/pages/iou/request/step/IOURequestStepDescription.tsx b/src/pages/iou/request/step/IOURequestStepDescription.tsx
index d075ed81c956..410fd24aa488 100644
--- a/src/pages/iou/request/step/IOURequestStepDescription.tsx
+++ b/src/pages/iou/request/step/IOURequestStepDescription.tsx
@@ -12,6 +12,7 @@ import TextInput from '@components/TextInput';
import useLocalize from '@hooks/useLocalize';
import useThemeStyles from '@hooks/useThemeStyles';
import * as ErrorUtils from '@libs/ErrorUtils';
+import * as IOUUtils from '@libs/IOUUtils';
import Navigation from '@libs/Navigation/Navigation';
import * as ReportUtils from '@libs/ReportUtils';
import * as TransactionUtils from '@libs/TransactionUtils';
@@ -124,8 +125,9 @@ function IOURequestStepDescription({
navigateBack();
return;
}
+ const isTransactionDraft = action === CONST.IOU.ACTION.CREATE || IOUUtils.isMovingTransactionFromTrackExpense(action);
- IOU.setMoneyRequestDescription(transaction?.transactionID ?? '0', newComment, action === CONST.IOU.ACTION.CREATE);
+ IOU.setMoneyRequestDescription(transaction?.transactionID ?? '0', newComment, isTransactionDraft);
if (action === CONST.IOU.ACTION.EDIT) {
IOU.updateMoneyRequestDescription(transaction?.transactionID ?? '0', reportID, newComment, policy, policyTags, policyCategories);
diff --git a/src/pages/iou/request/step/IOURequestStepParticipants.tsx b/src/pages/iou/request/step/IOURequestStepParticipants.tsx
index df1c62daea5a..5d81a7711cad 100644
--- a/src/pages/iou/request/step/IOURequestStepParticipants.tsx
+++ b/src/pages/iou/request/step/IOURequestStepParticipants.tsx
@@ -35,7 +35,7 @@ type IOURef = IOUValueType | null;
function IOURequestStepParticipants({
route: {
- params: {iouType, reportID, transactionID},
+ params: {iouType, reportID, transactionID, action},
},
transaction,
}: IOURequestStepParticipantsProps) {
@@ -47,6 +47,15 @@ function IOURequestStepParticipants({
const iouRequestType = TransactionUtils.getRequestType(transaction);
const isSplitRequest = iouType === CONST.IOU.TYPE.SPLIT;
const headerTitle = useMemo(() => {
+ if (action === CONST.IOU.ACTION.CATEGORIZE) {
+ return translate('iou.categorize');
+ }
+ if (action === CONST.IOU.ACTION.MOVE) {
+ return translate('iou.request');
+ }
+ if (action === CONST.IOU.ACTION.SHARE) {
+ return translate('iou.share');
+ }
if (isSplitRequest) {
return translate('iou.split');
}
@@ -54,7 +63,7 @@ function IOURequestStepParticipants({
return translate('common.send');
}
return translate(TransactionUtils.getHeaderTitleTranslationKey(transaction));
- }, [iouType, transaction, translate, isSplitRequest]);
+ }, [iouType, transaction, translate, isSplitRequest, action]);
const receiptFilename = transaction?.filename;
const receiptPath = transaction?.receipt?.source;
@@ -64,9 +73,13 @@ function IOURequestStepParticipants({
// When the component mounts, if there is a receipt, see if the image can be read from the disk. If not, redirect the user to the starting step of the flow.
// This is because until the request is saved, the receipt file is only stored in the browsers memory as a blob:// and if the browser is refreshed, then
// the image ceases to exist. The best way for the user to recover from this is to start over from the start of the request process.
+ // skip this in case user is moving the transaction as the receipt path will be valid in that case
useEffect(() => {
+ if (IOUUtils.isMovingTransactionFromTrackExpense(action)) {
+ return;
+ }
IOU.navigateToStartStepIfScanFileCannotBeRead(receiptFilename ?? '', receiptPath ?? '', () => {}, iouRequestType, iouType, transactionID, reportID, receiptType ?? '');
- }, [receiptType, receiptPath, receiptFilename, iouRequestType, iouType, transactionID, reportID]);
+ }, [receiptType, receiptPath, receiptFilename, iouRequestType, iouType, transactionID, reportID, action]);
const updateRouteParams = useCallback(() => {
const navigationState = navigation.getState();
@@ -133,16 +146,23 @@ function IOURequestStepParticipants({
nextStepIOUType = CONST.IOU.TYPE.SEND;
}
+ const isCategorizing = action === CONST.IOU.ACTION.CATEGORIZE;
+
IOU.setMoneyRequestTag(transactionID, '');
IOU.setMoneyRequestCategory(transactionID, '');
- Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute(CONST.IOU.ACTION.CREATE, nextStepIOUType, transactionID, selectedReportID.current || reportID));
+ const iouConfirmationPageRoute = ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute(action, nextStepIOUType, transactionID, selectedReportID.current || reportID);
+ if (isCategorizing) {
+ Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_CATEGORY.getRoute(action, nextStepIOUType, transactionID, selectedReportID.current || reportID, iouConfirmationPageRoute));
+ } else {
+ Navigation.navigate(iouConfirmationPageRoute);
+ }
},
- [iouType, transactionID, reportID],
+ [iouType, transactionID, reportID, action],
);
const navigateBack = useCallback(() => {
- IOUUtils.navigateToStartMoneyRequestStep(iouRequestType, iouType, transactionID, reportID);
- }, [iouRequestType, iouType, transactionID, reportID]);
+ IOUUtils.navigateToStartMoneyRequestStep(iouRequestType, iouType, transactionID, reportID, action);
+ }, [iouRequestType, iouType, transactionID, reportID, action]);
return (
);
diff --git a/src/pages/iou/request/step/withFullTransactionOrNotFound.tsx b/src/pages/iou/request/step/withFullTransactionOrNotFound.tsx
index fee7e2f301db..a225e3a1ade0 100644
--- a/src/pages/iou/request/step/withFullTransactionOrNotFound.tsx
+++ b/src/pages/iou/request/step/withFullTransactionOrNotFound.tsx
@@ -6,6 +6,7 @@ import type {OnyxEntry} from 'react-native-onyx';
import {withOnyx} from 'react-native-onyx';
import FullPageNotFoundView from '@components/BlockingViews/FullPageNotFoundView';
import getComponentDisplayName from '@libs/getComponentDisplayName';
+import * as IOUUtils from '@libs/IOUUtils';
import type {MoneyRequestNavigatorParamList} from '@libs/Navigation/types';
import CONST from '@src/CONST';
import ONYXKEYS from '@src/ONYXKEYS';
@@ -68,7 +69,7 @@ export default function {
const backTo = route.params.backTo ?? '';
- const backToRoute = backTo ? (`${backTo}?country=${currentCountry}` as const) : '';
+ const backToRoute = backTo ? `${backTo}?country=${currentCountry}` : '';
Navigation.goBack(backToRoute as Route);
}}
/>
diff --git a/src/pages/settings/Wallet/ActivatePhysicalCardPage.tsx b/src/pages/settings/Wallet/ActivatePhysicalCardPage.tsx
index d5b1230fd216..a031cf6363f4 100644
--- a/src/pages/settings/Wallet/ActivatePhysicalCardPage.tsx
+++ b/src/pages/settings/Wallet/ActivatePhysicalCardPage.tsx
@@ -56,7 +56,7 @@ function ActivatePhysicalCardPage({
const [lastPressedDigit, setLastPressedDigit] = useState('');
const domainCards = CardUtils.getDomainCards(cardList)[domain] ?? [];
- const physicalCard = domainCards.find((card) => !card.isVirtual);
+ const physicalCard = domainCards.find((card) => !card.nameValuePairs?.isVirtual);
const cardID = physicalCard?.cardID ?? 0;
const cardError = ErrorUtils.getLatestErrorMessage(physicalCard ?? {});
diff --git a/src/pages/settings/Wallet/Card/BaseGetPhysicalCard.tsx b/src/pages/settings/Wallet/Card/BaseGetPhysicalCard.tsx
index bcd1c1096b0e..9498b116cda9 100644
--- a/src/pages/settings/Wallet/Card/BaseGetPhysicalCard.tsx
+++ b/src/pages/settings/Wallet/Card/BaseGetPhysicalCard.tsx
@@ -115,7 +115,7 @@ function BaseGetPhysicalCard({
}
const domainCards = CardUtils.getDomainCards(cardList)[domain] || [];
- const physicalCard = domainCards.find((card) => !card?.isVirtual);
+ const physicalCard = domainCards.find((card) => !card?.nameValuePairs?.isVirtual);
// When there are no cards for the specified domain, user is redirected to the wallet page
if (domainCards.length === 0) {
@@ -148,7 +148,7 @@ function BaseGetPhysicalCard({
// If the current step of the get physical card flow is the confirmation page
if (isConfirmation) {
const domainCards = CardUtils.getDomainCards(cardList)[domain];
- const physicalCard = domainCards.find((card) => !card?.isVirtual);
+ const physicalCard = domainCards.find((card) => !card?.nameValuePairs?.isVirtual);
const cardID = physicalCard?.cardID ?? 0;
Wallet.requestPhysicalExpensifyCard(cardID, session?.authToken ?? '', updatedPrivatePersonalDetails);
diff --git a/src/pages/settings/Wallet/ExpensifyCardPage.tsx b/src/pages/settings/Wallet/ExpensifyCardPage.tsx
index 4c8b02eabdc6..d96574063ac7 100644
--- a/src/pages/settings/Wallet/ExpensifyCardPage.tsx
+++ b/src/pages/settings/Wallet/ExpensifyCardPage.tsx
@@ -64,8 +64,8 @@ function ExpensifyCardPage({
const {isOffline} = useNetwork();
const {translate} = useLocalize();
const domainCards = useMemo(() => cardList && CardUtils.getDomainCards(cardList)[domain], [cardList, domain]);
- const virtualCard = useMemo(() => domainCards?.find((card) => card.isVirtual), [domainCards]);
- const physicalCard = useMemo(() => domainCards?.find((card) => !card.isVirtual), [domainCards]);
+ const virtualCard = useMemo(() => domainCards?.find((card) => card.nameValuePairs?.isVirtual), [domainCards]);
+ const physicalCard = useMemo(() => domainCards?.find((card) => !card.nameValuePairs?.isVirtual), [domainCards]);
const [isLoading, setIsLoading] = useState(false);
const [isNotFound, setIsNotFound] = useState(false);
diff --git a/src/pages/settings/Wallet/PaymentMethodList.tsx b/src/pages/settings/Wallet/PaymentMethodList.tsx
index 2bbc73355d68..c897f07ce853 100644
--- a/src/pages/settings/Wallet/PaymentMethodList.tsx
+++ b/src/pages/settings/Wallet/PaymentMethodList.tsx
@@ -197,7 +197,7 @@ function PaymentMethodList({
if (shouldShowAssignedCards) {
const assignedCards = Object.values(cardList ?? {})
// Filter by physical, active cards associated with a domain
- .filter((card) => !card.isVirtual && !!card.domainName && CONST.EXPENSIFY_CARD.ACTIVE_STATES.includes(card.state ?? 0));
+ .filter((card) => !card.nameValuePairs?.isVirtual && !!card.domainName && CONST.EXPENSIFY_CARD.ACTIVE_STATES.includes(card.state ?? 0));
const numberPhysicalExpensifyCards = assignedCards.filter((card) => CardUtils.isExpensifyCard(card.cardID)).length;
diff --git a/src/pages/settings/Wallet/ReportVirtualCardFraudPage.tsx b/src/pages/settings/Wallet/ReportVirtualCardFraudPage.tsx
index 40a3eacb4ed9..7a6460029a8e 100644
--- a/src/pages/settings/Wallet/ReportVirtualCardFraudPage.tsx
+++ b/src/pages/settings/Wallet/ReportVirtualCardFraudPage.tsx
@@ -44,7 +44,7 @@ function ReportVirtualCardFraudPage({
const {translate} = useLocalize();
const domainCards = CardUtils.getDomainCards(cardList)[domain];
- const virtualCard = domainCards?.find((card) => card.isVirtual);
+ const virtualCard = domainCards?.find((card) => card.nameValuePairs?.isVirtual);
const virtualCardError = ErrorUtils.getLatestErrorMessage(virtualCard?.errors ?? {});
const prevIsLoading = usePrevious(formData?.isLoading);
diff --git a/src/pages/signin/ChooseSSOOrMagicCode.tsx b/src/pages/signin/ChooseSSOOrMagicCode.tsx
index 4143c2b733e0..3895b303020b 100644
--- a/src/pages/signin/ChooseSSOOrMagicCode.tsx
+++ b/src/pages/signin/ChooseSSOOrMagicCode.tsx
@@ -1,100 +1,67 @@
-import React, {useEffect} from 'react';
-import {Keyboard, View} from 'react-native';
+import React from 'react';
+import {View} from 'react-native';
import {withOnyx} from 'react-native-onyx';
import type {OnyxEntry} from 'react-native-onyx';
import Button from '@components/Button';
-import FormHelpMessage from '@components/FormHelpMessage';
import Text from '@components/Text';
-import useKeyboardState from '@hooks/useKeyboardState';
import useLocalize from '@hooks/useLocalize';
import useNetwork from '@hooks/useNetwork';
import useThemeStyles from '@hooks/useThemeStyles';
import useWindowDimensions from '@hooks/useWindowDimensions';
-import * as ErrorUtils from '@libs/ErrorUtils';
import Navigation from '@libs/Navigation/Navigation';
-import * as Session from '@userActions/Session';
-import CONST from '@src/CONST';
import ONYXKEYS from '@src/ONYXKEYS';
import ROUTES from '@src/ROUTES';
-import type {Account, Credentials} from '@src/types/onyx';
-import {isEmptyObject} from '@src/types/utils/EmptyObject';
-import ChangeExpensifyLoginLink from './ChangeExpensifyLoginLink';
-import Terms from './Terms';
+import type {Account} from '@src/types/onyx';
+import ValidateCodeForm from './ValidateCodeForm';
type ChooseSSOOrMagicCodeOnyxProps = {
- /** The credentials of the logged in person */
- credentials: OnyxEntry;
-
/** The details about the account that the user is signing in with */
account: OnyxEntry;
};
type ChooseSSOOrMagicCodeProps = ChooseSSOOrMagicCodeOnyxProps & {
- /** Function that returns whether the user is using SAML or magic codes to log in */
- setIsUsingMagicCode: (value: boolean) => void;
+ /** Determines if user is switched to using recovery code instead of 2fa code */
+ isUsingRecoveryCode: boolean;
+
+ /** Function to change `isUsingRecoveryCode` state when user toggles between 2fa code and recovery code */
+ setIsUsingRecoveryCode: (value: boolean) => void;
};
-function ChooseSSOOrMagicCode({credentials, account, setIsUsingMagicCode}: ChooseSSOOrMagicCodeProps) {
+function ChooseSSOOrMagicCode({account, isUsingRecoveryCode, setIsUsingRecoveryCode}: ChooseSSOOrMagicCodeProps) {
const styles = useThemeStyles();
- const {isKeyboardShown} = useKeyboardState();
const {translate} = useLocalize();
const {isOffline} = useNetwork();
const {isSmallScreenWidth} = useWindowDimensions();
-
- // This view doesn't have a field for user input, so dismiss the device keyboard if shown
- useEffect(() => {
- if (!isKeyboardShown) {
- return;
- }
- Keyboard.dismiss();
- }, [isKeyboardShown]);
+ const loginTextAfterMagicCode = isUsingRecoveryCode ? translate('validateCodeForm.enterRecoveryCode') : translate('validateCodeForm.enterAuthenticatorCode');
+ const loginText = account?.requiresTwoFactorAuth ? loginTextAfterMagicCode : translate('samlSignIn.orContinueWithMagicCode');
return (
- <>
-
- {translate('samlSignIn.welcomeSAMLEnabled')}
-