PluginProbe
Jetpack – WP Security, Backup, Speed, & Growth / 10.3
Jetpack – WP Security, Backup, Speed, & Growth v10.3
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 14.4.2 All 500 releases
jetpack / _inc / connect-button.js
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