Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/38774 expensify persona #41343

Merged
merged 25 commits into from
Jun 11, 2024
Merged
Show file tree
Hide file tree
Changes from 10 commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
e343aa6
new persona added
burczu Apr 22, 2024
9a58f4f
using expensify persona only for odd account ids
burczu Apr 22, 2024
6da74e4
handling new system report type
burczu Apr 26, 2024
aaa3cd4
navigating to system chat at the end of the onboarding process added
burczu Apr 26, 2024
282490a
addional todo comment added
burczu Apr 26, 2024
f50eaaa
fix: resolve conflicts
koko57 Apr 30, 2024
0410d8f
fix: minor fix
koko57 Apr 30, 2024
179575f
fix: remove comment
koko57 Apr 30, 2024
9cba84a
fix: remove unnecessary condition
koko57 Apr 30, 2024
ba3aa46
fix: remove console log
koko57 Apr 30, 2024
5c2e6d2
fix: remove unnecessary change
koko57 May 2, 2024
36842b8
fix: apply requested changes
koko57 May 2, 2024
a6b6593
fix: lint
koko57 May 2, 2024
d858c04
Merge branch 'main' into feature/38774-expensify-persona-agata
burczu May 6, 2024
56cd07f
fix: resolve conflicts
koko57 Jun 4, 2024
8365690
fix: apply requested changes
koko57 Jun 4, 2024
717fe74
fix: lint
koko57 Jun 4, 2024
b765fe2
Merge branch 'main' into feature/38774-expensify-persona
koko57 Jun 10, 2024
e921c92
fix: show Persona chat in LHN
koko57 Jun 10, 2024
eab9f0b
fix: remove unnecessary comment
koko57 Jun 10, 2024
99b7398
fix: show only Expensify name for persona chat
koko57 Jun 10, 2024
0205df8
Merge branch 'main' into feature/38774-expensify-persona
koko57 Jun 11, 2024
08a87cd
fix: show persona chat only for onboarded by persona users
koko57 Jun 11, 2024
2015e43
Merge branch 'main' into feature/38774-expensify-persona
koko57 Jun 11, 2024
5dc7f6c
fix: lint and typecheck
koko57 Jun 11, 2024
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
4 changes: 3 additions & 1 deletion src/libs/AccountUtils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,6 @@ import type {Account} from '@src/types/onyx';
const isValidateCodeFormSubmitting = (account: OnyxEntry<Account>) =>
!!account?.isLoading && account.loadingForm === (account.requiresTwoFactorAuth ? CONST.FORMS.VALIDATE_TFA_CODE_FORM : CONST.FORMS.VALIDATE_CODE_FORM);

export default {isValidateCodeFormSubmitting};
const isAccountIDOddNumber = (accountID: number) => accountID % 2 === 1;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

NAB - this could be made a bit more generic as NumberUtils.isOdd(value: number)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we please move this to the permissions file so that it is treated just like any of the other betas?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fair, I think we were not looking at this as a beta, but I can see where you are coming from. @koko57 do you think you could move this around to permissions file?


export default {isValidateCodeFormSubmitting, isAccountIDOddNumber};
13 changes: 12 additions & 1 deletion src/libs/ReportUtils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4974,7 +4974,6 @@ function shouldReportBeInOptionList({
// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
report?.isHidden ||
// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing

report?.participantAccountIDs?.includes(CONST.ACCOUNT_ID.NOTIFICATIONS) ||
(report?.participantAccountIDs?.length === 0 &&
!isChatThread(report) &&
!isPublicRoom(report) &&
Expand Down Expand Up @@ -5061,6 +5060,17 @@ function shouldReportBeInOptionList({
return true;
}

/**
* Returns the system report from the list of reports.
*/
function getSystemChat(): OnyxEntry<Report> {
if (!allReports) {
return null;
}

return Object.values(allReports ?? {}).find((report) => report?.chatType === CONST.REPORT.CHAT_TYPE.SYSTEM) ?? null;
}

/**
* Attempts to find a report in onyx with the provided list of participants. Does not include threads, task, expense, room, and policy expense chat.
*/
Expand Down Expand Up @@ -6544,6 +6554,7 @@ export {
getRoomWelcomeMessage,
getRootParentReport,
getRouteFromLink,
getSystemChat,
getTaskAssigneeChatOnyxData,
getTransactionDetails,
getTransactionReportName,
Expand Down
6 changes: 6 additions & 0 deletions src/libs/SidebarUtils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import localeCompare from './LocaleCompare';
import * as LocalePhoneNumber from './LocalePhoneNumber';
import * as Localize from './Localize';
import * as OptionsListUtils from './OptionsListUtils';
import * as PersonalDetailsUtils from './PersonalDetailsUtils';
import * as ReportActionsUtils from './ReportActionsUtils';
import * as ReportUtils from './ReportUtils';
import * as TaskUtils from './TaskUtils';
Expand Down Expand Up @@ -244,6 +245,11 @@ function getOptionData({
participantAccountIDs = [report.ownerAccountID ?? 0];
}

// TODO: this is added for the testing purposes only - should be removed once participants list of the system report is filled
if (report.chatType === CONST.REPORT.CHAT_TYPE.SYSTEM) {
participantAccountIDs = [report.ownerAccountID ?? 0, ...PersonalDetailsUtils.getAccountIDsByLogins([CONST.EMAIL.NOTIFICATIONS])];
}

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Are we good to remove this block of code?

const participantPersonalDetailList = Object.values(OptionsListUtils.getPersonalDetailsForAccountIDs(participantAccountIDs, personalDetails)) as PersonalDetails[];
const personalDetail = participantPersonalDetailList[0] ?? {};
const hasErrors = Object.keys(result.allReportErrors ?? {}).length !== 0;
Expand Down
51 changes: 43 additions & 8 deletions src/libs/actions/Report.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import Onyx from 'react-native-onyx';
import type {PartialDeep, ValueOf} from 'type-fest';
import type {Emoji} from '@assets/emojis/types';
import type {FileObject} from '@components/AttachmentModal';
import AccountUtils from '@libs/AccountUtils';
import * as ActiveClientManager from '@libs/ActiveClientManager';
import * as API from '@libs/API';
import type {
Expand Down Expand Up @@ -350,7 +351,10 @@ function subscribeToReportTypingEvents(reportID: string) {
delete typingWatchTimers[reportUserIdentifier];
}, 1500);
}).catch((error) => {
Log.hmmm('[Report] Failed to initially subscribe to Pusher channel', {errorType: error.type, pusherChannelName});
Log.hmmm('[Report] Failed to initially subscribe to Pusher channel', {
errorType: error.type,
pusherChannelName,
});
});
}

Expand Down Expand Up @@ -381,7 +385,10 @@ function subscribeToReportLeavingEvents(reportID: string) {

Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT_USER_IS_LEAVING_ROOM}${reportID}`, true);
}).catch((error) => {
Log.hmmm('[Report] Failed to initially subscribe to Pusher channel', {errorType: error.type, pusherChannelName});
Log.hmmm('[Report] Failed to initially subscribe to Pusher channel', {
errorType: error.type,
pusherChannelName,
});
});
}

Expand Down Expand Up @@ -870,7 +877,11 @@ function openReport(

if (isFromDeepLink) {
// eslint-disable-next-line rulesdir/no-api-side-effects-method
API.makeRequestWithSideEffects(SIDE_EFFECT_REQUEST_COMMANDS.OPEN_REPORT, parameters, {optimisticData, successData, failureData}).finally(() => {
API.makeRequestWithSideEffects(SIDE_EFFECT_REQUEST_COMMANDS.OPEN_REPORT, parameters, {
optimisticData,
successData,
failureData,
}).finally(() => {
Onyx.set(ONYXKEYS.IS_CHECKING_PUBLIC_ROOM, false);
});
} else {
Expand Down Expand Up @@ -1850,7 +1861,10 @@ function updateDescription(reportID: string, previousValue: string, newValue: st
{
onyxMethod: Onyx.METHOD.MERGE,
key: `${ONYXKEYS.COLLECTION.REPORT}${reportID}`,
value: {description: parsedDescription, pendingFields: {description: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE}},
value: {
description: parsedDescription,
pendingFields: {description: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE},
},
},
];
const failureData: OnyxUpdate[] = [
Expand Down Expand Up @@ -1925,6 +1939,17 @@ function navigateToConciergeChat(shouldDismissModal = false, checkIfCurrentPageA
}
}

/**
* Navigates to the 1:1 system chat
*/
function navigateToSystemChat() {
const systemChatReport = ReportUtils.getSystemChat();

if (systemChatReport && systemChatReport.reportID) {
Navigation.navigate(ROUTES.REPORT_WITH_ID.getRoute(systemChatReport.reportID));
}
}

/** Add a policy report (workspace room) optimistically and navigate to it. */
function addPolicyReport(policyReport: ReportUtils.OptimisticChatReport) {
const createdReportAction = ReportUtils.buildOptimisticCreatedReportAction(CONST.POLICY.OWNER_EMAIL_FAKE);
Expand Down Expand Up @@ -2202,7 +2227,10 @@ function shouldShowReportActionNotification(reportID: string, action: ReportActi

// If this notification was delayed and the user saw the message already, don't show it
if (action && report?.lastReadTime && report.lastReadTime >= action.created) {
Log.info(`${tag} No notification because the comment was already read`, false, {created: action.created, lastReadTime: report.lastReadTime});
Log.info(`${tag} No notification because the comment was already read`, false, {
created: action.created,
lastReadTime: report.lastReadTime,
});
return false;
}

Expand Down Expand Up @@ -2230,7 +2258,10 @@ function showReportActionNotification(reportID: string, reportAction: ReportActi

const report = allReports?.[reportID] ?? null;
if (!report) {
Log.hmmm("[LocalNotification] couldn't show report action notification because the report wasn't found", {reportID, reportActionID: reportAction.reportActionID});
Log.hmmm("[LocalNotification] couldn't show report action notification because the report wasn't found", {
reportID,
reportActionID: reportAction.reportActionID,
});
return;
}

Expand Down Expand Up @@ -3011,9 +3042,12 @@ function completeOnboarding(
},
adminsChatReportID?: string,
) {
const targetEmail = CONST.EMAIL.CONCIERGE;
const isAccountIDOdd = AccountUtils.isAccountIDOddNumber(currentUserAccountID ?? 0);
const targetEmail = isAccountIDOdd ? CONST.EMAIL.NOTIFICATIONS : CONST.EMAIL.CONCIERGE;

const actorAccountID = PersonalDetailsUtils.getAccountIDsByLogins([targetEmail])[0];
koko57 marked this conversation as resolved.
Show resolved Hide resolved
const targetChatReport = ReportUtils.getChatByParticipants([actorAccountID]);
// TODO: using getSystemChat is rather not necessary if we could have participants list filled correctly
const targetChatReport = isAccountIDOdd ? ReportUtils.getSystemChat() : ReportUtils.getChatByParticipants([actorAccountID]);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this TODO within the scope of this PR?

const {reportID: targetChatReportID = '', policyID: targetChatPolicyID = ''} = targetChatReport ?? {};

// Mention message
Expand Down Expand Up @@ -3713,6 +3747,7 @@ export {
saveReportActionDraft,
deleteReportComment,
navigateToConciergeChat,
navigateToSystemChat,
addPolicyReport,
deleteReport,
navigateToConciergeChatAndDeleteReport,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import type {FormOnyxValues} from '@components/Form/types';
import HeaderWithBackButton from '@components/HeaderWithBackButton';
import KeyboardAvoidingView from '@components/KeyboardAvoidingView';
import OfflineIndicator from '@components/OfflineIndicator';
import {useSession} from '@components/OnyxProvider';
import Text from '@components/Text';
import TextInput from '@components/TextInput';
import withCurrentUserPersonalDetails from '@components/withCurrentUserPersonalDetails';
Expand All @@ -16,6 +17,7 @@ import useLocalize from '@hooks/useLocalize';
import useOnboardingLayout from '@hooks/useOnboardingLayout';
import useThemeStyles from '@hooks/useThemeStyles';
import useWindowDimensions from '@hooks/useWindowDimensions';
import AccountUtils from '@libs/AccountUtils';
import * as ErrorUtils from '@libs/ErrorUtils';
import Navigation from '@libs/Navigation/Navigation';
import * as ValidationUtils from '@libs/ValidationUtils';
Expand All @@ -37,6 +39,7 @@ function BaseOnboardingPersonalDetails({currentUserPersonalDetails, shouldUseNat
const {shouldUseNarrowLayout} = useOnboardingLayout();
const {inputCallbackRef} = useAutoFocusInput();
const [shouldValidateOnChange, setShouldValidateOnChange] = useState(false);
const {accountID} = useSession();

useDisableModalDismissOnEscape();

Expand Down Expand Up @@ -69,6 +72,8 @@ function BaseOnboardingPersonalDetails({currentUserPersonalDetails, shouldUseNat
// Otherwise stay on the chats screen.
if (isSmallScreenWidth) {
Navigation.navigate(ROUTES.HOME);
} else if (AccountUtils.isAccountIDOddNumber(accountID ?? 0)) {
Report.navigateToSystemChat();
} else {
Report.navigateToConciergeChat();
}
Expand All @@ -79,7 +84,7 @@ function BaseOnboardingPersonalDetails({currentUserPersonalDetails, shouldUseNat
Navigation.navigate(ROUTES.WELCOME_VIDEO_ROOT);
}, variables.welcomeVideoDelay);
},
[currentUserPersonalDetails.login, isSmallScreenWidth, onboardingPurposeSelected],
[currentUserPersonalDetails.login, isSmallScreenWidth, onboardingPurposeSelected, accountID],
);

const validate = (values: FormOnyxValues<'onboardingPersonalDetailsForm'>) => {
Expand Down
7 changes: 6 additions & 1 deletion src/pages/OnboardingWork/BaseOnboardingWork.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import type {FormInputErrors, FormOnyxValues} from '@components/Form/types';
import HeaderWithBackButton from '@components/HeaderWithBackButton';
import KeyboardAvoidingView from '@components/KeyboardAvoidingView';
import OfflineIndicator from '@components/OfflineIndicator';
import {useSession} from '@components/OnyxProvider';
import Text from '@components/Text';
import TextInput from '@components/TextInput';
import withCurrentUserPersonalDetails from '@components/withCurrentUserPersonalDetails';
Expand All @@ -15,6 +16,7 @@ import useLocalize from '@hooks/useLocalize';
import useOnboardingLayout from '@hooks/useOnboardingLayout';
import useThemeStyles from '@hooks/useThemeStyles';
import useWindowDimensions from '@hooks/useWindowDimensions';
import AccountUtils from '@libs/AccountUtils';
import * as ErrorUtils from '@libs/ErrorUtils';
import Navigation from '@libs/Navigation/Navigation';
import * as ValidationUtils from '@libs/ValidationUtils';
Expand All @@ -32,6 +34,7 @@ function BaseOnboardingWork({currentUserPersonalDetails, shouldUseNativeStyles,
const {translate} = useLocalize();
const {isSmallScreenWidth} = useWindowDimensions();
const {shouldUseNarrowLayout} = useOnboardingLayout();
const {accountID} = useSession();

useDisableModalDismissOnEscape();

Expand Down Expand Up @@ -62,6 +65,8 @@ function BaseOnboardingWork({currentUserPersonalDetails, shouldUseNativeStyles,
// Otherwise stay on the chats screen.
if (isSmallScreenWidth) {
Navigation.navigate(ROUTES.HOME);
} else if (AccountUtils.isAccountIDOddNumber(accountID ?? 0)) {
Report.navigateToSystemChat();
} else {
Report.navigateToConciergeChat();
}
Expand All @@ -72,7 +77,7 @@ function BaseOnboardingWork({currentUserPersonalDetails, shouldUseNativeStyles,
Navigation.navigate(ROUTES.WELCOME_VIDEO_ROOT);
}, variables.welcomeVideoDelay);
},
[currentUserPersonalDetails.firstName, currentUserPersonalDetails.lastName, currentUserPersonalDetails.login, isSmallScreenWidth, onboardingPurposeSelected],
[currentUserPersonalDetails.firstName, currentUserPersonalDetails.lastName, currentUserPersonalDetails.login, isSmallScreenWidth, onboardingPurposeSelected, accountID],
);

const validate = (values: FormOnyxValues<'onboardingWorkForm'>) => {
Expand Down
Loading