diff --git a/src/libs/getCurrentPosition/index.ts b/src/libs/getCurrentPosition/index.ts index e64a8e9b0f5ce..7e39fe37d4191 100644 --- a/src/libs/getCurrentPosition/index.ts +++ b/src/libs/getCurrentPosition/index.ts @@ -4,17 +4,21 @@ import {GeolocationErrorCode} from './getCurrentPosition.types'; import type {GetCurrentPosition} from './getCurrentPosition.types'; const getCurrentPosition: GetCurrentPosition = async (success, error, options) => { - const foregroundPermissionResponse: PermissionResponse = await requestForegroundPermissionsAsync(); + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call + const foregroundPermissionResponse = (await requestForegroundPermissionsAsync()) as PermissionResponse; + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access if (foregroundPermissionResponse.status !== PermissionStatus.GRANTED) { error({code: GeolocationErrorCode.PERMISSION_DENIED, message: 'User denied access to location.'}); return; } try { + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call const currentPosition = await getCurrentPositionAsync(options); + // eslint-disable-next-line @typescript-eslint/no-unsafe-argument success(currentPosition); - } catch (caughtError) { + } catch (caughtError: unknown) { let message = 'Geolocation call failed'; let code = GeolocationErrorCode.POSITION_UNAVAILABLE; diff --git a/src/pages/EditReportFieldPage.tsx b/src/pages/EditReportFieldPage.tsx index 3f674634c1502..b0809d4f4f44b 100644 --- a/src/pages/EditReportFieldPage.tsx +++ b/src/pages/EditReportFieldPage.tsx @@ -1,13 +1,14 @@ import {Str} from 'expensify-common'; -import React, {useState} from 'react'; +import React from 'react'; import FullPageNotFoundView from '@components/BlockingViews/FullPageNotFoundView'; -import ConfirmModal from '@components/ConfirmModal'; import type {FormOnyxValues} from '@components/Form/types'; import HeaderWithBackButton from '@components/HeaderWithBackButton'; import * as Expensicons from '@components/Icon/Expensicons'; +import {ModalActions} from '@components/Modal/Global/ModalContext'; import {useSession} from '@components/OnyxListItemProvider'; import type {PopoverMenuItem} from '@components/PopoverMenu'; import ScreenWrapper from '@components/ScreenWrapper'; +import useConfirmModal from '@hooks/useConfirmModal'; import useLocalize from '@hooks/useLocalize'; import useOnyx from '@hooks/useOnyx'; import usePermissions from '@hooks/usePermissions'; @@ -50,7 +51,7 @@ function EditReportFieldPage({route}: EditReportFieldPageProps) { const [transactionViolations] = useOnyx(ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS, {canBeMissing: true}); const hasViolations = hasViolationsReportUtils(report?.reportID, transactionViolations, session?.accountID ?? CONST.DEFAULT_NUMBER_ID, session?.email ?? ''); - const [isDeleteModalVisible, setIsDeleteModalVisible] = useState(false); + const {showConfirmModal} = useConfirmModal(); const {translate} = useLocalize(); const isReportFieldTitle = isReportFieldOfTypeTitle(reportField); const reportFieldsEnabled = ((isPaidGroupPolicyExpenseReport(report) || isInvoiceReport(report)) && !!policy?.areReportFieldsEnabled) || isReportFieldTitle; @@ -78,7 +79,6 @@ function EditReportFieldPage({route}: EditReportFieldPageProps) { }; const handleReportFieldDelete = () => { - setIsDeleteModalVisible(false); goBack(); setTimeout(() => { deleteReportField(report.reportID, reportField); @@ -121,7 +121,27 @@ function EditReportFieldPage({route}: EditReportFieldPageProps) { const isReportFieldDeletable = reportField.deletable && reportField?.fieldID !== CONST.REPORT_FIELD_TITLE_FIELD_ID; if (isReportFieldDeletable) { - menuItems.push({icon: Expensicons.Trashcan, text: translate('common.delete'), onSelected: () => setIsDeleteModalVisible(true), shouldCallAfterModalHide: true}); + menuItems.push({ + icon: Expensicons.Trashcan, + text: translate('common.delete'), + onSelected: () => { + showConfirmModal({ + title: translate('workspace.reportFields.delete'), + prompt: translate('workspace.reportFields.deleteConfirmation'), + confirmText: translate('common.delete'), + cancelText: translate('common.cancel'), + danger: true, + shouldEnableNewFocusManagement: true, + // eslint-disable-next-line rulesdir/prefer-early-return + }).then((result) => { + if (result.action !== ModalActions.CONFIRM) { + return; + } + handleReportFieldDelete(); + }); + }, + shouldCallAfterModalHide: true, + }); } const fieldName = Str.UCFirst(reportField.name); @@ -139,18 +159,6 @@ function EditReportFieldPage({route}: EditReportFieldPageProps) { onBackButtonPress={goBack} /> - setIsDeleteModalVisible(false)} - prompt={translate('workspace.reportFields.deleteConfirmation')} - confirmText={translate('common.delete')} - cancelText={translate('common.cancel')} - danger - shouldEnableNewFocusManagement - /> - {(reportField.type === CONST.REPORT_FIELD_TYPES.TEXT || isReportFieldTitle) && ( ; function ReportDetailsPage({policy, report, route, reportMetadata}: ReportDetailsPageProps) { const {translate, localeCompare} = useLocalize(); const {isOffline} = useNetwork(); + const {showConfirmModal} = useConfirmModal(); const {isRestrictedToPreferredPolicy, preferredPolicyID} = usePreferredPolicy(); const styles = useThemeStyles(); const expensifyIcons = useMemoizedLazyExpensifyIcons(['Users', 'Gear', 'Send', 'Folder', 'UserPlus', 'Pencil', 'Checkmark', 'Building', 'Exit', 'Bug', 'Camera', 'Trashcan'] as const); @@ -181,8 +183,6 @@ function ReportDetailsPage({policy, report, route, reportMetadata}: ReportDetail const [personalDetails] = useOnyx(ONYXKEYS.PERSONAL_DETAILS_LIST, {canBeMissing: false}); const [introSelected] = useOnyx(ONYXKEYS.NVP_INTRO_SELECTED, {canBeMissing: true}); const currentUserPersonalDetails = useCurrentUserPersonalDetails(); - const [isLastMemberLeavingGroupModalVisible, setIsLastMemberLeavingGroupModalVisible] = useState(false); - const [isDeleteModalVisible, setIsDeleteModalVisible] = useState(false); const isPolicyAdmin = useMemo(() => isPolicyAdminUtil(policy), [policy]); const isPolicyEmployee = useMemo(() => isPolicyEmployeeUtil(report?.policyID, policy), [report?.policyID, policy]); const isPolicyExpenseChat = useMemo(() => isPolicyExpenseChatUtil(report), [report]); @@ -306,14 +306,6 @@ function ReportDetailsPage({policy, report, route, reportMetadata}: ReportDetail const [reportAttributes] = useOnyx(ONYXKEYS.DERIVED.REPORT_ATTRIBUTES, {canBeMissing: true, selector: reportsSelector}); const isWorkspaceChat = useMemo(() => isWorkspaceChatUtil(report?.chatType ?? ''), [report?.chatType]); - useEffect(() => { - if (canDeleteRequest) { - return; - } - - setIsDeleteModalVisible(false); - }, [canDeleteRequest]); - useEffect(() => { // Do not fetch private notes if isLoadingPrivateNotes is already defined, or if the network is offline, or if the report is a self DM. if (isPrivateNotesFetchTriggered || isOffline || isSelfDM) { @@ -338,7 +330,7 @@ function ReportDetailsPage({policy, report, route, reportMetadata}: ReportDetail const shouldShowLeaveButton = canLeaveChat(report, policy, !!reportNameValuePairs?.private_isArchived); const shouldShowGoToWorkspace = shouldShowPolicy(policy, false, currentUserPersonalDetails?.email) && !policy?.isJoinRequestPending; - const reportName = isGroupChat ? getReportNameFromReportNameUtils(report, reportAttributes) : Parser.htmlToText(getReportNameFromReportNameUtils(report, reportAttributes)); + const reportName = isGroupChat ? getReportName(report, reportAttributes) : Parser.htmlToText(getReportName(report, reportAttributes)); const additionalRoomDetails = (isPolicyExpenseChat && !!report?.isOwnPolicyExpenseChat) || isExpenseReportUtil(report) || isPolicyExpenseChat || isInvoiceRoom ? chatRoomSubtitle @@ -525,7 +517,19 @@ function ReportDetailsPage({policy, report, route, reportMetadata}: ReportDetail isAnonymousAction: true, action: () => { if (getParticipantsAccountIDsForDisplay(report, false, true).length === 1 && isRootGroupChat) { - setIsLastMemberLeavingGroupModalVisible(true); + showConfirmModal({ + danger: true, + title: translate('groupChat.lastMemberTitle'), + prompt: translate('groupChat.lastMemberWarning'), + confirmText: translate('common.leave'), + cancelText: translate('common.cancel'), + // eslint-disable-next-line rulesdir/prefer-early-return + }).then((result) => { + if (result.action !== ModalActions.CONFIRM) { + return; + } + leaveChat(); + }); return; } @@ -584,6 +588,8 @@ function ReportDetailsPage({policy, report, route, reportMetadata}: ReportDetail preferredPolicyID, introSelected, parentReport, + showConfirmModal, + translate, ]); const displayNamesWithTooltips = useMemo(() => { @@ -1010,37 +1016,25 @@ function ReportDetailsPage({policy, report, route, reportMetadata}: ReportDetail key={CONST.REPORT_DETAILS_MENU_ITEM.DELETE} icon={expensifyIcons.Trashcan} title={caseID === CASES.DEFAULT ? translate('common.delete') : translate('reportActionContextMenu.deleteAction', {action: requestParentReportAction})} - onPress={() => setIsDeleteModalVisible(true)} + onPress={() => { + showConfirmModal({ + title: caseID === CASES.DEFAULT ? translate('task.deleteTask') : translate('iou.deleteExpense', {count: 1}), + prompt: caseID === CASES.DEFAULT ? translate('task.deleteConfirmation') : translate('iou.deleteConfirmation', {count: 1}), + confirmText: translate('common.delete'), + cancelText: translate('common.cancel'), + danger: true, + shouldEnableNewFocusManagement: true, + // eslint-disable-next-line rulesdir/prefer-early-return + }).then((result) => { + if (result.action !== ModalActions.CONFIRM) { + return; + } + isTransactionDeleted.current = true; + }); + }} /> )} - { - setIsLastMemberLeavingGroupModalVisible(false); - leaveChat(); - }} - onCancel={() => setIsLastMemberLeavingGroupModalVisible(false)} - prompt={translate('groupChat.lastMemberWarning')} - confirmText={translate('common.leave')} - cancelText={translate('common.cancel')} - /> - { - setIsDeleteModalVisible(false); - isTransactionDeleted.current = true; - }} - onCancel={() => setIsDeleteModalVisible(false)} - prompt={caseID === CASES.DEFAULT ? translate('task.deleteConfirmation') : translate('iou.deleteConfirmation', {count: 1})} - confirmText={translate('common.delete')} - cancelText={translate('common.cancel')} - danger - shouldEnableNewFocusManagement - /> ); diff --git a/src/pages/ReportParticipantDetailsPage.tsx b/src/pages/ReportParticipantDetailsPage.tsx index 8739fcd9fac4f..93f31cd5a0457 100644 --- a/src/pages/ReportParticipantDetailsPage.tsx +++ b/src/pages/ReportParticipantDetailsPage.tsx @@ -2,13 +2,14 @@ import React, {useCallback} from 'react'; import {View} from 'react-native'; import Avatar from '@components/Avatar'; import Button from '@components/Button'; -import ConfirmModal from '@components/ConfirmModal'; import HeaderWithBackButton from '@components/HeaderWithBackButton'; import MenuItem from '@components/MenuItem'; import MenuItemWithTopDescription from '@components/MenuItemWithTopDescription'; +import {ModalActions} from '@components/Modal/Global/ModalContext'; import OfflineWithFeedback from '@components/OfflineWithFeedback'; import ScreenWrapper from '@components/ScreenWrapper'; import Text from '@components/Text'; +import useConfirmModal from '@hooks/useConfirmModal'; import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails'; import {useMemoizedLazyExpensifyIcons} from '@hooks/useLazyAsset'; import useLocalize from '@hooks/useLocalize'; @@ -39,8 +40,7 @@ function ReportParticipantDetails({report, route}: ReportParticipantDetailsPageP const StyleUtils = useStyleUtils(); const [personalDetails] = useOnyx(ONYXKEYS.PERSONAL_DETAILS_LIST, {canBeMissing: false}); const currentUserPersonalDetails = useCurrentUserPersonalDetails(); - - const [isRemoveMemberConfirmModalVisible, setIsRemoveMemberConfirmModalVisible] = React.useState(false); + const {showConfirmModal} = useConfirmModal(); const accountID = Number(route.params.accountID); const backTo = ROUTES.REPORT_PARTICIPANTS.getRoute(report?.reportID, route.params.backTo); @@ -52,7 +52,6 @@ function ReportParticipantDetails({report, route}: ReportParticipantDetailsPageP const isCurrentUserAdmin = isGroupChatAdmin(report, currentUserPersonalDetails?.accountID); const isSelectedMemberCurrentUser = accountID === currentUserPersonalDetails?.accountID; const removeUser = useCallback(() => { - setIsRemoveMemberConfirmModalVisible(false); removeFromGroupChat(report?.reportID, [accountID]); Navigation.goBack(backTo); }, [backTo, report?.reportID, accountID]); @@ -95,26 +94,28 @@ function ReportParticipantDetails({report, route}: ReportParticipantDetailsPageP )} {isCurrentUserAdmin && ( - <> -