diff --git a/keyserver/src/push/send.js b/keyserver/src/push/send.js --- a/keyserver/src/push/send.js +++ b/keyserver/src/push/send.js @@ -39,6 +39,7 @@ import { fetchServerThreadInfos } from '../fetchers/thread-fetchers'; import { fetchUserInfos } from '../fetchers/user-fetchers'; import type { Viewer } from '../session/viewer'; +import { getENSNames } from '../utils/ens-cache'; import { getAPNsNotificationTopic } from './providers'; import { apnPush, @@ -488,6 +489,7 @@ const { merged, ...rest } = await notifTextsForMessageInfo( allMessageInfos, threadInfo, + getENSNames, ); if (!badgeOnly) { notification.body = merged; @@ -547,6 +549,7 @@ const { merged, ...rest } = await notifTextsForMessageInfo( allMessageInfos, threadInfo, + getENSNames, ); const notification = { data: { diff --git a/lib/shared/notif-utils.js b/lib/shared/notif-utils.js --- a/lib/shared/notif-utils.js +++ b/lib/shared/notif-utils.js @@ -8,10 +8,16 @@ type RobotextMessageInfo, type MessageType, } from '../types/message-types'; -import type { NotifTexts } from '../types/notif-types'; +import type { ResolvedNotifTexts } from '../types/notif-types'; import type { ThreadInfo, ThreadType } from '../types/thread-types'; import type { RelativeUserInfo } from '../types/user-types'; -import { entityTextToRawString } from '../utils/entity-text'; +import type { GetENSNames } from '../utils/ens-helpers'; +import { + getEntityTextAsString, + entityTextToRawString, + type EntityText, +} from '../utils/entity-text'; +import { promiseAll } from '../utils/promises'; import { trimText } from '../utils/text-utils'; import { robotextForMessageInfo } from './message-utils'; import { messageSpecs } from './messages/message-specs'; @@ -21,10 +27,12 @@ async function notifTextsForMessageInfo( messageInfos: MessageInfo[], threadInfo: ThreadInfo, -): Promise { + getENSNames: ?GetENSNames, +): Promise { const fullNotifTexts = await fullNotifTextsForMessageInfo( messageInfos, threadInfo, + getENSNames, ); const merged = trimText(fullNotifTexts.merged, 300); const body = trimText(fullNotifTexts.body, 300); @@ -80,19 +88,61 @@ async function fullNotifTextsForMessageInfo( messageInfos: $ReadOnlyArray, threadInfo: ThreadInfo, -): Promise { + getENSNames: ?GetENSNames, +): Promise { const mostRecentType = mostRecentMessageInfoType(messageInfos); const messageSpec = messageSpecs[mostRecentType]; invariant( messageSpec.notificationTexts, `we're not aware of messageType ${mostRecentType}`, ); - return await messageSpec.notificationTexts(messageInfos, threadInfo, { - notifThreadName, - notifTextForSubthreadCreation, - strippedRobotextForMessageInfo, - notificationTexts: fullNotifTextsForMessageInfo, - }); + const innerNotificationTexts = ( + innerMessageInfos: $ReadOnlyArray, + innerThreadInfo: ThreadInfo, + ) => + fullNotifTextsForMessageInfo( + innerMessageInfos, + innerThreadInfo, + getENSNames, + ); + const unresolvedNotifTexts = await messageSpec.notificationTexts( + messageInfos, + threadInfo, + { + notifThreadName, + notifTextForSubthreadCreation, + strippedRobotextForMessageInfo, + notificationTexts: innerNotificationTexts, + }, + ); + + const resolveToString = async ( + entityText: string | EntityText, + ): Promise => { + if (typeof entityText === 'string') { + return entityText; + } + const notifString = await getEntityTextAsString(entityText, getENSNames, { + prefixThisThreadNounWith: 'your', + }); + invariant( + notifString !== null && notifString !== undefined, + 'getEntityTextAsString only returns falsey when passed falsey', + ); + return notifString; + }; + let promises = { + merged: resolveToString(unresolvedNotifTexts.merged), + body: resolveToString(unresolvedNotifTexts.body), + title: resolveToString(unresolvedNotifTexts.title), + }; + if (unresolvedNotifTexts.prefix) { + promises = { + ...promises, + prefix: resolveToString(unresolvedNotifTexts.prefix), + }; + } + return await promiseAll(promises); } function strippedRobotextForMessageInfo( diff --git a/lib/types/notif-types.js b/lib/types/notif-types.js --- a/lib/types/notif-types.js +++ b/lib/types/notif-types.js @@ -1,6 +1,15 @@ // @flow +import type { EntityText } from '../utils/entity-text'; + export type NotifTexts = { + +merged: string | EntityText, + +body: string | EntityText, + +title: string | EntityText, + +prefix?: string | EntityText, +}; + +export type ResolvedNotifTexts = { +merged: string, +body: string, +title: string,