From 46d681c6b825d21b3f698d793c4e630c687d90ad Mon Sep 17 00:00:00 2001
From: Jake Vanderwerf <get@jakevanderwerf.ca>
Date: Thu, 21 May 2026 21:41:53 +0000
Subject: [PATCH] =Major CustomBlocks.php overhaul, expanding block support and customization from the editor. theme.json should now be updated on new themes to set brand colours, etc. Also note: major change to .col vs .row alignment: simplifying it to .top .bottom vs the confusion of the differences for .col/.row .start and .a-start
---
inc/managers/ReferralManager.php | 174 ++++++++++++++++++++++++++++++++++-----------------------
1 files changed, 104 insertions(+), 70 deletions(-)
diff --git a/inc/managers/ReferralManager.php b/inc/managers/ReferralManager.php
index 6ac1630..c521c15 100644
--- a/inc/managers/ReferralManager.php
+++ b/inc/managers/ReferralManager.php
@@ -43,21 +43,27 @@
'referee_reward_type' => 'percentage', // 'percentage' or 'fixed'
'referee_reward_amount' => 20, // 20% or $20
'referee_reward_applies_to' => 'first_order', // 'first_order' or 'all_orders'
- 'referral_role' => BASE.'client'
];
- protected string $role = BASE.'client';
+ protected string $role;
protected array $settings;
public function __construct()
{
$this->defineTables();
+ $this->role = Site::getDefaultReferralRole();
+ $this->default_settings['referral_role'] = $this->role;
global $wpdb;
$this->wpdb = $wpdb;
$this->cache = Cache::for('referrals', WEEK_IN_SECONDS);
$this->requestCache = Cache::for('referral_requests', WEEK_IN_SECONDS)->connect('referrals', true);
$this->statsCache = Cache::for('referral_stats', WEEK_IN_SECONDS)->connect('referrals', true);
+ if (JVB_TESTING) {
+ $this->cache->flush();
+ $this->requestCache->flush();
+ $this->statsCache->flush();
+ }
$this->referrals_table = $wpdb->prefix . BASE . 'referrals';
$this->rewards_table = $wpdb->prefix . BASE . 'referral_rewards';
@@ -408,7 +414,7 @@
if ($custom_code && !empty($existing) && !in_array($custom_code, $existing)) {
$test = $this->createCode($user_id, $custom_code);
if ($test) {
- return $this->codes->pluck('code', ['user_id' => $user_id], 'created_at', 'DESC');
+ return $this->codes->pluck('code', ['user_id' => $user_id], 'created_at', 'DESC')[0];
} else {
return $existing[0];
}
@@ -1250,28 +1256,54 @@
$referrer_name = $referrer ? strtok($referrer->display_name, ' ') : '';
}
- $codeForm = '<div class="referral-reward-banner">
- '.jvbIcon('confetti').'
- <h4>Get ' . esc_html($reward_text) . '!</h4>
- ' . ($referrer_name ? '<p>' . esc_html($referrer_name) . ' invited you to join us</p>' : '') . '
- </div>
- <form id="referral-code-form">
- '.jvbFormStatus(). '
- <input type="hidden" name="user_select" value="' . esc_attr(get_option(BASE.'referral_role','client')) . '">
- ' .Form::render('referral_name', '', [
+ $header = sprintf(
+ '<header><h2>%sGet %s.</h2></header><h3>Have a code?</h3>%s<p>Enter your referral code to get started!</p>',
+ jvbIcon('confetti'),
+ esc_html($reward_text),
+ ($referrer_name ? '<p>' . esc_html($referrer_name) . ' invited you to join us</p>' : '')
+ );
+
+ $codeForm = sprintf(
+ '<form id="referral-code-form">
+ %s
+ <input type="hidden" name="user_select" value="%s">
+ %s%s%s%s
+ <div class="row">
+ <button type="button" class="button-secondary check-code-btn">
+ %s Verify Code
+ </button>
+ <button type="submit">
+ Get Started
+ </button>
+ </div>
+
+ <div class="code-status" hidden></div>
+
+ <p class="hint">
+ We\'ll send you a link to complete your registration.
+ </p>
+ </form>
+ <div class="success-content" hidden>
+ <h3>Check Your Email!</h3>
+ <p>We\'ve sent you a magic link to complete your registration. Click the link to activate your account and claim your reward!</p>
+ <p class="hint">Can\'t find it? Check your spam folder.</p>
+ </div>',
+ jvbFormStatus(),
+ esc_attr(get_option(BASE.'referral_role','client')),
+ Form::render('referral_name', '', [
'required' => true,
'type' => 'text',
'label' => 'Your Name',
'placeholder'=> 'Mister Meeseeks',
'autocomplete'=>'name'
- ]).
+ ]),
Form::render('referral_email', '', [
'required' => true,
'type' => 'email',
'label' => 'Your Email',
'placeholder'=> 'look@me.com',
'autocomplete'=> 'email'
- ]).
+ ]),
Form::render('referral_code', $prefill_code, [
'required' => true,
'type' => 'text',
@@ -1280,54 +1312,53 @@
'maxLength' => 20,
'autocomplete'=>'off',
'data-referrer' => $referrer_name
- ]).'
- '.$turnstile.'
- <button type="button" class="button-secondary check-code-btn">
- '.jvbIcon('check-circle', ['size' => 16]).' Verify Code
- </button>
- <div class="code-status" hidden></div>
- <button type="submit">
- Get Started
- </button>
+ ]),
+ $turnstile,
+ jvbIcon('check-circle')
+ );
- <p class="helper-text">
- We\'ll send you a link to complete your registration.
- </p>
- </form>
- <div class="success-content" hidden>
- <h3>Check Your Email!</h3>
- <p>We\'ve sent you a magic link to complete your registration. Click the link to activate your account and claim your reward!</p>
- <p class="hint">Can\'t find it? Check your spam folder.</p>
- </div>';
+ $loginHeader = sprintf(
+ '<header><h2>%sLogin</h2></header><p>Already have an account?<br>Log in to see your rewards!</p>',
+ jvbIcon('sign-in')
+ );
+ $loginForm = sprintf(
+ '<form id="login-form">%s%s%s
+ <button type="submit">%sLogin With Magic Link</button>
+ </form>
+ <div class="success-content" hidden>
+ <h3>Check Your Email!</h3>
+ <p>We\'ve sent you a magic link to log in - no password required! Click the link in your email to log in.</p>
+ <p class="hint">Can\'t find it? Check your spam folder.</p>
+ </div>',
+ jvbFormStatus(),
+ Form::render('login_email', null, [
+ 'required' => true,
+ 'type' => 'email',
+ 'label' => 'Your Email',
+ 'autocomplete'=>'email'
+ ]),
+ $turnstile,
+ jvbIcon('magic-wand')
+ );
- $loginForm = '<form id="login-form">
- '.jvbFormStatus().Form::render('login_email', null, [
- 'required' => true,
- 'type' => 'email',
- 'label' => 'Your Email',
- 'autocomplete'=>'email'
- ]).'
- '.$turnstile.'
- <button type="submit">Login With Magic Link</button>
-</form>
-<div class="success-content" hidden>
- <h3>Check Your Email!</h3>
- <p>We\'ve sent you a magic link to log in - no password required! Click the link in your email to log in.</p>
- <p class="hint">Can\'t find it? Check your spam folder.</p>
-</div>';
- $footer = '<div class="referral-footer">
- <a href="' . wp_login_url() . '" class="text-link">Prefer to use a password?</a>
- </div>';
+ $footer = sprintf(
+ '<p class="hint">
+ <a href="%s" class="text-link">Prefer to use a password?</a>
+ </p>',
+ wp_login_url()
+ );
$tabs = [
'enterCode' => [
'title' => 'Have a Code?',
'description' => [
'Enter your referral code to get started'
],
+ 'header' => $header,
'content' => $codeForm
],
'login' => [
+ 'header' => $loginHeader,
'title' => 'Login',
'description' => [
'Already have an account? Log in to see your rewards'
@@ -1400,6 +1431,7 @@
$share_url = $this->getShareURL($referral_code);
ob_start();
?>
+ <div class="wrap">
<header>
<h3>Share the ♡</h3>
<p>Invite friends. Earn rewards.</p>
@@ -1407,9 +1439,9 @@
<?php $this->getShareButtons($user_id); ?>
- <div class="copy-section">
+ <section class="copy">
<h4>Your Referral Link</h4>
- <div class="copy-group row btw nowrap">
+ <div class="copy-group row x-btw nowrap">
<code id="referral-link" class="copy-target"><?= esc_url($share_url) ?></code>
<button type="button" class="copy-btn" data-target="referral-link" title="Copy referral link">
<?= jvbIcon('copy'); ?>
@@ -1420,7 +1452,7 @@
<h4>Your Code</h4>
- <div class="copy-group row btw nowrap">
+ <div class="copy-group row x-btw nowrap">
<code id="referral-code" class="copy-target"><?= esc_html($referral_code) ?></code>
<button type="button" class="copy-btn" data-target="referral-code" title="Copy referral code">
<?= jvbIcon('copy'); ?>
@@ -1429,39 +1461,39 @@
</div>
<p class="hint">Manually copy and paste the code</p>
- </div>
+ </section>
- <div class="recent-referrals-section">
+ <section class="recent-referrals">
<h4>Recent Referrals</h4>
<div class="recent-referrals-list" data-user-id="<?= $user_id ?>">
<div class="loading">Loading...</div>
</div>
- </div>
+ </section>
- <div class="stats-summary">
- <div class="stat-row">
+ <section class="stats-summary">
+ <div class="row x-btw">
<span class="stat-label">Total Referrals</span>
<span class="stat-value" data-stat="total">-</span>
</div>
- <div class="stat-row">
+ <div class="row x-btw">
<span class="stat-label">Successful</span>
<span class="stat-value" data-stat="treated">-</span>
</div>
- <div class="stat-row">
+ <div class="row x-btw">
<span class="stat-label">Pending</span>
<span class="stat-value" data-stat="pending">-</span>
</div>
- <div class="stat-row highlight">
+ <div class="row x-btw highlight">
<span class="stat-label">Available Rewards</span>
<span class="stat-value" data-stat="rewards">$0.00</span>
</div>
- </div>
+ </section>
<a href="<?= get_home_url(null, '/dash/referrals')?>" class="view-dashboard-btn">
Dashboard <?= jvbIcon('arrow-right', ['size' => 16]); ?>
</a>
<p class="hint">Bulk-invite your friends via email - the link will pre-fill their name, email, and code!</p>
-
+ </div>
<?php
return ob_get_clean();
}
@@ -2622,7 +2654,8 @@
$referral_code = $this->getUserReferralCode($user_id);
if (!$referral_code) {
- $referral_code = $this->generateReferralCode($user_id);
+ $user = get_userdata($user_id);
+ $referral_code = $this->generateReferralCode($user);
}
$referrals = $this->getUserReferrals($user_id, ['limit' => 20]);
@@ -2656,9 +2689,10 @@
<?php $this->getShareButtons($user_id); ?>
<!-- Referral Code Card -->
- <div class="card">
+ <details open>
+ <summary>Your Code</summary>
<h3>Share Link</h3>
- <div class="row btw nowrap">
+ <div class="row x-btw nowrap">
<code id="referral-link" class="copy-target"><?= home_url('/?ref=' . $referral_code) ?></code>
<button type="button" class="copy-btn" data-target="referral-link" title="Copy referral link">
<?= jvbIcon('copy'); ?>
@@ -2666,14 +2700,14 @@
</button>
</div>
<h3>Share Code</h3>
- <div class="row btw nowrap">
+ <div class="row x-btw nowrap">
<code id="referral-code" class="copy-target"><?= esc_html($referral_code) ?></code>
<button type="button" class="copy-btn" data-target="referral-code" title="Copy referral code">
<?= jvbIcon('copy'); ?>
<?= jvbIcon('check-circle'); ?>
</button>
</div>
- </div>
+ </details>
<form class="invite">
<h2>Invite your Friends</h2>
<p>Or, if you prefer, enter your friends name(s) and email(s), and we'll send off some emails.</p>
@@ -2837,7 +2871,7 @@
update_option(BASE . 'referral_page_id', $page_id);
// Save client import role
- $import_role = sanitize_text_field($post_data[BASE . 'referral_role'] ?? JVB_USER);
+ $import_role = sanitize_text_field($post_data[BASE . 'referral_role'] ?? Site::getDefaultReferralRole());
update_option(BASE . 'referral_role', $import_role);
// Save reward settings
@@ -2906,7 +2940,7 @@
?>
<nav class="share">
<h4>Quick Share</h4>
- <ul class="share-buttons-grid">
+ <ul>
<a href="mailto:?subject=<?php echo urlencode('Check out ' . get_bloginfo('name')); ?>&body=<?php echo urlencode($share_message . ' ' . $share_url); ?>"
class="button" title="Email">
<?php echo jvbIcon('envelope'); ?>
--
Gitblit v1.10.0