<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[BuddyPress][12454] trunk/src/bp-core: Improve the `bp.apiRequest()` JS function and some PHP code indentation</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { white-space: pre-line; overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta" style="font-size: 105%">
<dt style="float: left; width: 6em; font-weight: bold">Revision</dt> <dd><a style="font-weight: bold" href="http://buddypress.trac.wordpress.org/changeset/12454">12454</a><script type="application/ld+json">{"@context":"http://schema.org","@type":"EmailMessage","description":"Review this Commit","action":{"@type":"ViewAction","url":"http://buddypress.trac.wordpress.org/changeset/12454","name":"Review Commit"}}</script></dd>
<dt style="float: left; width: 6em; font-weight: bold">Author</dt> <dd>imath</dd>
<dt style="float: left; width: 6em; font-weight: bold">Date</dt> <dd>2019-09-07 17:26:24 +0000 (Sat, 07 Sep 2019)</dd>
</dl>

<pre style='padding-left: 1em; margin: 2em 0; border-left: 2px solid #ccc; line-height: 1.25; font-size: 105%; font-family: sans-serif'>Improve the `bp.apiRequest()` JS function and some PHP code indentation

`bp.apiRequest()` will make sure to return the JSON response object in case of an error. In case this JSON response object is not available a default error object will be used.

When WordPress version is lower than 4.9, the same function will make sure to override the `url` option with the REST API root URL only if this option is not already set. Moreover the Nonce header is now only added for REST API requests made on the current site domain.

The PHP code indentation of `bp-core/bp-core-rest-api.php` file has been improved.

Fixes <a href="http://buddypress.trac.wordpress.org/ticket/8131">#8131</a></pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunksrcbpcorebpcorerestapiphp">trunk/src/bp-core/bp-core-rest-api.php</a></li>
<li><a href="#trunksrcbpcorejsbpapirequestjs">trunk/src/bp-core/js/bp-api-request.js</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunksrcbpcorebpcorerestapiphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/bp-core/bp-core-rest-api.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/bp-core/bp-core-rest-api.php    2019-08-28 21:31:44 UTC (rev 12453)
+++ trunk/src/bp-core/bp-core-rest-api.php      2019-09-07 17:26:24 UTC (rev 12454)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -18,7 +18,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">  * @return boolean True if the BP REST plugin is active. False otherwise.
</span><span class="cx" style="display: block; padding: 0 10px">  */
</span><span class="cx" style="display: block; padding: 0 10px"> function bp_rest_is_plugin_active() {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-    return (bool) has_action( 'bp_rest_api_init', 'bp_rest', 5 );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ return (bool) has_action( 'bp_rest_api_init', 'bp_rest', 5 );
</ins><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px"> /**
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -33,9 +33,9 @@
</span><span class="cx" style="display: block; padding: 0 10px">  * @return bool Whether to use the REST Endpoints of built BuddyPress.
</span><span class="cx" style="display: block; padding: 0 10px">  */
</span><span class="cx" style="display: block; padding: 0 10px"> function bp_rest_in_buddypress() {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-    $is_src = defined( 'BP_SOURCE_SUBDIRECTORY' ) && BP_SOURCE_SUBDIRECTORY === 'src';
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ $is_src = defined( 'BP_SOURCE_SUBDIRECTORY' ) && BP_SOURCE_SUBDIRECTORY === 'src';
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-    return ! $is_src && ! bp_rest_is_plugin_active();
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ return ! $is_src && ! bp_rest_is_plugin_active();
</ins><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px"> /**
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -47,16 +47,16 @@
</span><span class="cx" style="display: block; padding: 0 10px">  */
</span><span class="cx" style="display: block; padding: 0 10px"> function bp_rest_api_is_available() {
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-    /**
-     * Filter here to disable the BP REST API.
-     *
-     * The BP REST API requires at least WordPress 4.7.0
-     *
-     * @since 5.0.0
-     *
-     * @param boolean $value True if the BP REST API is available. False otherwise.
-     */
-    return apply_filters( 'bp_rest_api_is_available', function_exists( 'create_initial_rest_routes' ) && bp_rest_in_buddypress() ) || bp_rest_is_plugin_active();
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ /**
+        * Filter here to disable the BP REST API.
+        *
+        * The BP REST API requires at least WordPress 4.7.0
+        *
+        * @since 5.0.0
+        *
+        * @param boolean $value True if the BP REST API is available. False otherwise.
+        */
+       return apply_filters( 'bp_rest_api_is_available', function_exists( 'create_initial_rest_routes' ) && bp_rest_in_buddypress() ) || bp_rest_is_plugin_active();
</ins><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px"> /**
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -65,32 +65,34 @@
</span><span class="cx" style="display: block; padding: 0 10px">  * @since 5.0.0
</span><span class="cx" style="display: block; padding: 0 10px">  */
</span><span class="cx" style="display: block; padding: 0 10px"> function bp_rest_api_register_request_script() {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-    if ( ! bp_rest_api_is_available() ) {
-        return;
-    }
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ if ( ! bp_rest_api_is_available() ) {
+               return;
+       }
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-    $dependencies = array( 'jquery' );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ $dependencies = array( 'jquery' );
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-    // The wrapper for WP REST API requests was introduced in WordPress 4.9.0
-    if ( wp_script_is( 'wp-api-request', 'registered' ) ) {
-        $dependencies = array( 'wp-api-request' );
-    }
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ // The wrapper for WP REST API requests was introduced in WordPress 4.9.0.
+       if ( wp_script_is( 'wp-api-request', 'registered' ) ) {
+               $dependencies = array( 'wp-api-request' );
+       }
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-    wp_register_script(
-        'bp-api-request',
-        sprintf( '%1$sbp-core/js/bp-api-request%2$s.js', buddypress()->plugin_url, bp_core_get_minified_asset_suffix() ),
-        $dependencies,
-        bp_get_version(),
-        true
-    );
-    wp_localize_script(
-        'bp-api-request',
-        'bpApiSettings',
-        array(
-            'root'  => esc_url_raw( get_rest_url() ),
-            'nonce' => wp_create_nonce( 'wp_rest' ),
-        )
-    );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ wp_register_script(
+               'bp-api-request',
+               sprintf( '%1$sbp-core/js/bp-api-request%2$s.js', buddypress()->plugin_url, bp_core_get_minified_asset_suffix() ),
+               $dependencies,
+               bp_get_version(),
+               true
+       );
+
+       wp_localize_script(
+               'bp-api-request',
+               'bpApiSettings',
+               array(
+                       'root'            => esc_url_raw( get_rest_url() ),
+                       'nonce'           => wp_create_nonce( 'wp_rest' ),
+                       'unexpectedError' => __( 'An unexpected error occured. Please try again.', 'buddypress' ),
+               )
+       );
</ins><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px"> add_action( 'bp_init', 'bp_rest_api_register_request_script' );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span></span></pre></div>
<a id="trunksrcbpcorejsbpapirequestjs"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/bp-core/js/bp-api-request.js</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/bp-core/js/bp-api-request.js    2019-08-28 21:31:44 UTC (rev 12453)
+++ trunk/src/bp-core/js/bp-api-request.js      2019-09-07 17:26:24 UTC (rev 12454)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -17,6 +17,8 @@
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     // Polyfill wp.apiRequest if WordPress < 4.9
</span><span class="cx" style="display: block; padding: 0 10px">     bp.apiRequest = function( options ) {
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        var bpRequest;
+
</ins><span class="cx" style="display: block; padding: 0 10px">         if ( ! options.dataType ) {
</span><span class="cx" style="display: block; padding: 0 10px">             options.dataType = 'json';
</span><span class="cx" style="display: block; padding: 0 10px">         }
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -23,7 +25,7 @@
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">         // WordPress is >= 4.9.0.
</span><span class="cx" style="display: block; padding: 0 10px">         if ( wp.apiRequest ) {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-            return wp.apiRequest( options );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+            bpRequest = wp.apiRequest( options );
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">         // WordPress is < 4.9.0.
</span><span class="cx" style="display: block; padding: 0 10px">         } else {
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -33,13 +35,35 @@
</span><span class="cx" style="display: block; padding: 0 10px">                 url = url + options.path.replace( /^\//, '' );
</span><span class="cx" style="display: block; padding: 0 10px">             }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-            options.url = url;
-            options.beforeSend = function( xhr ) {
-                xhr.setRequestHeader( 'X-WP-Nonce', bpApiSettings.nonce );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+            if ( ! options.url ) {
+                options.url = url;
+            }
+
+            // Add The nonce only when needed.
+            if ( -1 !== options.url.indexOf( url ) ) {
+                options.beforeSend = function( xhr ) {
+                    xhr.setRequestHeader( 'X-WP-Nonce', bpApiSettings.nonce );
+                };
+            }
+
+            bpRequest = $.ajax( options );
+        }
+
+        return bpRequest.then( null, function( result ) {
+            var errorObject = {
+                code: 'unexpected_error',
+                message: bpApiSettings.unexpectedError,
+                data: {
+                    status: 404
+                }
</ins><span class="cx" style="display: block; padding: 0 10px">             };
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-            return $.ajax( options );
-        }
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+            if ( result && result.responseJSON ) {
+                errorObject = result.responseJSON;
+            }
+
+            return errorObject;
+        } );
</ins><span class="cx" style="display: block; padding: 0 10px">     };
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px"> } )( window.wp || {}, window.bp, jQuery );
</span></span></pre>
</div>
</div>

</body>
</html>