mirror of
https://github.com/Foundry376/Mailspring.git
synced 2024-09-20 23:36:21 +08:00
Rip out all invite-related code
This commit is contained in:
parent
3d5b21e4b2
commit
0d218bc86f
|
@ -386,18 +386,6 @@ class AccountSettingsPage extends React.Component
|
|||
provider: @state.provider.name
|
||||
})
|
||||
|
||||
if errorMessage is "Invite code required"
|
||||
choice = dialog.showMessageBox(remote.getCurrentWindow(), {
|
||||
type: 'info',
|
||||
buttons: ['Okay'],
|
||||
title: 'Confirm',
|
||||
message: 'Due to a large number of sign-ups this week, you’ll need an invitation code to add another account! Visit http://invite.nylas.com/ to grab one, or hold tight!'
|
||||
})
|
||||
OnboardingActions.moveToPage("token-auth")
|
||||
|
||||
if errorMessage is "Invalid invite code"
|
||||
OnboardingActions.moveToPage("token-auth")
|
||||
|
||||
pageNumber = @state.pageNumber
|
||||
errorFieldNames = err.body?.missing_fields || err.body?.missing_settings
|
||||
|
||||
|
|
|
@ -1,22 +0,0 @@
|
|||
PageRouter = require "./page-router"
|
||||
{SystemStartService, WorkspaceStore, ComponentRegistry} = require 'nylas-exports'
|
||||
|
||||
module.exports =
|
||||
item: null
|
||||
|
||||
activate: (@state) ->
|
||||
# This package does nothing in other windows
|
||||
return unless NylasEnv.getWindowType() is 'onboarding'
|
||||
|
||||
WorkspaceStore.defineSheet 'Main', {root: true},
|
||||
list: ['Center']
|
||||
|
||||
ComponentRegistry.register PageRouter,
|
||||
location: WorkspaceStore.Location.Center
|
||||
|
||||
if (NylasEnv.config.get('nylas.accounts')?.length ? 0) is 0
|
||||
startService = new SystemStartService()
|
||||
startService.checkAvailability().then (available) =>
|
||||
return unless available
|
||||
startService.doesLaunchOnSystemStart().then (launchesOnStart) =>
|
||||
startService.configureToLaunchOnSystemStart() unless launchesOnStart
|
34
internal_packages/onboarding/lib/main.es6
Normal file
34
internal_packages/onboarding/lib/main.es6
Normal file
|
@ -0,0 +1,34 @@
|
|||
import {SystemStartService, WorkspaceStore, ComponentRegistry} from 'nylas-exports'
|
||||
import PageRouter from './page-router'
|
||||
|
||||
export function activate() {
|
||||
WorkspaceStore.defineSheet('Main', {root: true}, {list: ['Center']});
|
||||
|
||||
ComponentRegistry.register(PageRouter, {
|
||||
location: WorkspaceStore.Location.Center,
|
||||
});
|
||||
|
||||
const accounts = NylasEnv.config.get('nylas.accounts') || [];
|
||||
|
||||
if (accounts.length === 0) {
|
||||
const startService = new SystemStartService();
|
||||
startService.checkAvailability().then((available) => {
|
||||
if (!available) {
|
||||
return;
|
||||
}
|
||||
startService.doesLaunchOnSystemStart().then((launchesOnStart) => {
|
||||
if (!launchesOnStart) {
|
||||
startService.configureToLaunchOnSystemStart();
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
export function deactivate() {
|
||||
|
||||
}
|
||||
|
||||
export function serialize() {
|
||||
|
||||
}
|
|
@ -7,7 +7,6 @@ OnboardingActions = Reflux.createActions [
|
|||
"moveToPreviousPage"
|
||||
"moveToPage"
|
||||
"accountJSONReceived"
|
||||
"retryCheckTokenAuthStatus"
|
||||
]
|
||||
|
||||
for key, action of OnboardingActions
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
OnboardingActions = require './onboarding-actions'
|
||||
TokenAuthAPI = require './token-auth-api'
|
||||
{AccountStore, Actions} = require 'nylas-exports'
|
||||
{ipcRenderer} = require 'electron'
|
||||
NylasStore = require 'nylas-store'
|
||||
|
@ -14,12 +13,10 @@ class PageRouterStore extends NylasStore
|
|||
@_pageData = NylasEnv.getWindowProps().pageData ? {}
|
||||
@_pageStack = [{page: @_page, pageData: @_pageData}]
|
||||
|
||||
@_checkTokenAuthStatus()
|
||||
@listenTo OnboardingActions.moveToPreviousPage, @_onMoveToPreviousPage
|
||||
@listenTo OnboardingActions.moveToPage, @_onMoveToPage
|
||||
@listenTo OnboardingActions.closeWindow, @_onCloseWindow
|
||||
@listenTo OnboardingActions.accountJSONReceived, @_onAccountJSONReceived
|
||||
@listenTo OnboardingActions.retryCheckTokenAuthStatus, @_checkTokenAuthStatus
|
||||
|
||||
_onAccountJSONReceived: (json) =>
|
||||
isFirstAccount = AccountStore.accounts().length is 0
|
||||
|
@ -58,10 +55,6 @@ class PageRouterStore extends NylasStore
|
|||
|
||||
pageData: -> @_pageData
|
||||
|
||||
tokenAuthEnabled: -> @_tokenAuthEnabled
|
||||
|
||||
tokenAuthEnabledError: -> @_tokenAuthEnabledError
|
||||
|
||||
connectType: ->
|
||||
@_connectType
|
||||
|
||||
|
@ -83,30 +76,4 @@ class PageRouterStore extends NylasStore
|
|||
else
|
||||
NylasEnv.close()
|
||||
|
||||
_checkTokenAuthStatus: ->
|
||||
@_tokenAuthEnabled = "unknown"
|
||||
@_tokenAuthEnabledError = null
|
||||
@trigger()
|
||||
|
||||
TokenAuthAPI.request
|
||||
path: "/status/"
|
||||
returnsModel: false
|
||||
timeout: 10000
|
||||
success: (json) =>
|
||||
if json.restricted
|
||||
@_tokenAuthEnabled = "yes"
|
||||
else
|
||||
@_tokenAuthEnabled = "no"
|
||||
|
||||
if @_tokenAuthEnabled is "no" and @_page is 'token-auth'
|
||||
@_onMoveToPage("account-choose")
|
||||
else
|
||||
@trigger()
|
||||
|
||||
error: (err) =>
|
||||
if err.statusCode is 404
|
||||
err.message = "Sorry, we could not reach the Nylas API. Please try again."
|
||||
@_tokenAuthEnabledError = err.message
|
||||
@trigger()
|
||||
|
||||
module.exports = new PageRouterStore()
|
||||
|
|
|
@ -9,8 +9,6 @@ AccountChoosePage = require './account-choose-page'
|
|||
AccountSettingsPage = require './account-settings-page'
|
||||
InitialPreferencesPage = require './initial-preferences-page'
|
||||
InitialPackagesPage = require './initial-packages-page'
|
||||
TokenAuthPage = require './token-auth-page'
|
||||
|
||||
|
||||
class PageRouter extends React.Component
|
||||
@displayName: 'PageRouter'
|
||||
|
@ -76,7 +74,6 @@ class PageRouter extends React.Component
|
|||
_renderCurrentPage: =>
|
||||
Component = {
|
||||
"welcome": WelcomePage
|
||||
"token-auth": TokenAuthPage
|
||||
"account-choose": AccountChoosePage
|
||||
"account-settings": AccountSettingsPage
|
||||
"initial-preferences": InitialPreferencesPage
|
||||
|
|
|
@ -1,58 +0,0 @@
|
|||
nodeRequest = require 'request'
|
||||
{Actions, Utils, APIError} = require 'nylas-exports'
|
||||
|
||||
class TokenAuthAPI
|
||||
|
||||
constructor: ->
|
||||
NylasEnv.config.onDidChange('env', @_onConfigChanged)
|
||||
@_onConfigChanged()
|
||||
@
|
||||
|
||||
_onConfigChanged: =>
|
||||
env = NylasEnv.config.get('env')
|
||||
if env is 'development'
|
||||
@APIRoot = "http://localhost:5000"
|
||||
else if env in ['experimental', 'staging']
|
||||
@APIRoot = "https://invite-staging.nylas.com"
|
||||
else
|
||||
@APIRoot = "https://invite.nylas.com"
|
||||
|
||||
request: (options={}) ->
|
||||
return if NylasEnv.getLoadSettings().isSpec
|
||||
options.method ?= 'GET'
|
||||
options.url ?= "#{@APIRoot}#{options.path}" if options.path
|
||||
options.body ?= {} unless options.formData
|
||||
options.json = true
|
||||
options.error ?= @_defaultErrorCallback
|
||||
|
||||
# This is to provide functional closure for the variable.
|
||||
rid = Utils.generateTempId()
|
||||
[rid].forEach (requestId) ->
|
||||
options.startTime = Date.now()
|
||||
Actions.willMakeAPIRequest({
|
||||
request: options,
|
||||
requestId: requestId
|
||||
})
|
||||
nodeRequest options, (error, response, body) ->
|
||||
statusCode = response?.statusCode
|
||||
|
||||
Actions.didMakeAPIRequest({
|
||||
request: options,
|
||||
statusCode: statusCode,
|
||||
error: error,
|
||||
requestId: requestId
|
||||
})
|
||||
|
||||
if error? or statusCode > 299
|
||||
if not statusCode or statusCode in [-123, 500]
|
||||
body = "Sorry, we could not reach the Nylas API. Please try
|
||||
again, or email us if you continue to have trouble.
|
||||
(#{statusCode})"
|
||||
options.error(new APIError({error:error, response:response, body:body, requestOptions: options}))
|
||||
else
|
||||
options.success(body) if options.success
|
||||
|
||||
_defaultErrorCallback: (apiError) ->
|
||||
console.error(apiError)
|
||||
|
||||
module.exports = new TokenAuthAPI
|
|
@ -1,158 +0,0 @@
|
|||
React = require 'react'
|
||||
ReactDOM = require 'react-dom'
|
||||
ReactCSSTransitionGroup = require 'react-addons-css-transition-group'
|
||||
_ = require 'underscore'
|
||||
{RetinaImg} = require 'nylas-component-kit'
|
||||
{Utils} = require 'nylas-exports'
|
||||
|
||||
TokenAuthAPI = require './token-auth-api'
|
||||
OnboardingActions = require './onboarding-actions'
|
||||
PageRouterStore = require './page-router-store'
|
||||
Providers = require './account-types'
|
||||
url = require 'url'
|
||||
|
||||
class TokenAuthPage extends React.Component
|
||||
@displayName: "TokenAuthPage"
|
||||
|
||||
constructor: (@props) ->
|
||||
@state =
|
||||
token: ""
|
||||
tokenValidityError: null
|
||||
|
||||
tokenAuthInflight: false
|
||||
tokenAuthEnabled: PageRouterStore.tokenAuthEnabled()
|
||||
tokenAuthEnabledError: PageRouterStore.tokenAuthEnabledError()
|
||||
|
||||
componentDidMount: ->
|
||||
@_usub = PageRouterStore.listen(@_onTokenAuthChange)
|
||||
|
||||
_onTokenAuthChange: =>
|
||||
@setState
|
||||
tokenAuthEnabled: PageRouterStore.tokenAuthEnabled()
|
||||
tokenAuthEnabledError: PageRouterStore.tokenAuthEnabledError()
|
||||
@_resize()
|
||||
|
||||
componentWillUnmount: ->
|
||||
@_usub?()
|
||||
|
||||
render: =>
|
||||
if @state.tokenAuthEnabled is "unknown"
|
||||
<div className="page token-auth">
|
||||
<ReactCSSTransitionGroup transitionLeaveTimeout={150} transitionEnterTimeout={150} transitionName="alpha-fade">
|
||||
{@_renderWaitingForTokenAuthAnswer()}
|
||||
</ReactCSSTransitionGroup>
|
||||
</div>
|
||||
|
||||
else if @state.tokenAuthEnabled is "yes"
|
||||
<div className="page token-auth token-auth-enabled">
|
||||
<div className="quit" onClick={ -> OnboardingActions.closeWindow() }>
|
||||
<RetinaImg name="onboarding-close.png" mode={RetinaImg.Mode.ContentPreserve}/>
|
||||
</div>
|
||||
|
||||
<RetinaImg url="nylas://onboarding/assets/nylas-pictograph@2x.png" mode={RetinaImg.Mode.ContentIsMask} style={zoom: 0.29} className="logo"/>
|
||||
<div className="caption" style={padding: 40}>
|
||||
Due to overwhelming interest, you need an invitation code to connect
|
||||
an account to N1. Enter your invitation code below, or <a href="https://invite.nylas.com">request one here</a>.
|
||||
</div>
|
||||
{@_renderContinueError()}
|
||||
<label className="token-label">
|
||||
{@_renderInput()}
|
||||
</label>
|
||||
{@_renderContinueButton()}
|
||||
</div>
|
||||
else
|
||||
<div className="page token-auth">
|
||||
</div>
|
||||
|
||||
_renderWaitingForTokenAuthAnswer: =>
|
||||
if @state.tokenAuthEnabledError
|
||||
<div style={position:'absolute', width:'100%', padding:60, paddingTop:135} key="error">
|
||||
<div className="errormsg">{@state.tokenAuthEnabledError}</div>
|
||||
<button key="retry"
|
||||
style={marginTop: 15}
|
||||
className="btn btn-large btn-retry"
|
||||
onClick={OnboardingActions.retryCheckTokenAuthStatus}>
|
||||
Try Again
|
||||
</button>
|
||||
</div>
|
||||
else
|
||||
<div style={position:'absolute', width:'100%'} key="spinner">
|
||||
<RetinaImg url="nylas://onboarding/assets/installing-spinner.gif"
|
||||
mode={RetinaImg.Mode.ContentPreserve}
|
||||
style={marginTop: 190}/>
|
||||
</div>
|
||||
|
||||
_renderInput: =>
|
||||
if @state.errorMessage
|
||||
<input type="text"
|
||||
value={@state.token}
|
||||
onChange={@_onTokenChange}
|
||||
onKeyPress={@_onKeyPress}
|
||||
placeholder="Invitation Code"
|
||||
className="token-input error" />
|
||||
else
|
||||
<input type="text"
|
||||
value={@state.token}
|
||||
onChange={@_onTokenChange}
|
||||
onKeyPress={@_onKeyPress}
|
||||
placeholder="Invitation Code"
|
||||
className="token-input" />
|
||||
|
||||
_renderContinueButton: =>
|
||||
if @state.tokenAuthInflight
|
||||
<button className="btn btn-large btn-disabled" type="button">
|
||||
<RetinaImg name="sending-spinner.gif" width={15} height={15} mode={RetinaImg.Mode.ContentPreserve} /> Checking…
|
||||
</button>
|
||||
else
|
||||
<button className="btn btn-large btn-gradient" type="button" onClick={@_onContinue}>Continue</button>
|
||||
|
||||
_renderContinueError: =>
|
||||
if @state.tokenValidityError
|
||||
<div className="errormsg" role="alert">
|
||||
{@state.tokenValidityError}
|
||||
</div>
|
||||
else
|
||||
<div></div>
|
||||
|
||||
_onTokenChange: (event) =>
|
||||
@setState(token: event.target.value)
|
||||
|
||||
_onKeyPress: (event) =>
|
||||
if event.key in ['Enter', 'Return']
|
||||
@_onContinue()
|
||||
|
||||
_onContinue: =>
|
||||
if @state.tokenAuthInflight
|
||||
return
|
||||
|
||||
if not @state.token or not /^[\w]{32}$/.test(@state.token)
|
||||
@setState({
|
||||
tokenAuthInflight: false,
|
||||
tokenValidityError: "Please enter a valid invitation code."
|
||||
})
|
||||
@_resize()
|
||||
return
|
||||
|
||||
@setState({tokenAuthInflight: true})
|
||||
|
||||
TokenAuthAPI.request
|
||||
path: "/token/#{@state.token}"
|
||||
returnsModel: false
|
||||
timeout: 30000
|
||||
success: (json) =>
|
||||
NylasEnv.config.set("invitationCode", @state.token)
|
||||
OnboardingActions.moveToPage("account-choose")
|
||||
error: (err) =>
|
||||
_.delay =>
|
||||
@setState
|
||||
tokenValidityError: err.message
|
||||
tokenAuthInflight: false
|
||||
@_resize()
|
||||
, 400
|
||||
|
||||
_resize: =>
|
||||
setTimeout( =>
|
||||
@props.onResize?()
|
||||
,10)
|
||||
|
||||
module.exports = TokenAuthPage
|
|
@ -114,12 +114,7 @@ class WelcomePage extends React.Component
|
|||
if @state.step < 2
|
||||
@setState(step: @state.step + 1)
|
||||
else
|
||||
Actions.recordUserEvent('Welcome Page Finished', {
|
||||
tokenAuthEnabled: PageRouterStore.tokenAuthEnabled(0)
|
||||
})
|
||||
if PageRouterStore.tokenAuthEnabled() is "no"
|
||||
OnboardingActions.moveToPage("account-choose")
|
||||
else
|
||||
OnboardingActions.moveToPage("token-auth")
|
||||
Actions.recordUserEvent('Welcome Page Finished')
|
||||
OnboardingActions.moveToPage("account-choose")
|
||||
|
||||
module.exports = WelcomePage
|
||||
|
|
|
@ -348,43 +348,6 @@
|
|||
}
|
||||
}
|
||||
|
||||
.page.token-auth.token-auth-enabled {
|
||||
height: auto;
|
||||
padding-bottom:25px;
|
||||
}
|
||||
.page.token-auth {
|
||||
width: 388px;
|
||||
min-height: 478px;
|
||||
position: relative;
|
||||
|
||||
padding-top: 40px;
|
||||
img.logo.content-mask {
|
||||
background-color: rgba(255,255,255,0.4);
|
||||
}
|
||||
|
||||
.caption {
|
||||
font-size: 17px;
|
||||
color: rgba(0,0,0,0.56);
|
||||
}
|
||||
|
||||
.token-label {
|
||||
max-width: 75%;
|
||||
}
|
||||
|
||||
input {
|
||||
display:block;
|
||||
padding:10px;
|
||||
width:75%;
|
||||
margin: 0 auto 20px auto;
|
||||
background-color: #F5F5F5;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
input.error {
|
||||
border: 1px solid #A33;
|
||||
}
|
||||
}
|
||||
|
||||
.initial-package {
|
||||
display:block;
|
||||
margin:auto;
|
||||
|
|
|
@ -192,7 +192,9 @@ export default class Application extends EventEmitter {
|
|||
openWindowsForTokenState(loadingMessage) {
|
||||
const accounts = this.config.get('nylas.accounts');
|
||||
const hasAccount = accounts && accounts.length > 0;
|
||||
if (hasAccount) {
|
||||
const hasN1ID = this.config.get('nylas.identity');
|
||||
|
||||
if (hasAccount && hasN1ID) {
|
||||
this.windowManager.ensureWindow(WindowManager.MAIN_WINDOW, {loadingMessage});
|
||||
this.windowManager.ensureWindow(WindowManager.WORK_WINDOW);
|
||||
} else {
|
||||
|
|
Loading…
Reference in a new issue