PluginProbe
Jetpack – WP Security, Backup, Speed, & Growth / 10.1
Jetpack – WP Security, Backup, Speed, & Growth v10.1
16.2-beta 12.0.3 12.1.3 12.2.3 12.3.2 12.4.2 12.5.2 12.6.4 12.7.3 12.8.3 12.9.5 13.0.2 13.1.5 13.2.4 13.3.3 13.4.5 13.5.2 13.6.2 13.7.2 13.8.3 13.9.2 14.0.1 14.1.1 14.2.2 14.3.1 All 501 releases
jetpack / _inc / connect-button.js

connect-button.js in Jetpack – WP Security, Backup, Speed, & Growth 10.1, at _inc/connect-button.js

194 lines 6.5 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 /* global jpConnect */
2
3 jQuery( document ).ready( function ( $ ) {
4 var connectButton = $( '.jp-connect-button, .jp-banner__alt-connect-button' ).eq( 0 );
5 var tosText = $( '.jp-connect-full__tos-blurb' );
6 var jetpackConnectIframe = $( '<iframe class="jp-jetpack-connect__iframe" />' );
7 // Sections that only show up in the first Set Up screen
8 var connectionHelpSections = $(
9 '#jetpack-connection-cards, .jp-connect-full__dismiss-paragraph, .jp-connect-full__testimonial'
10 );
11 // Sections that only show up in the "Authorize user" screen
12 var connectButtonFrom = '';
13
14 connectButton.on( 'click', function ( event ) {
15 event.preventDefault();
16
17 if ( 'undefined' === typeof URLSearchParams ) {
18 connectButtonFrom = '';
19 } else {
20 var searchParams = new URLSearchParams( $( this ).prop( 'search' ) );
21 connectButtonFrom = searchParams && searchParams.get( 'from' );
22 }
23
24 if ( connectionHelpSections.length ) {
25 connectionHelpSections.fadeOut( 600 );
26 }
27
28 jetpackConnectButton.startConnectionFlow();
29 } );
30
31 var jetpackConnectButton = {
32 isRegistering: false,
33 isPaidPlan: false,
34 startConnectionFlow: function () {
35 var connectionHelpSections = $( '#jetpack-connection-cards, .jp-connect-full__testimonial' );
36 if ( connectionHelpSections.length ) {
37 connectionHelpSections.fadeOut( 600 );
38 }
39
40 if ( ! jetpackConnectButton.isRegistering ) {
41 jetpackConnectButton.handleConnection();
42 }
43 },
44 selectAndStartAuthorizationFlow: function ( data ) {
45 if ( data.allowInplaceAuthorization && 'original' !== jpConnect.forceVariation ) {
46 jetpackConnectButton.handleAuthorizeInPlaceFlow( data );
47 } else {
48 // Forcing original connection flow, `JETPACK_SHOULD_NOT_USE_CONNECTION_IFRAME = true`
49 // or we're dealing with Safari which has issues with handling 3rd party cookies.
50 if ( data.alternateAuthorizeUrl ) {
51 window.location = data.alternateAuthorizeUrl;
52 } else {
53 window.location = data.authorizeUrl;
54 }
55 }
56 },
57 handleConnection: function () {
58 // Alternative connection buttons should redirect to the main one for the "connect in place" flow.
59 if ( connectButton.hasClass( 'jp-banner__alt-connect-button' ) ) {
60 // Make sure we don't lose the `from` parameter, if set.
61 var fromParam = ( connectButtonFrom && '&from=' + connectButtonFrom ) || '';
62 window.location = jpConnect.connectInPlaceUrl + fromParam;
63 return;
64 }
65
66 jetpackConnectButton.isRegistering = true;
67 tosText.hide();
68 connectButton.hide();
69 jetpackConnectButton.triggerLoadingState();
70
71 var registerUrl = jpConnect.apiBaseUrl + '/connection/register';
72
73 // detect Calypso Env and add to API URL
74 if ( window.Initial_State && window.Initial_State.calypsoEnv ) {
75 registerUrl =
76 registerUrl + '?' + $.param( { calypso_env: window.Initial_State.calypsoEnv } );
77 }
78
79 $.ajax( {
80 url: registerUrl,
81 type: 'POST',
82 data: {
83 registration_nonce: jpConnect.registrationNonce,
84 _wpnonce: jpConnect.apiNonce,
85 from: connectButtonFrom,
86 no_iframe: 'original' === jpConnect.forceVariation,
87 },
88 error: jetpackConnectButton.handleConnectionError,
89 success: jetpackConnectButton.selectAndStartAuthorizationFlow,
90 } );
91 },
92 triggerLoadingState: function () {
93 var loadingText = $( '<span>' )
94 .addClass( 'jp-connect-full__button-container-loading' )
95 .text( jpConnect.buttonTextRegistering )
96 .appendTo( '.jp-connect-full__button-container' );
97
98 var spinner = $( '<div>' ).addClass( 'jp-spinner' );
99 var spinnerOuter = $( '<div>' ).addClass( 'jp-spinner__outer' ).appendTo( spinner );
100 $( '<div>' ).addClass( 'jp-spinner__inner' ).appendTo( spinnerOuter );
101 loadingText.after( spinner );
102 },
103 handleAuthorizeInPlaceFlow: function ( data ) {
104 window.addEventListener( 'message', jetpackConnectButton.receiveData );
105 jetpackConnectIframe.attr(
106 'src',
107 data.authorizeUrl + '&from=' + connectButtonFrom + '&iframe_source=jetpack-connect-main'
108 );
109 jetpackConnectIframe.on( 'load', function () {
110 jetpackConnectIframe.show();
111 $( '.jp-connect-full__button-container' ).hide();
112 $( '#jp-connect-full__step1-header' ).hide();
113 $( '#jp-connect-full__step2-header' ).show();
114 } );
115 jetpackConnectIframe.hide();
116 $( '.jp-connect-full__button-container' ).after( jetpackConnectIframe );
117
118 // At this point we are pretty sure if things work out that we will be loading the admin script
119 var link = document.createElement( 'link' );
120 link.rel = 'preload';
121 link.as = 'script';
122 link.href = jpConnect.preFetchScript;
123 document.head.appendChild( link );
124 },
125 fetchPlanType: function () {
126 return $.ajax( {
127 url: jpConnect.apiBaseUrl + '/site',
128 type: 'GET',
129 data: {
130 _wpnonce: jpConnect.apiSiteDataNonce,
131 },
132 success: function ( data ) {
133 var siteData = JSON.parse( data.data );
134 jetpackConnectButton.isPaidPlan =
135 siteData.options.is_pending_plan || ! siteData.plan.is_free;
136 },
137 } );
138 },
139 receiveData: function ( event ) {
140 if (
141 event.origin !== jpConnect.jetpackApiDomain ||
142 event.source !== jetpackConnectIframe.get( 0 ).contentWindow
143 ) {
144 return;
145 }
146
147 switch ( event.data ) {
148 case 'close':
149 window.removeEventListener( 'message', this.receiveData );
150 jetpackConnectButton.handleAuthorizationComplete();
151 break;
152 case 'wpcom_nocookie':
153 jetpackConnectIframe.hide();
154 jetpackConnectButton.handleConnectionError();
155 break;
156 }
157 },
158 handleAuthorizationComplete: function () {
159 jetpackConnectButton.isRegistering = false;
160
161 // Fetch plan type late to make sure any stored license keys have been
162 // attached to the site during the connection.
163 jetpackConnectButton.fetchPlanType().always( function () {
164 if ( ! jetpackConnectButton.isPaidPlan ) {
165 window.location.assign( jpConnect.plansPromptUrl );
166 return;
167 }
168
169 var parser = document.createElement( 'a' );
170 parser.href = jpConnect.dashboardUrl;
171 var reload =
172 window.location.pathname === parser.pathname &&
173 window.location.hash.length &&
174 parser.hash.length;
175
176 window.location.assign( jpConnect.dashboardUrl );
177
178 if ( reload ) {
179 // The Jetpack admin page has hashes in the URLs, so we need to reload the page after .assign()
180 window.location.reload( true );
181 }
182 } );
183 },
184 handleConnectionError: function ( error ) {
185 jetpackConnectButton.isRegistering = false;
186 // If something goes wrong, we take users to Calypso.
187 window.location = connectButton.attr( 'href' );
188 },
189 };
190
191 // In case the parameter has been manually set in the URL after redirect.
192 connectButtonFrom = location.hash.split( '&from=' )[ 1 ];
193 } );
194