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 1ebfc6bb1b62..ac5f3fdd397e 100644
--- a/ios/Podfile.lock
+++ b/ios/Podfile.lock
@@ -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):
@@ -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 203e062de680..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",
@@ -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"
},
diff --git a/package.json b/package.json
index 43a3ed8cae6a..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",
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":";;;AAAA,wDAA0B;AAC1B,6CAOsB;AACtB,qDAO0B;AAC1B,2EAAgF;AAEhF,+FAAiE;AACjE,gGAAkE;AAClE,+DAA8D;AAC9D,sGAAwE;AACxE,6EAA+C;AAC/C,iFAAmD;AACnD,uEAA4C;AAC5C,gGAAkE;AAClE,mDAI0B;AAC1B,iEAKwC;AACxC,uEAKuC;AAKvC,IAAM,qBAAqB,GACzB,gBAAoD,CAAC;AAevD;IAA2B,qCAG1B;IAyCC,mBAAY,KAAwB;QAApC,iBAiBC;;gBAhBC,kBAAM,KAAK,CAAC;QAvCN,4BAAsB,GAAG,CAAC,CAAC;QAC3B,oBAAc,GAAG,+BAAc,CAAC,sBAAsB,CAAC;QACvD,8BAAwB,GAC9B,+BAAc,CAAC,gCAAgC,CAAC;QAE1C,wBAAkB,GAAG,CAAC,CAAC;QACvB,kBAAY,GAAyB;YAC3C,aAAa,EAAE,CAAC;YAChB,UAAU,EAAE,CAAC;YACb,WAAW,EAAE,CAAC;YACd,YAAY,EAAE,CAAC;SAChB,CAAC;QAEM,mBAAa,GAAG,CAAC,CAAC;QAClB,kBAAY,GAAG,KAAK,CAAC;QACrB,4BAAsB,GAA2B;YACvD,KAAK,EAAE;gBACL,WAAW,EAAE,CAAC;gBACd,eAAe,EAAE,CAAC;gBAClB,aAAa,EAAE,CAAC;aACjB;YACD,iBAAiB,EAAE,IAAI;YACvB,oBAAoB,EAAE,IAAI;SAC3B,CAAC;QAKM,iBAAW,GAAG,KAAK,CAAC;QA0KpB,kBAAY,GAAG;;YACrB,MAAA,MAAA,KAAI,CAAC,KAAK,EAAC,YAAY,kDAAI,CAAC;QAC9B,CAAC,CAAC;QAEM,uBAAiB,GAAG;YAC1B,IAAI,KAAI,CAAC,KAAK,CAAC,SAAS,EAAE;gBACxB,OAAO,CACL,8BAAC,6BAAc,IACb,UAAU,EAAE,OAAO,CAAC,KAAI,CAAC,KAAK,CAAC,UAAU,CAAC,EAC1C,kBAAkB,EAAE,KAAI,CAAC,KAAK,CAAC,kBAAkB,EACjD,SAAS,EAAE,KAAI,CAAC,KAAK,CAAC,SAAS,GAC/B,CACH,CAAC;aACH;QACH,CAAC,CAAC;QAmHM,uBAAiB,GAAG,UAC1B,KAA8C;;YAE9C,KAAI,CAAC,iBAAiB,EAAE,CAAC;YACzB,MAAA,MAAA,KAAI,CAAC,KAAK,EAAC,iBAAiB,mDAAG,KAAK,CAAC,CAAC;QACxC,CAAC,CAAC;QAEM,cAAQ,GAAG,UAAC,KAA8C;;YAChE,KAAI,CAAC,iBAAiB,EAAE,CAAC;YACzB,KAAI,CAAC,kBAAkB,CAAC,mBAAmB,EAAE,CAAC;YAC9C,MAAA,MAAA,KAAI,CAAC,KAAK,EAAC,QAAQ,mDAAG,KAAK,CAAC,CAAC;QAC/B,CAAC,CAAC;QA6BM,sBAAgB,GAAG,UAAC,KAAwB;;YAClD,KAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;YAC7B,IAAM,OAAO,GAAG,KAAI,CAAC,KAAK,CAAC,UAAU;gBACnC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM;gBACjC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC;YACnC,IAAM,OAAO,GAAG,KAAI,CAAC,sBAAsB,CAAC;YAC5C,KAAI,CAAC,sBAAsB,GAAG,OAAO,CAAC;YAEtC,qEAAqE;YACrE,IAAI,OAAO,GAAG,CAAC,IAAI,OAAO,KAAK,OAAO,EAAE;gBACtC,MAAA,KAAI,CAAC,MAAM,0CAAE,aAAa,EAAE,CAAC;aAC9B;YACD,IAAI,KAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;gBACvB,KAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;aAC5B;QACH,CAAC,CAAC;QAEM,eAAS,GAAG,UAAC,KAAa,EAAE,QAA2B;YAC7D,KAAI,CAAC,oBAAoB,EAAE,CAAC;YAC5B,OAAO,CACL;gBACE,8BAAC,2CAAoB,IACnB,OAAO,EAAE,KAAI,CAAC,YAAY,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,KAAI,CAAC,WAAW,EACrE,YAAY,EAAE,KAAI,CAAC,KAAK,CAAC,qBAAqB,EAC9C,UAAU,EAAE,KAAI,CAAC,KAAK,CAAC,UAAU,EACjC,MAAM,EAAE,KAAI,CAAC,KAAK,CAAC,mBAAmB,EACtC,SAAS,EAAE,KAAI,CAAC,KAAK,CAAC,SAAS,EAC/B,WAAW,EAAE,KAAI,CAAC,KAAK,CAAC,wBAAwB,EAChD,QAAQ,EAAE,KAAI,CAAC,KAAK,CAAC,QAAQ,EAC7B,QAAQ,EAAE,KAAI,CAAC,MAAM,GACrB;gBACF,8BAAC,wBAAc,uBACT,KAAK,IACT,gBAAgB,EAAE,KAAI,CAAC,KAAK,CAAC,WAAW,EACxC,QAAQ,EAAE,KAAI,CAAC,wBAAwB,EACvC,iBAAiB,EAAE,KAAI,CAAC,KAAK,CAAC,iBAAiB,KAE9C,QAAQ,CACM;gBAChB,KAAI,CAAC,WAAW;oBACf,CAAC,CAAC,KAAI,CAAC,iBAAiB,CAAC,KAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC;oBACvD,CAAC,CAAC,IAAI;gBACR,8BAAC,2CAAoB,IACnB,OAAO,EAAE,KAAI,CAAC,YAAY,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,KAAI,CAAC,WAAW,EACrE,YAAY,EAAE,KAAI,CAAC,KAAK,CAAC,qBAAqB,EAC9C,UAAU,EAAE,KAAI,CAAC,KAAK,CAAC,UAAU,EACjC,MAAM,EAAE,KAAI,CAAC,KAAK,CAAC,mBAAmB,EACtC,SAAS,EAAE,KAAI,CAAC,KAAK,CAAC,SAAS,EAC/B,WAAW,EAAE,KAAI,CAAC,KAAK,CAAC,wBAAwB,EAChD,QAAQ,EAAE,KAAI,CAAC,KAAK,CAAC,QAAQ,EAC7B,QAAQ,EAAE,KAAI,CAAC,MAAM,GACrB;gBACD,KAAI,CAAC,gCAAgC,EAAE,CACvC,CACJ,CAAC;QACJ,CAAC,CAAC;QAEM,mBAAa,GAAG,UAAC,KAAU,EAAE,WAAgB;;YACnD,IAAM,qBAAqB,GACzB,MAAA,KAAI,CAAC,KAAK,CAAC,qBAAqB,mCAAI,uBAAa,CAAC;YACpD,OAAO,CACL,8BAAC,qBAAqB,uBAChB,KAAK,IACT,KAAK,0EACA,KAAK,CAAC,KAAK,KACd,aAAa,EAAE,KAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,EACvD,UAAU,EAAE,SAAS,KAClB,KAAI,CAAC,YAAY,EAAE,GACnB,IAAA,+CAA8B,EAAC,KAAI,CAAC,KAAK,CAAC,QAAU,EAAE,WAAW,CAAC,GAEvE,KAAK,EAAE,WAAW,CAAC,KAAK;gBAExB,8BAAC,2CAAoB,IACnB,aAAa,EAAE,WAAW,CAAC,aAAa,EACxC,gBAAgB,EAAE,WAAW,CAAC,gBAAgB,EAC9C,IAAI,EAAE,WAAW,CAAC,IAAI,EACtB,GAAG,EAAE,WAAW,CAAC,KAAK,EACtB,QAAQ,EAAE,KAAI,CAAC,qBAAqB,GACpC,CACoB,CACzB,CAAC;QACJ,CAAC,CAAC;QAEM,8BAAwB,GAAG,UAAC,KAAwB;YAC1D,IAAM,qBAAqB,GAAG,KAAI,CAAC,KAAK,CAAC,UAAU;gBACjD,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;gBAC5B,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC;YAE/B,IAAI,KAAI,CAAC,kBAAkB,KAAK,qBAAqB,EAAE;gBACrD,KAAI,CAAC,kBAAkB,GAAG,qBAAqB,CAAC;gBAChD,KAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,WAAW,GAAG,CAAC,KAAI,CAAC,kBAAkB,CAAC;gBACzE,KAAI,CAAC,kBAAkB,CAAC,mBAAmB,EAAE,CAAC;aAC/C;QACH,CAAC,CAAC;QASM,eAAS,GAAG,UAAC,KAAa;YAChC,sDAAsD;YACtD,IACE,KAAI,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI;gBACxB,KAAI,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS;gBAC7B,KAAK,GAAG,CAAC,IAAI,KAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EACnC;gBACA,OAAO,IAAI,CAAC;aACb;YAED,IAAM,WAAW,GAAG,KAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC3C,IAAM,YAAY,GAAG,KAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;YAEhD,IAAM,KAAK,GAAG;gBACZ,WAAW,aAAA;gBACX,YAAY,cAAA;gBACZ,+HAA+H;gBAC/H,6IAA6I;aAC9I,CAAC;YACF,IAAM,SAAS,GAAG,KAAI,CAAC,KAAK,CAAC,sBAAsB,CAAC;YACpD,OAAO,SAAS,IAAI,8BAAC,SAAS,uBAAK,KAAK,EAAI,CAAC;QAC/C,CAAC,CAAC;QAEM,YAAM,GAAG;YACf,OAAO,CACL;gBACE,8BAAC,mBAAI,IACH,KAAK,EAAE;wBACL,UAAU,EAAE,KAAI,CAAC,YAAY,CAAC,UAAU;wBACxC,WAAW,EAAE,KAAI,CAAC,YAAY,CAAC,WAAW;qBAC3C,GACD;gBAEF,8BAAC,mBAAI,IACH,KAAK,EAAE,CAAC,KAAI,CAAC,KAAK,CAAC,wBAAwB,EAAE,KAAI,CAAC,YAAY,EAAE,CAAC,IAEhE,KAAI,CAAC,iBAAiB,CAAC,KAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAClD,CACN,CACJ,CAAC;QACJ,CAAC,CAAC;QAEM,YAAM,GAAG;;YACf;;gCAEoB;YACpB,IAAM,eAAe,GAAG,MAAA,IAAA,mCAAkB,GAAE,mCAAI,uBAAa,CAAC;YAC9D,OAAO,CACL;gBACE,8BAAC,eAAe,IACd,KAAK,EAAE,CAAC,CAAC,EACT,KAAK,EAAE,CAAC,KAAI,CAAC,KAAK,CAAC,wBAAwB,EAAE,KAAI,CAAC,YAAY,EAAE,CAAC,IAEhE,KAAI,CAAC,iBAAiB,CAAC,KAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,CACvC;gBAClB,8BAAC,mBAAI,IACH,KAAK,EAAE;wBACL,aAAa,EAAE,KAAI,CAAC,YAAY,CAAC,aAAa;wBAC9C,YAAY,EAAE,KAAI,CAAC,YAAY,CAAC,YAAY;qBAC7C,GACD,CACD,CACJ,CAAC;QACJ,CAAC,CAAC;QAEM,sCAAgC,GAAG;YACzC,OAAO,KAAI,CAAC,KAAK,CAAC,UAAU;gBAC1B,CAAC,KAAI,CAAC,KAAK,CAAC,sCAAsC;gBAClD,CAAC,KAAI,CAAC,YAAY;gBAClB,KAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CACxC,8BAAC,mBAAI,IAAC,KAAK,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,aAAa,EAAC,MAAM,IAC9C,KAAI,CAAC,oBAAoB,CACxB,IAAI,CAAC,GAAG,CAAC,KAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,EAClD,oCAAmB,CAAC,WAAW,CAChC,CACI,CACR,CAAC,CAAC,CAAC,IAAI,CAAC;QACX,CAAC,CAAC;QAaM,2BAAqB,GAAG,UAC9B,CAAM,EACN,EAAO,EACP,gBAAyC;;YAEzC,gBAAgB,CAAC,WAAW,GAAG,CAAC,KAAI,CAAC,kBAAkB,CAAC;YACxD,MAAA,KAAI,CAAC,yBAAyB,0CAAE,UAAU,CAAC,KAAI,CAAC,eAAe,CAAC,CAAC;QACnE,CAAC,CAAC;QAEM,uBAAiB,GAAG,UAAC,KAAa;YACxC,OAAO,KAAI,CAAC,oBAAoB,CAAC,KAAK,EAAE,oCAAmB,CAAC,YAAY,CAAC,CAAC;QAC5E,CAAC,CAAC;QAEM,0BAAoB,GAAG,UAAC,KAAa,EAAE,MAAoB;;YACjE,wEAAwE;YACxE,OAAO,MAAA,MAAA,KAAI,CAAC,KAAK,EAAC,UAAU,mDAAG;gBAC7B,IAAI,EAAE,KAAI,CAAC,KAAK,CAAC,IAAK,CAAC,KAAK,CAAC;gBAC7B,KAAK,OAAA;gBACL,MAAM,QAAA;gBACN,SAAS,EAAE,MAAA,KAAI,CAAC,KAAK,CAAC,SAAS,0CAAE,KAAK;aACvC,CAAgB,CAAC;QACpB,CAAC,CAAC;QAEF;;;;WAIG;QACK,sBAAgB,GAAG;YACzB,OAAO,IAAI,CAAC;QACd,CAAC,CAAC;QAEM,2BAAqB,GAAG,UAAC,KAAa;YAC5C,OAAO,CACL;gBACE,8BAAC,mBAAI,IACH,KAAK,EAAE;wBACL,aAAa,EACX,KAAI,CAAC,KAAK,CAAC,UAAU,IAAI,KAAI,CAAC,KAAK,CAAC,UAAU,KAAK,CAAC;4BAClD,CAAC,CAAC,QAAQ;4BACV,CAAC,CAAC,KAAK;qBACZ,IAEA,KAAI,CAAC,oBAAoB,CAAC,KAAK,EAAE,oCAAmB,CAAC,IAAI,CAAC,CACtD;gBACN,KAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CACrB,CACJ,CAAC;QACJ,CAAC,CAAC;QAEM,iBAAW,GAAG,UAAC,GAAQ;YAC7B,KAAI,CAAC,MAAM,GAAG,GAAG,CAAC;QACpB,CAAC,CAAC;QAEM,sBAAgB,GAAG,UAAC,GAAQ;YAClC,KAAI,CAAC,yBAAyB,GAAG,GAAG,CAAC;QACvC,CAAC,CAAC;QAEM,+BAAyB,GAAG,UAClC,CAAM,EACN,EAAO,EACP,KAAa,EACb,GAAQ;YAER,OAAO,CACL,8BAAC,2CAAoB,IACnB,GAAG,EAAE,KAAI,CAAC,gBAAgB,EAC1B,OAAO,EAAE,KAAI,CAAC,eAAe,EAC7B,GAAG,EAAE,KAAK,EACV,QAAQ,EAAE,KAAI,CAAC,iBAAiB,GAChC,CACH,CAAC;QACJ,CAAC,CAAC;QAOM,kBAAY,GAAG,UAAC,KAAa;YACnC,oIAAoI;YACpI,KAAI,CAAC,KAAK,CAAC,cAAc,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;YAClD,KAAI,CAAC,wBAAwB,EAAE,CAAC;QAClC,CAAC,CAAC;QAEM,8BAAwB,GAAG;;YACjC,IAAI,CAAC,KAAI,CAAC,YAAY,EAAE;gBACtB,KAAI,CAAC,YAAY,GAAG,IAAI,CAAC;gBACzB,MAAA,MAAA,KAAI,CAAC,KAAK,EAAC,MAAM,mDAAG;oBAClB,eAAe,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAI,CAAC,aAAa;iBACjD,CAAC,CAAC;gBACH,KAAI,CAAC,cAAc,EAAE,CAAC;aACvB;QACH,CAAC,CAAC;QAEM,oBAAc,GAAG;YACvB,IAAI,KAAI,CAAC,KAAK,CAAC,iBAAiB,KAAK,SAAS,EAAE;gBAC9C,KAAI,CAAC,oBAAoB,GAAG,UAAU,CAAC;oBACrC,IAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAChC,KAAI,CAAC,KAAK,CAAC,cAAc,CAAC,eAAe,CAC1C,CAAC;oBACF,OAAO,CAAC,IAAI,CACV,kBAAW,CAAC,+BAA+B,CAAC,OAAO,CACjD,OAAO,EACP,eAAe,CAAC,QAAQ,EAAE,CAC3B,CACF,CAAC;gBACJ,CAAC,EAAE,IAAI,CAAC,CAAC;aACV;YACD,KAAI,CAAC,iBAAiB,GAAG,UAAU,CAAC;gBAClC,6IAA6I;gBAC7I,sIAAsI;gBACtI,IAAI,KAAI,CAAC,KAAK,CAAC,UAAU,EAAE;oBACzB,KAAI,CAAC,WAAW,EAAE,CAAC;iBACpB;YACH,CAAC,EAAE,GAAG,CAAC,CAAC;QACV,CAAC,CAAC;QAEM,0BAAoB,GAAG;YAC7B,IAAI,KAAI,CAAC,iBAAiB,KAAK,SAAS,EAAE;gBACxC,YAAY,CAAC,KAAI,CAAC,iBAAiB,CAAC,CAAC;gBACrC,KAAI,CAAC,iBAAiB,GAAG,SAAS,CAAC;aACpC;QACH,CAAC,CAAC;QA0GF;;;WAGG;QACI,uBAAiB,GAAG;YACzB,KAAI,CAAC,kBAAkB,CAAC,iBAAiB,EAAE,CAAC;QAC9C,CAAC,CAAC;QAlvBA,KAAI,CAAC,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAChC,KAAI,CAAC,aAAa,EAAE,CAAC;QACrB,IAAI,KAAK,CAAC,iBAAiB,EAAE;YAC3B,IAAI,KAAK,CAAC,UAAU,EAAE;gBACpB,KAAI,CAAC,sBAAsB,GAAG,KAAK,CAAC,iBAAiB,CAAC,MAAM,CAAC;aAC9D;iBAAM;gBACL,KAAI,CAAC,sBAAsB,GAAG,KAAK,CAAC,iBAAiB,CAAC,KAAK,CAAC;aAC7D;SACF;QACD,KAAI,CAAC,kBAAkB;YACrB,MAAA,KAAK,CAAC,wBAAwB,mCAAI,CAAC,CAAC,KAAK,CAAC,mBAAmB,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAC5E,sDAAsD;QACtD,KAAI,CAAC,KAAK,GAAG,SAAS,CAAC,sBAAsB,CAAC,KAAI,CAAC,CAAC;QACpD,KAAI,CAAC,kBAAkB,GAAG,IAAI,4BAAkB,CAAC,KAAI,CAAC,CAAC;QACvD,KAAI,CAAC,YAAY,GAAG,IAAA,gCAAe,GAAE,CAAC;;IACxC,CAAC;IAEO,iCAAa,GAArB;;QACE,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,KAAK,SAAS,EAAE;YACtE,MAAM,IAAI,qBAAW,CAAC,uBAAa,CAAC,qBAAqB,CAAC,CAAC;SAC5D;QACD,IACE,MAAM,CAAC,MAAA,IAAI,CAAC,KAAK,CAAC,mBAAmB,0CAAE,MAAM,CAAC,GAAG,CAAC;YAClD,IAAI,CAAC,KAAK,CAAC,UAAU,EACrB;YACA,MAAM,IAAI,qBAAW,CAAC,uBAAa,CAAC,iCAAiC,CAAC,CAAC;SACxE;QACD,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE;YAC9D,MAAM,IAAI,qBAAW,CAAC,uBAAa,CAAC,kCAAkC,CAAC,CAAC;SACzE;QAED,wIAAwI;QACxI,sIAAsI;QACtI,IACE,OAAO;YACP,MAAM,CAAC,IAAI,CAAC,yBAAU,CAAC,OAAO,CAAC,MAAA,IAAI,CAAC,KAAK,CAAC,KAAK,mCAAI,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,EAClE;YACA,OAAO,CAAC,IAAI,CAAC,kBAAW,CAAC,gBAAgB,CAAC,CAAC;SAC5C;QACD,IACE,IAAA,iEAAyC,EACvC,IAAI,CAAC,KAAK,CAAC,qBAAqB,CACjC,EACD;YACA,OAAO,CAAC,IAAI,CAAC,kBAAW,CAAC,gCAAgC,CAAC,CAAC;SAC5D;IACH,CAAC;IAED,+DAA+D;IACxD,kCAAwB,GAA/B,UACE,SAAsC,EACtC,SAA4B;;QAE5B,IAAM,QAAQ,wBAAQ,SAAS,CAAE,CAAC;QAClC,IAAI,SAAS,CAAC,UAAU,KAAK,SAAS,CAAC,UAAU,EAAE;YACjD,QAAQ,CAAC,UAAU,GAAG,SAAS,CAAC,UAAU,IAAI,CAAC,CAAC;YAChD,QAAQ,CAAC,cAAc,GAAG,SAAS,CAAC,iBAAiB,CACnD,QAAQ,CAAC,UAAU,EACnB,SAAS,CACV,CAAC;SACH;aAAM,IAAI,SAAS,CAAC,cAAc,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,UAAU,EAAE;YACrE,QAAQ,CAAC,cAAc,GAAG,SAAS,CAAC,iBAAiB,CACnD,QAAQ,CAAC,UAAU,EACnB,SAAS,CACV,CAAC;SACH;QAED,8EAA8E;QAC9E,sDAAsD;QACtD,QAAQ,CAAC,cAAc,CAAC,0BAA0B,GAAG,OAAO,CAC1D,CAAC,CAAA,MAAA,SAAS,CAAC,cAAc,0CAAE,UAAU,CAAA,CACtC,CAAC;QAEF,IAAI,SAAS,CAAC,IAAI,KAAK,SAAS,CAAC,IAAI,EAAE;YACrC,QAAQ,CAAC,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC;YAC/B,QAAQ,CAAC,YAAY,GAAG,SAAS,CAAC,YAAY,CAAC,aAAa,CAC1D,SAAS,CAAC,IAAa,CACxB,CAAC;YACF,IAAI,SAAS,CAAC,UAAU,KAAK,SAAS,CAAC,UAAU,EAAE;gBACjD,QAAQ,CAAC,SAAS,wBAAQ,SAAS,CAAC,SAAS,CAAE,CAAC;aACjD;SACF;QACD,IAAI,SAAS,CAAC,SAAS,MAAK,MAAA,SAAS,CAAC,SAAS,0CAAE,KAAK,CAAA,EAAE;YACtD,QAAQ,CAAC,SAAS,GAAG,EAAE,KAAK,EAAE,SAAS,CAAC,SAAS,EAAE,CAAC;SACrD;QACD,QAAQ,CAAC,UAAU,GAAG,SAAS,CAAC,UAAU,CAAC;QAC3C,OAAO,QAAQ,CAAC;IAClB,CAAC;IAEc,gCAAsB,GAArC,UACE,SAAuB;QAEvB,IAAI,WAAoD,CAAC;QACzD,IACE,SAAS,CAAC,KAAK,CAAC,YAAY,KAAK,IAAI;YACrC,SAAS,CAAC,KAAK,CAAC,YAAY,KAAK,SAAS,EAC1C;YACA,WAAW,GAAG,UAAC,KAAK;gBAClB,+GAA+G;gBAC/G,mFAAmF;gBACnF,OAAA,SAAS,CAAC,KAAK,CAAC,YAAa,CAC3B,SAAS,CAAC,KAAK,CAAC,IAAK,CAAC,KAAK,CAAC,EAC5B,KAAK,CACN,CAAC,QAAQ,EAAE;YAHZ,CAGY,CAAC;SAChB;QACD,OAAO;YACL,IAAI,EAAE,IAAI;YACV,cAAc,EAAE,IAAM;YACtB,YAAY,EAAE,IAAI,+BAAY,CAAC,UAAC,EAAE,EAAE,EAAE;gBACpC,OAAO,EAAE,KAAK,EAAE,CAAC;YACnB,CAAC,EAAE,WAAW,CAAC;YACf,UAAU,EAAE,CAAC;SACd,CAAC;IACJ,CAAC;IAED,2HAA2H;IAC5G,2BAAiB,GAAhC,UACE,UAAkB,EAClB,cAAiC;QAEjC,OAAO,IAAI,qCAA2B;QACpC,6BAA6B;QAC7B,UAAU,EACV,UAAC,KAAK,EAAE,KAAK;;YACX,mCAAmC;YACnC,IAAM,IAAI,GAAG,MAAA,KAAK,CAAC,WAAW,sDAC5B,KAAK,CAAC,IAAM,CAAC,KAAK,CAAC,EACnB,KAAK,EACL,KAAK,CAAC,SAAS,CAChB,CAAC;YACF,OAAO,IAAI,IAAI,CAAC,CAAC;QACnB,CAAC,EACD,UAAC,KAAK,EAAE,KAAK,EAAE,aAAa;;YAC1B,gFAAgF;YAChF,MAAA,KAAK,CAAC,kBAAkB,sDACtB,aAAa,EACb,KAAK,CAAC,IAAM,CAAC,KAAK,CAAC,EACnB,KAAK,EACL,UAAU,EACV,KAAK,CAAC,SAAS,CAChB,CAAC;YACF,OAAO,MAAA,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAE,IAAI,mCAAI,CAAC,CAAC;QAClC,CAAC,EACD,UAAC,KAAK,EAAE,KAAK,EAAE,aAAa;;YAC1B,4CAA4C;YAC5C,MAAA,KAAK,CAAC,kBAAkB,sDACtB,aAAa,EACb,KAAK,CAAC,IAAM,CAAC,KAAK,CAAC,EACnB,KAAK,EACL,UAAU,EACV,KAAK,CAAC,SAAS,CAChB,CAAC;YACF,OAAO,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAE,IAAI,CAAC;QAC7B,CAAC,EACD,cAAc,CACf,CAAC;IACJ,CAAC;IAkBD,qCAAiB,GAAjB;;QACE,IAAI,CAAA,MAAA,IAAI,CAAC,KAAK,CAAC,IAAI,0CAAE,MAAM,MAAK,CAAC,EAAE;YACjC,IAAI,CAAC,wBAAwB,EAAE,CAAC;SACjC;IACH,CAAC;IAED,wCAAoB,GAApB;QACE,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,CAAC;QAClC,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC5B,IAAI,IAAI,CAAC,oBAAoB,KAAK,SAAS,EAAE;YAC3C,YAAY,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;SACzC;IACH,CAAC;IAED,0BAAM,GAAN;QACE,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC3D,IAAA,0CAAkB,EAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;QAExE,IAAM,KAYF,IAAI,CAAC,KAAK,EAXZ,YAAY,kBAAA,EACZ,qBAAqB,2BAAA,EACrB,mBAAmB,yBAAA,EACnB,UAAU,gBAAA,EACV,qBAAqB,2BAAA,EACrB,iBAAiB,uBAAA,EACjB,kBAAkB,wBAAA,EAClB,KAAK,WAAA,EACL,qBAAqB,2BAAA,EACrB,qBAAqB,2BAAA,EAClB,SAAS,sBAXR,6MAYL,CAAa,CAAC;QAEf,0GAA0G;QAC1G,gEAAgE;QAChE,IAAM,aAAa,GACjB,CAAC,IAAI,CAAC,8BAA8B,EAAE,IAAI,IAAI,CAAC,kBAAkB,CAAC;YAClE,SAAS,CAAC;QACZ,IAAM,iBAAiB,GACrB,YAAY,KAAK,SAAS;YACxB,CAAC,CAAC,+BAAc,CAAC,mBAAmB;YACpC,CAAC,CAAC,YAAY,CAAC;QAEnB,OAAO,CACL,8BAAC,qBAAqB,IACpB,mBAAmB,EAAE,IAAI,CAAC,yBAAyB,EACnD,qBAAqB,EAAE,IAAI,CAAC,qBAAqB,EACjD,mBAAmB,EAAE,mBAAmB,EACxC,KAAK,EACH,IAAI,CAAC,KAAK,CAAC,UAAU;gBACnB,CAAC,sBAAM,IAAI,CAAC,YAAY,EAAE,EAC1B,CAAC,oBAAG,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,QAAQ,IAAK,IAAI,CAAC,YAAY,EAAE,CAAE;YAG7D,8BAAC,sCAAmB,uBACd,SAAS,IACb,GAAG,EAAE,IAAI,CAAC,WAAW,EACrB,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc,EACzC,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,EACrC,WAAW,EAAE,IAAI,CAAC,gBAAgB,EAClC,aAAa,QACb,YAAY,EAAE,OAAO,CAAC,UAAU,CAAC,EACjC,eAAe,qBACb,iBAAiB,EAAE,IAAI,CAAC,iBAAiB,EACzC,QAAQ,EAAE,IAAI,CAAC,gBAAgB,EAC/B,cAAc,EACZ,IAAI,CAAC,KAAK,CAAC,cAAc,IAAI,IAAI,CAAC,iBAAiB,EAAE;oBAEvD,gEAAgE;oBAChE,KAAK,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,EACpC,qBAAqB,qBACnB,eAAe,EAAE,IAAI,CAAC,YAAY,CAAC,eAAe;wBAElD,6FAA6F;wBAC7F,SAAS,EAAE,CAAC,EACZ,QAAQ,EAAE,CAAC,IAER,IAAA,kDAA0B,EAAC,IAAI,CAAC,YAAY,EAAE,UAAU,CAAC,KAE3D,IAAI,CAAC,KAAK,CAAC,aAAa,GAE7B,8BAA8B,QAC9B,mBAAmB,EAAE,IAAI,CAAC,aAAa,EACvC,sBAAsB,EAAE,IAAI,CAAC,SAAS,EACtC,YAAY,EAAE,IAAI,CAAC,YAAY,EAC/B,6BAA6B,EAAE,qBAAqB,IAAI,SAAS,EACjE,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,EACnC,UAAU,EAAE,iBAAiB,EAC7B,cAAc,EAAE,CAAC,GAAG,iBAAiB,EACrC,sBAAsB,EAAE,iBAAiB,EACzC,eAAe,EAAE,iBAAiB,EAClC,kBAAkB,EAChB,CAAC,CAAC,IAAI,CAAC,8BAA8B,EAAE,IAAI,kBAAkB,CAAC;oBAC9D,SAAS,EAEX,aAAa,EAAE,aAAa,EAC5B,YAAY,EAAE,IAAI,CAAC,YAAY,EAC/B,QAAQ,EAAE,IAAI,CAAC,QAAQ,EACvB,uBAAuB,EACrB,IAAI,CAAC,kBAAkB,CAAC,4BAA4B;oBAClD,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,uBAAuB;oBACjD,CAAC,CAAC,SAAS,EAEf,sBAAsB,EAAE,IAAI,CAAC,gCAAgC,EAAE,EAC/D,YAAY,EAAE,IAAI,CAAC,YAAY,EAC/B,4BAA4B,QAC5B,kBAAkB,EAChB,qBAAoE,IAEtE,CACoB,CACzB,CAAC;IACJ,CAAC;IAeO,oDAAgC,GAAxC;QACE,4IAA4I;QAC5I,iFAAiF;QACjF,8HAA8H;QAC9H,IAAI,IAAI,CAAC,8BAA8B,EAAE,EAAE;YACzC,IAAI,CAAC,sBAAsB,CAAC,oBAAoB,GAAG,KAAK,CAAC;SAC1D;aAAM;YACL,IAAI,CAAC,sBAAsB,CAAC,oBAAoB,GAAG,IAAI,CAAC;SACzD;QACD,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,WAAW,GAAG,CAAC,IAAI,CAAC,kBAAkB,CAAC;QACzE,OAAO,IAAI,CAAC,sBAAsB,CAAC;IACrC,CAAC;IAEO,kDAA8B,GAAtC;;QACE,OAAO,CACL,CAAC,MAAA,IAAI,CAAC,KAAK,CAAC,kBAAkB,mCAAI,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC;YACxD,IAAI,CAAC,KAAK,CAAC,UAAU,CACtB,CAAC;IACJ,CAAC;IAEO,oCAAgB,GAAxB,UAAyB,KAAwB;QACzC,IAAA,KAAoB,KAAK,CAAC,WAAW,CAAC,MAAM,EAA1C,MAAM,YAAA,EAAE,KAAK,WAA6B,CAAC;QACnD,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;YACrD,OAAO,CAAC,IAAI,CAAC,kBAAW,CAAC,oBAAoB,CAAC,CAAC;SAChD;IACH,CAAC;IAiGO,gCAAY,GAApB;QACE,IAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU;YAC1C,CAAC,CAAC,IAAI,CAAC,wBAAwB;YAC/B,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC;QACxB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,cAAc,CAAC,IAAI,SAAS,CAAC;IAC9D,CAAC;IAiFO,qCAAiB,GAAzB,UACE,SAAsE;QAEtE,IAAM,eAAe,GAAG,SAAS,CAAC;QAClC,OAAO,CACL,CAAC,eAAK,CAAC,cAAc,CAAC,eAAe,CAAC,IAAI,eAAe,CAAC;YAC1D,CAAC,eAAe,IAAI,8BAAC,eAAe,OAAG,CAAC;YACxC,IAAI,CACL,CAAC;IACJ,CAAC;IA4ED,sBAAY,sCAAe;aAA3B;;YACE,IAAM,aAAa,GAAG,CAAA,MAAA,IAAI,CAAC,MAAM,0CAAE,sBAAsB,EAAE,KAAI,CAAC,CAAC;YACjE,OAAO,aAAa,IAAI,IAAI,CAAC,kBAAkB,CAAC;QAClD,CAAC;;;OAAA;IAgDD;;;;;OAKG;IACI,mDAA+B,GAAtC;;QACE,IACE,IAAI,CAAC,KAAK,CAAC,YAAY,KAAK,IAAI;YAChC,IAAI,CAAC,KAAK,CAAC,YAAY,KAAK,SAAS,EACrC;YACA,OAAO,CAAC,IAAI,CAAC,kBAAW,CAAC,mBAAmB,CAAC,CAAC;SAC/C;aAAM;YACL,MAAA,IAAI,CAAC,MAAM,0CAAE,+BAA+B,EAAE,CAAC;SAChD;IACH,CAAC;IAEM,+BAAW,GAAlB,UAAmB,MAAkD;;QACnE,MAAA,IAAI,CAAC,MAAM,0CAAE,WAAW,CAAC,OAAO,CAAC,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,QAAQ,CAAC,CAAC,CAAC;IACtD,CAAC;IAEM,iCAAa,GAApB,UAAqB,MAKpB;;QACC,IAAM,MAAM,GAAG,MAAA,IAAI,CAAC,MAAM,0CAAE,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACpD,IAAM,QAAQ,GAAG,MAAA,IAAI,CAAC,MAAM,0CAAE,eAAe,EAAE,CAAC;QAEhD,IAAI,MAAM,IAAI,QAAQ,EAAE;YACtB,IAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;YAC/D,IAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU;gBAC1C,CAAC,CAAC,QAAQ,CAAC,KAAK;gBAChB,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;YACpB,IAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;YACtE,IAAM,YAAY,GAChB,IAAI,CAAC,GAAG,CACN,CAAC,EACD,UAAU,GAAG,CAAC,MAAA,MAAM,CAAC,YAAY,mCAAI,CAAC,CAAC,GAAG,CAAC,cAAc,GAAG,QAAQ,CAAC,CACtE,GAAG,CAAC,MAAA,MAAM,CAAC,UAAU,mCAAI,CAAC,CAAC,CAAC;YAC/B,MAAA,IAAI,CAAC,MAAM,0CAAE,cAAc,CACzB,YAAY,EACZ,YAAY,EACZ,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,EACxB,IAAI,CACL,CAAC;SACH;IACH,CAAC;IAEM,gCAAY,GAAnB,UAAoB,MAKnB;;QACC,IAAM,KAAK,GAAG,MAAA,MAAA,IAAI,CAAC,KAAK,CAAC,IAAI,0CAAE,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,mCAAI,CAAC,CAAC,CAAC;QAC1D,IAAI,KAAK,IAAI,CAAC,EAAE;YACd,IAAI,CAAC,aAAa,uCAAM,MAAM,KAAE,KAAK,OAAA,IAAG,CAAC;SAC1C;IACH,CAAC;IAEM,kCAAc,GAArB,UAAsB,MAGrB;;QACC,IAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QACpD,IAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;QACpD,MAAA,IAAI,CAAC,MAAM,0CAAE,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC9D,CAAC;IAEM,qCAAiB,GAAxB;;QACE,OAAO,CAAA,MAAA,MAAA,IAAI,CAAC,MAAM,0CAAE,iBAAiB,kDAAI,KAAI,IAAI,CAAC;IACpD,CAAC;IAEM,sCAAkB,GAAzB;;QACE,6DAA6D;QAC7D,aAAa;QACb,OAAO,CAAA,MAAA,MAAA,IAAI,CAAC,MAAM,0CAAE,kBAAkB,kDAAI,KAAI,IAAI,CAAC;IACrD,CAAC;IAOD,sBAAW,8CAAuB;QALlC;;;WAGG;QACH,yDAAyD;aACzD;YACE,OAAO,IAAI,CAAC,MAAM,CAAC;QACrB,CAAC;;;OAAA;IAKD,sBAAW,sCAAe;QAH1B;;WAEG;aACH;YACE,OAAO,IAAI,CAAC,kBAAkB,CAAC;QACjC,CAAC;;;OAAA;IAED;;OAEG;IACI,4CAAwB,GAA/B;QACE,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,WAAW,EAAE,CAAC;IAC1C,CAAC;IAjvBM,sBAAY,GAAG;QACpB,IAAI,EAAE,EAAE;QACR,UAAU,EAAE,CAAC;KACd,CAAC;IAuvBJ,gBAAC;CAAA,AAjyBD,CAA2B,eAAK,CAAC,aAAa,GAiyB7C;AAED,kBAAe,SAAS,CAAC"}
-\ 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/ONYXKEYS.ts b/src/ONYXKEYS.ts
index 3959f76a626f..dc82f542068f 100755
--- a/src/ONYXKEYS.ts
+++ b/src/ONYXKEYS.ts
@@ -312,9 +312,7 @@ const ONYXKEYS = {
COLLECTION: {
DOWNLOAD: 'download_',
POLICY: 'policy_',
- POLICY_MEMBERS: 'policyMembers_',
POLICY_DRAFTS: 'policyDrafts_',
- POLICY_MEMBERS_DRAFTS: 'policyMembersDrafts_',
POLICY_JOIN_MEMBER: 'policyJoinMember_',
POLICY_CATEGORIES: 'policyCategories_',
POLICY_RECENTLY_USED_CATEGORIES: 'policyRecentlyUsedCategories_',
@@ -526,10 +524,8 @@ type OnyxCollectionValuesMapping = {
[ONYXKEYS.COLLECTION.POLICY_DRAFTS]: OnyxTypes.Policy;
[ONYXKEYS.COLLECTION.POLICY_CATEGORIES]: OnyxTypes.PolicyCategories;
[ONYXKEYS.COLLECTION.POLICY_TAGS]: OnyxTypes.PolicyTagList;
- [ONYXKEYS.COLLECTION.POLICY_MEMBERS]: OnyxTypes.PolicyMembers;
- [ONYXKEYS.COLLECTION.POLICY_MEMBERS_DRAFTS]: OnyxTypes.PolicyMember;
[ONYXKEYS.COLLECTION.POLICY_RECENTLY_USED_CATEGORIES]: OnyxTypes.RecentlyUsedCategories;
- [ONYXKEYS.COLLECTION.DEPRECATED_POLICY_MEMBER_LIST]: OnyxTypes.PolicyMembers;
+ [ONYXKEYS.COLLECTION.DEPRECATED_POLICY_MEMBER_LIST]: OnyxTypes.PolicyEmployeeList;
[ONYXKEYS.COLLECTION.WORKSPACE_INVITE_MEMBERS_DRAFT]: OnyxTypes.InvitedEmailsToAccountIDs;
[ONYXKEYS.COLLECTION.WORKSPACE_INVITE_MESSAGE_DRAFT]: string;
[ONYXKEYS.COLLECTION.REPORT]: OnyxTypes.Report;
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({
/>
)}
-
+
boolean;
type IndicatorOnyxProps = {
- /** The employee list of all policies (coming from Onyx) */
- allPolicyMembers: OnyxCollection;
-
/** All the user's policies (from Onyx via withFullPolicy) */
policies: OnyxCollection;
@@ -40,14 +37,13 @@ type IndicatorOnyxProps = {
type IndicatorProps = IndicatorOnyxProps;
-function Indicator({reimbursementAccount, allPolicyMembers, policies, bankAccountList, fundList, userWallet, walletTerms, loginList}: IndicatorOnyxProps) {
+function Indicator({reimbursementAccount, policies, bankAccountList, fundList, userWallet, walletTerms, loginList}: IndicatorOnyxProps) {
const theme = useTheme();
const styles = useThemeStyles();
// If a policy was just deleted from Onyx, then Onyx will pass a null value to the props, and
// those should be cleaned out before doing any error checking
const cleanPolicies = Object.fromEntries(Object.entries(policies ?? {}).filter(([, policy]) => policy?.id));
- const cleanAllPolicyMembers = Object.fromEntries(Object.entries(allPolicyMembers ?? {}).filter(([, policyMembers]) => !!policyMembers));
// All of the error & info-checking methods are put into an array. This is so that using _.some() will return
// early as soon as the first error / info condition is returned. This makes the checks very efficient since
@@ -57,7 +53,7 @@ function Indicator({reimbursementAccount, allPolicyMembers, policies, bankAccoun
() => PaymentMethods.hasPaymentMethodError(bankAccountList, fundList),
() => Object.values(cleanPolicies).some(PolicyUtils.hasPolicyError),
() => Object.values(cleanPolicies).some(PolicyUtils.hasCustomUnitsError),
- () => Object.values(cleanAllPolicyMembers).some(PolicyUtils.hasPolicyMemberError),
+ () => Object.values(cleanPolicies).some(PolicyUtils.hasEmployeeListError),
() => Object.keys(reimbursementAccount?.errors ?? {}).length > 0,
() => !!loginList && UserUtils.hasLoginListError(loginList),
@@ -77,9 +73,6 @@ function Indicator({reimbursementAccount, allPolicyMembers, policies, bankAccoun
Indicator.displayName = 'Indicator';
export default withOnyx({
- allPolicyMembers: {
- key: ONYXKEYS.COLLECTION.POLICY_MEMBERS,
- },
policies: {
key: ONYXKEYS.COLLECTION.POLICY,
},
diff --git a/src/components/MoneyTemporaryForRefactorRequestConfirmationList.tsx b/src/components/MoneyTemporaryForRefactorRequestConfirmationList.tsx
index 21815f00253b..f460b9d8e88c 100755
--- a/src/components/MoneyTemporaryForRefactorRequestConfirmationList.tsx
+++ b/src/components/MoneyTemporaryForRefactorRequestConfirmationList.tsx
@@ -27,6 +27,7 @@ import * as ReceiptUtils from '@libs/ReceiptUtils';
import * as ReportUtils from '@libs/ReportUtils';
import playSound, {SOUNDS} from '@libs/Sound';
import * as TransactionUtils from '@libs/TransactionUtils';
+import tryResolveUrlFromApiRoot from '@libs/tryResolveUrlFromApiRoot';
import * as IOU from '@userActions/IOU';
import CONST from '@src/CONST';
import ONYXKEYS from '@src/ONYXKEYS';
@@ -160,6 +161,8 @@ type MoneyRequestConfirmationListProps = MoneyRequestConfirmationListOnyxProps &
hasSmartScanFailed?: boolean;
reportActionID?: string;
+
+ action?: ValueOf;
};
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 4aac07863c36..9e6fb31d0316 100644
--- a/src/components/SelectionList/BaseListItem.tsx
+++ b/src/components/SelectionList/BaseListItem.tsx
@@ -30,6 +30,7 @@ function BaseListItem({
isFocused,
shouldSyncFocus = true,
onFocus = () => {},
+ hoverStyle,
}: BaseListItemProps) {
const theme = useTheme();
const styles = useThemeStyles();
@@ -69,7 +70,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 2fc8a0ebfee6..d07d658f6b12 100644
--- a/src/components/SelectionList/TableListItem.tsx
+++ b/src/components/SelectionList/TableListItem.tsx
@@ -60,6 +60,7 @@ function TableListItem({
keyForList={item.keyForList}
onFocus={onFocus}
shouldSyncFocus={shouldSyncFocus}
+ hoverStyle={item.isSelected && styles.activeComponentBG}
>
{(hovered) => (
<>
diff --git a/src/components/SelectionList/types.ts b/src/components/SelectionList/types.ts
index db9feea756a6..53ebdc36d507 100644
--- a/src/components/SelectionList/types.ts
+++ b/src/components/SelectionList/types.ts
@@ -154,6 +154,7 @@ type BaseListItemProps = CommonListItemProps & {
FooterComponent?: ReactElement;
children?: ReactElement> | ((hovered: boolean) => ReactElement>);
shouldSyncFocus?: boolean;
+ hoverStyle?: StyleProp;
};
type UserListItemProps = ListItemProps & {
diff --git a/src/languages/en.ts b/src/languages/en.ts
index 9451407c822f..7c379dec347d 100755
--- a/src/languages/en.ts
+++ b/src/languages/en.ts
@@ -602,8 +602,8 @@ export default {
sendMoney: 'Send money',
assignTask: 'Assign task',
header: 'Quick action',
- trackManual: 'Track manual',
- trackScan: 'Track scan',
+ trackManual: 'Track expense',
+ trackScan: 'Track receipt',
trackDistance: 'Track distance',
},
iou: {
@@ -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/AppNavigator/ReportScreenIDSetter.ts b/src/libs/Navigation/AppNavigator/ReportScreenIDSetter.ts
index 529f0f3d31a7..5407a451682a 100644
--- a/src/libs/Navigation/AppNavigator/ReportScreenIDSetter.ts
+++ b/src/libs/Navigation/AppNavigator/ReportScreenIDSetter.ts
@@ -3,10 +3,10 @@ import type {OnyxCollection, OnyxEntry} from 'react-native-onyx';
import {withOnyx} from 'react-native-onyx';
import useActiveWorkspace from '@hooks/useActiveWorkspace';
import usePermissions from '@hooks/usePermissions';
-import {getPolicyMembersByIdWithoutCurrentUser} from '@libs/PolicyUtils';
+import {getPolicyEmployeeListByIdWithoutCurrentUser} from '@libs/PolicyUtils';
import * as ReportUtils from '@libs/ReportUtils';
import ONYXKEYS from '@src/ONYXKEYS';
-import type {Policy, PolicyMembers, Report, ReportMetadata} from '@src/types/onyx';
+import type {PersonalDetailsList, Policy, Report, ReportMetadata} from '@src/types/onyx';
import type {ReportScreenWrapperProps} from './ReportScreenWrapper';
type ReportScreenIDSetterComponentProps = {
@@ -16,8 +16,8 @@ type ReportScreenIDSetterComponentProps = {
/** The policies which the user has access to */
policies: OnyxCollection;
- /** Members of all the workspaces the user is member of */
- policyMembers: OnyxCollection;
+ /** The personal details of the person who is logged in */
+ personalDetails: OnyxEntry;
/** Whether user is a new user */
isFirstTimeNewExpensifyUser: OnyxEntry;
@@ -58,7 +58,7 @@ const getLastAccessedReportID = (
};
// This wrapper is reponsible for opening the last accessed report if there is no reportID specified in the route params
-function ReportScreenIDSetter({route, reports, policies, policyMembers = {}, navigation, isFirstTimeNewExpensifyUser = false, reportMetadata, accountID}: ReportScreenIDSetterProps) {
+function ReportScreenIDSetter({route, reports, policies, navigation, isFirstTimeNewExpensifyUser = false, reportMetadata, accountID, personalDetails}: ReportScreenIDSetterProps) {
const {canUseDefaultRooms} = usePermissions();
const {activeWorkspaceID} = useActiveWorkspace();
@@ -73,7 +73,7 @@ function ReportScreenIDSetter({route, reports, policies, policyMembers = {}, nav
return;
}
- const policyMemberAccountIDs = getPolicyMembersByIdWithoutCurrentUser(policyMembers, activeWorkspaceID, accountID);
+ const policyMemberAccountIDs = getPolicyEmployeeListByIdWithoutCurrentUser(policies, activeWorkspaceID, accountID);
// If there is no reportID in route, try to find last accessed and use it for setParams
const reportID = getLastAccessedReportID(
@@ -92,7 +92,7 @@ function ReportScreenIDSetter({route, reports, policies, policyMembers = {}, nav
if (reportID) {
navigation.setParams({reportID: String(reportID)});
}
- }, [route, navigation, reports, canUseDefaultRooms, policies, isFirstTimeNewExpensifyUser, reportMetadata, activeWorkspaceID, policyMembers, accountID]);
+ }, [route, navigation, reports, canUseDefaultRooms, policies, isFirstTimeNewExpensifyUser, reportMetadata, activeWorkspaceID, personalDetails, accountID]);
// The ReportScreen without the reportID set will display a skeleton
// until the reportID is loaded and set in the route param
@@ -110,10 +110,6 @@ export default withOnyx session?.accountID,
},
+ personalDetails: {
+ key: ONYXKEYS.PERSONAL_DETAILS_LIST,
+ },
})(ReportScreenIDSetter);
diff --git a/src/libs/Navigation/dismissModalWithReport.ts b/src/libs/Navigation/dismissModalWithReport.ts
index 2622cc2b9855..c0405c2c9da0 100644
--- a/src/libs/Navigation/dismissModalWithReport.ts
+++ b/src/libs/Navigation/dismissModalWithReport.ts
@@ -3,7 +3,7 @@ import type {NavigationContainerRef} from '@react-navigation/native';
import {StackActions} from '@react-navigation/native';
import {findLastIndex} from 'lodash';
import Log from '@libs/Log';
-import getPolicyMemberAccountIDs from '@libs/PolicyMembersUtils';
+import getPolicyEmployeeAccountIDs from '@libs/PolicyEmployeeListUtils';
import {doesReportBelongToWorkspace} from '@libs/ReportUtils';
import NAVIGATORS from '@src/NAVIGATORS';
import ROUTES from '@src/ROUTES';
@@ -47,7 +47,7 @@ function dismissModalWithReport(targetReport: Report | EmptyObject, navigationRe
if (targetReport.reportID !== getTopmostReportId(state)) {
const reportState = getStateFromPath(ROUTES.REPORT_WITH_ID.getRoute(targetReport.reportID));
const policyID = getPolicyIDFromState(state as State);
- const policyMemberAccountIDs = getPolicyMemberAccountIDs(policyID);
+ const policyMemberAccountIDs = getPolicyEmployeeAccountIDs(policyID);
const shouldOpenAllWorkspace = isEmptyObject(targetReport) ? true : !doesReportBelongToWorkspace(targetReport, policyMemberAccountIDs, policyID);
if (shouldOpenAllWorkspace) {
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/Notification/PushNotification/subscribeToReportCommentPushNotifications.ts b/src/libs/Notification/PushNotification/subscribeToReportCommentPushNotifications.ts
index 36051fa35c56..4b17adf86841 100644
--- a/src/libs/Notification/PushNotification/subscribeToReportCommentPushNotifications.ts
+++ b/src/libs/Notification/PushNotification/subscribeToReportCommentPushNotifications.ts
@@ -3,7 +3,7 @@ import * as OnyxUpdates from '@libs/actions/OnyxUpdates';
import * as ActiveClientManager from '@libs/ActiveClientManager';
import Log from '@libs/Log';
import Navigation from '@libs/Navigation/Navigation';
-import getPolicyMemberAccountIDs from '@libs/PolicyMembersUtils';
+import getPolicyEmployeeAccountIDs from '@libs/PolicyEmployeeListUtils';
import {extractPolicyIDFromPath} from '@libs/PolicyUtils';
import {doesReportBelongToWorkspace, getReport} from '@libs/ReportUtils';
import Visibility from '@libs/Visibility';
@@ -65,9 +65,9 @@ export default function subscribeToReportCommentPushNotifications() {
const policyID = lastVisitedPath && extractPolicyIDFromPath(lastVisitedPath);
const report = getReport(reportID.toString());
- const policyMembersAccountIDs = policyID ? getPolicyMemberAccountIDs(policyID) : [];
+ const policyEmployeeAccountIDs = policyID ? getPolicyEmployeeAccountIDs(policyID) : [];
- const reportBelongsToWorkspace = policyID && !isEmptyObject(report) && doesReportBelongToWorkspace(report, policyMembersAccountIDs, policyID);
+ const reportBelongsToWorkspace = policyID && !isEmptyObject(report) && doesReportBelongToWorkspace(report, policyEmployeeAccountIDs, policyID);
Log.info('[PushNotification] onSelected() - called', false, {reportID, reportActionID});
Navigation.isNavigationReady()
diff --git a/src/libs/PolicyEmployeeListUtils.ts b/src/libs/PolicyEmployeeListUtils.ts
new file mode 100644
index 000000000000..305ffda87e28
--- /dev/null
+++ b/src/libs/PolicyEmployeeListUtils.ts
@@ -0,0 +1,25 @@
+import type {OnyxCollection} from 'react-native-onyx';
+import Onyx from 'react-native-onyx';
+import ONYXKEYS from '@src/ONYXKEYS';
+import type {Policy} from '@src/types/onyx';
+import {getCurrentUserAccountID} from './actions/Report';
+import {getPolicyEmployeeListByIdWithoutCurrentUser} from './PolicyUtils';
+
+let allPolicies: OnyxCollection = {};
+Onyx.connect({
+ key: ONYXKEYS.COLLECTION.POLICY,
+ waitForCollectionCallback: true,
+ callback: (value) => (allPolicies = value),
+});
+
+function getPolicyEmployeeAccountIDs(policyID?: string) {
+ if (!policyID) {
+ return [];
+ }
+
+ const currentUserAccountID = getCurrentUserAccountID();
+
+ return getPolicyEmployeeListByIdWithoutCurrentUser(allPolicies, policyID, currentUserAccountID);
+}
+
+export default getPolicyEmployeeAccountIDs;
diff --git a/src/libs/PolicyMembersUtils.ts b/src/libs/PolicyMembersUtils.ts
deleted file mode 100644
index 4376de150f17..000000000000
--- a/src/libs/PolicyMembersUtils.ts
+++ /dev/null
@@ -1,25 +0,0 @@
-import type {OnyxCollection} from 'react-native-onyx';
-import Onyx from 'react-native-onyx';
-import ONYXKEYS from '@src/ONYXKEYS';
-import type {PolicyMembers} from '@src/types/onyx';
-import {getCurrentUserAccountID} from './actions/Report';
-import {getPolicyMembersByIdWithoutCurrentUser} from './PolicyUtils';
-
-let policyMembers: OnyxCollection;
-Onyx.connect({
- key: ONYXKEYS.COLLECTION.POLICY_MEMBERS,
- waitForCollectionCallback: true,
- callback: (value) => (policyMembers = value),
-});
-
-function getPolicyMemberAccountIDs(policyID?: string) {
- if (!policyID) {
- return [];
- }
-
- const currentUserAccountID = getCurrentUserAccountID();
-
- return getPolicyMembersByIdWithoutCurrentUser(policyMembers, policyID, currentUserAccountID);
-}
-
-export default getPolicyMemberAccountIDs;
diff --git a/src/libs/PolicyUtils.ts b/src/libs/PolicyUtils.ts
index b162a7c6df93..b4cf4b164a19 100644
--- a/src/libs/PolicyUtils.ts
+++ b/src/libs/PolicyUtils.ts
@@ -4,13 +4,14 @@ import type {ValueOf} from 'type-fest';
import CONST from '@src/CONST';
import ONYXKEYS from '@src/ONYXKEYS';
import ROUTES from '@src/ROUTES';
-import type {PersonalDetailsList, Policy, PolicyCategories, PolicyMembers, PolicyTagList, PolicyTags, TaxRate} from '@src/types/onyx';
+import type {Policy, PolicyCategories, PolicyEmployeeList, PolicyTagList, PolicyTags, TaxRate} from '@src/types/onyx';
import type {PolicyFeatureName, Rate} from '@src/types/onyx/Policy';
import type {EmptyObject} from '@src/types/utils/EmptyObject';
import {isEmptyObject} from '@src/types/utils/EmptyObject';
import getPolicyIDFromState from './Navigation/getPolicyIDFromState';
import Navigation, {navigationRef} from './Navigation/Navigation';
import type {RootStackParamList, State} from './Navigation/types';
+import {getPersonalDetailByEmail} from './PersonalDetailsUtils';
type MemberEmailsToAccountIDs = Record;
@@ -25,11 +26,10 @@ function getActivePolicies(policies: OnyxCollection): Policy[] | undefin
}
/**
- * Checks if we have any errors stored within the POLICY_MEMBERS. Determines whether we should show a red brick road error or not.
- * Data structure: {accountID: {role:'user', errors: []}, accountID2: {role:'admin', errors: [{1231312313: 'Unable to do X'}]}, ...}
+ * Checks if we have any errors stored within the policy?.employeeList. Determines whether we should show a red brick road error or not.
*/
-function hasPolicyMemberError(policyMembers: OnyxEntry): boolean {
- return Object.values(policyMembers ?? {}).some((member) => Object.keys(member?.errors ?? {}).length > 0);
+function hasEmployeeListError(policy: OnyxEntry): boolean {
+ return Object.values(policy?.employeeList ?? {}).some((employee) => Object.keys(employee?.errors ?? {}).length > 0);
}
/**
@@ -90,9 +90,8 @@ function getUnitRateValue(toLocaleDigit: (arg: string) => string, customUnitRate
/**
* Get the brick road indicator status for a policy. The policy has an error status if there is a policy member error, a custom unit error or a field error.
*/
-function getPolicyBrickRoadIndicatorStatus(policy: OnyxEntry, policyMembersCollection: OnyxCollection): ValueOf | undefined {
- const policyMembers = policyMembersCollection?.[`${ONYXKEYS.COLLECTION.POLICY_MEMBERS}${policy?.id}`] ?? {};
- if (hasPolicyMemberError(policyMembers) || hasCustomUnitsError(policy) || hasPolicyErrorFields(policy)) {
+function getPolicyBrickRoadIndicatorStatus(policy: OnyxEntry): ValueOf | undefined {
+ if (hasEmployeeListError(policy) || hasCustomUnitsError(policy) || hasPolicyErrorFields(policy)) {
return CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR;
}
return undefined;
@@ -128,7 +127,7 @@ const isPolicyAdmin = (policy: OnyxEntry | EmptyObject): boolean => poli
*/
const isFreeGroupPolicy = (policy: OnyxEntry | EmptyObject): boolean => policy?.type === CONST.POLICY.TYPE.FREE;
-const isPolicyMember = (policyID: string, policies: OnyxCollection): boolean => Object.values(policies ?? {}).some((policy) => policy?.id === policyID);
+const isPolicyEmployee = (policyID: string, policies: OnyxCollection): boolean => Object.values(policies ?? {}).some((policy) => policy?.id === policyID);
/**
* Checks if the current user is an owner (creator) of the policy.
@@ -140,18 +139,19 @@ const isPolicyOwner = (policy: OnyxEntry, currentUserAccountID: number):
*
* We only return members without errors. Otherwise, the members with errors would immediately be removed before the user has a chance to read the error.
*/
-function getMemberAccountIDsForWorkspace(policyMembers: OnyxEntry, personalDetails: OnyxEntry): MemberEmailsToAccountIDs {
+function getMemberAccountIDsForWorkspace(employeeList: PolicyEmployeeList | undefined): MemberEmailsToAccountIDs {
+ const members = employeeList ?? {};
const memberEmailsToAccountIDs: MemberEmailsToAccountIDs = {};
- Object.keys(policyMembers ?? {}).forEach((accountID) => {
- const member = policyMembers?.[accountID];
+ Object.keys(members).forEach((email) => {
+ const member = members?.[email];
if (Object.keys(member?.errors ?? {})?.length > 0) {
return;
}
- const personalDetail = personalDetails?.[accountID];
+ const personalDetail = getPersonalDetailByEmail(email);
if (!personalDetail?.login) {
return;
}
- memberEmailsToAccountIDs[personalDetail.login] = Number(accountID);
+ memberEmailsToAccountIDs[email] = Number(personalDetail.accountID);
});
return memberEmailsToAccountIDs;
}
@@ -159,19 +159,19 @@ function getMemberAccountIDsForWorkspace(policyMembers: OnyxEntry
/**
* Get login list that we should not show in the workspace invite options
*/
-function getIneligibleInvitees(policyMembers: OnyxEntry, personalDetails: OnyxEntry): string[] {
+function getIneligibleInvitees(employeeList?: PolicyEmployeeList): string[] {
+ const policyEmployeeList = employeeList ?? {};
const memberEmailsToExclude: string[] = [...CONST.EXPENSIFY_EMAILS];
- Object.keys(policyMembers ?? {}).forEach((accountID) => {
- const policyMember = policyMembers?.[accountID];
+ Object.keys(policyEmployeeList).forEach((email) => {
+ const policyEmployee = policyEmployeeList?.[email];
// Policy members that are pending delete or have errors are not valid and we should show them in the invite options (don't exclude them).
- if (policyMember?.pendingAction === CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE || Object.keys(policyMember?.errors ?? {}).length > 0) {
+ if (policyEmployee?.pendingAction === CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE || Object.keys(policyEmployee?.errors ?? {}).length > 0) {
return;
}
- const memberEmail = personalDetails?.[accountID]?.login;
- if (!memberEmail) {
+ if (!email) {
return;
}
- memberEmailsToExclude.push(memberEmail);
+ memberEmailsToExclude.push(email);
});
return memberEmailsToExclude;
@@ -279,12 +279,12 @@ function getPathWithoutPolicyID(path: string) {
return path.replace(CONST.REGEX.PATH_WITHOUT_POLICY_ID, '/');
}
-function getPolicyMembersByIdWithoutCurrentUser(policyMembers: OnyxCollection, currentPolicyID?: string, currentUserAccountID?: number) {
- return policyMembers
- ? Object.keys(policyMembers[`${ONYXKEYS.COLLECTION.POLICY_MEMBERS}${currentPolicyID}`] ?? {})
- .map((policyMemberAccountID) => Number(policyMemberAccountID))
- .filter((policyMemberAccountID) => policyMemberAccountID !== currentUserAccountID)
- : [];
+function getPolicyEmployeeListByIdWithoutCurrentUser(policies: OnyxCollection>, currentPolicyID?: string, currentUserAccountID?: number) {
+ const policy = policies?.[`${ONYXKEYS.COLLECTION.POLICY}${currentPolicyID}`] ?? null;
+ const policyMemberEmailsToAccountIDs = getMemberAccountIDsForWorkspace(policy?.employeeList);
+ return Object.values(policyMemberEmailsToAccountIDs)
+ .map((policyMemberAccountID) => Number(policyMemberAccountID))
+ .filter((policyMemberAccountID) => policyMemberAccountID !== currentUserAccountID);
}
function goBackFromInvalidPolicy() {
@@ -321,7 +321,7 @@ function getPolicyIDFromNavigationState() {
export {
getActivePolicies,
hasAccountingConnections,
- hasPolicyMemberError,
+ hasEmployeeListError,
hasPolicyError,
hasPolicyErrorFields,
hasCustomUnitsError,
@@ -345,12 +345,12 @@ export {
getCleanedTagName,
getCountOfEnabledTagsOfList,
isPendingDeletePolicy,
- isPolicyMember,
+ isPolicyEmployee,
isPolicyOwner,
isPaidGroupPolicy,
extractPolicyIDFromPath,
getPathWithoutPolicyID,
- getPolicyMembersByIdWithoutCurrentUser,
+ getPolicyEmployeeListByIdWithoutCurrentUser,
goBackFromInvalidPolicy,
isPolicyFeatureEnabled,
hasTaxRateError,
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 f7b160bd67e2..f31b4a780c5a 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 = {
@@ -3515,6 +3518,7 @@ function buildOptimisticIOUReportAction(
receipt: Receipt = {},
isOwnPolicyExpenseChat = false,
created = DateUtils.getDBTime(),
+ linkedExpenseReportAction: ReportAction | EmptyObject = {},
): OptimisticIOUReportAction {
const IOUReportID = iouReportID || generateReportID();
@@ -3559,6 +3563,7 @@ function buildOptimisticIOUReportAction(
}
return {
+ ...linkedExpenseReportAction,
actionName: CONST.REPORT.ACTIONS.TYPE.IOU,
actorAccountID: currentUserAccountID,
automatic: false,
@@ -3771,6 +3776,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.
*
@@ -4054,7 +4097,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: [
@@ -4330,8 +4373,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),
@@ -4345,6 +4405,8 @@ function buildTransactionThread(reportAction: OnyxEntry, policy: OnyxEntry, isPolicyMember: boolean): boolean {
+function canLeaveRoom(report: OnyxEntry, isPolicyEmployee: boolean): boolean {
if (!report?.visibility) {
if (
report?.chatType === CONST.REPORT.CHAT_TYPE.POLICY_ADMINS ||
@@ -5036,7 +5102,7 @@ function canLeaveRoom(report: OnyxEntry, isPolicyMember: boolean): boole
// DM chats don't have a chatType
return false;
}
- } else if (isPublicAnnounceRoom(report) && isPolicyMember) {
+ } else if (isPublicAnnounceRoom(report) && isPolicyEmployee) {
return false;
}
return true;
@@ -5646,7 +5712,7 @@ function shouldDisableThread(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 (
@@ -5863,6 +5929,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`
*/
@@ -5981,6 +6072,7 @@ export {
buildOptimisticMoneyRequestEntities,
buildOptimisticReportPreview,
buildOptimisticModifiedExpenseReportAction,
+ buildOptimisticMovedTrackedExpenseModifiedReportAction,
buildOptimisticCancelPaymentReportAction,
updateReportPreview,
buildOptimisticTaskReportAction,
@@ -6123,6 +6215,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/WorkspacesSettingsUtils.ts b/src/libs/WorkspacesSettingsUtils.ts
index 995bcba06a5c..db41bb18aeef 100644
--- a/src/libs/WorkspacesSettingsUtils.ts
+++ b/src/libs/WorkspacesSettingsUtils.ts
@@ -4,13 +4,13 @@ import type {ValueOf} from 'type-fest';
import CONST from '@src/CONST';
import type {TranslationPaths} from '@src/languages/types';
import ONYXKEYS from '@src/ONYXKEYS';
-import type {Policy, PolicyMembers, ReimbursementAccount, Report, ReportActions} from '@src/types/onyx';
+import type {Policy, ReimbursementAccount, Report, ReportActions} from '@src/types/onyx';
import type {Unit} from '@src/types/onyx/Policy';
import * as CollectionUtils from './CollectionUtils';
import * as CurrencyUtils from './CurrencyUtils';
import type {Phrase, PhraseParameters} from './Localize';
import * as OptionsListUtils from './OptionsListUtils';
-import {hasCustomUnitsError, hasPolicyError, hasPolicyMemberError, hasTaxRateError} from './PolicyUtils';
+import {hasCustomUnitsError, hasEmployeeListError, hasPolicyError, hasTaxRateError} from './PolicyUtils';
import * as ReportUtils from './ReportUtils';
type CheckingMethod = () => boolean;
@@ -33,16 +33,6 @@ Onyx.connect({
callback: (value) => (allPolicies = value),
});
-let allPolicyMembers: OnyxCollection;
-
-Onyx.connect({
- key: ONYXKEYS.COLLECTION.POLICY_MEMBERS,
- waitForCollectionCallback: true,
- callback: (val) => {
- allPolicyMembers = val;
- },
-});
-
let reimbursementAccount: OnyxEntry;
Onyx.connect({
@@ -88,17 +78,16 @@ const getBrickRoadForPolicy = (report: Report): BrickRoad => {
return shouldShowGreenDotIndicator ? CONST.BRICK_ROAD_INDICATOR_STATUS.INFO : undefined;
};
-function hasGlobalWorkspaceSettingsRBR(policies: OnyxCollection, policyMembers: OnyxCollection) {
+function hasGlobalWorkspaceSettingsRBR(policies: OnyxCollection) {
// When attempting to open a policy with an invalid policyID, the policy collection is updated to include policy objects with error information.
// Only policies displayed on the policy list page should be verified. Otherwise, the user will encounter an RBR unrelated to any policies on the list.
const cleanPolicies = Object.fromEntries(Object.entries(policies ?? {}).filter(([, policy]) => policy?.id));
- const cleanAllPolicyMembers = Object.fromEntries(Object.entries(policyMembers ?? {}).filter(([, policyMemberValues]) => !!policyMemberValues));
const errorCheckingMethods: CheckingMethod[] = [
() => Object.values(cleanPolicies).some(hasPolicyError),
() => Object.values(cleanPolicies).some(hasCustomUnitsError),
() => Object.values(cleanPolicies).some(hasTaxRateError),
- () => Object.values(cleanAllPolicyMembers).some(hasPolicyMemberError),
+ () => Object.values(cleanPolicies).some(hasEmployeeListError),
() => Object.keys(reimbursementAccount?.errors ?? {}).length > 0,
];
@@ -106,7 +95,7 @@ function hasGlobalWorkspaceSettingsRBR(policies: OnyxCollection, policyM
}
function hasWorkspaceSettingsRBR(policy: Policy) {
- const policyMemberError = allPolicyMembers ? hasPolicyMemberError(allPolicyMembers[`${ONYXKEYS.COLLECTION.POLICY_MEMBERS}${policy.id}`]) : false;
+ const policyMemberError = hasEmployeeListError(policy);
const taxRateError = hasTaxRateError(policy);
return Object.keys(reimbursementAccount?.errors ?? {}).length > 0 || hasPolicyError(policy) || hasCustomUnitsError(policy) || policyMemberError || taxRateError;
@@ -143,7 +132,7 @@ function getChatTabBrickRoad(policyID?: string): BrickRoad | undefined {
function checkIfWorkspaceSettingsTabHasRBR(policyID?: string) {
if (!policyID) {
- return hasGlobalWorkspaceSettingsRBR(allPolicies, allPolicyMembers);
+ return hasGlobalWorkspaceSettingsRBR(allPolicies);
}
const policy = allPolicies ? allPolicies[`${ONYXKEYS.COLLECTION.POLICY}${policyID}`] : null;
diff --git a/src/libs/actions/IOU.ts b/src/libs/actions/IOU.ts
index 85f4b74f3436..896b88988818 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({
@@ -550,20 +578,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,
@@ -572,6 +591,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,
@@ -691,7 +720,10 @@ function buildOnyxDataForMoneyRequest(
},
},
},
- {
+ );
+
+ if (!isEmptyObject(transactionThreadCreatedReportAction)) {
+ successData.push({
onyxMethod: Onyx.METHOD.MERGE,
key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${transactionThreadReport.reportID}`,
value: {
@@ -700,8 +732,8 @@ function buildOnyxDataForMoneyRequest(
errors: null,
},
},
- },
- );
+ });
+ }
const errorKey = DateUtils.getMicroseconds();
@@ -737,9 +769,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'),
+ },
},
},
{
@@ -775,16 +809,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)) {
@@ -813,16 +850,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({
@@ -897,14 +936,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,
@@ -913,6 +944,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) {
@@ -982,7 +1023,10 @@ function buildOnyxDataForTrackExpense(
pendingFields: clearedPendingFields,
},
},
- {
+ );
+
+ if (!isEmptyObject(transactionThreadCreatedReportAction)) {
+ successData.push({
onyxMethod: Onyx.METHOD.MERGE,
key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${transactionThreadReport.reportID}`,
value: {
@@ -991,8 +1035,8 @@ function buildOnyxDataForTrackExpense(
errors: null,
},
},
- },
- );
+ });
+ }
const failureData: OnyxUpdate[] = [];
@@ -1061,9 +1105,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'),
+ },
},
},
{
@@ -1105,6 +1151,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
@@ -1128,6 +1338,7 @@ function getMoneyRequestInformation(
payeeAccountID = userAccountID,
payeeEmail = currentUserEmail,
moneyRequestReportID = '',
+ linkedTrackedExpenseReportAction?: OnyxTypes.ReportAction,
): MoneyRequestInformation {
const payerEmail = PhoneNumber.addSMSDomainIfPhoneNumber(participant.login ?? '');
const payerAccountID = Number(participant.accountID);
@@ -1177,7 +1388,6 @@ function getMoneyRequestInformation(
} else {
iouReport = IOUUtils.updateIOUOwnerAndTotal(iouReport, payeeAccountID, amount, currency);
}
-
// STEP 3: Build optimistic receipt and transaction
const receiptObject: Receipt = {};
let filename;
@@ -1186,7 +1396,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,
@@ -1240,9 +1450,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 {
@@ -1284,8 +1498,8 @@ function getMoneyRequestInformation(
optimisticPolicyRecentlyUsedCategories,
optimisticPolicyRecentlyUsedTags,
isNewChatReport,
- optimisticTransactionThread,
- optimisticCreatedActionForTransactionThread,
+ optimisticTransactionThread ?? {},
+ optimisticCreatedActionForTransactionThread ?? {},
shouldCreateNewMoneyRequestReport,
policy,
policyTagList,
@@ -1303,8 +1517,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,
@@ -1335,6 +1549,8 @@ function getTrackExpenseInformation(
payeeEmail = currentUserEmail,
payeeAccountID = userAccountID,
moneyRequestReportID = '',
+ linkedTrackedExpenseReportAction?: OnyxTypes.ReportAction,
+ existingTransactionID?: string,
): TrackExpenseInformation | EmptyObject {
const isPolicyExpenseChat = participant.isPolicyExpenseChat;
@@ -1390,7 +1606,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,
@@ -1403,7 +1619,7 @@ function getTrackExpenseInformation(
merchant,
receiptObject,
filename,
- null,
+ existingTransactionID ?? null,
category,
tag,
billable,
@@ -1440,16 +1656,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;
@@ -1464,8 +1682,8 @@ function getTrackExpenseInformation(
optimisticCreatedActionForIOUReport,
iouAction,
reportPreviewAction,
- optimisticTransactionThread,
- optimisticCreatedActionForTransactionThread,
+ optimisticTransactionThread ?? {},
+ (optimisticCreatedActionForTransactionThread as OptimisticCreatedReportAction) ?? {}, // Add type assertion here
shouldCreateNewMoneyRequestReport,
policy,
policyTagList,
@@ -2239,28 +2457,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});
}
/**
@@ -2286,12 +2784,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,
@@ -2306,7 +2810,7 @@ function requestMoney(
createdReportActionIDForThread,
onyxData,
} = getMoneyRequestInformation(
- currentChatReport,
+ isMovingTransactionFromTrackExpense ? {} : currentChatReport,
participant,
comment,
amount,
@@ -2314,7 +2818,7 @@ function requestMoney(
currentCreated,
merchant,
receipt,
- undefined,
+ isMovingTransactionFromTrackExpense ? (linkedTrackedExpenseReportAction?.originalMessage as IOUMessage)?.IOUTransactionID : undefined,
category,
tag,
billable,
@@ -2324,39 +2828,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);
@@ -2387,10 +2926,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 {
@@ -2422,39 +2966,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);
}
@@ -2801,7 +3416,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 {
@@ -3470,7 +4085,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 {
@@ -3872,7 +4487,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;
@@ -4179,152 +4794,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});
@@ -4652,7 +5122,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);
}
@@ -5379,8 +5849,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[] = [
{
@@ -5589,4 +6060,5 @@ export {
trackExpense,
canIOUBePaid,
canApproveIOU,
+ createDraftTransaction,
};
diff --git a/src/libs/actions/Policy.ts b/src/libs/actions/Policy.ts
index 74965bcaca13..fffc992746d9 100644
--- a/src/libs/actions/Policy.ts
+++ b/src/libs/actions/Policy.ts
@@ -79,7 +79,7 @@ import type {
Policy,
PolicyCategories,
PolicyCategory,
- PolicyMember,
+ PolicyEmployee,
PolicyOwnershipChangeChecks,
PolicyTag,
PolicyTagList,
@@ -182,15 +182,6 @@ Onyx.connect({
callback: (value) => (allReports = value),
});
-let allPolicyMembers: OnyxCollection;
-Onyx.connect({
- key: ONYXKEYS.COLLECTION.POLICY_MEMBERS,
- waitForCollectionCallback: true,
- callback: (val) => {
- allPolicyMembers = val;
- },
-});
-
let lastAccessedWorkspacePolicyID: OnyxEntry = null;
Onyx.connect({
key: ONYXKEYS.LAST_ACCESSED_WORKSPACE_POLICY_ID,
@@ -841,28 +832,29 @@ function removeMembers(accountIDs: number[], policyID: string) {
return;
}
- const membersListKey = `${ONYXKEYS.COLLECTION.POLICY_MEMBERS}${policyID}` as const;
+ const policyKey = `${ONYXKEYS.COLLECTION.POLICY}${policyID}` as const;
const policy = getPolicy(policyID);
const workspaceChats = ReportUtils.getWorkspaceChats(policyID, accountIDs);
+ const emailList = accountIDs.map((accountID) => allPersonalDetails?.[accountID]?.login).filter((login) => !!login) as string[];
const optimisticClosedReportActions = workspaceChats.map(() => ReportUtils.buildOptimisticClosedReportAction(sessionEmail, policy.name, CONST.REPORT.ARCHIVE_REASON.REMOVED_FROM_POLICY));
const announceRoomMembers = removeOptimisticAnnounceRoomMembers(policy.id, policy.name, accountIDs);
- const optimisticMembersState: OnyxCollection = {};
- const successMembersState: OnyxCollection = {};
- const failureMembersState: OnyxCollection = {};
- accountIDs.forEach((accountID) => {
- optimisticMembersState[accountID] = {pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE};
- successMembersState[accountID] = null;
- failureMembersState[accountID] = {errors: ErrorUtils.getMicroSecondOnyxError('workspace.people.error.genericRemove')};
+ const optimisticMembersState: OnyxCollection = {};
+ const successMembersState: OnyxCollection = {};
+ const failureMembersState: OnyxCollection = {};
+ emailList.forEach((email) => {
+ optimisticMembersState[email] = {pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE};
+ successMembersState[email] = null;
+ failureMembersState[email] = {errors: ErrorUtils.getMicroSecondOnyxError('workspace.people.error.genericRemove')};
});
const optimisticData: OnyxUpdate[] = [
{
onyxMethod: Onyx.METHOD.MERGE,
- key: membersListKey,
- value: optimisticMembersState,
+ key: policyKey,
+ value: {employeeList: optimisticMembersState},
},
...announceRoomMembers.onyxOptimisticData,
];
@@ -870,8 +862,8 @@ function removeMembers(accountIDs: number[], policyID: string) {
const successData: OnyxUpdate[] = [
{
onyxMethod: Onyx.METHOD.MERGE,
- key: membersListKey,
- value: successMembersState,
+ key: policyKey,
+ value: {employeeList: successMembersState},
},
...announceRoomMembers.onyxSuccessData,
];
@@ -879,8 +871,8 @@ function removeMembers(accountIDs: number[], policyID: string) {
const failureData: OnyxUpdate[] = [
{
onyxMethod: Onyx.METHOD.MERGE,
- key: membersListKey,
- value: failureMembersState,
+ key: policyKey,
+ value: {employeeList: failureMembersState},
},
...announceRoomMembers.onyxFailureData,
];
@@ -926,9 +918,8 @@ function removeMembers(accountIDs: number[], policyID: string) {
// If we delete all these logins then we should clear the informative messages since they are no longer relevant.
if (!isEmptyObject(policy?.primaryLoginsInvited ?? {})) {
// Take the current policy members and remove them optimistically
- const policyMemberAccountIDs = Object.keys(allPolicyMembers?.[`${ONYXKEYS.COLLECTION.POLICY_MEMBERS}${policyID}`] ?? {}).map((accountID) => Number(accountID));
- const remainingMemberAccountIDs = policyMemberAccountIDs.filter((accountID) => !accountIDs.includes(accountID));
- const remainingLogins: string[] = PersonalDetailsUtils.getLoginsByAccountIDs(remainingMemberAccountIDs);
+ const employeeListEmails = Object.keys(allPolicies?.[`${ONYXKEYS.COLLECTION.POLICY}${policyID}`]?.employeeList ?? {});
+ const remainingLogins = employeeListEmails.filter((email) => !emailList.includes(email));
const invitedPrimaryToSecondaryLogins: Record = {};
if (policy.primaryLoginsInvited) {
@@ -939,7 +930,7 @@ function removeMembers(accountIDs: number[], policyID: string) {
if (!remainingLogins.some((remainingLogin) => !!invitedPrimaryToSecondaryLogins[remainingLogin])) {
optimisticData.push({
onyxMethod: Onyx.METHOD.MERGE,
- key: membersListKey,
+ key: policyKey,
value: {
primaryLoginsInvited: null,
},
@@ -969,7 +960,7 @@ function removeMembers(accountIDs: number[], policyID: string) {
});
const params: DeleteMembersFromWorkspaceParams = {
- emailList: accountIDs.map((accountID) => allPersonalDetails?.[accountID]?.login).join(','),
+ emailList: emailList.join(','),
policyID,
};
@@ -977,52 +968,47 @@ function removeMembers(accountIDs: number[], policyID: string) {
}
function leaveWorkspace(policyID: string) {
- const membersListKey = `${ONYXKEYS.COLLECTION.POLICY_MEMBERS}${policyID}` as const;
const policy = allPolicies?.[`${ONYXKEYS.COLLECTION.POLICY}${policyID}`];
const workspaceChats = ReportUtils.getAllWorkspaceReports(policyID);
const optimisticData: OnyxUpdate[] = [
- {
- onyxMethod: Onyx.METHOD.MERGE,
- key: membersListKey,
- value: {
- [sessionAccountID]: {
- pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE,
- },
- },
- },
{
onyxMethod: Onyx.METHOD.MERGE,
key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`,
value: {
pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE,
+ employeeList: {
+ [sessionEmail]: {
+ pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE,
+ },
+ },
},
},
];
+
const successData: OnyxUpdate[] = [
{
onyxMethod: Onyx.METHOD.MERGE,
- key: membersListKey,
+ key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`,
value: {
- [sessionAccountID]: null,
+ pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE,
+ employeeList: {
+ [sessionEmail]: null,
+ },
},
},
];
const failureData: OnyxUpdate[] = [
- {
- onyxMethod: Onyx.METHOD.MERGE,
- key: membersListKey,
- value: {
- [sessionAccountID]: {
- errors: ErrorUtils.getMicroSecondOnyxError('workspace.people.error.genericRemove'),
- },
- },
- },
{
onyxMethod: Onyx.METHOD.MERGE,
key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`,
value: {
pendingAction: policy?.pendingAction,
+ employeeList: {
+ [sessionEmail]: {
+ errors: ErrorUtils.getMicroSecondOnyxError('workspace.people.error.genericRemove'),
+ },
+ },
},
},
];
@@ -1071,7 +1057,7 @@ function leaveWorkspace(policyID: string) {
}
function updateWorkspaceMembersRole(policyID: string, accountIDs: number[], newRole: typeof CONST.POLICY.ROLE.ADMIN | typeof CONST.POLICY.ROLE.USER) {
- const previousPolicyMembers = {...allPolicyMembers};
+ const previousEmployeeList = {...allPolicies?.[policyID]?.employeeList};
const memberRoles: WorkspaceMembersRoleData[] = accountIDs.reduce((result: WorkspaceMembersRoleData[], accountID: number) => {
if (!allPersonalDetails?.[accountID]?.login) {
return result;
@@ -1089,13 +1075,15 @@ function updateWorkspaceMembersRole(policyID: string, accountIDs: number[], newR
const optimisticData: OnyxUpdate[] = [
{
onyxMethod: Onyx.METHOD.MERGE,
- key: `${ONYXKEYS.COLLECTION.POLICY_MEMBERS}${policyID}`,
+ key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`,
value: {
- ...memberRoles.reduce((member: Record, current) => {
- // eslint-disable-next-line no-param-reassign
- member[current.accountID] = {role: current?.role, pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE};
- return member;
- }, {}),
+ employeeList: {
+ ...memberRoles.reduce((member: Record, current) => {
+ // eslint-disable-next-line no-param-reassign
+ member[current.email] = {role: current?.role, pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE};
+ return member;
+ }, {}),
+ },
errors: null,
},
},
@@ -1104,13 +1092,15 @@ function updateWorkspaceMembersRole(policyID: string, accountIDs: number[], newR
const successData: OnyxUpdate[] = [
{
onyxMethod: Onyx.METHOD.MERGE,
- key: `${ONYXKEYS.COLLECTION.POLICY_MEMBERS}${policyID}`,
+ key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`,
value: {
- ...memberRoles.reduce((member: Record, current) => {
- // eslint-disable-next-line no-param-reassign
- member[current.accountID] = {role: current?.role, pendingAction: null};
- return member;
- }, {}),
+ employeeList: {
+ ...memberRoles.reduce((member: Record, current) => {
+ // eslint-disable-next-line no-param-reassign
+ member[current.email] = {role: current?.role, pendingAction: null};
+ return member;
+ }, {}),
+ },
errors: null,
},
},
@@ -1119,9 +1109,9 @@ function updateWorkspaceMembersRole(policyID: string, accountIDs: number[], newR
const failureData: OnyxUpdate[] = [
{
onyxMethod: Onyx.METHOD.MERGE,
- key: `${ONYXKEYS.COLLECTION.POLICY_MEMBERS}${policyID}`,
+ key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`,
value: {
- ...(previousPolicyMembers[`${ONYXKEYS.COLLECTION.POLICY_MEMBERS}${policyID}`] as Record),
+ employeeList: previousEmployeeList,
errors: ErrorUtils.getMicroSecondOnyxError('workspace.editor.genericFailureMessage'),
},
},
@@ -1391,7 +1381,7 @@ function createPolicyExpenseChats(policyID: string, invitedEmailsToAccountIDs: I
* Please see https://github.com/Expensify/App/blob/main/README.md#Security for more details
*/
function addMembersToWorkspace(invitedEmailsToAccountIDs: InvitedEmailsToAccountIDs, welcomeNote: string, policyID: string) {
- const membersListKey = `${ONYXKEYS.COLLECTION.POLICY_MEMBERS}${policyID}` as const;
+ const policyKey = `${ONYXKEYS.COLLECTION.POLICY}${policyID}` as const;
const logins = Object.keys(invitedEmailsToAccountIDs).map((memberLogin) => PhoneNumber.addSMSDomainIfPhoneNumber(memberLogin));
const accountIDs = Object.values(invitedEmailsToAccountIDs);
@@ -1403,14 +1393,13 @@ function addMembersToWorkspace(invitedEmailsToAccountIDs: InvitedEmailsToAccount
// create onyx data for policy expense chats for each new member
const membersChats = createPolicyExpenseChats(policyID, invitedEmailsToAccountIDs);
- const optimisticMembersState: OnyxCollection = {};
- const failureMembersState: OnyxCollection = {};
- accountIDs.forEach((accountID) => {
- optimisticMembersState[accountID] = {
- pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD,
- role: CONST.POLICY.ROLE.USER,
- };
- failureMembersState[accountID] = {
+ const optimisticMembersState: OnyxCollection = {};
+ const successMembersState: OnyxCollection = {};
+ const failureMembersState: OnyxCollection = {};
+ Object.keys(invitedEmailsToAccountIDs).forEach((email) => {
+ optimisticMembersState[email] = {pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD, role: CONST.POLICY.ROLE.USER};
+ successMembersState[email] = {pendingAction: null};
+ failureMembersState[email] = {
errors: ErrorUtils.getMicroSecondOnyxError('workspace.people.error.genericAdd'),
};
});
@@ -1418,10 +1407,12 @@ function addMembersToWorkspace(invitedEmailsToAccountIDs: InvitedEmailsToAccount
const optimisticData: OnyxUpdate[] = [
{
onyxMethod: Onyx.METHOD.MERGE,
- key: membersListKey,
+ key: policyKey,
// Convert to object with each key containing {pendingAction: ‘add’}
- value: optimisticMembersState,
+ value: {
+ employeeList: optimisticMembersState,
+ },
},
...newPersonalDetailsOnyxData.optimisticData,
...membersChats.onyxOptimisticData,
@@ -1431,19 +1422,10 @@ function addMembersToWorkspace(invitedEmailsToAccountIDs: InvitedEmailsToAccount
const successData: OnyxUpdate[] = [
{
onyxMethod: Onyx.METHOD.MERGE,
- key: membersListKey,
-
- // Convert to object with each key clearing pendingAction, when it is an existing account.
- // Remove the object, when it is a newly created account.
- value: accountIDs.reduce((accountIDsWithClearedPendingAction, accountID) => {
- const value = {
- ...allPolicyMembers?.[accountID],
- pendingAction: null,
- errors: null,
- };
-
- return {...accountIDsWithClearedPendingAction, [accountID]: value};
- }, {}),
+ key: policyKey,
+ value: {
+ employeeList: successMembersState,
+ },
},
...newPersonalDetailsOnyxData.finallyData,
...membersChats.onyxSuccessData,
@@ -1453,7 +1435,7 @@ function addMembersToWorkspace(invitedEmailsToAccountIDs: InvitedEmailsToAccount
const failureData: OnyxUpdate[] = [
{
onyxMethod: Onyx.METHOD.MERGE,
- key: membersListKey,
+ key: policyKey,
// Convert to object with each key containing the error. We don’t
// need to remove the members since that is handled by onClose of OfflineWithFeedback.
@@ -1919,10 +1901,13 @@ function updateWorkspaceCustomUnitAndRate(policyID: string, currentCustomUnit: C
* Removes an error after trying to delete a member
*/
function clearDeleteMemberError(policyID: string, accountID: number) {
- Onyx.merge(`${ONYXKEYS.COLLECTION.POLICY_MEMBERS}${policyID}`, {
- [accountID]: {
- pendingAction: null,
- errors: null,
+ const email = allPersonalDetails?.[accountID]?.login ?? '';
+ Onyx.merge(`${ONYXKEYS.COLLECTION.POLICY}${policyID}`, {
+ employeeList: {
+ [email]: {
+ pendingAction: null,
+ errors: null,
+ },
},
});
}
@@ -1931,8 +1916,11 @@ function clearDeleteMemberError(policyID: string, accountID: number) {
* Removes an error after trying to add a member
*/
function clearAddMemberError(policyID: string, accountID: number) {
- Onyx.merge(`${ONYXKEYS.COLLECTION.POLICY_MEMBERS}${policyID}`, {
- [accountID]: null,
+ const email = allPersonalDetails?.[accountID]?.login ?? '';
+ Onyx.merge(`${ONYXKEYS.COLLECTION.POLICY}${policyID}`, {
+ employeeList: {
+ [email]: null,
+ },
});
Onyx.merge(`${ONYXKEYS.PERSONAL_DETAILS_LIST}`, {
[accountID]: null,
@@ -2066,22 +2054,18 @@ function createDraftInitialWorkspace(policyOwnerEmail = '', policyName = '', pol
customUnits,
makeMeAdmin,
autoReporting: true,
+ employeeList: {
+ [sessionEmail]: {
+ role: CONST.POLICY.ROLE.ADMIN,
+ errors: {},
+ },
+ },
approvalMode: CONST.POLICY.APPROVAL_MODE.OPTIONAL,
harvesting: {
enabled: true,
},
},
},
- {
- onyxMethod: Onyx.METHOD.SET,
- key: `${ONYXKEYS.COLLECTION.POLICY_MEMBERS_DRAFTS}${policyID}`,
- value: {
- [sessionAccountID]: {
- role: CONST.POLICY.ROLE.ADMIN,
- errors: {},
- },
- },
- },
];
Onyx.update(optimisticData);
@@ -2114,6 +2098,7 @@ function createWorkspace(policyOwnerEmail = '', makeMeAdmin = false, policyName
expenseReportActionData,
expenseCreatedReportActionID,
} = ReportUtils.buildOptimisticWorkspaceChats(policyID, workspaceName);
+
const optimisticData: OnyxUpdate[] = [
{
onyxMethod: Onyx.METHOD.SET,
@@ -2140,15 +2125,11 @@ function createWorkspace(policyOwnerEmail = '', makeMeAdmin = false, policyName
areWorkflowsEnabled: false,
areReportFieldsEnabled: false,
areConnectionsEnabled: false,
- },
- },
- {
- onyxMethod: Onyx.METHOD.SET,
- key: `${ONYXKEYS.COLLECTION.POLICY_MEMBERS}${policyID}`,
- value: {
- [sessionAccountID]: {
- role: CONST.POLICY.ROLE.ADMIN,
- errors: {},
+ employeeList: {
+ [sessionEmail]: {
+ role: CONST.POLICY.ROLE.ADMIN,
+ errors: {},
+ },
},
},
},
@@ -2202,11 +2183,6 @@ function createWorkspace(policyOwnerEmail = '', makeMeAdmin = false, policyName
key: `${ONYXKEYS.COLLECTION.POLICY_DRAFTS}${policyID}`,
value: null,
},
- {
- onyxMethod: Onyx.METHOD.SET,
- key: `${ONYXKEYS.COLLECTION.POLICY_MEMBERS_DRAFTS}${policyID}`,
- value: null,
- },
];
const successData: OnyxUpdate[] = [
@@ -2277,9 +2253,9 @@ function createWorkspace(policyOwnerEmail = '', makeMeAdmin = false, policyName
const failureData: OnyxUpdate[] = [
{
- onyxMethod: Onyx.METHOD.SET,
- key: `${ONYXKEYS.COLLECTION.POLICY_MEMBERS}${policyID}`,
- value: null,
+ onyxMethod: Onyx.METHOD.MERGE,
+ key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`,
+ value: {employeeList: null},
},
{
onyxMethod: Onyx.METHOD.SET,
@@ -2633,6 +2609,16 @@ function createWorkspaceFromIOUPayment(iouReport: Report | EmptyObject): string
areWorkflowsEnabled: false,
areReportFieldsEnabled: false,
areConnectionsEnabled: false,
+ employeeList: {
+ [sessionEmail]: {
+ role: CONST.POLICY.ROLE.ADMIN,
+ errors: {},
+ },
+ [employeeEmail]: {
+ role: CONST.POLICY.ROLE.USER,
+ errors: {},
+ },
+ },
};
const optimisticData: OnyxUpdate[] = [
@@ -2641,20 +2627,6 @@ function createWorkspaceFromIOUPayment(iouReport: Report | EmptyObject): string
key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`,
value: newWorkspace,
},
- {
- onyxMethod: Onyx.METHOD.SET,
- key: `${ONYXKEYS.COLLECTION.POLICY_MEMBERS}${policyID}`,
- value: {
- [sessionAccountID]: {
- role: CONST.POLICY.ROLE.ADMIN,
- errors: {},
- },
- [employeeAccountID]: {
- role: CONST.POLICY.ROLE.USER,
- errors: {},
- },
- },
- },
{
onyxMethod: Onyx.METHOD.SET,
key: `${ONYXKEYS.COLLECTION.REPORT}${announceChatReportID}`,
@@ -2710,13 +2682,6 @@ function createWorkspaceFromIOUPayment(iouReport: Report | EmptyObject): string
pendingAction: null,
},
},
- {
- onyxMethod: Onyx.METHOD.MERGE,
- key: `${ONYXKEYS.COLLECTION.POLICY_MEMBERS_DRAFTS}${policyID}`,
- value: {
- pendingAction: null,
- },
- },
...employeeWorkspaceChat.onyxOptimisticData,
];
@@ -2787,13 +2752,6 @@ function createWorkspaceFromIOUPayment(iouReport: Report | EmptyObject): string
];
const failureData: OnyxUpdate[] = [
- {
- onyxMethod: Onyx.METHOD.MERGE,
- key: `${ONYXKEYS.COLLECTION.POLICY_MEMBERS}${policyID}`,
- value: {
- pendingAction: null,
- },
- },
{
onyxMethod: Onyx.METHOD.MERGE,
key: `${ONYXKEYS.COLLECTION.REPORT}${announceChatReportID}`,
diff --git a/src/libs/actions/Report.ts b/src/libs/actions/Report.ts
index 1e59cf21f542..f599208ff915 100644
--- a/src/libs/actions/Report.ts
+++ b/src/libs/actions/Report.ts
@@ -59,7 +59,7 @@ import Navigation from '@libs/Navigation/Navigation';
import LocalNotification from '@libs/Notification/LocalNotification';
import * as PersonalDetailsUtils from '@libs/PersonalDetailsUtils';
import * as PhoneNumber from '@libs/PhoneNumber';
-import getPolicyMemberAccountIDs from '@libs/PolicyMembersUtils';
+import getPolicyEmployeeAccountIDs from '@libs/PolicyEmployeeListUtils';
import {extractPolicyIDFromPath} from '@libs/PolicyUtils';
import processReportIDDeeplink from '@libs/processReportIDDeeplink';
import * as Pusher from '@libs/Pusher/pusher';
@@ -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;
@@ -2181,8 +2186,8 @@ function showReportActionNotification(reportID: string, reportAction: ReportActi
const onClick = () =>
Modal.close(() => {
const policyID = lastVisitedPath && extractPolicyIDFromPath(lastVisitedPath);
- const policyMembersAccountIDs = policyID ? getPolicyMemberAccountIDs(policyID) : [];
- const reportBelongsToWorkspace = policyID ? doesReportBelongToWorkspace(report, policyMembersAccountIDs, policyID) : false;
+ const policyEmployeeAccountIDs = policyID ? getPolicyEmployeeAccountIDs(policyID) : [];
+ const reportBelongsToWorkspace = policyID ? doesReportBelongToWorkspace(report, policyEmployeeAccountIDs, policyID) : false;
if (!reportBelongsToWorkspace) {
Navigation.navigateWithSwitchPolicyID({route: ROUTES.HOME});
}
@@ -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/actions/TeachersUnite.ts b/src/libs/actions/TeachersUnite.ts
index 1f8b32724bd4..36fd9d340aeb 100644
--- a/src/libs/actions/TeachersUnite.ts
+++ b/src/libs/actions/TeachersUnite.ts
@@ -96,17 +96,13 @@ function addSchoolPrincipal(firstName: string, partnerUserID: string, lastName:
role: CONST.POLICY.ROLE.USER,
owner: sessionEmail,
outputCurrency: allPersonalDetails?.[sessionAccountID]?.localCurrencyCode ?? CONST.CURRENCY.USD,
- pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD,
- },
- },
- {
- onyxMethod: Onyx.METHOD.SET,
- key: `${ONYXKEYS.COLLECTION.POLICY_MEMBERS}${policyID}`,
- value: {
- [sessionAccountID]: {
- role: CONST.POLICY.ROLE.USER,
- errors: {},
+ employeeList: {
+ [sessionEmail]: {
+ role: CONST.POLICY.ROLE.USER,
+ errors: {},
+ },
},
+ pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD,
},
},
{
@@ -155,9 +151,11 @@ function addSchoolPrincipal(firstName: string, partnerUserID: string, lastName:
const failureData: OnyxUpdate[] = [
{
- onyxMethod: Onyx.METHOD.SET,
- key: `${ONYXKEYS.COLLECTION.POLICY_MEMBERS}${policyID}`,
- value: null,
+ onyxMethod: Onyx.METHOD.MERGE,
+ key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`,
+ value: {
+ [sessionEmail]: null,
+ },
},
{
onyxMethod: Onyx.METHOD.SET,
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/ReportDetailsPage.tsx b/src/pages/ReportDetailsPage.tsx
index 7f1dadab8c0e..0646f37f9b26 100644
--- a/src/pages/ReportDetailsPage.tsx
+++ b/src/pages/ReportDetailsPage.tsx
@@ -67,7 +67,7 @@ function ReportDetailsPage({policies, report, session, personalDetails}: ReportD
const route = useRoute();
const policy = useMemo(() => policies?.[`${ONYXKEYS.COLLECTION.POLICY}${report?.policyID ?? ''}`], [policies, report?.policyID]);
const isPolicyAdmin = useMemo(() => PolicyUtils.isPolicyAdmin(policy ?? null), [policy]);
- const isPolicyMember = useMemo(() => PolicyUtils.isPolicyMember(report?.policyID ?? '', policies), [report?.policyID, policies]);
+ const isPolicyEmployee = useMemo(() => PolicyUtils.isPolicyEmployee(report?.policyID ?? '', policies), [report?.policyID, policies]);
const shouldUseFullTitle = useMemo(() => ReportUtils.shouldUseFullTitleToDisplay(report), [report]);
const isChatRoom = useMemo(() => ReportUtils.isChatRoom(report), [report]);
const isUserCreatedPolicyRoom = useMemo(() => ReportUtils.isUserCreatedPolicyRoom(report), [report]);
@@ -137,9 +137,9 @@ function ReportDetailsPage({policies, report, session, personalDetails}: ReportD
// - The report is a user created room and the room and the current user is a workspace member i.e. non-workspace members should not see this option.
if (
(isGroupChat ||
- (isDefaultRoom && isChatThread && isPolicyMember) ||
+ (isDefaultRoom && isChatThread && isPolicyEmployee) ||
(!isUserCreatedPolicyRoom && participants.length) ||
- (isUserCreatedPolicyRoom && (isPolicyMember || (isChatThread && !ReportUtils.isPublicRoom(report))))) &&
+ (isUserCreatedPolicyRoom && (isPolicyEmployee || (isChatThread && !ReportUtils.isPublicRoom(report))))) &&
!ReportUtils.isConciergeChatReport(report)
) {
items.push({
@@ -157,8 +157,8 @@ function ReportDetailsPage({policies, report, session, personalDetails}: ReportD
},
});
} else if (
- (isUserCreatedPolicyRoom && (!participants.length || !isPolicyMember)) ||
- ((isDefaultRoom || ReportUtils.isPolicyExpenseChat(report)) && isChatThread && !isPolicyMember)
+ (isUserCreatedPolicyRoom && (!participants.length || !isPolicyEmployee)) ||
+ ((isDefaultRoom || ReportUtils.isPolicyExpenseChat(report)) && isChatThread && !isPolicyEmployee)
) {
items.push({
key: CONST.REPORT_DETAILS_MENU_ITEM.INVITE,
@@ -201,7 +201,7 @@ function ReportDetailsPage({policies, report, session, personalDetails}: ReportD
isMoneyRequestReport,
report,
isGroupDMChat,
- isPolicyMember,
+ isPolicyEmployee,
isUserCreatedPolicyRoom,
session,
isSelfDM,
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..79198e81fc43 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('');
@@ -146,8 +156,13 @@ 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 isPolicyEmployee = useMemo(() => (report?.policyID ? PolicyUtils.isPolicyEmployee(report.policyID, policies as Record) : false), [report?.policyID, policies]);
+ const backRoute = useMemo(() => {
+ if (role === CONST.IOU.SHARE.ROLE.ACCOUNTANT) {
+ return ROUTES.REPORT_WITH_ID.getRoute(reportID);
+ }
+ return reportID && (isPolicyEmployee ? ROUTES.ROOM_MEMBERS.getRoute(reportID) : ROUTES.REPORT_WITH_ID_DETAILS.getRoute(reportID));
+ }, [isPolicyEmployee, 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/RoomMembersPage.tsx b/src/pages/RoomMembersPage.tsx
index d025a3bde265..009eaaf15a3c 100644
--- a/src/pages/RoomMembersPage.tsx
+++ b/src/pages/RoomMembersPage.tsx
@@ -224,11 +224,11 @@ function RoomMembersPage({report, session, policies}: RoomMembersPageProps) {
return result;
};
- const isPolicyMember = useMemo(() => {
+ const isPolicyEmployee = useMemo(() => {
if (!report?.policyID || policies === null) {
return false;
}
- return PolicyUtils.isPolicyMember(report.policyID, policies);
+ return PolicyUtils.isPolicyEmployee(report.policyID, policies);
}, [report?.policyID, policies]);
const data = getMemberOptions();
const headerMessage = searchValue.trim() && !data.length ? translate('roomMembersPage.memberNotFound') : '';
@@ -240,7 +240,7 @@ function RoomMembersPage({report, session, policies}: RoomMembersPageProps) {
>
{
diff --git a/src/pages/home/HeaderView.tsx b/src/pages/home/HeaderView.tsx
index 1a88719c2649..56828bce7847 100644
--- a/src/pages/home/HeaderView.tsx
+++ b/src/pages/home/HeaderView.tsx
@@ -94,11 +94,11 @@ function HeaderView({report, personalDetails, parentReport, parentReportAction,
const isCanceledTaskReport = ReportUtils.isCanceledTaskReport(report, parentReportAction);
const isWhisperAction = ReportActionsUtils.isWhisperAction(parentReportAction);
const isUserCreatedPolicyRoom = ReportUtils.isUserCreatedPolicyRoom(report);
- const isPolicyMember = useMemo(() => !isEmptyObject(policy), [policy]);
- const canLeaveRoom = ReportUtils.canLeaveRoom(report, isPolicyMember);
- const canLeavePolicyExpenseChat = ReportUtils.canLeavePolicyExpenseChat(report, policy);
+ const isPolicyEmployee = useMemo(() => !isEmptyObject(policy), [policy]);
+ const canLeaveRoom = ReportUtils.canLeaveRoom(report, isPolicyEmployee);
const reportDescription = ReportUtils.getReportDescriptionText(report);
const policyName = ReportUtils.getPolicyName(report, true);
+ const canLeavePolicyExpenseChat = ReportUtils.canLeavePolicyExpenseChat(report, policy);
const policyDescription = ReportUtils.getPolicyDescriptionText(policy);
const isPersonalExpenseChat = isPolicyExpenseChat && ReportUtils.isCurrentUserSubmitter(report.reportID);
const shouldShowSubtitle = () => {
@@ -153,7 +153,7 @@ function HeaderView({report, personalDetails, parentReport, parentReportAction,
onSelected: join,
});
} else if (canLeave) {
- const isWorkspaceMemberLeavingWorkspaceRoom = !isChatThread && (report.visibility === CONST.REPORT.VISIBILITY.RESTRICTED || isPolicyExpenseChat) && isPolicyMember;
+ const isWorkspaceMemberLeavingWorkspaceRoom = !isChatThread && (report.visibility === CONST.REPORT.VISIBILITY.RESTRICTED || isPolicyExpenseChat) && isPolicyEmployee;
threeDotMenuItems.push({
icon: Expensicons.ChatBubbles,
text: translate('common.leave'),
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 (
;
- policyMembers: OnyxCollection;
};
type AllSettingsScreenProps = AllSettingsScreenOnyxProps;
-function AllSettingsScreen({policies, policyMembers}: AllSettingsScreenProps) {
+function AllSettingsScreen({policies}: AllSettingsScreenProps) {
const styles = useThemeStyles();
const waitForNavigate = useWaitForNavigation();
const {translate} = useLocalize();
@@ -48,7 +47,7 @@ function AllSettingsScreen({policies, policyMembers}: AllSettingsScreenProps) {
})();
},
focused: !isSmallScreenWidth,
- brickRoadIndicator: hasGlobalWorkspaceSettingsRBR(policies, policyMembers) ? CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR : undefined,
+ brickRoadIndicator: hasGlobalWorkspaceSettingsRBR(policies) ? CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR : undefined,
},
...(shouldShowSubscriptionsMenu
? [
@@ -90,7 +89,7 @@ function AllSettingsScreen({policies, policyMembers}: AllSettingsScreenProps) {
hoverAndPressStyle: styles.hoveredComponentBG,
brickRoadIndicator: item.brickRoadIndicator,
}));
- }, [isSmallScreenWidth, styles.hoveredComponentBG, styles.sectionMenuItem, translate, waitForNavigate, policies, policyMembers]);
+ }, [isSmallScreenWidth, styles.hoveredComponentBG, styles.sectionMenuItem, translate, waitForNavigate, policies]);
return (
({
policies: {
key: ONYXKEYS.COLLECTION.POLICY,
},
- policyMembers: {
- key: ONYXKEYS.COLLECTION.POLICY_MEMBERS,
- },
})(AllSettingsScreen);
diff --git a/src/pages/home/sidebar/SidebarLinksData.tsx b/src/pages/home/sidebar/SidebarLinksData.tsx
index e56962a331a2..1000ceff1a76 100644
--- a/src/pages/home/sidebar/SidebarLinksData.tsx
+++ b/src/pages/home/sidebar/SidebarLinksData.tsx
@@ -15,7 +15,7 @@ import useLocalize from '@hooks/useLocalize';
import useNetwork from '@hooks/useNetwork';
import usePrevious from '@hooks/usePrevious';
import useThemeStyles from '@hooks/useThemeStyles';
-import {getPolicyMembersByIdWithoutCurrentUser} from '@libs/PolicyUtils';
+import {getPolicyEmployeeListByIdWithoutCurrentUser} from '@libs/PolicyUtils';
import * as ReportUtils from '@libs/ReportUtils';
import SidebarUtils from '@libs/SidebarUtils';
import * as Policy from '@userActions/Policy';
@@ -26,7 +26,7 @@ import type {Message} from '@src/types/onyx/ReportAction';
import SidebarLinks from './SidebarLinks';
type ChatReportSelector = OnyxTypes.Report & {isUnreadWithMention: boolean};
-type PolicySelector = Pick;
+type PolicySelector = Pick;
type ReportActionsSelector = Array>;
type SidebarLinksDataOnyxProps = {
@@ -51,9 +51,6 @@ type SidebarLinksDataOnyxProps = {
/** All of the transaction violations */
transactionViolations: OnyxCollection;
- /** All policy members */
- policyMembers: OnyxCollection;
-
/** Drafts of reports */
reportsDrafts: OnyxCollection;
};
@@ -77,7 +74,6 @@ function SidebarLinksData({
onLinkClick,
policies,
priorityMode = CONST.PRIORITY_MODE.DEFAULT,
- policyMembers,
transactionViolations,
reportsDrafts,
}: SidebarLinksDataProps) {
@@ -88,7 +84,8 @@ function SidebarLinksData({
const {activeWorkspaceID} = useActiveWorkspace();
const {translate} = useLocalize();
const prevPriorityMode = usePrevious(priorityMode);
- const policyMemberAccountIDs = getPolicyMembersByIdWithoutCurrentUser(policyMembers, activeWorkspaceID, accountID);
+
+ const policyMemberAccountIDs = getPolicyEmployeeListByIdWithoutCurrentUser(policies, activeWorkspaceID, accountID);
// eslint-disable-next-line react-hooks/exhaustive-deps
useEffect(() => Policy.openWorkspace(activeWorkspaceID ?? '', policyMemberAccountIDs), [activeWorkspaceID]);
@@ -246,6 +243,7 @@ const policySelector = (policy: OnyxEntry): PolicySelector =>
type: policy.type,
name: policy.name,
avatar: policy.avatar,
+ employeeList: policy.employeeList,
}) as PolicySelector;
const SidebarLinkDataWithCurrentReportID = withCurrentReportID(
@@ -265,7 +263,6 @@ const SidebarLinkDataWithCurrentReportID = withCurrentReportID(
lodashIsEqual(prevProps.policies, nextProps.policies) &&
lodashIsEqual(prevProps.insets, nextProps.insets) &&
prevProps.onLinkClick === nextProps.onLinkClick &&
- lodashIsEqual(prevProps.policyMembers, nextProps.policyMembers) &&
lodashIsEqual(prevProps.transactionViolations, nextProps.transactionViolations) &&
prevProps.currentReportID === nextProps.currentReportID &&
lodashIsEqual(prevProps.reportsDrafts, nextProps.reportsDrafts),
@@ -299,9 +296,6 @@ export default withOnyx {
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..eeb88fd84354 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);
@@ -176,6 +178,7 @@ function IOURequestStepDescription({
autoGrowHeight
containerStyles={[styles.autoGrowHeightMultilineInput]}
shouldSubmitForm
+ isMarkdownEnabled
/>
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 ;
-
- /** Members of all the workspaces the user is member of */
- policyMembers: OnyxCollection;
};
type InitialSettingsPageProps = InitialSettingsPageOnyxProps & WithCurrentUserPersonalDetailsProps;
@@ -98,7 +95,7 @@ type MenuData = {
type Menu = {sectionStyle: StyleProp; sectionTranslationKey: TranslationPaths; items: MenuData[]};
-function InitialSettingsPage({session, userWallet, bankAccountList, fundList, walletTerms, loginList, currentUserPersonalDetails, policies, policyMembers}: InitialSettingsPageProps) {
+function InitialSettingsPage({session, userWallet, bankAccountList, fundList, walletTerms, loginList, currentUserPersonalDetails, policies}: InitialSettingsPageProps) {
const network = useNetwork();
const theme = useTheme();
const styles = useThemeStyles();
@@ -189,7 +186,7 @@ function InitialSettingsPage({session, userWallet, bankAccountList, fundList, wa
translationKey: 'common.workspaces',
icon: Expensicons.Building,
routeName: ROUTES.SETTINGS_WORKSPACES,
- brickRoadIndicator: hasGlobalWorkspaceSettingsRBR(policies, policyMembers) ? CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR : undefined,
+ brickRoadIndicator: hasGlobalWorkspaceSettingsRBR(policies) ? CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR : undefined,
},
{
translationKey: 'allSettingsScreen.cardsAndDomains',
@@ -221,7 +218,7 @@ function InitialSettingsPage({session, userWallet, bankAccountList, fundList, wa
sectionTranslationKey: 'common.workspaces',
items,
};
- }, [policies, policyMembers, styles.workspaceSettingsSectionContainer]);
+ }, [policies, styles.workspaceSettingsSectionContainer]);
/**
* Retuns a list of menu items data for general section
@@ -531,8 +528,5 @@ export default withCurrentUserPersonalDetails(
policies: {
key: ONYXKEYS.COLLECTION.POLICY,
},
- policyMembers: {
- key: ONYXKEYS.COLLECTION.POLICY_MEMBERS,
- },
})(InitialSettingsPage),
);
diff --git a/src/pages/settings/Profile/PersonalDetails/CountrySelectionPage.tsx b/src/pages/settings/Profile/PersonalDetails/CountrySelectionPage.tsx
index 8bed21f322ec..c0d980083ddf 100644
--- a/src/pages/settings/Profile/PersonalDetails/CountrySelectionPage.tsx
+++ b/src/pages/settings/Profile/PersonalDetails/CountrySelectionPage.tsx
@@ -68,7 +68,7 @@ function CountrySelectionPage({route, navigation}: CountrySelectionPageProps) {
shouldShowBackButton
onBackButtonPress={() => {
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')}
-