Mailspring/app/internal_packages/contacts/lib/ContactDetailRead.tsx
Ben Gotow c629967c3d Add a proper address book with CardDAV + Google People support
commit 423cf4f407
Author: Ben Gotow <ben@foundry376.com>
Date:   Fri Oct 11 22:33:53 2019 -0500

    Replace belcard with homegrown VCard parser because our needs are minimal and the linux binary has relocation issues

commit 4ae19c0ed5
Author: Ben Gotow <ben@foundry376.com>
Date:   Fri Oct 11 10:38:26 2019 -0500

    Skip building a few more belr components, still looking for relocation error cause

commit a7ec02a449
Author: Ben Gotow <ben@foundry376.com>
Date:   Thu Oct 10 22:16:15 2019 -0500

    Fix windows SRV record lookups for contact directory autodiscovery

commit 318a31d279
Author: Ben Gotow <ben@foundry376.com>
Date:   Thu Oct 10 20:50:06 2019 -0500

    Leave vcard_grammar unpacked so mailsync can find it at runtime

commit bf7e43e37d
Author: Ben Gotow <ben@foundry376.com>
Date:   Thu Oct 10 20:43:01 2019 -0500

    Fix bug in icon case sensitivity

commit c283513653
Author: Ben Gotow <ben@foundry376.com>
Date:   Thu Oct 10 17:29:24 2019 -0500

    Renew Windows Authenticode code signing cert (there goes $500…)

commit d13235f65b
Author: Ben Gotow <ben@foundry376.com>
Date:   Wed Oct 9 23:25:34 2019 -0500

    Bump mailsync to move belr dlls

commit 00ca6431df
Author: Ben Gotow <ben@foundry376.com>
Date:   Wed Oct 9 23:22:53 2019 -0500

    Bump to xcode9 to fix odd C++11 error

commit 47903c99c4
Author: Ben Gotow <ben@foundry376.com>
Date:   Wed Oct 9 23:01:32 2019 -0500

    Bump mailsync to build belr as a dll instead of a static lib

commit 21d645d4e7
Author: Ben Gotow <ben@foundry376.com>
Date:   Wed Oct 9 22:38:24 2019 -0500

    Bump mailsync

commit 3f943031cb
Author: Ben Gotow <ben@foundry376.com>
Date:   Wed Oct 9 21:57:39 2019 -0500

    Bump mailsync to fix windows libetpan failure

commit 8fb55ca0fc
Author: Ben Gotow <ben@foundry376.com>
Date:   Wed Oct 9 21:36:57 2019 -0500

    Bump mailsync, add grammar

commit b959c54e50
Author: Ben Gotow <ben@foundry376.com>
Date:   Wed Oct 9 21:20:13 2019 -0500

    Bump mailsync for linux / win32

commit ddb5229d67
Author: Ben Gotow <ben@foundry376.com>
Date:   Tue Oct 8 22:44:12 2019 -0500

    Bump mailsync

commit f80e1bc422
Author: Ben Gotow <ben@foundry376.com>
Date:   Tue Oct 8 11:11:39 2019 -0500

    Fix LESS linter failures

commit 66dc60a731
Author: Ben Gotow <ben@foundry376.com>
Date:   Tue Oct 8 11:00:37 2019 -0500

    Extend participant search to return / expand groups

commit 3bded91307
Author: Ben Gotow <ben@foundry376.com>
Date:   Tue Oct 8 03:18:11 2019 -0500

    Add comments, etc

commit 4ede5446de
Author: Ben Gotow <ben@foundry376.com>
Date:   Tue Oct 8 02:38:50 2019 -0500

    Google People API contacts CRUD alongside CardDav

commit 96c6a64e46
Author: Ben Gotow <ben@foundry376.com>
Date:   Mon Oct 7 14:00:34 2019 -0500

    Build ContactBook concept to track which accounts have sync running

commit 1f6aab1083
Author: Ben Gotow <ben@foundry376.com>
Date:   Mon Oct 7 11:38:03 2019 -0500

    Contact and contact group CRUD, address book menus

commit b877c58d48
Author: Ben Gotow <ben@foundry376.com>
Date:   Sun Oct 6 16:32:33 2019 -0500

    Editing contact names working

commit 761079304c
Author: Ben Gotow <ben@foundry376.com>
Date:   Mon Sep 30 15:42:59 2019 -0500

    Improved styling of YYYYMMDD field

commit 71a567276b
Author: Ben Gotow <ben@foundry376.com>
Date:   Mon Sep 30 15:06:28 2019 -0500

    UI for edit + move + delete contacts

commit f1967dd603
Author: Ben Gotow <ben@foundry376.com>
Date:   Thu Sep 26 13:50:44 2019 -0500

    Allow you to turn on / off the “Found in Mail” autocompletions

commit 0c2b0eb03b
Author: Ben Gotow <ben@foundry376.com>
Date:   Thu Sep 26 13:50:14 2019 -0500

    Improve contacts window launch perf by lazy loading composer support, scanning less of fs for themes

commit 07abd6cb71
Author: Ben Gotow <ben@foundry376.com>
Date:   Thu Sep 26 04:36:10 2019 -0500

    Support for CardDav contact display, better groups presentation

commit 0a9e166d79
Author: Ben Gotow <ben@foundry376.com>
Date:   Tue Sep 24 12:42:37 2019 -0500

    Add hidden attribute to the model in prep for deletion of auto-created contacts

commit e6ce3b2af9
Author: Ben Gotow <ben@foundry376.com>
Date:   Tue Sep 24 12:12:52 2019 -0500

    Initial pass at address book

commit 740d7e8655
Author: Ben Gotow <ben@foundry376.com>
Date:   Tue Sep 24 08:27:06 2019 -0500

    Make headers of Preferences > Accounts consistent with General
2019-10-12 12:40:57 -05:00

194 lines
5.5 KiB
TypeScript

import React from 'react';
import { Account, Contact, AccountStore, ContactGroup } from 'mailspring-exports';
import { ContactProfilePhoto, RetinaImg } from 'mailspring-component-kit';
import * as Icons from './SVGIcons';
import { Store } from './Store';
import { ContactBase, ContactInteractorMetadata } from './ContactInfoMapping';
export const ContactDetailRead = ({
data,
groups,
contact,
metadata,
}: {
data: ContactBase;
groups: ContactGroup[];
contact: Contact;
metadata: ContactInteractorMetadata;
}) => {
return (
<div className="contact-detail-content-wrap">
<div className="contact-hero">
<ContactProfilePhoto contact={contact} loading={false} avatar={data.photoURL} />
<h3>{data.name.displayName}</h3>
</div>
<div className="contact-group-memberships">
{contact.contactGroups.map(gid => {
const group = groups.find(g => g.id === gid);
const label = group ? group.name : gid;
return (
<div
key={gid}
className="group-membership"
onClick={() => {
Store.setPerspective({
label,
accountId: contact.accountId,
groupId: gid,
type: 'group',
});
}}
>
<RetinaImg
name="label.png"
style={{ marginRight: 5 }}
mode={RetinaImg.Mode.ContentDark}
/>
{label}
</div>
);
})}
</div>
{
<ContactAttributes
data={data}
origin={metadata.origin}
account={AccountStore.accountForId(contact.accountId)}
/>
}
</div>
);
};
const ContactAttributes = ({
data,
origin,
account,
}: {
data: ContactBase;
origin: string;
account: Account;
}) => (
<div className="contact-attributes">
{data.nicknames && (
<div className="contact-attributes-section">
{data.nicknames.map((item, idx) => (
<div className="contact-attribute" key={idx}>
<label></label>
<div>{`${item.value}`}</div>
</div>
))}
</div>
)}
{(data.title || data.company) && (
<div className="contact-attributes-section">
<div className="contact-attribute">
<label>
<Icons.Briefcase />
</label>
<div>{`${data.title ? `${data.title}, ` : ''}${data.company}`}</div>
</div>
</div>
)}
{data.emailAddresses && (
<div className="contact-attributes-section">
{data.emailAddresses.map((item, idx) => (
<div className="contact-attribute" key={idx}>
<label>
<Icons.Envelope />
</label>
<div>
<a href={`mailto:${item.value}`} title="Send email...">
{item.value}
</a>
{item.type && <div className="type">{item.type}</div>}
</div>
</div>
))}
</div>
)}
{data.phoneNumbers && (
<div className="contact-attributes-section">
{data.phoneNumbers.map((item, idx) => (
<div className="contact-attribute" key={idx}>
<label>
<Icons.Phone />
</label>
<div>
<a href={`tel:${item.value}`} title="Call...">
{item.value}
</a>
{item.type && <div className="type">{item.type}</div>}
</div>
</div>
))}
</div>
)}
{data.addresses && (
<div className="contact-attributes-section">
{data.addresses.map((item, idx) => (
<div className="contact-attribute" key={idx}>
<label>
<Icons.Map />
</label>
<div>
<a href={`https://maps.google.com/?q=${encodeURIComponent(item.formattedValue)}`}>
{item.formattedValue}
</a>
{item.type && <div className="type">{item.type}</div>}
</div>
</div>
))}
</div>
)}
{data.birthdays && (
<div className="contact-attributes-section">
{data.birthdays.map((item, idx) => (
<div className="contact-attribute" key={idx}>
<label>
<Icons.Crown />
</label>
<div>
{new Date(item.date.year, item.date.month - 1, item.date.day).toLocaleDateString()}
</div>
</div>
))}
</div>
)}
{data.relations && (
<div className="contact-attributes-section">
{data.relations.map((item, idx) => (
<div className="contact-attribute" key={idx}>
<label>
<Icons.People />
</label>
<div>
{item.person}
{item.type && <div className="type">{item.type}</div>}
</div>
</div>
))}
</div>
)}
{data.urls && (
<div className="contact-attributes-section">
{data.urls.map((item, idx) => (
<div className="contact-attribute" key={idx}>
<label>
<Icons.Link />
</label>
<div>
<a href={`${item.value}`} title="Visit website...">
{item.value}
</a>
{item.type && <div className="type">{item.type}</div>}
</div>
</div>
))}
</div>
)}
<div className="contact-origin">
<div>{`${origin} (${account ? account.label : 'Unknown Account'})`}</div>
</div>
</div>
);