blocks
5 years ago
build
5 years ago
fonts
8 years ago
genericons
6 years ago
lib
5 years ago
social-logos
5 years ago
accessible-focus.js
5 years ago
class.jetpack-provision.php
6 years ago
connect-button.js
5 years ago
crowdsignal-shortcode.js
5 years ago
crowdsignal-survey.js
5 years ago
facebook-embed.js
5 years ago
footer.php
7 years ago
gallery-settings.js
5 years ago
genericons.php
11 years ago
header.php
7 years ago
idc-notice.js
5 years ago
jetpack-admin.js
5 years ago
jetpack-connection-banner.js
5 years ago
jetpack-deactivate-dialog.js
5 years ago
jetpack-jitm.js
5 years ago
jetpack-modules.js
5 years ago
jetpack-modules.models.js
6 years ago
jetpack-modules.views.js
5 years ago
jetpack-server-sandbox.php
6 years ago
jetpack-wizard-banner.js
5 years ago
jquery.jetpack-resize.js
5 years ago
polldaddy-shortcode.js
5 years ago
postmessage.js
8 years ago
social-logos.php
6 years ago
twitter-timeline.js
5 years ago
idc-notice.js
242 lines
| 1 | /* global idcL10n, jQuery, analytics, history, wpCookies */ |
| 2 | |
| 3 | ( function ( $ ) { |
| 4 | var restNonce = idcL10n.nonce, |
| 5 | currentUrl = idcL10n.currentUrl, |
| 6 | restRoot = idcL10n.apiRoot, |
| 7 | notice = $( '.jp-idc-notice' ), |
| 8 | idcButtons = $( '.jp-idc-notice .dops-button' ), |
| 9 | tracksUser = idcL10n.tracksUserData, |
| 10 | tracksEvent = idcL10n.tracksEventData, |
| 11 | adminBarMenu = $( '#wp-admin-bar-jetpack-idc' ), |
| 12 | confirmSafeModeButton = $( '#jp-idc-confirm-safe-mode-action' ), |
| 13 | fixConnectionButton = $( '#jp-idc-fix-connection-action' ), |
| 14 | migrateButton = $( '#jp-idc-migrate-action' ), |
| 15 | reconnectButton = $( '#jp-idc-reconnect-site-action' ), |
| 16 | errorNotice = $( '.jp-idc-error__notice' ), |
| 17 | erroredAction = false; |
| 18 | |
| 19 | // Initialize Tracks and bump stats. |
| 20 | if ( 'undefined' !== typeof analytics ) { |
| 21 | analytics.initialize( tracksUser.userid, tracksUser.username ); |
| 22 | } |
| 23 | |
| 24 | if ( tracksEvent.isAdmin ) { |
| 25 | trackAndBumpMCStats( 'notice_view' ); |
| 26 | } else { |
| 27 | trackAndBumpMCStats( 'non_admin_notice_view', { page: tracksEvent.currentScreen } ); |
| 28 | } |
| 29 | clearConfirmationArgsFromUrl(); |
| 30 | |
| 31 | // If the user dismisses the notice, set a cookie for one week so we don't display it for that time. |
| 32 | notice.on( 'click', '.notice-dismiss', function () { |
| 33 | var secure = 'https:' === window.location.protocol; |
| 34 | wpCookies.set( 'jetpack_idc_dismiss_notice', '1', 7 * 24 * 60 * 60, false, false, secure ); |
| 35 | trackAndBumpMCStats( 'non_admin_notice_dismiss', { page: tracksEvent.currentScreen } ); |
| 36 | } ); |
| 37 | |
| 38 | notice.on( 'click', '#jp-idc-error__action', function () { |
| 39 | errorNotice.hide(); |
| 40 | switch ( erroredAction ) { |
| 41 | case 'confirm': |
| 42 | confirmSafeMode(); |
| 43 | break; |
| 44 | case 'start-fresh': |
| 45 | startFreshConnection(); |
| 46 | break; |
| 47 | case 'migrate': |
| 48 | migrateStatsAndSubscribers(); |
| 49 | break; |
| 50 | default: |
| 51 | return; |
| 52 | } |
| 53 | } ); |
| 54 | |
| 55 | // Confirm Safe Mode |
| 56 | confirmSafeModeButton.on( 'click', confirmSafeMode ); |
| 57 | |
| 58 | // Fix connection |
| 59 | fixConnectionButton.on( 'click', fixJetpackConnection ); |
| 60 | |
| 61 | // Start fresh connection |
| 62 | reconnectButton.on( 'click', startFreshConnection ); |
| 63 | |
| 64 | // Starts migration process. |
| 65 | migrateButton.on( 'click', migrateStatsAndSubscribers ); |
| 66 | |
| 67 | function disableDopsButtons() { |
| 68 | idcButtons.prop( 'disabled', true ); |
| 69 | } |
| 70 | |
| 71 | function enableDopsButtons() { |
| 72 | idcButtons.prop( 'disabled', false ); |
| 73 | } |
| 74 | |
| 75 | function clearConfirmationArgsFromUrl( allowReload ) { |
| 76 | allowReload = 'undefined' === typeof allowReload ? false : allowReload; |
| 77 | |
| 78 | // If the jetpack_idc_clear_confirmation query arg is present, let's try to clear it. |
| 79 | // |
| 80 | // Otherwise, there's a weird flow where if the user dismisses the notice, then shows the notice, then clicks |
| 81 | // the confirm safe mode button again, and then reloads the page, then the notice never disappears. |
| 82 | if ( |
| 83 | window.location.search && |
| 84 | -1 !== window.location.search.indexOf( 'jetpack_idc_clear_confirmation' ) |
| 85 | ) { |
| 86 | trackAndBumpMCStats( 'clear_confirmation_clicked' ); |
| 87 | |
| 88 | // If push state is available, let's use that to minimize reloading the page. |
| 89 | // Otherwise, we can clear the args by reloading the page. |
| 90 | if ( history && history.pushState ) { |
| 91 | history.pushState( {}, '', currentUrl ); |
| 92 | } else if ( allowReload ) { |
| 93 | window.location.href = currentUrl; |
| 94 | } |
| 95 | } |
| 96 | } |
| 97 | |
| 98 | function confirmSafeMode() { |
| 99 | errorNotice.hide(); |
| 100 | trackAndBumpMCStats( 'confirm_safe_mode' ); |
| 101 | |
| 102 | var route = restRoot + 'jetpack/v4/identity-crisis/confirm-safe-mode'; |
| 103 | disableDopsButtons(); |
| 104 | $.ajax( { |
| 105 | method: 'POST', |
| 106 | beforeSend: function ( xhr ) { |
| 107 | xhr.setRequestHeader( 'X-WP-Nonce', restNonce ); |
| 108 | }, |
| 109 | url: route, |
| 110 | data: {}, |
| 111 | success: function () { |
| 112 | notice.hide(); |
| 113 | adminBarMenu.removeClass( 'hide' ); |
| 114 | |
| 115 | // We must refresh the Jetpack admin UI page in order for the React UI to render. |
| 116 | if ( window.location.search && 1 === window.location.search.indexOf( 'page=jetpack' ) ) { |
| 117 | window.location.reload(); |
| 118 | } |
| 119 | }, |
| 120 | error: function ( error ) { |
| 121 | erroredAction = 'confirm'; |
| 122 | displayErrorNotice( error ); |
| 123 | enableDopsButtons(); |
| 124 | }, |
| 125 | } ); |
| 126 | } |
| 127 | |
| 128 | function migrateStatsAndSubscribers() { |
| 129 | errorNotice.hide(); |
| 130 | trackAndBumpMCStats( 'migrate' ); |
| 131 | |
| 132 | var route = restRoot + 'jetpack/v4/identity-crisis/migrate'; |
| 133 | disableDopsButtons(); |
| 134 | $.ajax( { |
| 135 | method: 'POST', |
| 136 | beforeSend: function ( xhr ) { |
| 137 | xhr.setRequestHeader( 'X-WP-Nonce', restNonce ); |
| 138 | }, |
| 139 | url: route, |
| 140 | data: {}, |
| 141 | success: function () { |
| 142 | notice.hide(); |
| 143 | if ( $( 'body' ).hasClass( 'toplevel_page_jetpack' ) ) { |
| 144 | // On the main Jetpack page, sites in IDC will not see Jetpack's interface. |
| 145 | // Once IDC is resolved, we need to refresh the page to regain access to the UI. |
| 146 | window.location.reload( true ); |
| 147 | } |
| 148 | }, |
| 149 | error: function ( error ) { |
| 150 | erroredAction = 'migrate'; |
| 151 | displayErrorNotice( error ); |
| 152 | enableDopsButtons(); |
| 153 | }, |
| 154 | } ); |
| 155 | } |
| 156 | |
| 157 | function fixJetpackConnection() { |
| 158 | errorNotice.hide(); |
| 159 | trackAndBumpMCStats( 'fix_connection' ); |
| 160 | notice.addClass( 'jp-idc-show-second-step' ); |
| 161 | } |
| 162 | |
| 163 | /** |
| 164 | * On successful request of the endpoint, we will redirect to the |
| 165 | * connection auth flow after appending a specific 'from=' param for tracking. |
| 166 | */ |
| 167 | function startFreshConnection() { |
| 168 | errorNotice.hide(); |
| 169 | trackAndBumpMCStats( 'start_fresh' ); |
| 170 | |
| 171 | var route = restRoot + 'jetpack/v4/identity-crisis/start-fresh'; |
| 172 | disableDopsButtons(); |
| 173 | $.ajax( { |
| 174 | method: 'POST', |
| 175 | beforeSend: function ( xhr ) { |
| 176 | xhr.setRequestHeader( 'X-WP-Nonce', restNonce ); |
| 177 | }, |
| 178 | url: route, |
| 179 | data: {}, |
| 180 | success: function ( connectUrl ) { |
| 181 | // Add a from param and take them to connect. |
| 182 | window.location = connectUrl + '&from=idc-notice'; |
| 183 | }, |
| 184 | error: function ( error ) { |
| 185 | erroredAction = 'start-fresh'; |
| 186 | displayErrorNotice( error ); |
| 187 | enableDopsButtons(); |
| 188 | }, |
| 189 | } ); |
| 190 | } |
| 191 | |
| 192 | /** |
| 193 | * Displays an error message from the REST endpoints we're hitting. |
| 194 | * |
| 195 | * @param error {Object} Object containing the errored response from the API |
| 196 | */ |
| 197 | function displayErrorNotice( error ) { |
| 198 | var errorDescription = $( '.jp-idc-error__desc' ); |
| 199 | if ( error && error.responseJSON && error.responseJSON.message ) { |
| 200 | errorDescription.html( error.responseJSON.message ); |
| 201 | } else { |
| 202 | errorDescription.html( '' ); |
| 203 | } |
| 204 | errorNotice.css( 'display', 'flex' ); |
| 205 | } |
| 206 | |
| 207 | /** |
| 208 | * This function will fire both a Tracks and MC stat. |
| 209 | * It will make sure to format the event name properly for the given stat home. |
| 210 | * |
| 211 | * Tracks: Will be prefixed by 'jetpack_idc_' and use underscores. |
| 212 | * MC: Will not be prefixed, and will use dashes. |
| 213 | * |
| 214 | * @param eventName string |
| 215 | * @param extraProps object |
| 216 | */ |
| 217 | function trackAndBumpMCStats( eventName, extraProps ) { |
| 218 | if ( 'undefined' === typeof extraProps || 'object' !== typeof extraProps ) { |
| 219 | extraProps = {}; |
| 220 | } |
| 221 | |
| 222 | if ( |
| 223 | eventName && |
| 224 | eventName.length && |
| 225 | 'undefined' !== typeof analytics && |
| 226 | analytics.tracks && |
| 227 | analytics.mc |
| 228 | ) { |
| 229 | // Format for Tracks |
| 230 | eventName = eventName.replace( /-/g, '_' ); |
| 231 | eventName = |
| 232 | eventName.indexOf( 'jetpack_idc_' ) !== 0 ? 'jetpack_idc_' + eventName : eventName; |
| 233 | analytics.tracks.recordEvent( eventName, extraProps ); |
| 234 | |
| 235 | // Now format for MC stats |
| 236 | eventName = eventName.replace( 'jetpack_idc_', '' ); |
| 237 | eventName = eventName.replace( /_/g, '-' ); |
| 238 | analytics.mc.bumpStat( 'jetpack-idc', eventName ); |
| 239 | } |
| 240 | } |
| 241 | } )( jQuery ); |
| 242 |