mirror of
https://github.com/Foundry376/Mailspring.git
synced 2025-09-21 12:05:47 +08:00
rm(fullcontact): Deprecated in favor of new contact sidebar
This commit is contained in:
parent
66cb0a6a77
commit
34f1ca0ba8
6 changed files with 0 additions and 311 deletions
|
@ -1,41 +0,0 @@
|
||||||
_ = require 'underscore'
|
|
||||||
Reflux = require 'reflux'
|
|
||||||
request = require 'request'
|
|
||||||
{Contact,
|
|
||||||
AccountStore
|
|
||||||
ContactStore,
|
|
||||||
DatabaseStore,
|
|
||||||
FocusedContactsStore} = require 'nylas-exports'
|
|
||||||
|
|
||||||
FullContactStore = Reflux.createStore
|
|
||||||
init: ->
|
|
||||||
|
|
||||||
dataForContact: (contact) ->
|
|
||||||
return {} unless contact
|
|
||||||
if contact.thirdPartyData["FullContact"]
|
|
||||||
return contact.thirdPartyData["FullContact"]
|
|
||||||
else
|
|
||||||
@_attachFullcontactDataToContact(contact)
|
|
||||||
return {}
|
|
||||||
|
|
||||||
_attachFullcontactDataToContact: (contact) ->
|
|
||||||
email = contact.email.toLowerCase().trim()
|
|
||||||
return if email.length is 0
|
|
||||||
|
|
||||||
url = "https://api.fullcontact.com/v2/person.json?email=#{email}&apiKey=eadcbaf0286562a"
|
|
||||||
request url, (err, resp, data) =>
|
|
||||||
return if err
|
|
||||||
return if resp.statusCode != 200
|
|
||||||
try
|
|
||||||
data = JSON.parse(data)
|
|
||||||
contact.title = data.organizations?[0]?["title"]
|
|
||||||
contact.company = data.organizations?[0]?["name"]
|
|
||||||
contact.thirdPartyData ?= {}
|
|
||||||
contact.thirdPartyData["FullContact"] = data
|
|
||||||
|
|
||||||
DatabaseStore.inTransaction (t) =>
|
|
||||||
t.persistModel(contact)
|
|
||||||
.then =>
|
|
||||||
@trigger()
|
|
||||||
|
|
||||||
module.exports = FullContactStore
|
|
|
@ -1,16 +0,0 @@
|
||||||
_ = require 'underscore'
|
|
||||||
React = require "react"
|
|
||||||
SidebarFullContact = require "./sidebar-fullcontact"
|
|
||||||
{ComponentRegistry, WorkspaceStore} = require "nylas-exports"
|
|
||||||
|
|
||||||
module.exports =
|
|
||||||
item: null
|
|
||||||
|
|
||||||
activate: (@state={}) ->
|
|
||||||
# ComponentRegistry.register SidebarFullContact,
|
|
||||||
# role: "MessageListSidebar:ContactCard"
|
|
||||||
|
|
||||||
deactivate: ->
|
|
||||||
# ComponentRegistry.unregister(SidebarFullContact)
|
|
||||||
|
|
||||||
serialize: -> @state
|
|
|
@ -1,132 +0,0 @@
|
||||||
_ = require 'underscore'
|
|
||||||
React = require "react"
|
|
||||||
|
|
||||||
{Actions} = require 'nylas-exports'
|
|
||||||
{RetinaImg} = require 'nylas-component-kit'
|
|
||||||
|
|
||||||
class SidebarFullContactDetails extends React.Component
|
|
||||||
@displayName: "SidebarFullContactDetails"
|
|
||||||
|
|
||||||
@propTypes:
|
|
||||||
contact: React.PropTypes.object
|
|
||||||
fullContactData: React.PropTypes.object
|
|
||||||
|
|
||||||
render: =>
|
|
||||||
<div className="contact-card-fullcontact">
|
|
||||||
<div className="header">
|
|
||||||
{@_profilePhoto()}
|
|
||||||
<h1 className="name">{@_name()}</h1>
|
|
||||||
<div className="email">{@_email()}</div>
|
|
||||||
</div>
|
|
||||||
<div className="subheader"
|
|
||||||
style={display: if @_showSubheader() then "block" else "none"}>
|
|
||||||
<div className="title">{@_title()}</div>
|
|
||||||
<div className="company">{@_company()}</div>
|
|
||||||
</div>
|
|
||||||
<div className="social-profiles"
|
|
||||||
style={display: if @_showSocialProfiles() then "block" else "none"}>
|
|
||||||
{@_socialProfiles()}
|
|
||||||
</div>
|
|
||||||
{@_noInfo()}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
_socialProfiles: =>
|
|
||||||
profiles = @_profiles()
|
|
||||||
return profiles.map (profile) =>
|
|
||||||
<div className="social-profile">
|
|
||||||
<RetinaImg
|
|
||||||
className="social-icon"
|
|
||||||
name="#{profile.typeId}-icon.png"
|
|
||||||
mode={RetinaImg.Mode.ContentIsMask} />
|
|
||||||
<div className="social-link">
|
|
||||||
<a href={profile.url}>{@_username(profile)}</a>
|
|
||||||
{@_twitterBio(profile)}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
_profiles: =>
|
|
||||||
profiles = @props.fullContactData.socialProfiles ? []
|
|
||||||
profiles = _.filter profiles, (p) => @_supportedProfileTypes[p.typeId]
|
|
||||||
|
|
||||||
_supportedProfileTypes:
|
|
||||||
twitter: true
|
|
||||||
linkedin: true
|
|
||||||
facebook: true
|
|
||||||
|
|
||||||
_showSocialProfiles: =>
|
|
||||||
@_profiles().length > 0
|
|
||||||
|
|
||||||
_username: (profile) =>
|
|
||||||
if (profile.username ? "").length > 0
|
|
||||||
if profile.typeId is "twitter"
|
|
||||||
return "@#{profile.username}"
|
|
||||||
else
|
|
||||||
return profile.username
|
|
||||||
else
|
|
||||||
return profile.typeName
|
|
||||||
|
|
||||||
_noInfo: =>
|
|
||||||
if not @_showSocialProfiles() and not @_showSubheader()
|
|
||||||
<div className="sidebar-no-info">No additional information available.</div>
|
|
||||||
else return ""
|
|
||||||
|
|
||||||
_twitterBio: (profile) =>
|
|
||||||
return "" unless profile.typeId is "twitter"
|
|
||||||
return "" unless profile.bio?.length > 0
|
|
||||||
|
|
||||||
# http://stackoverflow.com/a/13398311/793472
|
|
||||||
twitterRegex = /(^|[^@\w])@(\w{1,15})\b/g
|
|
||||||
replace = '$1<a href="https://twitter.com/$2">@$2</a>'
|
|
||||||
bio = profile.bio.replace(twitterRegex, replace)
|
|
||||||
<div className="bio sidebar-extra-info"
|
|
||||||
dangerouslySetInnerHTML={{__html: bio}}></div>
|
|
||||||
|
|
||||||
_showSubheader: =>
|
|
||||||
@_title().length > 0 or @_company().length > 0
|
|
||||||
|
|
||||||
_name: =>
|
|
||||||
(@props.fullContactData.contactInfo?.fullName) ? @props.contact?.name ? ""
|
|
||||||
|
|
||||||
_email: =>
|
|
||||||
email = @props.contact.email ? ""
|
|
||||||
if @_name().toLowerCase().trim() isnt email.toLowerCase().trim()
|
|
||||||
return email
|
|
||||||
else return ""
|
|
||||||
|
|
||||||
_title: =>
|
|
||||||
org = @_primaryOrg()
|
|
||||||
return "" unless org?
|
|
||||||
if org.current and org.title?
|
|
||||||
return org.title
|
|
||||||
else if not org.current and org.title?
|
|
||||||
return "Former #{org.title}"
|
|
||||||
else return ""
|
|
||||||
|
|
||||||
_company: =>
|
|
||||||
location = @props.fullContactData.demographics?.locationGeneral ? ""
|
|
||||||
name = @_primaryOrg()?.name ? ""
|
|
||||||
if name.length > 0 and location.length > 0
|
|
||||||
return "#{name} (#{location})"
|
|
||||||
else if name.length > 0
|
|
||||||
return name
|
|
||||||
else if location.length > 0
|
|
||||||
return "(#{location})"
|
|
||||||
else return ""
|
|
||||||
|
|
||||||
_primaryOrg: =>
|
|
||||||
orgs = @props.fullContactData.organizations ? []
|
|
||||||
org = _.findWhere orgs, isPrimary: true
|
|
||||||
if not org? then org = orgs[0]
|
|
||||||
return org
|
|
||||||
|
|
||||||
_profilePhoto: =>
|
|
||||||
photos = @props.fullContactData.photos ? []
|
|
||||||
photo = _.findWhere photo, isPrimary: true
|
|
||||||
if not photo? then photo = _.findWhere photo, typeId: "linkedin"
|
|
||||||
if not photo? then photo = photos[0]
|
|
||||||
if photo? and photo.url?
|
|
||||||
return <img src={photo.url} className="profile-photo" />
|
|
||||||
else return ""
|
|
||||||
|
|
||||||
|
|
||||||
module.exports = SidebarFullContactDetails
|
|
|
@ -1,37 +0,0 @@
|
||||||
_ = require 'underscore'
|
|
||||||
React = require "react"
|
|
||||||
ReactCSSTransitionGroup = require 'react-addons-css-transition-group'
|
|
||||||
FullContactStore = require "./fullcontact-store"
|
|
||||||
|
|
||||||
{InjectedComponentSet} = require 'nylas-component-kit'
|
|
||||||
|
|
||||||
SidebarFullContactDetails = require "./sidebar-fullcontact-details"
|
|
||||||
|
|
||||||
class SidebarFullContact extends React.Component
|
|
||||||
@displayName: "SidebarFullContact"
|
|
||||||
|
|
||||||
@propTypes:
|
|
||||||
contact: React.PropTypes.object
|
|
||||||
|
|
||||||
constructor: (@props) ->
|
|
||||||
@state = @_getStateFromStores()
|
|
||||||
|
|
||||||
componentDidMount: =>
|
|
||||||
@unsubscribe = FullContactStore.listen(@_onChange)
|
|
||||||
|
|
||||||
componentWillUnmount: =>
|
|
||||||
@unsubscribe()
|
|
||||||
|
|
||||||
render: =>
|
|
||||||
<SidebarFullContactDetails
|
|
||||||
contact={@props.contact}
|
|
||||||
fullContactData={@state.focusedContactData} />
|
|
||||||
|
|
||||||
_onChange: =>
|
|
||||||
@setState(@_getStateFromStores())
|
|
||||||
|
|
||||||
_getStateFromStores: =>
|
|
||||||
focusedContactData: FullContactStore.dataForContact(@props.contact)
|
|
||||||
|
|
||||||
|
|
||||||
module.exports = SidebarFullContact
|
|
|
@ -1,13 +0,0 @@
|
||||||
{
|
|
||||||
"name": "sidebar-fullcontact",
|
|
||||||
"version": "0.1.0",
|
|
||||||
"main": "./lib/main",
|
|
||||||
"description": "View user data on the sidebar via fullcontact",
|
|
||||||
"license": "GPL-3.0",
|
|
||||||
"private": true,
|
|
||||||
"engines": {
|
|
||||||
"nylas": "*"
|
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,72 +0,0 @@
|
||||||
@import "ui-variables";
|
|
||||||
|
|
||||||
.contact-card-fullcontact {
|
|
||||||
padding-bottom: 0;
|
|
||||||
order: 1;
|
|
||||||
flex-shrink: 0;
|
|
||||||
|
|
||||||
color: @text-color;
|
|
||||||
-webkit-user-select:text;
|
|
||||||
img.content-mask { background-color: @text-color; }
|
|
||||||
|
|
||||||
h1.name {
|
|
||||||
font-size: 20px;
|
|
||||||
font-weight: @font-weight-normal;
|
|
||||||
margin: 0;
|
|
||||||
padding: 0.6em 0 0.4em 0;
|
|
||||||
text-overflow: ellipsis;
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
|
|
||||||
.profile-photo {
|
|
||||||
max-width: 42px;
|
|
||||||
max-height: 42px;
|
|
||||||
display: block;
|
|
||||||
float: right;
|
|
||||||
margin-left: @spacing-standard;
|
|
||||||
}
|
|
||||||
|
|
||||||
.header {
|
|
||||||
&:before, &:after { content: " "; display: table; }
|
|
||||||
&:after { clear: both; }
|
|
||||||
}
|
|
||||||
|
|
||||||
.subheader {
|
|
||||||
color: @text-color-subtle;
|
|
||||||
padding: 0 0 @spacing-standard 0;
|
|
||||||
font-size: @font-size-smaller;
|
|
||||||
}
|
|
||||||
|
|
||||||
.email {
|
|
||||||
word-break: break-all;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.social-profiles {
|
|
||||||
border-top: 1px solid @border-color-divider;
|
|
||||||
padding-top: 7px;
|
|
||||||
}
|
|
||||||
.social-profile {
|
|
||||||
margin-top: 0.5em;
|
|
||||||
.social-icon {
|
|
||||||
margin-top: 6px;
|
|
||||||
float: left;
|
|
||||||
}
|
|
||||||
.social-link {
|
|
||||||
padding-left: @spacing-double;
|
|
||||||
font-size: @font-size-smaller;
|
|
||||||
a {
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.sidebar-extra-info {
|
|
||||||
font-size: 12px;
|
|
||||||
font-weight: @font-weight-medium;
|
|
||||||
color: @text-color-subtle;
|
|
||||||
}
|
|
||||||
.sidebar-no-info {
|
|
||||||
font-size: @font-size-smaller;
|
|
||||||
color: fade(@text-color, 30%);
|
|
||||||
}
|
|
Loading…
Add table
Reference in a new issue