/**
* Ambassador Dashboard UI
* Shortcode: [bbb_ambassador_dashboard]
* Requires: bbb_get_ambassador_stats (wp_ajax) and bbb_find_user_by_ref etc.
*/// Enqueue dashboard assets
function bbb_enqueue_dashboard_assets() {
if ( ! is_page() && ! is_singular() ) {
// still enqueue if shortcode used anywhere; safe guard later
}
wp_register_style( ‘bbb-dashboard-css’, false );
wp_enqueue_style( ‘bbb-dashboard-css’ );
wp_add_inline_style( ‘bbb-dashboard-css’, ”
.bbb-dashboard{max-width:1100px;margin:18px auto;padding:18px;font-family:Inter,Arial,Helvetica,sans-serif;color:#071018}
.bbb-panel{background:#fff;border-radius:12px;padding:18px;margin-bottom:14px;color:#071018}
.bbb-grid{display:grid;grid-template-columns:1fr 320px;gap:16px}
.bbb-stats{display:flex;gap:12px;flex-wrap:wrap}
.bbb-stat{flex:1;min-width:140px;background:#f6f7fb;padding:12px;border-radius:10px;text-align:center}
.bbb-qr{display:flex;flex-direction:column;align-items:center;gap:8px}
.bbb-ref-input{width:100%;padding:8px;border-radius:8px;border:1px solid #e3e7ef}
.bbb-share{display:flex;gap:8px;flex-wrap:wrap}
@media(max-width:880px){.bbb-grid{grid-template-columns:1fr}}
” );wp_register_script( ‘bbb-dashboard-js’, false );
wp_enqueue_script( ‘bbb-dashboard-js’ );
$ajax = admin_url( ‘admin-ajax.php’ );
$nonce = wp_create_nonce( ‘bbb_dashboard_nonce’ );
wp_add_inline_script( ‘bbb-dashboard-js’, ”
const BBB_AJAX_URL = ‘” . esc_js( $ajax ) . “‘;
const BBB_DASHBOARD_NONCE = ‘” . esc_js( $nonce ) . “‘;
” );
wp_add_inline_script( ‘bbb-dashboard-js’, ”
(function(){
function el(sel){return document.querySelector(sel);}
function els(sel){return document.querySelectorAll(sel);}function fetchStats(){
var data = new FormData();
data.append(‘action’,’bbb_get_ambassador_stats’);
data.append(‘_wpnonce’, BBB_DASHBOARD_NONCE);
fetch(BBB_AJAX_URL, { method:’POST’, body: data, credentials:’same-origin’ })
.then(res=>res.json()).then(json=>{
if(json.success){
const s = json.data;
el(‘.bbb-stat-clicks’).innerText = s.clicks || 0;
el(‘.bbb-stat-orders’).innerText = s.orders || 0;
el(‘.bbb-stat-earnings’).innerText = (s.earnings ? ‘RM’ + parseFloat(s.earnings).toFixed(2) : ‘RM0.00’);
el(‘.bbb-stat-signups’).innerText = s.signups || 0;
} else {
// not logged or no ref yet
console.log(‘Stats error’, json);
}
}).catch(err=>console.log(‘AJAX error’,err));
}// update phone
document.addEventListener(‘submit’, function(e){
if(e.target && e.target.id === ‘bbb-update-phone-form’){
e.preventDefault();
var fd = new FormData(e.target);
fd.append(‘action’,’bbb_update_amb_phone’);
fd.append(‘_wpnonce’, BBB_DASHBOARD_NONCE);
fetch(BBB_AJAX_URL, {method:’POST’, body:fd, credentials:’same-origin’})
.then(r=>r.json()).then(j=>{
if(j.success){ alert(‘Phone updated’); } else { alert(‘Update failed’); }
}).catch(()=>alert(‘Network error’));
}
});// initial fetch
document.addEventListener(‘DOMContentLoaded’, function(){ fetchStats(); });
})();
” );
}
add_action( ‘wp_enqueue_scripts’, ‘bbb_enqueue_dashboard_assets’ );// AJAX handler to update ambassador phone (logged-in only)
function bbb_ajax_update_amb_phone() {
check_admin_referer(‘bbb_dashboard_nonce’);
if ( ! is_user_logged_in() ) wp_send_json_error(‘not_logged_in’);
$user = wp_get_current_user();
if ( ! in_array( ‘bbb_ambassador’, (array)$user->roles ) ) wp_send_json_error(‘not_ambassador’);
$phone = sanitize_text_field( $_POST[‘phone’] ?? ” );
if ( empty( $phone ) ) wp_send_json_error(’empty_phone’);
update_user_meta( $user->ID, ‘bbb_phone’, $phone );
wp_send_json_success( [‘ok’=>1] );
}
add_action( ‘wp_ajax_bbb_update_amb_phone’, ‘bbb_ajax_update_amb_phone’ );// Shortcode rendering
function bbb_ambassador_dashboard_shortcode( $atts ) {
ob_start();
if ( ! is_user_logged_in() ) {
echo ‘
‘;
return ob_get_clean();
}$user = wp_get_current_user();
if ( ! in_array( ‘bbb_ambassador’, (array)$user->roles ) ) {
echo ‘
Ambassador Portal
Your account is not registered as an Ambassador. Apply here.
‘;
return ob_get_clean();
}// ensure ref id exists (generated earlier by plugin)
$ref_id = get_user_meta( $user->ID, ‘bbb_ref_id’, true );
if ( empty( $ref_id ) ) {
$ref_id = ‘BBB’.dechex( $user->ID ).substr( md5( $user->user_email . time() ), 0, 6 );
update_user_meta( $user->ID, ‘bbb_ref_id’, $ref_id );
}$ref_link = add_query_arg( ‘ref’, $ref_id, home_url( ‘/’ ) );
$qr_src = ‘https://chart.googleapis.com/chart?chs=300×300&cht=qr&chl=’ . rawurlencode( $ref_link ) . ‘&chld=L|1’;// earnings quick read
$earnings = floatval( get_user_meta( $user->ID, ‘bbb_total_earnings’, true ) ?? 0 );?>