Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,8 @@ import {ReportActionPositionContextProvider, ReportActionScrollToNewestContext}
import ReportActionsListItemRenderer from '@pages/inbox/report/ReportActionsListItemRenderer';
import useReportUnreadMessageScrollTracking from '@pages/inbox/report/useReportUnreadMessageScrollTracking';

import {openReport, subscribeToNewActionEvent} from '@userActions/Report';
import {openReport} from '@userActions/Report';
import {subscribeToNewActionEvent} from '@userActions/Report/reportActionSubscribers';

import CONST from '@src/CONST';
import ONYXKEYS from '@src/ONYXKEYS';
Expand Down
3 changes: 2 additions & 1 deletion src/components/ReportActionItem/TaskView.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,8 @@ import StringUtils from '@libs/StringUtils';
import {isActiveTaskEditRoute} from '@libs/TaskUtils';

import {callFunctionIfActionIsAllowed} from '@userActions/Session';
import {canActionTask, canModifyTask, clearTaskErrors, completeTask, reopenTask, setTaskReport} from '@userActions/Task';
import {canActionTask, canModifyTask, completeTask, reopenTask, setTaskReport} from '@userActions/Task';
import {clearTaskErrors} from '@userActions/TaskDeletion';

import CONST from '@src/CONST';
import ONYXKEYS from '@src/ONYXKEYS';
Expand Down
2 changes: 1 addition & 1 deletion src/libs/actions/Chronos.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ import type {OnyxUpdate} from 'react-native-onyx';
import {Str} from 'expensify-common';
import Onyx from 'react-native-onyx';

import {notifyNewAction} from './Report';
import {notifyNewAction} from './Report/reportActionSubscribers';

type ChronosTimerOnyxUpdate = OnyxUpdate<typeof ONYXKEYS.COLLECTION.REPORT | typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS | typeof ONYXKEYS.NVP_CHRONOS_TIME_TRACKING>;

Expand Down
2 changes: 1 addition & 1 deletion src/libs/actions/IOU/Hold.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ import {
} from '@libs/ReportUtils';
import {getAmount, isScanFailedTransactionMovedOnPayment} from '@libs/TransactionUtils';

import {notifyNewAction} from '@userActions/Report';
import {notifyNewAction} from '@userActions/Report/reportActionSubscribers';

import CONST from '@src/CONST';
import ONYXKEYS from '@src/ONYXKEYS';
Expand Down
3 changes: 2 additions & 1 deletion src/libs/actions/IOU/PayMoneyRequest.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,8 @@ import {shouldSplitScanFailedTransactions} from '@libs/TransactionUtils';

import {buildPolicyData, generatePolicyID} from '@userActions/Policy/Policy';
import type {BuildPolicyDataKeys} from '@userActions/Policy/Policy';
import {completeOnboarding, notifyNewAction} from '@userActions/Report';
import {completeOnboarding} from '@userActions/Report';
import {notifyNewAction} from '@userActions/Report/reportActionSubscribers';
import {getOnboardingMessages} from '@userActions/Welcome/OnboardingFlow';
import type {OnboardingCompanySize} from '@userActions/Welcome/OnboardingFlow';

Expand Down
2 changes: 1 addition & 1 deletion src/libs/actions/IOU/PerDiem.ts
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ import {addOptimization} from '@libs/telemetry/submitFollowUpAction';
import {buildOptimisticTransaction} from '@libs/TransactionUtils';

import {buildOptimisticPolicyRecentlyUsedTags} from '@userActions/Policy/Tag';
import {notifyNewAction} from '@userActions/Report';
import {notifyNewAction} from '@userActions/Report/reportActionSubscribers';

import CONST from '@src/CONST';
import ONYXKEYS from '@src/ONYXKEYS';
Expand Down
2 changes: 1 addition & 1 deletion src/libs/actions/IOU/RejectMoneyRequest.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ import {
import {getAmount, getCurrency} from '@libs/TransactionUtils';
import type {AvatarSource} from '@libs/UserAvatarUtils';

import {notifyNewAction} from '@userActions/Report';
import {notifyNewAction} from '@userActions/Report/reportActionSubscribers';

import CONST from '@src/CONST';
import NAVIGATORS from '@src/NAVIGATORS';
Expand Down
2 changes: 1 addition & 1 deletion src/libs/actions/IOU/SendInvoice.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ import {addOptimization} from '@libs/telemetry/submitFollowUpAction';
import {buildOptimisticTransaction} from '@libs/TransactionUtils';

import {buildOptimisticPolicyRecentlyUsedTags} from '@userActions/Policy/Tag';
import {notifyNewAction} from '@userActions/Report';
import {notifyNewAction} from '@userActions/Report/reportActionSubscribers';

import CONST from '@src/CONST';
import ONYXKEYS from '@src/ONYXKEYS';
Expand Down
2 changes: 1 addition & 1 deletion src/libs/actions/IOU/SendMoney.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ import playSound, {SOUNDS} from '@libs/Sound';
import {addOptimization, startTracking} from '@libs/telemetry/submitFollowUpAction';
import {buildOptimisticTransaction} from '@libs/TransactionUtils';

import {notifyNewAction} from '@userActions/Report';
import {notifyNewAction} from '@userActions/Report/reportActionSubscribers';

import CONST from '@src/CONST';
import ONYXKEYS from '@src/ONYXKEYS';
Expand Down
2 changes: 1 addition & 1 deletion src/libs/actions/IOU/Split.ts
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ import {
} from '@libs/TransactionUtils';

import {buildOptimisticPolicyRecentlyUsedTags} from '@userActions/Policy/Tag';
import {notifyNewAction} from '@userActions/Report';
import {notifyNewAction} from '@userActions/Report/reportActionSubscribers';
import {sanitizeWaypointsForAPI} from '@userActions/Transaction';

import CONST from '@src/CONST';
Expand Down
3 changes: 2 additions & 1 deletion src/libs/actions/IOU/TrackExpense.ts
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,8 @@ import {buildAddMembersToWorkspaceOnyxData, buildUpdateWorkspaceMembersRoleOnyxD
import {buildPolicyData} from '@userActions/Policy/Policy';
import type {BuildPolicyDataKeys} from '@userActions/Policy/Policy';
import type {GuidedSetupData} from '@userActions/Report';
import {buildInviteToRoomOnyxData, notifyNewAction} from '@userActions/Report';
import {buildInviteToRoomOnyxData} from '@userActions/Report';
import {notifyNewAction} from '@userActions/Report/reportActionSubscribers';
import {stringifyWaypointsForAPI} from '@userActions/Transaction';
import {getOnboardingMessages} from '@userActions/Welcome/OnboardingFlow';

Expand Down
37 changes: 2 additions & 35 deletions src/libs/actions/Link.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import * as API from '@libs/API';
import type {GenerateSpotnanaTokenParams} from '@libs/API/parameters';
import {SIDE_EFFECT_REQUEST_COMMANDS} from '@libs/API/types';
import asyncOpenURL from '@libs/asyncOpenURL';
import * as Environment from '@libs/Environment/Environment';
import buildOldDotURL from '@libs/buildOldDotURL';
import getIsNarrowLayout from '@libs/getIsNarrowLayout';
import isPublicScreenRoute from '@libs/isPublicScreenRoute';
import Log from '@libs/Log';
Expand All @@ -17,6 +17,7 @@ import Navigation from '@libs/Navigation/Navigation';
import navigationRef from '@libs/Navigation/navigationRef';
import REPORT_LINK_ROUTE_PARAMS from '@libs/Navigation/reportLinkRouteParams';
import {getIsOffline} from '@libs/NetworkState';
import openExternalLink from '@libs/openExternalLink';
import {findLastAccessedReport, getReportIDFromLink, getReportOrDraftReport, getRouteFromLink, isMoneyRequestReport} from '@libs/ReportUtils';
import shouldSkipDeepLinkNavigation from '@libs/shouldSkipDeepLinkNavigation';
import {endSpan, getSpan, startSpan} from '@libs/telemetry/activeSpans';
Expand All @@ -42,48 +43,15 @@ import {doneCheckingPublicRoom, navigateToConciergeChat, openReport} from './Rep
import {canAnonymousUserAccessRoute, isAnonymousUser, signOutAndRedirectToSignIn, waitForUserSignIn} from './Session';
import {setOnboardingErrorMessage} from './Welcome';

let currentUserEmail = '';
let currentUserAccountID: number = CONST.DEFAULT_NUMBER_ID;
// Use connectWithoutView since this is to open an external link and doesn't affect any UI
Onyx.connectWithoutView({
key: ONYXKEYS.SESSION,
callback: (value) => {
currentUserEmail = value?.email ?? '';
currentUserAccountID = value?.accountID ?? CONST.DEFAULT_NUMBER_ID;
},
});

function buildOldDotURL(url: string, shortLivedAuthToken?: string): Promise<string> {
const hashIndex = url.lastIndexOf('#');
const hasHashParams = hashIndex !== -1;
const hasURLParams = url.indexOf('?') !== -1;
let originURL = url;
let hashParams = '';
if (hasHashParams) {
originURL = url.substring(0, hashIndex);
hashParams = url.substring(hashIndex);
}

const authTokenParam = shortLivedAuthToken ? `authToken=${shortLivedAuthToken}` : '';
const emailParam = `email=${encodeURIComponent(currentUserEmail)}`;
const paramsArray = [authTokenParam, emailParam];
const params = paramsArray.filter(Boolean).join('&');

return Environment.getOldDotEnvironmentURL().then((environmentURL) => {
const oldDotDomain = addTrailingForwardSlash(environmentURL);

// If the URL contains # or ?, we can assume they don't need to have the `?` token to start listing url parameters.
return `${oldDotDomain}${originURL}${hasURLParams ? '&' : '?'}${params}${hashParams}`;
});
}

/**
* @param shouldSkipCustomSafariLogic When true, we will use `Linking.openURL` even if the browser is Safari.
*/
function openExternalLink(url: string, shouldSkipCustomSafariLogic = false, shouldOpenInSameTab = false) {
asyncOpenURL(Promise.resolve(), url, shouldSkipCustomSafariLogic, shouldOpenInSameTab);
}

function openOldDotLink(url: string, shouldOpenInSameTab = false) {
if (getIsOffline()) {
buildOldDotURL(url).then((oldDotURL) => openExternalLink(oldDotURL, undefined, shouldOpenInSameTab));
Expand Down Expand Up @@ -720,7 +688,6 @@ export {
openTravelDotLink,
buildTravelDotURL,
getTravelDotLink,
buildOldDotURL,
openReportFromDeepLink,
getShortLivedAuthTokenURL,
};
39 changes: 1 addition & 38 deletions src/libs/actions/Report/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -276,13 +276,7 @@ import {DeviceEventEmitter, Linking} from 'react-native';
import Onyx from 'react-native-onyx';

import deleteReport from './DeleteReport';

type SubscriberCallback = (isFromCurrentUser: boolean, reportAction: ReportAction | undefined) => void;

type ActionSubscriber = {
reportID: string;
callback: SubscriberCallback;
};
import {notifyNewAction} from './reportActionSubscribers';

type Video = Dimensions & {
url: string;
Expand Down Expand Up @@ -817,35 +811,6 @@ function clearAgentZeroProcessingIndicator(reportID: string, agentAccountID: num
AgentZeroReasoningStore.clearReasoning(reportID, agentAccountID);
}

// New action subscriber array for report pages
let newActionSubscribers: ActionSubscriber[] = [];

/**
* Enables the Report actions file to let the ReportActionsList know that a new comment has arrived in realtime for the current report
* Add subscriber for report id
* @returns Remove subscriber for report id
*/
function subscribeToNewActionEvent(reportID: string, callback: SubscriberCallback): () => void {
newActionSubscribers.push({callback, reportID});
return () => {
newActionSubscribers = newActionSubscribers.filter((subscriber) => subscriber.reportID !== reportID);
};
}

/** Notify the ReportActionsList that a new comment has arrived */
function notifyNewAction(reportID: string | string[] | undefined, reportAction: ReportAction | undefined, isFromCurrentUser: boolean) {
if (!reportID) {
return;
}
const ids = Array.isArray(reportID) ? reportID : [reportID];
for (const id of ids) {
const actionSubscriber = newActionSubscribers.find((subscriber) => subscriber.reportID === id);
if (actionSubscriber) {
actionSubscriber.callback(isFromCurrentUser, reportAction);
}
}
}

/**
* Builds an optimistic report action with resolved followups (followup-list marked as selected).
* @param reportAction - The report action to check and potentially resolve
Expand Down Expand Up @@ -9043,7 +9008,6 @@ export {
navigateToConciergeChat,
navigateToConciergeChatAndDeleteReport,
clearCreateChatError,
notifyNewAction,
openReport,
openRoomMembersPage,
readNewestAction,
Expand All @@ -9065,7 +9029,6 @@ export {
shouldShowReportActionNotification,
showReportActionNotification,
startNewChat,
subscribeToNewActionEvent,
subscribeToReportLeavingEvents,
clearAgentZeroProcessingIndicator,
clearConciergeThinkingKickoff,
Expand Down
42 changes: 42 additions & 0 deletions src/libs/actions/Report/reportActionSubscribers.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
/**
* Subscriber registry for new report actions, kept out of the Report hub so callers can notify without importing it.
*/
import type ReportAction from '@src/types/onyx/ReportAction';

type SubscriberCallback = (isFromCurrentUser: boolean, reportAction: ReportAction | undefined) => void;

type ActionSubscriber = {
reportID: string;
callback: SubscriberCallback;
};

// New action subscriber array for report pages
let newActionSubscribers: ActionSubscriber[] = [];

/**
* Enables the Report actions file to let the ReportActionsList know that a new comment has arrived in realtime for the current report
* Add subscriber for report id
* @returns Remove subscriber for report id
*/
function subscribeToNewActionEvent(reportID: string, callback: SubscriberCallback): () => void {
newActionSubscribers.push({callback, reportID});
return () => {
newActionSubscribers = newActionSubscribers.filter((subscriber) => subscriber.reportID !== reportID);
};
}

/** Notify the ReportActionsList that a new comment has arrived */
function notifyNewAction(reportID: string | string[] | undefined, reportAction: ReportAction | undefined, isFromCurrentUser: boolean) {
if (!reportID) {
return;
}
const ids = Array.isArray(reportID) ? reportID : [reportID];
for (const id of ids) {
const actionSubscriber = newActionSubscribers.find((subscriber) => subscriber.reportID === id);
if (actionSubscriber) {
actionSubscriber.callback(isFromCurrentUser, reportAction);
}
}
}

export {subscribeToNewActionEvent, notifyNewAction};
3 changes: 2 additions & 1 deletion src/libs/actions/Session/index.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import {buildOldDotURL, openExternalLink} from '@libs/actions/Link';
import * as PersistedRequests from '@libs/actions/PersistedRequests';
import * as API from '@libs/API';
import type {
Expand All @@ -21,6 +20,7 @@ import type {
import type SignInUserParams from '@libs/API/parameters/SignInUserParams';
import {READ_COMMANDS, SIDE_EFFECT_REQUEST_COMMANDS, WRITE_COMMANDS} from '@libs/API/types';
import asyncOpenURL from '@libs/asyncOpenURL';
import buildOldDotURL from '@libs/buildOldDotURL';
import * as ErrorUtils from '@libs/ErrorUtils';
import FraudProtection from '@libs/FraudProtection';
import getPlatform from '@libs/getPlatform';
Expand All @@ -34,6 +34,7 @@ import * as MainQueue from '@libs/Network/MainQueue';
import * as NetworkStore from '@libs/Network/NetworkStore';
import {getCurrentUserEmail} from '@libs/Network/NetworkStore';
import * as SequentialQueue from '@libs/Network/SequentialQueue';
import openExternalLink from '@libs/openExternalLink';
import {buildPersonalDetailsUpdate} from '@libs/PersonalDetailsUtils';
import type {PersonalDetailsOnyxUpdate} from '@libs/PersonalDetailsUtils';
import clearPrefetchOnAppStart from '@libs/Prefetch/clearPrefetchOnAppStart';
Expand Down
Loading
Loading