diff --git a/src/CONST/index.ts b/src/CONST/index.ts index a2029dd35303f..e8bd897d88f5c 100755 --- a/src/CONST/index.ts +++ b/src/CONST/index.ts @@ -1102,6 +1102,7 @@ const CONST = { ACTIONABLE_ADD_PAYMENT_CARD: 'ACTIONABLEADDPAYMENTCARD', ACTIONABLE_JOIN_REQUEST: 'ACTIONABLEJOINREQUEST', ACTIONABLE_MENTION_WHISPER: 'ACTIONABLEMENTIONWHISPER', + ACTIONABLE_MENTION_INVITE_TO_SUBMIT_EXPENSE_CONFIRM_WHISPER: 'ACTIONABLEMENTIONINVITETOSUBMITEXPENSECONFIRMWHISPER', ACTIONABLE_REPORT_MENTION_WHISPER: 'ACTIONABLEREPORTMENTIONWHISPER', ACTIONABLE_TRACK_EXPENSE_WHISPER: 'ACTIONABLETRACKEXPENSEWHISPER', POLICY_EXPENSE_CHAT_WELCOME_WHISPER: 'POLICYEXPENSECHATWELCOMEWHISPER', @@ -1286,8 +1287,12 @@ const CONST = { }, ACTIONABLE_MENTION_WHISPER_RESOLUTION: { INVITE: 'invited', + INVITE_TO_SUBMIT_EXPENSE: 'inviteToSubmitExpense', NOTHING: 'nothing', }, + ACTIONABLE_MENTION_INVITE_TO_SUBMIT_EXPENSE_CONFIRM_WHISPER: { + DONE: 'done', + }, ACTIONABLE_TRACK_EXPENSE_WHISPER_RESOLUTION: { NOTHING: 'nothing', }, diff --git a/src/languages/de.ts b/src/languages/de.ts index ed4081ab710b5..17648e94ed123 100644 --- a/src/languages/de.ts +++ b/src/languages/de.ts @@ -6310,7 +6310,8 @@ const translations = { levelThreeResult: 'Nachricht aus dem Kanal entfernt, anonyme Warnung gesendet und Nachricht zur Überprüfung gemeldet.', }, actionableMentionWhisperOptions: { - invite: 'Lade sie ein', + inviteToSubmitExpense: 'Zum Einreichen von Ausgaben einladen', + inviteToChat: 'Nur zum Chatten einladen', nothing: 'Nichts tun', }, actionableMentionJoinWorkspaceOptions: { diff --git a/src/languages/en.ts b/src/languages/en.ts index 9ec97e7718f60..428aa7b2785b2 100755 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -6279,7 +6279,8 @@ const translations = { levelThreeResult: 'Message removed from channel plus anonymous warning and message is reported for review.', }, actionableMentionWhisperOptions: { - invite: 'Invite them', + inviteToSubmitExpense: 'Invite to submit expenses', + inviteToChat: 'Invite to chat only', nothing: 'Do nothing', }, actionableMentionJoinWorkspaceOptions: { diff --git a/src/languages/es.ts b/src/languages/es.ts index 42c5b55255cc5..354c2765cef4c 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -6743,7 +6743,8 @@ const translations = { copied: '¡Copiado!', }, actionableMentionWhisperOptions: { - invite: 'Invitar', + inviteToSubmitExpense: 'Invitar a enviar gastos', + inviteToChat: 'Invitar solo a chatear', nothing: 'No hacer nada', }, actionableMentionJoinWorkspaceOptions: { diff --git a/src/languages/fr.ts b/src/languages/fr.ts index e93da84b8655e..46af1135f346d 100644 --- a/src/languages/fr.ts +++ b/src/languages/fr.ts @@ -6321,7 +6321,8 @@ const translations = { levelThreeResult: 'Message supprimé du canal avec un avertissement anonyme et le message est signalé pour examen.', }, actionableMentionWhisperOptions: { - invite: 'Invitez-les', + inviteToSubmitExpense: 'Inviter à soumettre des dépenses', + inviteToChat: 'Inviter uniquement à discuter', nothing: 'Ne rien faire', }, actionableMentionJoinWorkspaceOptions: { diff --git a/src/languages/it.ts b/src/languages/it.ts index 6d22281d0f047..00ef1866b320c 100644 --- a/src/languages/it.ts +++ b/src/languages/it.ts @@ -6325,8 +6325,9 @@ const translations = { levelThreeResult: 'Messaggio rimosso dal canale più avviso anonimo e messaggio segnalato per revisione.', }, actionableMentionWhisperOptions: { - invite: 'Invitali', - nothing: 'Do nothing', + inviteToSubmitExpense: 'Invita a inviare le spese', + inviteToChat: 'Invita solo a chattare', + nothing: 'Non fare nulla', }, actionableMentionJoinWorkspaceOptions: { accept: 'Accetta', diff --git a/src/languages/ja.ts b/src/languages/ja.ts index 764686555fa63..7a70878f1021f 100644 --- a/src/languages/ja.ts +++ b/src/languages/ja.ts @@ -6283,7 +6283,8 @@ const translations = { levelThreeResult: 'チャンネルからメッセージが削除され、匿名の警告が行われ、メッセージがレビューのために報告されました。', }, actionableMentionWhisperOptions: { - invite: '招待する', + inviteToSubmitExpense: '経費の提出に招待する', + inviteToChat: 'チャットのみ招待', nothing: '何もしない', }, actionableMentionJoinWorkspaceOptions: { diff --git a/src/languages/nl.ts b/src/languages/nl.ts index 4b5358ff62921..3a4d668da3cab 100644 --- a/src/languages/nl.ts +++ b/src/languages/nl.ts @@ -6317,8 +6317,9 @@ const translations = { levelThreeResult: 'Bericht verwijderd uit kanaal plus anonieme waarschuwing en bericht is gerapporteerd voor beoordeling.', }, actionableMentionWhisperOptions: { - invite: 'Nodig hen uit', - nothing: 'Do nothing', + inviteToSubmitExpense: 'Uitnodigen om onkosten in te dienen', + inviteToChat: 'Alleen uitnodigen om te chatten', + nothing: 'Niets doen', }, actionableMentionJoinWorkspaceOptions: { accept: 'Accepteren', diff --git a/src/languages/pl.ts b/src/languages/pl.ts index 78dcb39732f3f..cd0a1d3906851 100644 --- a/src/languages/pl.ts +++ b/src/languages/pl.ts @@ -6302,8 +6302,9 @@ const translations = { levelThreeResult: 'Wiadomość usunięta z kanału, dodano anonimowe ostrzeżenie, a wiadomość została zgłoszona do przeglądu.', }, actionableMentionWhisperOptions: { - invite: 'Zaproś ich', - nothing: 'Do nothing', + inviteToSubmitExpense: 'Zaproś do przesyłania wydatków', + inviteToChat: 'Zaproś tylko do czatu', + nothing: 'Nie rób nic', }, actionableMentionJoinWorkspaceOptions: { accept: 'Akceptuj', diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts index 6ae53b3e03411..9395e982a7fe4 100644 --- a/src/languages/pt-BR.ts +++ b/src/languages/pt-BR.ts @@ -6315,7 +6315,8 @@ const translations = { levelThreeResult: 'Mensagem removida do canal, além de um aviso anônimo, e a mensagem foi relatada para revisão.', }, actionableMentionWhisperOptions: { - invite: 'Convide-os', + inviteToSubmitExpense: 'Convidar para enviar despesas', + inviteToChat: 'Convidar apenas para conversar', nothing: 'Não faça nada', }, actionableMentionJoinWorkspaceOptions: { diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts index 73f4ea2eb5089..fc6c49687044e 100644 --- a/src/languages/zh-hans.ts +++ b/src/languages/zh-hans.ts @@ -6203,8 +6203,9 @@ const translations = { levelThreeResult: '消息已从频道中移除,并收到匿名警告,消息已提交审核。', }, actionableMentionWhisperOptions: { - invite: '邀请他们', - nothing: 'Do nothing', + inviteToSubmitExpense: '邀请提交费用', + inviteToChat: '仅邀请聊天', + nothing: '什么都不做', }, actionableMentionJoinWorkspaceOptions: { accept: '接受', diff --git a/src/libs/API/parameters/ResolveActionableMentionWhisperParams.ts b/src/libs/API/parameters/ResolveActionableMentionWhisperParams.ts index 87dfc934eb5fc..3b6b05910a5be 100644 --- a/src/libs/API/parameters/ResolveActionableMentionWhisperParams.ts +++ b/src/libs/API/parameters/ResolveActionableMentionWhisperParams.ts @@ -3,7 +3,7 @@ import type CONST from '@src/CONST'; type ResolveActionableMentionWhisperParams = { reportActionID: string; - resolution: ValueOf; + resolution: ValueOf | ValueOf; }; export default ResolveActionableMentionWhisperParams; diff --git a/src/libs/ReportActionsUtils.ts b/src/libs/ReportActionsUtils.ts index 40d12e88f016d..a909bad543e0b 100644 --- a/src/libs/ReportActionsUtils.ts +++ b/src/libs/ReportActionsUtils.ts @@ -733,6 +733,12 @@ function isActionableMentionWhisper(reportAction: OnyxEntry): repo return isActionOfType(reportAction, CONST.REPORT.ACTIONS.TYPE.ACTIONABLE_MENTION_WHISPER); } +function isActionableMentionInviteToSubmitExpenseConfirmWhisper( + reportAction: OnyxEntry, +): reportAction is ReportAction { + return isActionOfType(reportAction, CONST.REPORT.ACTIONS.TYPE.ACTIONABLE_MENTION_INVITE_TO_SUBMIT_EXPENSE_CONFIRM_WHISPER); +} + /** * Checks if a given report action corresponds to an actionable report mention whisper. * @param reportAction @@ -2991,6 +2997,7 @@ export { isActionableJoinRequest, isActionableJoinRequestPending, isActionableMentionWhisper, + isActionableMentionInviteToSubmitExpenseConfirmWhisper, isActionableReportMentionWhisper, isActionableTrackExpense, isExpenseChatWelcomeWhisper, diff --git a/src/libs/actions/Report.ts b/src/libs/actions/Report.ts index 004ad36fda5a2..879653d78e104 100644 --- a/src/libs/actions/Report.ts +++ b/src/libs/actions/Report.ts @@ -200,7 +200,7 @@ import {setDownload} from './Download'; import {close} from './Modal'; import navigateFromNotification from './navigateFromNotification'; import {getAll} from './PersistedRequests'; -import {buildAddMembersToWorkspaceOnyxData, buildRoomMembersOnyxData} from './Policy/Member'; +import {addMembersToWorkspace, buildAddMembersToWorkspaceOnyxData, buildRoomMembersOnyxData} from './Policy/Member'; import {createPolicyExpenseChats} from './Policy/Policy'; import { createUpdateCommentMatcher, @@ -4346,10 +4346,37 @@ function clearNewRoomFormError() { function resolveActionableMentionWhisper( reportID: string | undefined, reportAction: OnyxEntry, - resolution: ValueOf, + resolution: ValueOf | ValueOf, + policy?: OnyxEntry, ) { + if (!reportAction || !reportID) { + return; + } + + if (ReportActionsUtils.isActionableMentionWhisper(reportAction) && resolution === CONST.REPORT.ACTIONABLE_MENTION_WHISPER_RESOLUTION.INVITE_TO_SUBMIT_EXPENSE) { + const actionOriginalMessage = ReportActionsUtils.getOriginalMessage(reportAction); + + const policyID = policy?.id; + + if (actionOriginalMessage && policyID) { + const currentUserDetails = allPersonalDetails?.[getCurrentUserAccountID()]; + const welcomeNoteSubject = `# ${currentUserDetails?.displayName ?? ''} invited you to ${policy?.name ?? 'a workspace'}`; + const welcomeNote = Localize.translateLocal('workspace.common.welcomeNote'); + const policyMemberAccountIDs = Object.values(getMemberAccountIDsForWorkspace(policy?.employeeList, false, false)); + addMembersToWorkspace( + { + [`${actionOriginalMessage.inviteeEmails?.at(0)}`]: actionOriginalMessage.inviteeAccountIDs?.at(0) ?? CONST.DEFAULT_NUMBER_ID, + }, + `${welcomeNoteSubject}\n\n${welcomeNote}`, + policyID, + policyMemberAccountIDs, + CONST.POLICY.ROLE.USER, + ); + } + } + const message = ReportActionsUtils.getReportActionMessage(reportAction); - if (!message || !reportAction || !reportID) { + if (!message) { return; } @@ -4423,6 +4450,14 @@ function resolveActionableMentionWhisper( API.write(WRITE_COMMANDS.RESOLVE_ACTIONABLE_MENTION_WHISPER, parameters, {optimisticData, failureData}); } +function resolveActionableMentionConfirmWhisper( + reportID: string | undefined, + reportAction: OnyxEntry, + resolution: ValueOf, +) { + resolveActionableMentionWhisper(reportID, reportAction, resolution); +} + function resolveActionableReportMentionWhisper( reportId: string | undefined, reportAction: OnyxEntry, @@ -5870,6 +5905,7 @@ export { removeFromGroupChat, removeFromRoom, resolveActionableMentionWhisper, + resolveActionableMentionConfirmWhisper, resolveActionableReportMentionWhisper, resolveConciergeCategoryOptions, savePrivateNotesDraft, diff --git a/src/pages/home/report/PureReportActionItem.tsx b/src/pages/home/report/PureReportActionItem.tsx index 5f2edc2a1635f..dc6f16e1dd82f 100644 --- a/src/pages/home/report/PureReportActionItem.tsx +++ b/src/pages/home/report/PureReportActionItem.tsx @@ -54,7 +54,7 @@ import {isReportMessageAttachment} from '@libs/isReportMessageAttachment'; import Navigation from '@libs/Navigation/Navigation'; import Permissions from '@libs/Permissions'; import {getDisplayNameOrDefault} from '@libs/PersonalDetailsUtils'; -import {getCleanedTagName} from '@libs/PolicyUtils'; +import {getCleanedTagName, getPersonalPolicy, isPolicyAdmin, isPolicyOwner} from '@libs/PolicyUtils'; import { extractLinksFromMessageHtml, getAddedApprovalRuleMessage, @@ -99,6 +99,7 @@ import { getWorkspaceUpdateFieldMessage, isActionableAddPaymentCard, isActionableJoinRequest, + isActionableMentionInviteToSubmitExpenseConfirmWhisper, isActionableMentionWhisper, isActionableReportMentionWhisper, isActionableTrackExpense, @@ -157,7 +158,7 @@ import variables from '@styles/variables'; import {openPersonalBankAccountSetupView} from '@userActions/BankAccounts'; import {hideEmojiPicker, isActive} from '@userActions/EmojiPickerAction'; import {acceptJoinRequest, declineJoinRequest} from '@userActions/Policy/Member'; -import {expandURLPreview, resolveConciergeCategoryOptions} from '@userActions/Report'; +import {expandURLPreview, resolveActionableMentionConfirmWhisper, resolveConciergeCategoryOptions} from '@userActions/Report'; import type {IgnoreDirection} from '@userActions/ReportActions'; import {isAnonymousUser, signOutAndRedirectToSignIn} from '@userActions/Session'; import {isBlockedFromConcierge} from '@userActions/User'; @@ -325,6 +326,7 @@ type PureReportActionItemProps = { reportId: string | undefined, reportAction: OnyxEntry, resolution: ValueOf, + policy: OnyxEntry, ) => void; /** Whether the provided report is a closed expense report with no expenses */ @@ -359,6 +361,9 @@ type PureReportActionItemProps = { /** Whether to show border for MoneyRequestReportPreviewContent */ shouldShowBorder?: boolean; + + /** Current user's account id */ + currentUserAccountID?: number; }; // This is equivalent to returning a negative boolean in normal functions, but we can keep the element return type @@ -423,6 +428,7 @@ function PureReportActionItem({ dismissTrackExpenseActionableWhisper = () => {}, userBillingFundID, shouldShowBorder, + currentUserAccountID, }: PureReportActionItemProps) { const actionSheetAwareScrollViewContext = useContext(ActionSheetAwareScrollView.ActionSheetAwareScrollViewContext); const {translate, datetimeToCalendarTime, formatPhoneNumber} = useLocalize(); @@ -446,7 +452,8 @@ function PureReportActionItem({ const prevDraftMessage = usePrevious(draftMessage); const isReportActionLinked = linkedReportActionID && action.reportActionID && linkedReportActionID === action.reportActionID; const [isReportActionActive, setIsReportActionActive] = useState(!!isReportActionLinked); - const isActionableWhisper = isActionableMentionWhisper(action) || isActionableTrackExpense(action) || isActionableReportMentionWhisper(action); + const isActionableWhisper = + isActionableMentionWhisper(action) || isActionableMentionInviteToSubmitExpenseConfirmWhisper(action) || isActionableTrackExpense(action) || isActionableReportMentionWhisper(action); const isReportArchived = useReportIsArchived(report?.reportID); const highlightedBackgroundColorIfNeeded = useMemo( @@ -801,30 +808,57 @@ function PureReportActionItem({ ]; } - return [ + if (isActionableMentionInviteToSubmitExpenseConfirmWhisper(action)) { + return [ + { + text: 'common.buttonConfirm', + key: `${action.reportActionID}-actionableReportMentionConfirmWhisper-${CONST.REPORT.ACTIONABLE_MENTION_INVITE_TO_SUBMIT_EXPENSE_CONFIRM_WHISPER.DONE}`, + onPress: () => resolveActionableMentionConfirmWhisper(reportID, action, CONST.REPORT.ACTIONABLE_MENTION_INVITE_TO_SUBMIT_EXPENSE_CONFIRM_WHISPER.DONE), + isPrimary: true, + }, + ]; + } + + const actionableMentionWhisperOptions = []; + const isReportInPolicy = !!report?.policyID && report.policyID !== CONST.POLICY.ID_FAKE && getPersonalPolicy()?.id !== report.policyID; + + if (isReportInPolicy && (isPolicyAdmin(policy) || isPolicyOwner(policy, currentUserAccountID))) { + actionableMentionWhisperOptions.push({ + text: 'actionableMentionWhisperOptions.inviteToSubmitExpense', + key: `${action.reportActionID}-actionableMentionWhisper-${CONST.REPORT.ACTIONABLE_MENTION_WHISPER_RESOLUTION.INVITE_TO_SUBMIT_EXPENSE}`, + onPress: () => resolveActionableMentionWhisper(reportID, action, CONST.REPORT.ACTIONABLE_MENTION_WHISPER_RESOLUTION.INVITE_TO_SUBMIT_EXPENSE, policy), + isMediumSized: true, + }); + } + + actionableMentionWhisperOptions.push( { - text: 'actionableMentionWhisperOptions.invite', + text: 'actionableMentionWhisperOptions.inviteToChat', key: `${action.reportActionID}-actionableMentionWhisper-${CONST.REPORT.ACTIONABLE_MENTION_WHISPER_RESOLUTION.INVITE}`, - onPress: () => resolveActionableMentionWhisper(reportID, action, CONST.REPORT.ACTIONABLE_MENTION_WHISPER_RESOLUTION.INVITE), - isPrimary: true, + onPress: () => resolveActionableMentionWhisper(reportID, action, CONST.REPORT.ACTIONABLE_MENTION_WHISPER_RESOLUTION.INVITE, policy), + isMediumSized: true, }, { text: 'actionableMentionWhisperOptions.nothing', key: `${action.reportActionID}-actionableMentionWhisper-${CONST.REPORT.ACTIONABLE_MENTION_WHISPER_RESOLUTION.NOTHING}`, - onPress: () => resolveActionableMentionWhisper(reportID, action, CONST.REPORT.ACTIONABLE_MENTION_WHISPER_RESOLUTION.NOTHING), + onPress: () => resolveActionableMentionWhisper(reportID, action, CONST.REPORT.ACTIONABLE_MENTION_WHISPER_RESOLUTION.NOTHING, policy), + isMediumSized: true, }, - ]; + ); + return actionableMentionWhisperOptions; }, [ action, + userBillingFundID, isActionableWhisper, + policy, + currentUserAccountID, reportID, - userBillingFundID, + originalReportID, + isBetaEnabled, createDraftTransactionAndNavigateToParticipantSelector, dismissTrackExpenseActionableWhisper, resolveActionableReportMentionWhisper, resolveActionableMentionWhisper, - originalReportID, - isBetaEnabled, ]); /** @@ -1229,7 +1263,7 @@ function PureReportActionItem({ {actionableItemButtons.length > 0 && ( )} diff --git a/src/pages/home/report/ReportActionItem.tsx b/src/pages/home/report/ReportActionItem.tsx index 8ed65d756be0e..aadfc53409737 100644 --- a/src/pages/home/report/ReportActionItem.tsx +++ b/src/pages/home/report/ReportActionItem.tsx @@ -53,6 +53,7 @@ function ReportActionItem({allReports, policies, action, report, transactions, s const originalReportID = useMemo(() => getOriginalReportID(reportID, action), [reportID, action]); const originalReport = allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${originalReportID}`]; const isOriginalReportArchived = useReportIsArchived(originalReportID); + const [currentUserAccountID] = useOnyx(ONYXKEYS.SESSION, {canBeMissing: false, selector: (session) => session?.accountID}); const [draftMessage] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS_DRAFTS}${originalReportID}`, { canBeMissing: true, selector: (draftMessagesForReport) => { @@ -95,6 +96,7 @@ function ReportActionItem({allReports, policies, action, report, transactions, s action={action} report={report} policy={policy} + currentUserAccountID={currentUserAccountID} draftMessage={draftMessage} iouReport={iouReport} taskReport={taskReport} diff --git a/src/types/onyx/OriginalMessage.ts b/src/types/onyx/OriginalMessage.ts index 09cd4797b973c..cea4803cd6fb1 100644 --- a/src/types/onyx/OriginalMessage.ts +++ b/src/types/onyx/OriginalMessage.ts @@ -116,6 +116,9 @@ type OriginalMessageAddComment = { /** Model of `actionable mention whisper` report action */ type OriginalMessageActionableMentionWhisper = { + /** Emails of users that aren't members of the room */ + inviteeEmails: string[]; + /** Account IDs of users that aren't members of the room */ inviteeAccountIDs: number[]; @@ -126,6 +129,18 @@ type OriginalMessageActionableMentionWhisper = { whisperedTo?: number[]; }; +/** Model of `actionable mention whisper` report action */ +type OriginalMessageActionableMentionInviteToSubmitExpenseConfirmWhisper = { + /** Account IDs of users that aren't members of the room */ + inviteeAccountIDs: number[]; + + /** Decision on whether to invite users that were mentioned but aren't members or do nothing */ + resolution?: ValueOf | null; + + /** Collection of accountIDs of users mentioned in message */ + whisperedTo?: number[]; +}; + /** Model of `actionable report mention whisper` report action */ type OriginalMessageActionableReportMentionWhisper = { /** Decision on whether to create a report that were mentioned but doesn't exist or do nothing */ @@ -857,6 +872,7 @@ type OriginalMessageMap = { [CONST.REPORT.ACTIONS.TYPE.ACTIONABLE_ADD_PAYMENT_CARD]: OriginalMessageAddPaymentCard; [CONST.REPORT.ACTIONS.TYPE.ACTIONABLE_JOIN_REQUEST]: OriginalMessageJoinPolicy; [CONST.REPORT.ACTIONS.TYPE.ACTIONABLE_MENTION_WHISPER]: OriginalMessageActionableMentionWhisper; + [CONST.REPORT.ACTIONS.TYPE.ACTIONABLE_MENTION_INVITE_TO_SUBMIT_EXPENSE_CONFIRM_WHISPER]: OriginalMessageActionableMentionInviteToSubmitExpenseConfirmWhisper; [CONST.REPORT.ACTIONS.TYPE.ACTIONABLE_REPORT_MENTION_WHISPER]: OriginalMessageActionableReportMentionWhisper; [CONST.REPORT.ACTIONS.TYPE.ACTIONABLE_TRACK_EXPENSE_WHISPER]: OriginalMessageActionableTrackedExpenseWhisper; [CONST.REPORT.ACTIONS.TYPE.POLICY_EXPENSE_CHAT_WELCOME_WHISPER]: OriginalMessagePolicyExpenseChatWelcomeWhisper; diff --git a/src/types/onyx/ReportAction.ts b/src/types/onyx/ReportAction.ts index 5667284fdba17..339745e6291d5 100644 --- a/src/types/onyx/ReportAction.ts +++ b/src/types/onyx/ReportAction.ts @@ -76,7 +76,11 @@ type Message = { currency?: string; /** resolution for actionable mention whisper */ - resolution?: ValueOf | ValueOf | null; + resolution?: + | ValueOf + | ValueOf + | ValueOf + | null; /** The time this report action was deleted */ deleted?: string;