From 8cb1f1f5325ec8e5433eb2c0556f3e8feaa9ef0c Mon Sep 17 00:00:00 2001 From: Scott Nonnenberg Date: Tue, 8 May 2018 16:53:18 -0700 Subject: [PATCH] Fall back on givenName/familyName if no displayName/organization --- ts/components/conversation/EmbeddedContact.md | 38 +++++++++++ ts/test/types/Contact_test.ts | 65 +++++++++++++++++++ ts/types/Contact.ts | 10 ++- 3 files changed, 111 insertions(+), 2 deletions(-) create mode 100644 ts/test/types/Contact_test.ts diff --git a/ts/components/conversation/EmbeddedContact.md b/ts/components/conversation/EmbeddedContact.md index 0b790e3fa..a92b3c2ce 100644 --- a/ts/components/conversation/EmbeddedContact.md +++ b/ts/components/conversation/EmbeddedContact.md @@ -150,6 +150,44 @@ const View = Whisper.MessageView; ; ``` +#### No displayName or organization + +```jsx +const outgoing = new Whisper.Message({ + type: 'outgoing', + sent_at: Date.now() - 18000000, + contact: [ + { + name: { + givenName: 'Someone', + }, + number: [ + { + value: '+12025551000', + type: 1, + }, + ], + avatar: { + avatar: { + path: util.gifObjectUrl, + }, + }, + }, + ], +}); +const incoming = new Whisper.Message( + Object.assign({}, outgoing.attributes, { + source: '+12025550011', + type: 'incoming', + }) +); +const View = Whisper.MessageView; + + + +; +``` + #### Default avatar ```jsx diff --git a/ts/test/types/Contact_test.ts b/ts/test/types/Contact_test.ts new file mode 100644 index 000000000..775429adc --- /dev/null +++ b/ts/test/types/Contact_test.ts @@ -0,0 +1,65 @@ +import 'mocha'; +import { assert } from 'chai'; + +import { getName } from '../../types/Contact'; + +describe('Contact', () => { + describe('getName', () => { + it('returns displayName if provided', () => { + const contact = { + name: { + displayName: 'displayName', + givenName: 'givenName', + familyName: 'familyName', + }, + organization: 'Somewhere, Inc.', + }; + const expected = 'displayName'; + const actual = getName(contact); + assert.strictEqual(actual, expected); + }); + it('returns organization if no displayName', () => { + const contact = { + name: { + givenName: 'givenName', + familyName: 'familyName', + }, + organization: 'Somewhere, Inc.', + }; + const expected = 'Somewhere, Inc.'; + const actual = getName(contact); + assert.strictEqual(actual, expected); + }); + it('returns givenName + familyName if no displayName or organization', () => { + const contact = { + name: { + givenName: 'givenName', + familyName: 'familyName', + }, + }; + const expected = 'givenName familyName'; + const actual = getName(contact); + assert.strictEqual(actual, expected); + }); + it('returns just givenName', () => { + const contact = { + name: { + givenName: 'givenName', + }, + }; + const expected = 'givenName'; + const actual = getName(contact); + assert.strictEqual(actual, expected); + }); + it('returns just familyName', () => { + const contact = { + name: { + familyName: 'familyName', + }, + }; + const expected = 'familyName'; + const actual = getName(contact); + assert.strictEqual(actual, expected); + }); + }); +}); diff --git a/ts/types/Contact.ts b/ts/types/Contact.ts index 2702b6929..ea7998a57 100644 --- a/ts/types/Contact.ts +++ b/ts/types/Contact.ts @@ -17,7 +17,7 @@ interface Name { prefix?: string; suffix?: string; middleName?: string; - displayName: string; + displayName?: string; } export enum ContactType { @@ -101,5 +101,11 @@ export function contactSelector( export function getName(contact: Contact): string | null { const { name, organization } = contact; - return (name && name.displayName) || organization || null; + const displayName = (name && name.displayName) || null; + const givenName = (name && name.givenName) || null; + const familyName = (name && name.familyName) || null; + const backupName = + (givenName && familyName && `${givenName} ${familyName}`) || null; + + return displayName || organization || backupName || givenName || familyName; }