diff --git a/__mocks__/Illustrations.ts b/__mocks__/Illustrations.ts index 0170c75167c7..300f7529830a 100644 --- a/__mocks__/Illustrations.ts +++ b/__mocks__/Illustrations.ts @@ -21,6 +21,7 @@ const CreditCardsNew = 'CreditCardsNew'; const CreditCardsNewGreen = 'CreditCardsNewGreen'; const InvoiceBlue = 'InvoiceBlue'; const LaptopWithSecondScreenAndHourglass = 'LaptopWithSecondScreenAndHourglass'; +const RunningTurtle = 'RunningTurtle'; const LockOpen = 'LockOpen'; const Luggage = 'Luggage'; const MoneyIntoWallet = 'MoneyIntoWallet'; @@ -29,6 +30,7 @@ const ConciergeBubble = 'ConciergeBubble'; const TreasureChest = 'TreasureChest'; const ThumbsUpStars = 'ThumbsUpStars'; const Hands = 'Hands'; +const Hand = 'Hand'; const SmartScan = 'SmartScan'; const Hourglass = 'Hourglass'; const CommentBubbles = 'CommentBubbles'; @@ -56,6 +58,9 @@ const Binoculars = 'Binoculars'; const CompanyCard = 'CompanyCard'; const ReceiptUpload = 'ReceiptUpload'; const ExpensifyCardIllustration = 'ExpensifyCardIllustration'; +const ExpensifyCardImage = 'ExpensifyCardImage'; +const MultiScan = 'MultiScan'; +const Shutter = 'Shutter'; const SplitBill = 'SplitBill'; const PiggyBank = 'PiggyBank'; const Pillow = 'Pillow'; @@ -134,6 +139,7 @@ export { CreditCardsNewGreen, InvoiceBlue, LaptopWithSecondScreenAndHourglass, + RunningTurtle, LockOpen, Luggage, MoneyIntoWallet, @@ -142,6 +148,7 @@ export { TreasureChest, ThumbsUpStars, Hands, + Hand, SmartScan, Hourglass, CommentBubbles, @@ -169,6 +176,9 @@ export { CompanyCard, ReceiptUpload, ExpensifyCardIllustration, + ExpensifyCardImage, + MultiScan, + Shutter, SplitBill, PiggyBank, Pillow, diff --git a/src/components/ApproverSelectionList.tsx b/src/components/ApproverSelectionList.tsx index ceab0014cab3..53d267de8499 100644 --- a/src/components/ApproverSelectionList.tsx +++ b/src/components/ApproverSelectionList.tsx @@ -1,6 +1,7 @@ import React, {useMemo, useState} from 'react'; import type {SectionListData} from 'react-native'; import useDebouncedState from '@hooks/useDebouncedState'; +import {useMemoizedLazyIllustrations} from '@hooks/useLazyAsset'; import useLocalize from '@hooks/useLocalize'; import useOnyx from '@hooks/useOnyx'; import useThemeStyles from '@hooks/useThemeStyles'; @@ -17,7 +18,6 @@ import {isEmptyObject} from '@src/types/utils/EmptyObject'; import BlockingView from './BlockingViews/BlockingView'; import FullPageNotFoundView from './BlockingViews/FullPageNotFoundView'; import HeaderWithBackButton from './HeaderWithBackButton'; -import * as Illustrations from './Icon/Illustrations'; import ScreenWrapper from './ScreenWrapper'; import SelectionList from './SelectionListWithSections'; import InviteMemberListItem from './SelectionListWithSections/InviteMemberListItem'; @@ -82,6 +82,7 @@ function ApproverSelectionList({ const [searchTerm, debouncedSearchTerm, setSearchTerm] = useDebouncedState(''); const [countryCode = CONST.DEFAULT_COUNTRY_CODE] = useOnyx(ONYXKEYS.COUNTRY_CODE, {canBeMissing: false}); const shouldShowTextInput = shouldShowTextInputProp ?? allApprovers?.length >= CONST.STANDARD_LIST_ITEM_LIMIT; + const lazyIllustrations = useMemoizedLazyIllustrations(['TurtleInShell']); const [selectedMembers, setSelectedMembers] = useState([]); @@ -127,7 +128,7 @@ function ApproverSelectionList({ const listEmptyContent = useMemo( () => ( ), - [translate, listEmptyContentSubtitle, styles.textSupporting, styles.pb10], + [translate, listEmptyContentSubtitle, styles.textSupporting, styles.pb10, lazyIllustrations], ); return ( diff --git a/src/components/CardPreview.tsx b/src/components/CardPreview.tsx index d315eb40cf3c..f9826a2ecd71 100644 --- a/src/components/CardPreview.tsx +++ b/src/components/CardPreview.tsx @@ -1,6 +1,6 @@ import React from 'react'; import {View} from 'react-native'; -import ExpensifyCardImage from '@assets/images/expensify-card.svg'; +import {useMemoizedLazyIllustrations} from '@hooks/useLazyAsset'; import useOnyx from '@hooks/useOnyx'; import useThemeStyles from '@hooks/useThemeStyles'; import variables from '@styles/variables'; @@ -10,6 +10,7 @@ import Text from './Text'; function CardPreview() { const styles = useThemeStyles(); + const lazyIllustrations = useMemoizedLazyIllustrations(['ExpensifyCardImage']); const [privatePersonalDetails] = useOnyx(ONYXKEYS.PRIVATE_PERSONAL_DETAILS, {canBeMissing: true}); const [session] = useOnyx(ONYXKEYS.SESSION, {canBeMissing: true}); @@ -21,7 +22,7 @@ function CardPreview() { (null); const styles = useThemeStyles(); + const lazyIllustrations = useMemoizedLazyIllustrations(['LaptopWithSecondScreenAndHourglass']); const iconToDisplay = getIntegrationIcon(connectionName); const canBeExported = canBeExportedUtil(report); @@ -89,7 +90,7 @@ function ReportDetailsExportPage({route}: ReportDetailsExportPageProps) { onBackButtonPress={() => Navigation.goBack(ROUTES.REPORT_WITH_ID_DETAILS.getRoute(reportID, backTo))} /> >>()] = useOnyx(ONYXKEYS.NVP_MUTED_PLATFORMS, {canBeMissing: true}); const isPlatformMuted = mutedPlatforms[platform]; @@ -802,7 +801,7 @@ function IOURequestStepScan({ @@ -871,7 +870,7 @@ function IOURequestStepScan({ {shouldShowMultiScanEducationalPopup && ( @@ -923,7 +922,7 @@ function IOURequestStepScan({ > @@ -939,7 +938,7 @@ function IOURequestStepScan({ @@ -954,7 +953,7 @@ function IOURequestStepScan({ diff --git a/src/pages/iou/request/step/IOURequestStepScan/index.tsx b/src/pages/iou/request/step/IOURequestStepScan/index.tsx index 1090eafa1f44..67d14be8dd4e 100644 --- a/src/pages/iou/request/step/IOURequestStepScan/index.tsx +++ b/src/pages/iou/request/step/IOURequestStepScan/index.tsx @@ -8,11 +8,7 @@ import type {OnyxEntry} from 'react-native-onyx'; import {RESULTS} from 'react-native-permissions'; import Animated, {useAnimatedStyle, useSharedValue, withTiming} from 'react-native-reanimated'; import type Webcam from 'react-webcam'; -import MultiScan from '@assets/images/educational-illustration__multi-scan.svg'; import TestReceipt from '@assets/images/fake-receipt.png'; -import Hand from '@assets/images/hand.svg'; -import ReceiptUpload from '@assets/images/receipt-upload.svg'; -import Shutter from '@assets/images/shutter.svg'; import ActivityIndicator from '@components/ActivityIndicator'; import AttachmentPicker from '@components/AttachmentPicker'; import Button from '@components/Button'; @@ -21,7 +17,6 @@ import {DragAndDropContext} from '@components/DragAndDrop/Provider'; import DropZoneUI from '@components/DropZone/DropZoneUI'; import FeatureTrainingModal from '@components/FeatureTrainingModal'; import Icon from '@components/Icon'; -import * as Expensicons from '@components/Icon/Expensicons'; import LocationPermissionModal from '@components/LocationPermissionModal'; import PressableWithFeedback from '@components/Pressable/PressableWithFeedback'; import ReceiptAlternativeMethods from '@components/ReceiptAlternativeMethods'; @@ -31,6 +26,7 @@ import withCurrentUserPersonalDetails from '@components/withCurrentUserPersonalD import useDefaultExpensePolicy from '@hooks/useDefaultExpensePolicy'; import useFilesValidation from '@hooks/useFilesValidation'; import useIOUUtils from '@hooks/useIOUUtils'; +import {useMemoizedLazyExpensifyIcons, useMemoizedLazyIllustrations} from '@hooks/useLazyAsset'; import useLocalize from '@hooks/useLocalize'; import useOnyx from '@hooks/useOnyx'; import usePermissions from '@hooks/usePermissions'; @@ -129,6 +125,8 @@ function IOURequestStepScan({ const defaultExpensePolicy = useDefaultExpensePolicy(); const [dismissedProductTraining] = useOnyx(ONYXKEYS.NVP_DISMISSED_PRODUCT_TRAINING, {canBeMissing: true}); const [reportAttributesDerived] = useOnyx(ONYXKEYS.DERIVED.REPORT_ATTRIBUTES, {canBeMissing: true, selector: reportsSelector}); + const lazyIllustrations = useMemoizedLazyIllustrations(['MultiScan', 'Hand', 'ReceiptUpload', 'Shutter']); + const lazyIcons = useMemoizedLazyExpensifyIcons(['Bolt', 'Gallery', 'ReceiptMultiple', 'boltSlash', 'ReplaceReceipt', 'SmartScan']); const isEditing = action === CONST.IOU.ACTION.EDIT; const canUseMultiScan = isStartingScan && iouType !== CONST.IOU.TYPE.SPLIT; const isReplacingReceipt = (isEditing && hasReceipt(initialTransaction)) || (!!initialTransaction?.receipt && !!backTo); @@ -852,7 +850,7 @@ function IOURequestStepScan({ {cameraPermissionState !== 'granted' && isQueriedPermissionState && ( @@ -940,7 +938,7 @@ function IOURequestStepScan({ @@ -952,7 +950,8 @@ function IOURequestStepScan({ style={[styles.alignItemsCenter]} onPress={capturePhoto} > - @@ -968,7 +967,7 @@ function IOURequestStepScan({ @@ -983,7 +982,7 @@ function IOURequestStepScan({ @@ -992,7 +991,7 @@ function IOURequestStepScan({ {canUseMultiScan && isMobile() && shouldShowMultiScanEducationalPopup && ( {PDFValidationComponent} - @@ -1087,7 +1087,7 @@ function IOURequestStepScan({ >(); const {environmentURL} = useEnvironment(); const {result, login, backTo} = params; - const illustrations = useMemoizedLazyIllustrations(['LockClosedOrange'] as const); + const lazyIllustrations = useMemoizedLazyIllustrations(['RunningTurtle', 'LockClosedOrange']); const defaultResult = { heading: translate('mergeAccountsPage.mergeFailureGenericHeading'), buttonText: translate('common.buttonConfirm'), - illustration: illustrations.LockClosedOrange, + illustration: lazyIllustrations.LockClosedOrange, }; const results: Record, ConfirmationPageProps> = useMemo(() => { @@ -70,7 +69,7 @@ function MergeResultPage() { ), onButtonPress: () => Navigation.goBack(ROUTES.SETTINGS_SECURITY), buttonText: translate('common.buttonConfirm'), - illustration: illustrations.LockClosedOrange, + illustration: lazyIllustrations.LockClosedOrange, }, [CONST.MERGE_ACCOUNT_RESULTS.ERR_2FA]: { heading: translate('mergeAccountsPage.mergeFailureGenericHeading'), @@ -83,7 +82,7 @@ function MergeResultPage() { ctaStyle: {...styles.mt2, ...styles.textSupporting}, onButtonPress: () => Navigation.goBack(ROUTES.SETTINGS_SECURITY), buttonText: translate('common.buttonConfirm'), - illustration: illustrations.LockClosedOrange, + illustration: lazyIllustrations.LockClosedOrange, }, [CONST.MERGE_ACCOUNT_RESULTS.ERR_SMART_SCANNER]: { heading: translate('mergeAccountsPage.mergeFailureGenericHeading'), @@ -93,7 +92,7 @@ function MergeResultPage() { ), buttonText: translate('common.buttonConfirm'), - illustration: illustrations.LockClosedOrange, + illustration: lazyIllustrations.LockClosedOrange, onButtonPress: () => Navigation.goBack(ROUTES.SETTINGS_SECURITY), }, [CONST.MERGE_ACCOUNT_RESULTS.ERR_SAML_DOMAIN_CONTROL]: { @@ -105,7 +104,7 @@ function MergeResultPage() { ), buttonText: translate('common.buttonConfirm'), onButtonPress: () => Navigation.goBack(ROUTES.SETTINGS_SECURITY), - illustration: illustrations.LockClosedOrange, + illustration: lazyIllustrations.LockClosedOrange, }, [CONST.MERGE_ACCOUNT_RESULTS.ERR_SAML_NOT_SUPPORTED]: { heading: translate('mergeAccountsPage.mergePendingSAML.weAreWorkingOnIt'), @@ -126,7 +125,7 @@ function MergeResultPage() { shouldShowSecondaryButton: true, buttonText: translate('common.buttonConfirm'), onButtonPress: () => Navigation.goBack(ROUTES.SETTINGS_SECURITY), - illustration: Illustrations.RunningTurtle, + illustration: lazyIllustrations.RunningTurtle, illustrationStyle: {width: 132, height: 150}, }, [CONST.MERGE_ACCOUNT_RESULTS.ERR_SAML_PRIMARY_LOGIN]: { @@ -138,7 +137,7 @@ function MergeResultPage() { ), buttonText: translate('common.buttonConfirm'), onButtonPress: () => Navigation.goBack(ROUTES.SETTINGS_SECURITY), - illustration: illustrations.LockClosedOrange, + illustration: lazyIllustrations.LockClosedOrange, }, [CONST.MERGE_ACCOUNT_RESULTS.ERR_ACCOUNT_LOCKED]: { heading: translate('mergeAccountsPage.mergeFailureGenericHeading'), @@ -149,7 +148,7 @@ function MergeResultPage() { ), buttonText: translate('common.buttonConfirm'), onButtonPress: () => Navigation.goBack(ROUTES.SETTINGS_SECURITY), - illustration: illustrations.LockClosedOrange, + illustration: lazyIllustrations.LockClosedOrange, }, [CONST.MERGE_ACCOUNT_RESULTS.ERR_INVOICING]: { heading: translate('mergeAccountsPage.mergeFailureGenericHeading'), @@ -160,31 +159,31 @@ function MergeResultPage() { ), buttonText: translate('common.buttonConfirm'), onButtonPress: () => Navigation.goBack(ROUTES.SETTINGS_SECURITY), - illustration: illustrations.LockClosedOrange, + illustration: lazyIllustrations.LockClosedOrange, }, [CONST.MERGE_ACCOUNT_RESULTS.TOO_MANY_ATTEMPTS]: { heading: translate('mergeAccountsPage.mergeFailureTooManyAttempts.heading'), description: translate('mergeAccountsPage.mergeFailureTooManyAttempts.description'), buttonText: translate('common.buttonConfirm'), onButtonPress: () => Navigation.goBack(ROUTES.SETTINGS_SECURITY), - illustration: illustrations.LockClosedOrange, + illustration: lazyIllustrations.LockClosedOrange, }, [CONST.MERGE_ACCOUNT_RESULTS.ACCOUNT_UNVALIDATED]: { heading: translate('mergeAccountsPage.mergeFailureGenericHeading'), description: translate('mergeAccountsPage.mergeFailureUnvalidatedAccount.description'), buttonText: translate('common.buttonConfirm'), onButtonPress: () => Navigation.goBack(ROUTES.SETTINGS_SECURITY), - illustration: illustrations.LockClosedOrange, + illustration: lazyIllustrations.LockClosedOrange, }, [CONST.MERGE_ACCOUNT_RESULTS.ERR_MERGE_SELF]: { heading: translate('mergeAccountsPage.mergeFailureGenericHeading'), description: translate('mergeAccountsPage.mergeFailureSelfMerge.description'), buttonText: translate('common.buttonConfirm'), onButtonPress: () => Navigation.goBack(ROUTES.SETTINGS_SECURITY), - illustration: illustrations.LockClosedOrange, + illustration: lazyIllustrations.LockClosedOrange, }, }; - }, [login, translate, userEmailOrPhone, styles, environmentURL, illustrations.LockClosedOrange]); + }, [login, translate, userEmailOrPhone, styles, environmentURL, lazyIllustrations.LockClosedOrange, lazyIllustrations.RunningTurtle]); useEffect(() => { /** diff --git a/src/pages/workspace/accounting/qbd/RequireQuickBooksDesktopPage.tsx b/src/pages/workspace/accounting/qbd/RequireQuickBooksDesktopPage.tsx index 1f8845a2f115..74f2b36ac98d 100644 --- a/src/pages/workspace/accounting/qbd/RequireQuickBooksDesktopPage.tsx +++ b/src/pages/workspace/accounting/qbd/RequireQuickBooksDesktopPage.tsx @@ -14,7 +14,7 @@ import Navigation from '@libs/Navigation/Navigation'; function RequireQuickBooksDesktopModal() { const {translate} = useLocalize(); const styles = useThemeStyles(); - const illustrations = useMemoizedLazyIllustrations(['LaptopWithSecondScreenX'] as const); + const illustrations = useMemoizedLazyIllustrations(['LaptopWithSecondScreenX']); return (