2014-11-28 20:49:41 -05:00
|
|
|
CocoClass = require 'core/CocoClass'
|
|
|
|
{me} = require 'core/auth'
|
|
|
|
{backboneFailure} = require 'core/errors'
|
|
|
|
storage = require 'core/storage'
|
2014-03-23 12:30:01 -04:00
|
|
|
GPLUS_TOKEN_KEY = 'gplusToken'
|
2014-01-03 13:32:13 -05:00
|
|
|
|
|
|
|
# gplus user object props to
|
|
|
|
userPropsToSave =
|
|
|
|
'name.givenName': 'firstName'
|
|
|
|
'name.familyName': 'lastName'
|
|
|
|
'gender': 'gender'
|
|
|
|
'id': 'gplusID'
|
|
|
|
|
|
|
|
fieldsToFetch = 'displayName,gender,image,name(familyName,givenName),id'
|
|
|
|
plusURL = '/plus/v1/people/me?fields='+fieldsToFetch
|
|
|
|
revokeUrl = 'https://accounts.google.com/o/oauth2/revoke?token='
|
2014-06-30 22:16:26 -04:00
|
|
|
clientID = '800329290710-j9sivplv2gpcdgkrsis9rff3o417mlfa.apps.googleusercontent.com'
|
2015-02-13 14:24:06 -05:00
|
|
|
scope = 'https://www.googleapis.com/auth/plus.login email'
|
2014-01-03 13:32:13 -05:00
|
|
|
|
|
|
|
module.exports = GPlusHandler = class GPlusHandler extends CocoClass
|
|
|
|
constructor: ->
|
2015-04-18 22:41:34 -04:00
|
|
|
@accessToken = storage.load GPLUS_TOKEN_KEY, false
|
2014-01-03 13:32:13 -05:00
|
|
|
super()
|
|
|
|
|
2016-02-25 18:24:16 -05:00
|
|
|
token: -> @accessToken?.access_token
|
2016-03-15 16:50:33 -04:00
|
|
|
|
|
|
|
startedLoading: false
|
|
|
|
apiLoaded: false
|
|
|
|
connected: false
|
|
|
|
person: null
|
|
|
|
|
|
|
|
fakeAPI: ->
|
|
|
|
window.gapi =
|
|
|
|
client:
|
|
|
|
load: (api, version, cb) -> cb()
|
|
|
|
plus:
|
|
|
|
people:
|
|
|
|
get: -> {
|
|
|
|
execute: (cb) ->
|
|
|
|
cb({
|
|
|
|
name: {
|
|
|
|
givenName: 'Mr'
|
|
|
|
familyName: 'Bean'
|
|
|
|
}
|
|
|
|
id: 'abcd'
|
|
|
|
emails: [{value: 'some@email.com'}]
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
auth:
|
|
|
|
authorize: (opts, cb) ->
|
|
|
|
cb({access_token: '1234'})
|
|
|
|
|
|
|
|
@startedLoading = true
|
|
|
|
@apiLoaded = true
|
|
|
|
|
|
|
|
fakeConnect: ->
|
|
|
|
@accessToken = {access_token: '1234'}
|
|
|
|
@trigger 'connect'
|
2014-01-03 13:32:13 -05:00
|
|
|
|
2016-03-15 16:50:33 -04:00
|
|
|
loadAPI: (options={}) ->
|
|
|
|
options.success ?= _.noop
|
|
|
|
options.context ?= options
|
|
|
|
if @apiLoaded
|
|
|
|
options.success.bind(options.context)()
|
|
|
|
else
|
|
|
|
@once 'load-api', options.success, options.context
|
|
|
|
|
|
|
|
if not @startedLoading
|
2016-02-25 18:24:16 -05:00
|
|
|
po = document.createElement('script')
|
|
|
|
po.type = 'text/javascript'
|
|
|
|
po.async = true
|
|
|
|
po.src = 'https://apis.google.com/js/client:platform.js?onload=onGPlusLoaded'
|
|
|
|
s = document.getElementsByTagName('script')[0]
|
|
|
|
s.parentNode.insertBefore po, s
|
2016-03-15 16:50:33 -04:00
|
|
|
@startedLoading = true
|
|
|
|
window.onGPlusLoaded = =>
|
|
|
|
@apiLoaded = true
|
|
|
|
if @accessToken and me.get('gplusID')
|
|
|
|
# We need to check the current state, given our access token
|
|
|
|
gapi.auth.setToken 'token', @accessToken
|
|
|
|
session_state = @accessToken.session_state
|
|
|
|
gapi.auth.checkSessionState {client_id: clientID, session_state: session_state}, (connected) =>
|
|
|
|
@connected = connected
|
|
|
|
@trigger 'load-api'
|
|
|
|
else
|
|
|
|
@connected = false
|
|
|
|
@trigger 'load-api'
|
2016-02-25 18:24:16 -05:00
|
|
|
|
2014-04-13 17:48:36 -04:00
|
|
|
|
2016-03-15 16:50:33 -04:00
|
|
|
connect: (options={}) ->
|
|
|
|
options.success ?= _.noop
|
|
|
|
options.context ?= options
|
|
|
|
authOptions = {
|
|
|
|
client_id: clientID
|
|
|
|
scope: 'https://www.googleapis.com/auth/plus.login email'
|
|
|
|
}
|
|
|
|
gapi.auth.authorize authOptions, (e) =>
|
|
|
|
return unless e.access_token
|
|
|
|
@connected = true
|
|
|
|
try
|
2014-11-14 14:04:17 -05:00
|
|
|
# Without removing this, we sometimes get a cross-domain error
|
2016-03-15 16:50:33 -04:00
|
|
|
d = _.omit(e, 'g-oauth-window')
|
|
|
|
storage.save(GPLUS_TOKEN_KEY, d, 0)
|
|
|
|
catch e
|
|
|
|
console.error 'Unable to save G+ token key', e
|
|
|
|
@accessToken = e
|
|
|
|
@trigger 'connect'
|
|
|
|
options.success.bind(options.context)()
|
|
|
|
|
2014-12-20 19:02:41 -05:00
|
|
|
|
2016-02-25 18:24:16 -05:00
|
|
|
loadPerson: (options={}) ->
|
2016-03-15 16:50:33 -04:00
|
|
|
options.success ?= _.noop
|
|
|
|
options.context ?= options
|
2014-01-03 13:32:13 -05:00
|
|
|
# email and profile data loaded separately
|
2016-03-15 16:50:33 -04:00
|
|
|
gapi.client.load 'plus', 'v1', =>
|
|
|
|
gapi.client.plus.people.get({userId: 'me'}).execute (r) =>
|
|
|
|
attrs = {}
|
|
|
|
for gpProp, userProp of userPropsToSave
|
|
|
|
keys = gpProp.split('.')
|
|
|
|
value = r
|
|
|
|
for key in keys
|
|
|
|
value = value[key]
|
|
|
|
if value
|
|
|
|
attrs[userProp] = value
|
|
|
|
|
|
|
|
if r.emails?.length
|
|
|
|
attrs.email = r.emails[0].value
|
|
|
|
@trigger 'load-person', attrs
|
|
|
|
options.success.bind(options.context)(attrs)
|
2014-01-03 13:32:13 -05:00
|
|
|
|
2014-04-13 17:48:36 -04:00
|
|
|
|
2016-03-15 16:50:33 -04:00
|
|
|
renderButtons: ->
|
|
|
|
return false unless gapi?.plusone?
|
|
|
|
gapi.plusone.go?() # Handles +1 button
|
|
|
|
|
|
|
|
# Friends logic, not in use
|
|
|
|
|
2014-03-23 12:30:01 -04:00
|
|
|
loadFriends: (friendsCallback) ->
|
|
|
|
return friendsCallback() unless @loggedIn
|
2014-04-13 17:48:36 -04:00
|
|
|
expiresIn = if @accessToken then parseInt(@accessToken.expires_at) - new Date().getTime()/1000 else -1
|
2014-06-30 22:16:26 -04:00
|
|
|
onReauthorized = => gapi.client.request({path: '/plus/v1/people/me/people/visible', callback: friendsCallback})
|
2014-04-13 17:48:36 -04:00
|
|
|
if expiresIn < 0
|
|
|
|
# TODO: this tries to open a popup window, which might not ever finish or work, so the callback may never be called.
|
2014-03-23 12:30:01 -04:00
|
|
|
@reauthorize()
|
|
|
|
@listenToOnce(@, 'logged-in', onReauthorized)
|
|
|
|
else
|
|
|
|
onReauthorized()
|
2016-03-15 16:50:33 -04:00
|
|
|
|
|
|
|
reauthorize: ->
|
|
|
|
params =
|
|
|
|
'client_id' : clientID
|
|
|
|
'scope' : scope
|
|
|
|
gapi.auth.authorize params, @onGPlusLogin
|