You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
133 lines
2.6 KiB
TypeScript
133 lines
2.6 KiB
TypeScript
// @ts-ignore
|
|
import Attachments from '../../app/attachments';
|
|
import { format as formatPhoneNumber } from '../types/PhoneNumber';
|
|
|
|
export interface Contact {
|
|
name?: Name;
|
|
number?: Array<Phone>;
|
|
email?: Array<Email>;
|
|
address?: Array<PostalAddress>;
|
|
avatar?: Avatar;
|
|
organization?: string;
|
|
}
|
|
|
|
interface Name {
|
|
givenName?: string;
|
|
familyName?: string;
|
|
prefix?: string;
|
|
suffix?: string;
|
|
middleName?: string;
|
|
displayName?: string;
|
|
}
|
|
|
|
export enum ContactType {
|
|
HOME = 1,
|
|
MOBILE = 2,
|
|
WORK = 3,
|
|
CUSTOM = 4,
|
|
}
|
|
|
|
export enum AddressType {
|
|
HOME = 1,
|
|
WORK = 2,
|
|
CUSTOM = 3,
|
|
}
|
|
|
|
export interface Phone {
|
|
value: string;
|
|
type: ContactType;
|
|
label?: string;
|
|
}
|
|
|
|
export interface Email {
|
|
value: string;
|
|
type: ContactType;
|
|
label?: string;
|
|
}
|
|
|
|
export interface PostalAddress {
|
|
type: AddressType;
|
|
label?: string;
|
|
street?: string;
|
|
pobox?: string;
|
|
neighborhood?: string;
|
|
city?: string;
|
|
region?: string;
|
|
postcode?: string;
|
|
country?: string;
|
|
}
|
|
|
|
interface Avatar {
|
|
avatar: Attachment;
|
|
isProfile: boolean;
|
|
}
|
|
|
|
interface Attachment {
|
|
path?: string;
|
|
error?: boolean;
|
|
pending?: boolean;
|
|
}
|
|
|
|
export function contactSelector(
|
|
contact: Contact,
|
|
options: {
|
|
regionCode: string;
|
|
hasSignalAccount: boolean;
|
|
getAbsoluteAttachmentPath: (path: string) => string;
|
|
onSendMessage: () => void;
|
|
onClick: () => void;
|
|
}
|
|
) {
|
|
const {
|
|
getAbsoluteAttachmentPath,
|
|
hasSignalAccount,
|
|
onClick,
|
|
onSendMessage,
|
|
regionCode,
|
|
} = options;
|
|
|
|
let { avatar } = contact;
|
|
if (avatar && avatar.avatar) {
|
|
if (avatar.avatar.error) {
|
|
avatar = undefined;
|
|
} else {
|
|
avatar = {
|
|
...avatar,
|
|
avatar: {
|
|
...avatar.avatar,
|
|
path: avatar.avatar.path
|
|
? getAbsoluteAttachmentPath(avatar.avatar.path)
|
|
: undefined,
|
|
},
|
|
};
|
|
}
|
|
}
|
|
|
|
return {
|
|
...contact,
|
|
hasSignalAccount,
|
|
onSendMessage,
|
|
onClick,
|
|
avatar,
|
|
number:
|
|
contact.number &&
|
|
contact.number.map(item => ({
|
|
...item,
|
|
value: formatPhoneNumber(item.value, {
|
|
ourRegionCode: regionCode,
|
|
}),
|
|
})),
|
|
};
|
|
}
|
|
|
|
export function getName(contact: Contact): string | undefined {
|
|
const { name, organization } = contact;
|
|
const displayName = (name && name.displayName) || undefined;
|
|
const givenName = (name && name.givenName) || undefined;
|
|
const familyName = (name && name.familyName) || undefined;
|
|
const backupName =
|
|
(givenName && familyName && `${givenName} ${familyName}`) || undefined;
|
|
|
|
return displayName || organization || backupName || givenName || familyName;
|
|
}
|