| 479 | } |
| 480 | |
| 481 | function toContactItem( |
| 482 | acc: ContactAccumulator, |
| 483 | pool: 'friend' | 'non_friend', |
| 484 | scoring: { score: number; scoreBreakdown: ContactItem['scoreBreakdown'] } |
| 485 | ): ContactItem { |
| 486 | const aliases = [...acc.aliases].filter((alias) => alias !== acc.displayName) |
| 487 | const searchText = [acc.displayName, acc.platformId, ...aliases].join(' ').toLowerCase() |
| 488 | |
| 489 | const item: ContactItem = { |
| 490 | key: acc.key, |
| 491 | platform: acc.platform, |
| 492 | platformId: acc.platformId, |
| 493 | sessionScoped: acc.sessionScoped, |
| 494 | sessionId: acc.sessionId, |
| 495 | displayName: acc.displayName, |
| 496 | aliases, |
| 497 | avatar: acc.avatar, |
| 498 | isFriend: acc.isFriend, |
| 499 | pool, |
| 500 | score: scoring.score, |
| 501 | scoreBreakdown: { |
| 502 | ...scoring.scoreBreakdown, |
| 503 | privateMessageCount: acc.privateMessageCount || scoring.scoreBreakdown.privateMessageCount, |
| 504 | activePrivateMonths: acc.activePrivateMonths.size || scoring.scoreBreakdown.activePrivateMonths, |
| 505 | commonGroupCount: acc.commonGroupSessionIds.size, |
| 506 | coOccurrenceCount: acc.coOccurrenceCount, |
| 507 | coOccurrenceRawScore: acc.coOccurrenceRawScore, |
| 508 | replyInteractionCount: acc.replyInteractionCount, |
| 509 | repliesFromOwnerToContact: acc.repliesFromOwnerToContact, |
| 510 | repliesFromContactToOwner: acc.repliesFromContactToOwner, |
| 511 | }, |
| 512 | sourceSessions: acc.sourceSessions, |
| 513 | searchText, |
| 514 | lastInteractionTs: acc.lastInteractionTs, |
| 515 | } |
| 516 | if (pool === 'friend') item.friendSource = 'private' |
| 517 | return item |
| 518 | } |
| 519 | |
| 520 | export function createEmptyContactsDiagnostics(): ContactsDiagnostics { |
| 521 | return createEmptyDiagnostics() |