summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/jetpack/_inc/connect-button.js')
-rw-r--r--plugins/jetpack/_inc/connect-button.js173
1 files changed, 173 insertions, 0 deletions
diff --git a/plugins/jetpack/_inc/connect-button.js b/plugins/jetpack/_inc/connect-button.js
new file mode 100644
index 00000000..c2317efd
--- /dev/null
+++ b/plugins/jetpack/_inc/connect-button.js
@@ -0,0 +1,173 @@
+/* global jpConnect */
+
+jQuery( document ).ready( function( $ ) {
+ var connectButton = $( '.jp-connect-button, .jp-banner__alt-connect-button' ).eq( 0 );
+ var tosText = $( '.jp-connect-full__tos-blurb' );
+ var jetpackConnectIframe = $( '<iframe class="jp-jetpack-connect__iframe" />' );
+ var connectionHelpSections = $(
+ '#jetpack-connection-cards, .jp-connect-full__dismiss-paragraph'
+ );
+
+ connectButton.on( 'click', function( event ) {
+ event.preventDefault();
+
+ if ( connectionHelpSections.length ) {
+ connectionHelpSections.fadeOut( 600 );
+ }
+
+ jetpackConnectButton.selectAndStartConnectionFlow();
+ } );
+
+ var jetpackConnectButton = {
+ isRegistering: false,
+ isPaidPlan: false,
+ selectAndStartConnectionFlow: function() {
+ var connectionHelpSections = $( '#jetpack-connection-cards' );
+ if ( connectionHelpSections.length ) {
+ connectionHelpSections.fadeOut( 600 );
+ }
+
+ if ( ! jetpackConnectButton.isRegistering ) {
+ if ( 'original' === jpConnect.forceVariation ) {
+ // Forcing original connection flow, `JETPACK_SHOULD_USE_CONNECTION_IFRAME = false`
+ // or we're dealing with Safari which has issues with handling 3rd party cookies.
+ jetpackConnectButton.handleOriginalFlow();
+ } else if ( 'in_place' === jpConnect.forceVariation ) {
+ // Forcing new connection flow, `JETPACK_SHOULD_USE_CONNECTION_IFRAME = true`.
+ jetpackConnectButton.handleConnectInPlaceFlow();
+ } else {
+ // Forcing A/B test driven connection flow variation, `JETPACK_SHOULD_USE_CONNECTION_IFRAME` not defined.
+ jetpackConnectButton.startConnectionFlow();
+ }
+ }
+ },
+ startConnectionFlow: function() {
+ var abTestName = 'jetpack_connect_in_place_v3';
+
+ $.ajax( {
+ url: 'https://public-api.wordpress.com/wpcom/v2/abtest/' + abTestName,
+ type: 'GET',
+ error: jetpackConnectButton.handleConnectionError,
+ data: jpConnect.identity,
+ xhrFields: {
+ withCredentials: true,
+ },
+ crossDomain: true,
+ success: function( data ) {
+ if ( data && 'in_place' === data.variation ) {
+ jetpackConnectButton.handleConnectInPlaceFlow();
+ return;
+ }
+ jetpackConnectButton.handleOriginalFlow();
+ },
+ } );
+ },
+ handleOriginalFlow: function() {
+ window.location = connectButton.attr( 'href' );
+ },
+ handleConnectInPlaceFlow: function() {
+ // Alternative connection buttons should redirect to the main one for the "connect in place" flow.
+ if ( connectButton.hasClass( 'jp-banner__alt-connect-button' ) ) {
+ window.location = jpConnect.connectInPlaceUrl;
+ return;
+ }
+
+ jetpackConnectButton.isRegistering = true;
+ tosText.hide();
+ connectButton.hide();
+ jetpackConnectButton.triggerLoadingState();
+
+ var registerUrl = jpConnect.apiBaseUrl + '/connection/register';
+
+ // detect Calypso Env and add to API URL
+ if ( window.Initial_State && window.Initial_State.calypsoEnv ) {
+ registerUrl =
+ registerUrl + '?' + $.param( { calypso_env: window.Initial_State.calypsoEnv } );
+ }
+
+ $.ajax( {
+ url: registerUrl,
+ type: 'POST',
+ data: {
+ registration_nonce: jpConnect.registrationNonce,
+ _wpnonce: jpConnect.apiNonce,
+ },
+ error: jetpackConnectButton.handleConnectionError,
+ success: jetpackConnectButton.handleConnectionSuccess,
+ } );
+ },
+ triggerLoadingState: function() {
+ var loadingText = $( '<span>' )
+ .addClass( 'jp-connect-full__button-container-loading' )
+ .text( jpConnect.buttonTextRegistering )
+ .appendTo( '.jp-connect-full__button-container' );
+
+ var spinner = $( '<div>' ).addClass( 'jp-spinner' );
+ var spinnerOuter = $( '<div>' )
+ .addClass( 'jp-spinner__outer' )
+ .appendTo( spinner );
+ $( '<div>' )
+ .addClass( 'jp-spinner__inner' )
+ .appendTo( spinnerOuter );
+ loadingText.after( spinner );
+ },
+ handleConnectionSuccess: function( data ) {
+ jetpackConnectButton.fetchPlanType();
+ window.addEventListener( 'message', jetpackConnectButton.receiveData );
+ jetpackConnectIframe.attr( 'src', data.authorizeUrl );
+ jetpackConnectIframe.on( 'load', function() {
+ jetpackConnectIframe.show();
+ $( '.jp-connect-full__button-container' ).hide();
+ } );
+ jetpackConnectIframe.hide();
+ $( '.jp-connect-full__button-container' ).after( jetpackConnectIframe );
+ },
+ fetchPlanType: function() {
+ $.ajax( {
+ url: jpConnect.apiBaseUrl + '/site',
+ type: 'GET',
+ data: {
+ _wpnonce: jpConnect.apiSiteDataNonce,
+ },
+ success: function( data ) {
+ var siteData = JSON.parse( data.data );
+ jetpackConnectButton.isPaidPlan = ! siteData.plan.is_free;
+ },
+ } );
+ },
+ receiveData: function( event ) {
+ if (
+ event.origin === jpConnect.jetpackApiDomain &&
+ event.source === jetpackConnectIframe.get( 0 ).contentWindow &&
+ event.data === 'close'
+ ) {
+ window.removeEventListener( 'message', this.receiveData );
+ jetpackConnectButton.handleAuthorizationComplete();
+ }
+ },
+ handleAuthorizationComplete: function() {
+ jetpackConnectButton.isRegistering = false;
+
+ if ( jetpackConnectButton.isPaidPlan ) {
+ window.location.assign( jpConnect.dashboardUrl );
+ } else {
+ window.location.assign( jpConnect.plansPromptUrl );
+ }
+ window.location.reload( true );
+ },
+ handleConnectionError: function( error ) {
+ jetpackConnectButton.isRegistering = false;
+ jetpackConnectButton.handleOriginalFlow();
+ },
+ };
+
+ // When we visit /wp-admin/admin.php?page=jetpack#/setup, immediately start the connection flow.
+ var hash = location.hash.replace( /#\//, '' );
+ if ( 'setup' === hash ) {
+ if ( connectionHelpSections.length ) {
+ connectionHelpSections.hide();
+ }
+
+ jetpackConnectButton.selectAndStartConnectionFlow();
+ }
+} );