import { React, // The ComponentRegistry manages all React components in N1. ComponentRegistry, // A `Store` is a Flux component which contains all business logic and data // models to be consumed by React components to render markup. MessageStore, } from 'nylas-exports'; const tld = require('tld'); // Notice that this file is `main.cjsx` rather than `main.coffee`. We use the // `.cjsx` filetype because we use the CJSX DSL to describe markup for React to // render. Without the CJSX, we could just name this file `main.coffee` instead. class PhishingIndicator extends React.Component { // Adding a displayName to a React component helps for debugging. static displayName = 'PhishingIndicator'; constructor() { super(); this.state = { message: MessageStore.items()[0], }; } componentDidMount() { this._unlisten = MessageStore.listen(this._onMessagesChanged); } componentWillUnmount() { if (this._unlisten) { this._unlisten(); } } _onMessagesChanged = () => { this.setState({ message: MessageStore.items()[0], }); } // A React component's `render` method returns a virtual DOM element described // in CJSX. `render` is deterministic: with the same input, it will always // render the same output. Here, the input is provided by @isPhishingAttempt. // `@state` and `@props` are popular inputs as well. render() { const {message} = this.state; // This package's strategy to ascertain whether or not the email is a // phishing attempt boils down to checking the `replyTo` attributes on // `Message` models from `MessageStore`. if (message && message.replyTo && message.replyTo.length !== 0) { const from = message.from[0].email const fromDomain = tld.registered(from.split('@')[1]); const replyTo = message.replyTo[0].email const replyToDomain = tld.registered(replyTo.split('@')[1]); if (replyToDomain !== fromDomain) { return (