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
11 changes: 7 additions & 4 deletions src/components/SettlementButton/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -17,14 +17,15 @@ import RenderHTML from '@components/RenderHTML';
import useActiveAdminPolicies from '@hooks/useActiveAdminPolicies';
import useConfirmModal from '@hooks/useConfirmModal';
import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails';
import useLastWorkspaceNumber from '@hooks/useLastWorkspaceNumber';
import {useMemoizedLazyExpensifyIcons} from '@hooks/useLazyAsset';
import useLocalize from '@hooks/useLocalize';
import useNetwork from '@hooks/useNetwork';
import useOnyx from '@hooks/useOnyx';
import usePermissions from '@hooks/usePermissions';
import usePolicy from '@hooks/usePolicy';
import useThemeStyles from '@hooks/useThemeStyles';
import {createWorkspace, isCurrencySupportedForDirectReimbursement, isCurrencySupportedForGlobalReimbursement} from '@libs/actions/Policy/Policy';
import {createWorkspace, generateDefaultWorkspaceName, isCurrencySupportedForDirectReimbursement, isCurrencySupportedForGlobalReimbursement} from '@libs/actions/Policy/Policy';
import {navigateToBankAccountRoute} from '@libs/actions/ReimbursementAccount';
import {getLastPolicyBankAccountID, getLastPolicyPaymentMethod} from '@libs/actions/Search';
import {isBankAccountPartiallySetup} from '@libs/BankAccountUtils';
Expand Down Expand Up @@ -106,7 +107,8 @@ function SettlementButton({
const {translate, localeCompare} = useLocalize();
const {isOffline} = useNetwork();
const policy = usePolicy(policyID);
const {accountID, email} = useCurrentUserPersonalDetails();
const {accountID, email = ''} = useCurrentUserPersonalDetails();
const lastWorkspaceNumber = useLastWorkspaceNumber();

// The app would crash due to subscribing to the entire report collection if chatReportID is an empty string. So we should have a fallback ID here.
// eslint-disable-next-line rulesdir/no-default-id-values
Expand Down Expand Up @@ -166,7 +168,7 @@ function SettlementButton({
const [delegateEmail] = useOnyx(ONYXKEYS.ACCOUNT, {selector: delegateEmailSelector});
const isASAPSubmitBetaEnabled = isBetaEnabled(CONST.BETAS.ASAP_SUBMIT);
const isPayInvoiceViaExpensifyBetaEnabled = isBetaEnabled(CONST.BETAS.PAY_INVOICE_VIA_EXPENSIFY);
const hasViolations = hasViolationsReportUtils(iouReport?.reportID, transactionViolations, accountID, email ?? '');
const hasViolations = hasViolationsReportUtils(iouReport?.reportID, transactionViolations, accountID, email);

const isInvoiceReport = (!isEmptyObject(iouReport) && isInvoiceReportUtil(iouReport)) || false;

Expand Down Expand Up @@ -418,10 +420,11 @@ function SettlementButton({
introSelected,
activePolicyID,
currentUserAccountIDParam: currentUserPersonalDetails.accountID,
currentUserEmailParam: currentUserPersonalDetails.email ?? '',
currentUserEmailParam: email,
betas,
isSelfTourViewed,
hasActiveAdminPolicies: !!activeAdminPolicies.length,
policyName: generateDefaultWorkspaceName(email, lastWorkspaceNumber, translate),
}).policyID;
};

Expand Down
4 changes: 2 additions & 2 deletions src/components/WorkspaceConfirmationForm.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import useOnyx from '@hooks/useOnyx';
import useThemeStyles from '@hooks/useThemeStyles';
import useWorkspaceConfirmationAvatar from '@hooks/useWorkspaceConfirmationAvatar';
import {clearDraftValues} from '@libs/actions/FormActions';
import {generatePolicyID, newGenerateDefaultWorkspaceName} from '@libs/actions/Policy/Policy';
import {generateDefaultWorkspaceName, generatePolicyID} from '@libs/actions/Policy/Policy';
import type {CustomRNImageManipulatorResult} from '@libs/cropOrRotateImage/types';
import {addErrorMessage} from '@libs/ErrorUtils';
import getFirstAlphaNumericCharacter from '@libs/getFirstAlphaNumericCharacter';
Expand Down Expand Up @@ -117,7 +117,7 @@ function WorkspaceConfirmationForm({onSubmit, policyOwnerEmail = '', onBackButto

const email = policyOwnerEmail || (session?.email ?? '');
const lastWorkspaceNumber = lastWorkspaceNumberSelector(policies, email);
const defaultWorkspaceName = newGenerateDefaultWorkspaceName(email, lastWorkspaceNumber, translate);
const defaultWorkspaceName = generateDefaultWorkspaceName(email, lastWorkspaceNumber, translate);
const [workspaceNameFirstCharacter, setWorkspaceNameFirstCharacter] = useState(defaultWorkspaceName ?? '');

const userCurrency = draftValues?.currency ?? currentUserPersonalDetails?.localCurrencyCode ?? CONST.CURRENCY.USD;
Expand Down
4 changes: 2 additions & 2 deletions src/hooks/useAutoCreateTrackWorkspace.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import type {OnyxCollection} from 'react-native-onyx';
import {navigateAfterOnboardingWithMicrotaskQueue} from '@libs/navigateAfterOnboarding';
import {createDisplayName} from '@libs/PersonalDetailsUtils';
import {isPaidGroupPolicy, isPolicyAdmin} from '@libs/PolicyUtils';
import {createWorkspace, generatePolicyID, newGenerateDefaultWorkspaceName} from '@userActions/Policy/Policy';
import {createWorkspace, generateDefaultWorkspaceName, generatePolicyID} from '@userActions/Policy/Policy';
import {completeOnboarding} from '@userActions/Report';
import {setOnboardingAdminsChatReportID, setOnboardingPolicyID} from '@userActions/Welcome';
import CONST from '@src/CONST';
Expand Down Expand Up @@ -75,7 +75,7 @@ function useAutoCreateTrackWorkspace() {
? createWorkspace({
policyOwnerEmail: undefined,
makeMeAdmin: true,
policyName: newGenerateDefaultWorkspaceName(session?.email ?? '', lastWorkspaceNumber, translate, displayName),
policyName: generateDefaultWorkspaceName(session?.email ?? '', lastWorkspaceNumber, translate, displayName),
policyID: generatePolicyID(),
engagementChoice: CONST.ONBOARDING_CHOICES.TRACK_WORKSPACE,
currency: currentUserPersonalDetails.localCurrencyCode ?? CONST.CURRENCY.USD,
Expand Down
6 changes: 3 additions & 3 deletions src/libs/actions/App.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ import type Locale from '@src/types/onyx/Locale';
import type {OnyxData} from '@src/types/onyx/Request';
import {setShouldForceOffline} from './Network';
import {getAll, rollbackOngoingRequest, save} from './PersistedRequests';
import {createDraftInitialWorkspace, createWorkspace, generatePolicyID, newGenerateDefaultWorkspaceName} from './Policy/Policy';
import {createDraftInitialWorkspace, createWorkspace, generateDefaultWorkspaceName, generatePolicyID} from './Policy/Policy';

type PolicyParamsForOpenOrReconnect = {
policyIDList: string[];
Expand Down Expand Up @@ -675,7 +675,7 @@ function createWorkspaceWithPolicyDraft(params: CreateWorkspaceWithPolicyDraftPa
type SavePolicyDraftByNewWorkspaceParams = {
isSelfTourViewed: boolean | undefined;
policyID?: string;
policyName?: string;
policyName: string;
policyOwnerEmail?: string;
makeMeAdmin?: boolean;
currency?: string;
Expand Down Expand Up @@ -786,7 +786,7 @@ function setUpPoliciesAndNavigate(
introSelected,
currency,
policyOwnerEmail,
policyName: policyName || newGenerateDefaultWorkspaceName(policyOwnerEmail, lastWorkspaceNumber, translate),
policyName: policyName || generateDefaultWorkspaceName(policyOwnerEmail, lastWorkspaceNumber, translate),
transitionFromOldDot: true,
makeMeAdmin,
activePolicyID,
Expand Down
6 changes: 5 additions & 1 deletion src/libs/actions/IOU/TrackExpense.ts
Original file line number Diff line number Diff line change
Expand Up @@ -190,6 +190,7 @@ type GetTrackExpenseInformationParams = {
quickAction: OnyxEntry<OnyxTypes.QuickAction>;
betas: OnyxEntry<OnyxTypes.Beta[]>;
isSelfTourViewed: boolean;
defaultWorkspaceName?: string;
};

type DeleteTrackExpenseParams = {
Expand Down Expand Up @@ -826,6 +827,7 @@ function getTrackExpenseInformation(params: GetTrackExpenseInformationParams): T
quickAction,
betas,
isSelfTourViewed,
defaultWorkspaceName,
} = params;
const {payeeAccountID = getUserAccountID(), payeeEmail = getCurrentUserEmail(), participant} = participantParams;
const {policy} = policyParams;
Expand Down Expand Up @@ -960,7 +962,7 @@ function getTrackExpenseInformation(params: GetTrackExpenseInformationParams): T
const workspaceData = buildPolicyData({
policyOwnerEmail: undefined,
makeMeAdmin: policy?.makeMeAdmin,
policyName: policy?.name,
policyName: policy?.name ?? defaultWorkspaceName ?? '',
policyID: policy?.id,
expenseReportId: chatReport?.reportID,
engagementChoice: CONST.ONBOARDING_CHOICES.TRACK_WORKSPACE,
Expand Down Expand Up @@ -2245,6 +2247,7 @@ function trackExpense(params: CreateTrackExpenseParams) {
betas,
draftTransactionIDs = [],
isSelfTourViewed,
defaultWorkspaceName,
} = params;
const {participant, payeeAccountID, payeeEmail} = participantParams;
const {policy, policyCategories, policyTagList} = policyData;
Expand Down Expand Up @@ -2385,6 +2388,7 @@ function trackExpense(params: CreateTrackExpenseParams) {
quickAction,
betas,
isSelfTourViewed,
defaultWorkspaceName,
}) ?? {};
const activeReportID = isMoneyRequestReport ? report?.reportID : chatReport?.reportID;
const onyxData: TrackedExpenseParams['onyxData'] = trackExpenseInformationOnyxData;
Expand Down
1 change: 1 addition & 0 deletions src/libs/actions/IOU/types/CreateTrackExpenseParams.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ type CreateTrackExpenseParams = {
betas: OnyxEntry<OnyxTypes.Beta[]>;
draftTransactionIDs: string[] | undefined;
isSelfTourViewed: boolean;
defaultWorkspaceName?: string;
};

export type {CreateTrackExpenseParams, TrackExpenseAccountantParams};
10 changes: 5 additions & 5 deletions src/libs/actions/Policy/Policy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -252,7 +252,7 @@
};

const deprecatedAllPolicies: OnyxCollection<Policy> = {};
Onyx.connect({

Check warning on line 255 in src/libs/actions/Policy/Policy.ts

View workflow job for this annotation

GitHub Actions / Changed files ESLint check

Onyx.connect() is deprecated. Use useOnyx() hook instead and pass the data as parameters to a pure function
key: ONYXKEYS.COLLECTION.POLICY,
callback: (val, key) => {
if (!key) {
Expand All @@ -268,7 +268,7 @@
});

let deprecatedAllReportActions: OnyxCollection<ReportActions>;
Onyx.connect({

Check warning on line 271 in src/libs/actions/Policy/Policy.ts

View workflow job for this annotation

GitHub Actions / Changed files ESLint check

Onyx.connect() is deprecated. Use useOnyx() hook instead and pass the data as parameters to a pure function
key: ONYXKEYS.COLLECTION.REPORT_ACTIONS,
waitForCollectionCallback: true,
callback: (actions) => {
Expand All @@ -278,7 +278,7 @@

let deprecatedSessionEmail = '';
let deprecatedSessionAccountID = 0;
Onyx.connect({

Check warning on line 281 in src/libs/actions/Policy/Policy.ts

View workflow job for this annotation

GitHub Actions / Changed files ESLint check

Onyx.connect() is deprecated. Use useOnyx() hook instead and pass the data as parameters to a pure function
key: ONYXKEYS.SESSION,
callback: (val) => {
deprecatedSessionEmail = val?.email ?? '';
Expand All @@ -287,7 +287,7 @@
});

let deprecatedAllPersonalDetails: OnyxEntry<PersonalDetailsList>;
Onyx.connect({

Check warning on line 290 in src/libs/actions/Policy/Policy.ts

View workflow job for this annotation

GitHub Actions / Changed files ESLint check

Onyx.connect() is deprecated. Use useOnyx() hook instead and pass the data as parameters to a pure function
key: ONYXKEYS.PERSONAL_DETAILS_LIST,
callback: (val) => (deprecatedAllPersonalDetails = val),
});
Expand Down Expand Up @@ -2186,7 +2186,7 @@
/**
* Generate a policy name based on an email and the last workspace number.
*/
function newGenerateDefaultWorkspaceName(email: string, lastWorkspaceNumber: number | undefined, localeTranslate: LocalizedTranslate, displayNameOverride?: string): string {
function generateDefaultWorkspaceName(email: string, lastWorkspaceNumber: number | undefined, localeTranslate: LocalizedTranslate, displayNameOverride?: string): string {
const emailParts = email.split('@');
if (!emailParts || emailParts.length !== 2) {
return '';
Expand All @@ -2207,7 +2207,7 @@
* Generate a policy name based on an email and policy list.
* @param [email] the email to base the workspace name on. If not passed, will use the logged-in user's email instead
*/
function generateDefaultWorkspaceName(email = '', displayNameOverride?: string): string {
function oldGenerateDefaultWorkspaceName(email = '', displayNameOverride?: string): string {
const emailParts = email ? email.split('@') : deprecatedSessionEmail.split('@');
if (!emailParts || emailParts.length !== 2) {
return '';
Expand Down Expand Up @@ -2437,7 +2437,7 @@
isSelfTourViewed,
betas,
} = options;
const workspaceName = policyName || generateDefaultWorkspaceName(policyOwnerEmail);
const workspaceName = policyName || oldGenerateDefaultWorkspaceName(policyOwnerEmail);

const {customUnits, customUnitID, customUnitRateID, outputCurrency} = buildOptimisticDistanceRateCustomUnits(currency);

Expand Down Expand Up @@ -3952,7 +3952,7 @@

// Generate new variables for the policy
const policyID = generatePolicyID();
const workspaceName = newGenerateDefaultWorkspaceName(currentUserEmail, lastWorkspaceNumber, localeTranslate);
const workspaceName = generateDefaultWorkspaceName(currentUserEmail, lastWorkspaceNumber, localeTranslate);
const employeeAccountID = iouReport?.ownerAccountID;
const {customUnits, customUnitID, customUnitRateID} = buildOptimisticDistanceRateCustomUnits(iouReport?.currency ?? currentUserLocalCurrency);
const oldPersonalPolicyID = iouReport?.policyID;
Expand Down Expand Up @@ -7053,8 +7053,8 @@
clearDeleteWorkspaceError,
setWorkspaceDefaultSpendCategory,
getDisplayNameForWorkspace,
newGenerateDefaultWorkspaceName,
generateDefaultWorkspaceName,
oldGenerateDefaultWorkspaceName,
updateGeneralSettings,
deleteWorkspaceAvatar,
updateWorkspaceAvatar,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import Text from '@components/Text';
import useArchivedReportsIdSet from '@hooks/useArchivedReportsIdSet';
import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails';
import useHasActiveAdminPolicies from '@hooks/useHasActiveAdminPolicies';
import useLastWorkspaceNumber from '@hooks/useLastWorkspaceNumber';
import {useMemoizedLazyIllustrations} from '@hooks/useLazyAsset';
import useLocalize from '@hooks/useLocalize';
import useNetwork from '@hooks/useNetwork';
Expand All @@ -24,7 +25,7 @@ import useOnyx from '@hooks/useOnyx';
import usePermissions from '@hooks/usePermissions';
import useResponsiveLayout from '@hooks/useResponsiveLayout';
import useThemeStyles from '@hooks/useThemeStyles';
import {createWorkspace, generatePolicyID} from '@libs/actions/Policy/Policy';
import {createWorkspace, generateDefaultWorkspaceName, generatePolicyID} from '@libs/actions/Policy/Policy';
import {completeOnboarding} from '@libs/actions/Report';
import {setOnboardingAdminsChatReportID, setOnboardingPolicyID} from '@libs/actions/Welcome';
import Log from '@libs/Log';
Expand Down Expand Up @@ -65,6 +66,7 @@ function BaseOnboardingInterestedFeatures({shouldUseNativeStyles}: BaseOnboardin
const [conciergeReportID = ''] = useOnyx(ONYXKEYS.CONCIERGE_REPORT_ID);
const archivedReportsIdSet = useArchivedReportsIdSet();
const hasActiveAdminPolicies = useHasActiveAdminPolicies();
const lastWorkspaceNumber = useLastWorkspaceNumber();

const paidGroupPolicy = Object.values(allPolicies ?? {}).find((policy) => isPaidGroupPolicy(policy) && isPolicyAdmin(policy, session?.email));
const {isOffline} = useNetwork();
Expand Down Expand Up @@ -188,13 +190,14 @@ function BaseOnboardingInterestedFeatures({shouldUseNativeStyles}: BaseOnboardin
enabled: selectedFeatures.includes(feature.id),
}));

const email = currentUserPersonalDetails.email ?? '';
// We need `adminsChatReportID` for `completeOnboarding`, but at the same time, we don't want to call `createWorkspace` more than once.
// If we have already created a workspace, we want to reuse the `onboardingAdminsChatReportID` and `onboardingPolicyID`.
const {adminsChatReportID, policyID} = shouldCreateWorkspace
? createWorkspace({
policyOwnerEmail: undefined,
makeMeAdmin: true,
policyName: '',
policyName: generateDefaultWorkspaceName(email, lastWorkspaceNumber, translate),
policyID: generatePolicyID(),
engagementChoice: CONST.ONBOARDING_CHOICES.MANAGE_TEAM,
currency: currentUserPersonalDetails?.localCurrencyCode ?? '',
Expand All @@ -206,7 +209,7 @@ function BaseOnboardingInterestedFeatures({shouldUseNativeStyles}: BaseOnboardin
introSelected,
activePolicyID,
currentUserAccountIDParam: currentUserPersonalDetails.accountID,
currentUserEmailParam: currentUserPersonalDetails.email ?? '',
currentUserEmailParam: email,
shouldAddGuideWelcomeMessage: false,
betas,
isSelfTourViewed,
Expand Down Expand Up @@ -284,6 +287,8 @@ function BaseOnboardingInterestedFeatures({shouldUseNativeStyles}: BaseOnboardin
conciergeReportID,
betas,
hasActiveAdminPolicies,
lastWorkspaceNumber,
translate,
]);

// Create items for enabled features
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ import {isPaidGroupPolicy, isPolicyAdmin} from '@libs/PolicyUtils';
import type {SkeletonSpanReasonAttributes} from '@libs/telemetry/useSkeletonSpan';
import {isRequiredFulfilled} from '@libs/ValidationUtils';
import {clearWorkspaceDetailsDraft} from '@userActions/Onboarding';
import {createWorkspace, generatePolicyID, newGenerateDefaultWorkspaceName} from '@userActions/Policy/Policy';
import {createWorkspace, generateDefaultWorkspaceName, generatePolicyID} from '@userActions/Policy/Policy';
import {setOnboardingAdminsChatReportID, setOnboardingErrorMessage, setOnboardingPolicyID} from '@userActions/Welcome';
import CONST from '@src/CONST';
import ONYXKEYS from '@src/ONYXKEYS';
Expand Down Expand Up @@ -60,7 +60,7 @@ function BaseOnboardingWorkspaceConfirmation({shouldUseNativeStyles}: BaseOnboar

const email = session?.email ?? '';
const lastWorkspaceNumber = lastWorkspaceNumberSelector(allPolicies, email);
const defaultWorkspaceName = draftValues?.name ?? newGenerateDefaultWorkspaceName(email, lastWorkspaceNumber, translate);
const defaultWorkspaceName = draftValues?.name ?? generateDefaultWorkspaceName(email, lastWorkspaceNumber, translate);
const defaultCurrency = draftValues?.currency ?? currentUserPersonalDetails?.localCurrencyCode ?? CONST.CURRENCY.USD;

useEffect(() => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ import {navigateAfterOnboardingWithMicrotaskQueue} from '@libs/navigateAfterOnbo
import Navigation from '@libs/Navigation/Navigation';
import {isPaidGroupPolicy, isPolicyAdmin} from '@libs/PolicyUtils';
import {getSubscriptionPrice} from '@libs/SubscriptionUtils';
import {createWorkspace, generatePolicyID, newGenerateDefaultWorkspaceName} from '@userActions/Policy/Policy';
import {createWorkspace, generateDefaultWorkspaceName, generatePolicyID} from '@userActions/Policy/Policy';
import {completeOnboarding as completeOnboardingReport} from '@userActions/Report';
import {setOnboardingAdminsChatReportID, setOnboardingErrorMessage, setOnboardingPolicyID} from '@userActions/Welcome';
import CONST from '@src/CONST';
Expand Down Expand Up @@ -166,7 +166,7 @@ function BaseOnboardingWorkspaceOptional({shouldUseNativeStyles}: BaseOnboarding
? createWorkspace({
policyOwnerEmail: undefined,
makeMeAdmin: true,
policyName: newGenerateDefaultWorkspaceName(email, lastWorkspaceNumber, translate),
policyName: generateDefaultWorkspaceName(email, lastWorkspaceNumber, translate),
policyID: generatePolicyID(),
engagementChoice: CONST.ONBOARDING_CHOICES.TRACK_WORKSPACE,
currency: currentUserPersonalDetails.localCurrencyCode ?? CONST.CURRENCY.USD,
Expand Down
11 changes: 2 additions & 9 deletions src/pages/iou/request/step/IOURequestStepAccountant.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails'
import useLocalize from '@hooks/useLocalize';
import useOnyx from '@hooks/useOnyx';
import {setMoneyRequestAccountant} from '@libs/actions/IOU';
import {newGenerateDefaultWorkspaceName} from '@libs/actions/Policy/Policy';
import {generateDefaultWorkspaceName} from '@libs/actions/Policy/Policy';
import Navigation from '@libs/Navigation/Navigation';
import {createDraftWorkspaceAndNavigateToConfirmationScreen} from '@libs/ReportUtils';
import MoneyRequestAccountantSelector from '@pages/iou/request/MoneyRequestAccountantSelector';
Expand Down Expand Up @@ -49,14 +49,7 @@ function IOURequestStepAccountant({
// Sharing with an accountant involves inviting them to the workspace and that requires admin access.
const hasActiveAdminWorkspaces = (adminPolicies?.length ?? 0) > 0;
if (!hasActiveAdminWorkspaces) {
createDraftWorkspaceAndNavigateToConfirmationScreen(
introSelected,
transactionID,
action,
newGenerateDefaultWorkspaceName(email, lastWorkspaceNumber, translate),
accountID,
email,
);
createDraftWorkspaceAndNavigateToConfirmationScreen(introSelected, transactionID, action, generateDefaultWorkspaceName(email, lastWorkspaceNumber, translate), accountID, email);
return;
}

Expand Down
Loading
Loading