React = require 'react' _ = require 'underscore' {RetinaImg} = require 'nylas-component-kit' {EdgehillAPI, Utils} = require 'nylas-exports' OnboardingActions = require './onboarding-actions' Providers = require './account-types' url = require 'url' class AccountChoosePage extends React.Component @displayName: "AccountChoosePage" constructor: (@props) -> @state = email: "" provider: "" componentWillUnmount: -> @_usub?() render: =>
OnboardingActions.closeWindow() }>
Select your email provider
{@_renderProviders()}
_renderProviders: -> return Providers.map (provider) =>
@_onChooseProvider(provider)}>
{provider.displayName}
_renderError: -> if @state.error
{@state.error}
else
_onEmailChange: (event) => @setState email: event.target.value _onChooseProvider: (provider) => if provider.name is 'gmail' # Show the "Sign in to Gmail" prompt for a moment before actually bouncing # to Gmail. (400msec animation + 200msec to read) _.delay => @_onBounceToGmail(provider) , 600 OnboardingActions.moveToPage("account-settings", {provider}) _base64url: (buf) -> # Python-style urlsafe_b64encode buf.toString('base64') .replace(/\+/g, '-') # Convert '+' to '-' .replace(/\//g, '_') # Convert '/' to '_' _onBounceToGmail: (provider) => crypto = require 'crypto' # Client key is used for polling. Requirements are that it not be guessable # and that it never collides with an active key (keys are active only between # initiating gmail auth and successfully requesting the account data once. provider.clientKey = @_base64url(crypto.randomBytes(40)) # Encryption key is used to AES encrypt the account data during storage on the # server. provider.encryptionKey = crypto.randomBytes(24) provider.encryptionIv = crypto.randomBytes(16) code = atom.config.get('edgehill.token') || '' state = [provider.clientKey,@_base64url(provider.encryptionKey),@_base64url(provider.encryptionIv),code].join(',') googleUrl = url.format({ protocol: 'https' host: 'accounts.google.com/o/oauth2/auth' query: response_type: 'code' state: state client_id: '372024217839-cdsnrrqfr4d6b4gmlqepd7v0n0l0ip9q.apps.googleusercontent.com' redirect_uri: "#{EdgehillAPI.APIRoot}/oauth/google/callback" access_type: 'offline' scope: 'https://www.googleapis.com/auth/userinfo.email \ https://www.googleapis.com/auth/userinfo.profile \ https://mail.google.com/ \ https://www.google.com/m8/feeds \ https://www.googleapis.com/auth/calendar' approval_prompt: 'force' }) shell = require 'shell' shell.openExternal(googleUrl) module.exports = AccountChoosePage