@@ -2,61 +2,98 @@ import loadScript from "load-script"
22import { store } from "./wrapRootElement"
33
44export const onInitialClientRender = ( ) => {
5- loadScript ( `https://apis.google.com/js/api.js` , err => {
6- if ( err ) {
7- console . error ( "Could not load gapi" )
8- return
9- }
5+ const gapiPromise = new Promise ( ( resolve , reject ) => {
6+ loadScript ( "https://apis.google.com/js/api.js" , err => {
7+ if ( err ) {
8+ reject ( err )
9+ } else {
10+ window . gapi . load ( "client" , ( ) => {
11+ resolve ( window . gapi )
12+ } )
13+ }
14+ } )
15+ } )
16+
17+ const gisPromise = new Promise ( ( resolve , reject ) => {
18+ loadScript ( "https://accounts.google.com/gsi/client" , err => {
19+ if ( err ) {
20+ reject ( err )
21+ } else resolve ( window . google )
22+ } )
23+ } )
24+
25+ Promise . all ( [ gapiPromise , gisPromise ] )
26+ . then ( ( [ gapi , google ] ) => {
27+ const SCOPES = [ "https://www.googleapis.com/auth/analytics.readonly" ]
28+ const clientId = process . env . GAPI_CLIENT_ID
1029
11- var SCOPES = [ "https://www.googleapis.com/auth/analytics.readonly" ]
30+ if ( ! clientId ) {
31+ console . error (
32+ "GAPI_CLIENT_ID is not defined. Please check your .env file."
33+ )
34+ store . dispatch ( { type : "gapiStatus" , status : "cannot initialize" } )
35+ return
36+ }
1237
13- const clientId = process . env . GAPI_CLIENT_ID
38+ // Google Sign-In previously helped manage user signed-in status
39+ // With GIS we are responsible for managing sign-in state
40+ try {
41+ const storedTokenString = localStorage . getItem ( "google_token" )
42+ if ( storedTokenString ) {
43+ const storedToken = JSON . parse ( storedTokenString )
44+ if ( storedToken . expires_at > Date . now ( ) ) {
45+ gapi . client . setToken ( storedToken )
46+ store . dispatch ( { type : "setToken" , token : storedToken } )
47+ } else {
48+ localStorage . removeItem ( "google_token" )
49+ }
50+ }
51+ } catch ( e ) {
52+ console . error ( "Unable to restore token from localStorage:" , e )
53+ localStorage . removeItem ( "google_token" )
54+ }
1455
15- // TODO - Remove :analytics and replace it with the discovery document.
16- window . gapi . load ( "client:auth2:analytics" , ( ) => {
1756 Promise . all ( [
18- window . gapi . client . load (
19- "https://analyticsreporting.googleapis.com/$discovery/rest?version=v4"
20- ) ,
21- window . gapi . client . load (
57+ gapi . client . load (
2258 "https://analyticsdata.googleapis.com/$discovery/rest"
2359 ) ,
24- window . gapi . client . load (
60+ gapi . client . load (
2561 "https://analyticsadmin.googleapis.com/$discovery/rest"
2662 ) ,
27- ] ) . then ( ( ) => {
28- window . gapi . client
29- . init ( {
63+ ] )
64+ . then ( ( ) => {
65+ // Replace gapi.auth2.init() with google.accounts.oauth2.initTokenClient()
66+ const tokenClient = google . accounts . oauth2 . initTokenClient ( {
67+ client_id : clientId ,
3068 scope : SCOPES . join ( " " ) ,
31- clientId,
32- } )
33- . then ( ( ) => {
34- store . dispatch ( { type : "setGapi" , gapi : window . gapi } )
35- const user = window . gapi . auth2 . getAuthInstance ( ) . currentUser . get ( )
36- store . dispatch ( {
37- type : "setUser" ,
38- user : user . isSignedIn ( ) ? user : undefined ,
39- } )
40- window . gapi . auth2 . getAuthInstance ( ) . currentUser . listen ( user => {
41- store . dispatch ( {
42- type : "setUser" ,
43- user : user . isSignedIn ( ) ? user : undefined ,
44- } )
45- } )
46- } )
47- . catch ( e => {
48- store . dispatch ( { type : "setGapi" , gapi : window . gapi } )
49- store . dispatch ( {
50- type : "setUser" ,
51- user : undefined ,
52- } )
53- store . dispatch ( {
54- type : "gapiStatus" ,
55- status : "cannot initialize" ,
56- } )
57- console . error ( e )
69+ callback : tokenResponse => {
70+ if ( tokenResponse && tokenResponse . access_token ) {
71+ const tokenWithExpiry = {
72+ ...tokenResponse ,
73+ expires_at : Date . now ( ) + tokenResponse . expires_in * 1000 ,
74+ }
75+ localStorage . setItem ( "google_token" , JSON . stringify ( tokenWithExpiry ) )
76+ gapi . client . setToken ( tokenResponse )
77+ store . dispatch ( { type : "setToken" , token : tokenResponse } )
78+ } else {
79+ store . dispatch ( { type : "setToken" , token : undefined } )
80+ }
81+ }
5882 } )
59- } , console . error )
83+
84+ store . dispatch ( { type : "setGapi" , gapi } )
85+ store . dispatch ( { type : "gapiStatus" , status : "initialized" } )
86+ store . dispatch ( { type : "setGoogle" , google } )
87+ store . dispatch ( { type : "setTokenClient" , tokenClient } )
88+ } )
89+ . catch ( e => {
90+ store . dispatch ( { type : "setGapi" , gapi } )
91+ store . dispatch ( { type : "setToken" , token : undefined } )
92+ store . dispatch ( { type : "gapiStatus" , status : "cannot initialize" } )
93+ console . error ( e )
94+ } )
95+ } )
96+ . catch ( e => {
97+ console . error ( e )
6098 } )
61- } )
6299}
0 commit comments