From a9654f00c8fbc9934289d761843ddd071025013f Mon Sep 17 00:00:00 2001
From: Jake Vanderwerf <get@jakevanderwerf.ca>
Date: Fri, 28 Aug 2026 17:20:28 +0000
Subject: [PATCH] =PHPStorm Code Inspection: fixed class reference errors (from getting rid of JVB() and replacing with direct class::getInstance; as well as general code sniffing, etc

---
 jvb.php |  551 +++++++++++++++++++++++++++---------------------------
 1 files changed, 274 insertions(+), 277 deletions(-)

diff --git a/jvb.php b/jvb.php
index aee9ced..ec283ed 100644
--- a/jvb.php
+++ b/jvb.php
@@ -4,20 +4,51 @@
 Plugin URI: https://jakevan.ca
 Description: The Base Plugin for JakeVan clients
 Author: Jake Vanderwerf
-Version: 1.0.0
+Version: 1.1.0
 Author URI: https://jakevan.ca/
 Textdomain: jvb
 */
 
-use JVBase\JVB;
-use JVBase\managers\IconsManager;
-use JVBase\utility\Checker;
-use JVBase\utility\Features;
-
-//security
 if (!defined('ABSPATH')) {
-    exit;
+	exit; // Exit if accessed directly
 }
+use JVBase\admin\SEOAdmin;
+use JVBase\base\SchemaHelper;
+use JVBase\blocks\CustomBlocks;
+use JVBase\JVB;
+use JVBase\managers\AdminPages;
+use JVBase\managers\Approvals;
+use JVBase\managers\Dashboard\Dashboard;
+use JVBase\managers\DirectoryManager;
+use JVBase\managers\Emails;
+use JVBase\managers\Favourites;
+use JVBase\managers\IconsManager;
+use JVBase\managers\InvitationsManager;
+use JVBase\managers\Login;
+use JVBase\managers\MagicLinks;
+use JVBase\managers\NotificationManager;
+use JVBase\managers\queue\Queue;
+use JVBase\managers\Referrals;
+use JVBase\managers\Responses;
+use JVBase\managers\Roles;
+use JVBase\managers\SEO\render\SchemaOutput;
+use JVBase\managers\TaxonomyRelationships;
+use JVBase\managers\UserTermsManager;
+use JVBase\registrar\Registrar;
+
+use JVBase\base\Site;
+
+//add_action('admin_enqueue_scripts', function() {
+//	global $wp_scripts;
+//	add_action('admin_print_scripts', function() use ($wp_scripts) {
+//		$queue = $wp_scripts->queue ?? [];
+//		foreach ($queue as $handle) {
+//			$src = $wp_scripts->registered[$handle]->src ?? 'unknown';
+//			error_log("Enqueued: $handle => $src");
+//		}
+//	}, 999);
+//}, 999);
+
 
 /**
  * Track REST API errors by wrapping request execution
@@ -75,63 +106,41 @@
 }, 10, 3);
 
 
-const JVB_LOCAL = 'northeh.test';
 
 function jvbIgnoredPostTypes():array
 {
 	return [BASE.'directory', BASE.'dash', 'attachment', 'revision', 'nav_menu_item'];
 }
-add_filter('show_admin_bar', '__return_false');
+
 
 define('JVB_TESTING', str_contains(get_home_url(),'.test'));
-//if (JVB_TESTING) {
-//	error_log('In testing mode...');
-//} else {
-//	error_log('Not in testing mode...');
+//const JVB_TESTING = false;
+
+//if (!JVB_TESTING) {
+	add_filter('show_admin_bar', '__return_false');
 //}
 
+
+
 const JVB_DIR = WP_PLUGIN_DIR . '/jvb';
 define('JVB_URL', plugin_dir_url(__FILE__));
 
 // Session Security
-define('JVB_SESSION_FINGERPRINT', true);
+const JVB_SESSION_FINGERPRINT = true;
 
 // Login Security
-define('JVB_MAX_LOGIN_ATTEMPTS', 5);
-define('JVB_LOCKOUT_DURATION', 15 * MINUTE_IN_SECONDS);
+const JVB_MAX_LOGIN_ATTEMPTS = 5;
+const JVB_LOCKOUT_DURATION = 15 * MINUTE_IN_SECONDS;
 
 
+require(JVB_DIR.'/inc/Instance.php');
 require(JVB_DIR.'/base/_setup.php');
-//error_log('###############################################');
-//error_log('Registered Base');
-//error_log('###############################################');
-//error_log('BASE: '.print_r(BASE, true));
-//error_log('JVB_SITE: '.print_r(JVB_SITE, true));
-//error_log('JVB_OPTIONS: '.print_r(JVB_OPTIONS, true));
-//error_log('JVB_CONTENT: '.print_r(JVB_CONTENT, true));
-//error_log('JVB_TAXONOMY: '.print_r(JVB_TAXONOMY, true));
-//error_log('JVB_LOGIN: '.print_r(JVB_LOGIN, true));
-//error_log('JVB_MEMBERSHIP: '.print_r(JVB_MEMBERSHIP, true));
-//error_log('JVB_USER: '.print_r(JVB_USER, true));
 
-
-if (empty(JVB_SITE)) {
-    return;
-}
 require(JVB_DIR.'/inc/utility/setup.php');
 require(JVB_DIR.'/checks.php');
-require(JVB_DIR.'/globals.php');
 
-$jvb_feed        = jvbGlobalFeedContent();
-$jvb_taxonomy_for= jvbGlobalTaxonomyFor();
-$jvb_responses     = jvbGlobalResponses();
-
-global $jvb_everything;
-$jvb_everything = array_merge(JVB_CONTENT, JVB_TAXONOMY);
-
-
-require(JVB_DIR . '/inc/registry/_setup.php');
-
+require(JVB_DIR . '/inc/integrations/ServiceMap.php');
+require(JVB_DIR . '/inc/registrar/_setup.php');
 require(JVB_DIR . '/activate.php');
 
 require(JVB_DIR . '/inc/helpers/all.php');
@@ -162,6 +171,13 @@
 	return IconsManager::for($source)->get($name, $options);
 }
 
+function jvbFullIcon(string $name, array $options = []):string
+{
+	$source = $options['source'] ?? 'icons';
+	unset($options['source']);
+	return IconsManager::for($source)->getRawSvg($name, $options['style']??null);
+}
+
 /**
  * Get a CSS data URI for an icon
  *
@@ -212,7 +228,7 @@
         'display' => __('Every minute', 'jvb')
     ];
     $schedules[ 'monthly' ] = [
-        'interval' => 604800 * 4,
+        'interval' => MONTH_IN_SECONDS,
         'display' => __('Once Monthly', 'jvb')
     ];
 
@@ -223,21 +239,7 @@
 register_deactivation_hook(JVB_DIR.'/jvb.php', 'jvbDeactivatePlugin');
 
 
-
-
-
-
-
-add_action('init', 'jvbUserCheck');
-function jvbUserCheck():void
-{
-    if (is_admin() && isOurPeople()) {
-        wp_redirect(get_home_url(null, '/dash'));
-        exit;
-    }
-}
-
-require(JVB_DIR . '/inc/users/UserSettings.php');
+//require(JVB_DIR . '/inc/users/UserSettings.php');
 
 
 require(JVB_DIR . '/inc/templates.php');
@@ -249,22 +251,202 @@
 require(JVB_DIR . '/inc/admin/_setup.php');
 
 require(JVB_DIR . '/JVBase.php');
-add_action('init', 'jvbLoadBase', 1);
+
+/**
+ * After moving to the Registrar::based registration, we need to carefully time
+ * 	when Site gets defined, as well as Registrar initial definitions, field definitions,
+ * 	and integration config
+ * These custom actions should simplify the timing for us.
+ */
+add_action('plugins_loaded', 'jvb_site_definitions',1);
+add_action('plugins_loaded', 'jvb_registrar_definitions',2);
+add_action('plugins_loaded', 'jvb_field_definitions', 3);
+add_action('plugins_loaded', 'jvb_options_definitions',3);
+add_action('init', 'jvbLoadBase', 2);
+add_action('init', 'jvb_integration_definitions',3);
+add_action('init', 'jvb_field_section_definitions', 5);
+/**
+ * Can define the Site settings
+ * @return void
+ */
+function jvb_site_definitions():void
+{
+	do_action('jvb_define_site');
+}
+function jvb_registrar_definitions():void
+{
+	do_action('jvb_define_registrar');
+}
+function jvb_field_definitions():void
+{
+	do_action('jvb_define_fields');
+}
+
+function jvb_options_definitions():void
+{
+    do_action('jvb_define_options');
+}
+
 function jvbLoadBase():void
 {
-	JVB::getInstance();
+	do_action('jvbloaded');
+	Emails::getInstance();
+	Queue::getInstance();
+	Roles::getInstance();
+	Login::getInstance();
+	SEOAdmin::getInstance();
+	SchemaOutput::getInstance();
+	SchemaHelper::getInstance();
+	CustomBlocks::getInstance();
+
+	AdminPages::getInstance();
+
+	if (Site::has('magic_link')) {
+		MagicLinks::getInstance();
+	}
+	if (Site::has('dashboard')) {
+		Dashboard::getInstance();
+	}
+	if (Site::has('referrals')) {
+		Referrals::getInstance();
+	}
+
+
+	if (Site::has('is_directory')) {
+		DirectoryManager::getInstance();
+	}
+
+	if (Site::has('feed_block')) {
+		TaxonomyRelationships::getInstance();
+	}
+
+	if (Site::hasAll(['dashboard', 'membership', 'feed_block'])) {
+		UserTermsManager::getInstance();
+	}
+
+	if (Site::has('favourites')) {
+		Favourites::getInstance();
+	}
+
+	if (!empty(Registrar::withFeature('has_responses'))) {
+		Responses::getInstance();
+	}
+
+	$membership = Site::membership();
+	if ($membership && $membership->has('notifications')) {
+		NotificationManager::getInstance();
+	}
+	if ($membership && $membership->has('invitable')) {
+		InvitationsManager::getInstance();
+	}
+
+	if (!empty(Registrar::withFeature('approve_new'))) {
+		Approvals::getInstance();
+	}
+	jvbLoadRoutes();
 }
+
+function jvb_integration_definitions():void
+{
+	do_action('jvb_define_integrations');
+}
+
+function jvb_field_section_definitions():void
+{
+	do_action('jvb_define_field_sections');
+	Registrar::maybeBuildSections();
+}
+
+add_action('wp_footer', 'jvbAdditionalActions');
+function jvbAdditionalActions():void
+{
+	if (Login::isLogin()) {
+		return;
+	}
+	$extras = apply_filters('jvbAdditionalActions', []);
+	$extras = array_filter($extras, function ($extra) {
+		return is_array($extra) && array_key_exists('button', $extra) && array_key_exists('content', $extra);
+	});
+	if (empty ($extras)) {
+		return;
+	}
+	$buttons = array_map(function ($extra) {
+		return $extra['button'];
+	}, $extras);
+	$contents = array_map(function($extra) {
+		return $extra['content'];
+	}, $extras);
+
+	if (!empty ($buttons)) {
+		?>
+		<section class="main-actions">
+			<div class="buttons col">
+				<?= implode('', $buttons); ?>
+			</div>
+			<div class="actions">
+				<?= implode('', $contents); ?>
+			</div>
+		</section>
+		<?php
+	}
+}
+
+
 function JVB(): JVB
 {
 	return JVB::getInstance();
 }
 
+use JVBase\rest\routes\AdminRoutes;
+use JVBase\rest\routes\ContentRoutes;
+use JVBase\rest\routes\ContentTermsRoutes;
+use JVBase\rest\routes\ErrorRoutes;
+use JVBase\rest\routes\FeedRoutes;
+use JVBase\rest\routes\FormRoutes;
+use JVBase\rest\routes\NewsRoutes;
+use JVBase\rest\routes\OptionsRoutes;
+use JVBase\rest\routes\SEORoutes;
+use JVBase\rest\routes\SettingsRoutes;
+use JVBase\rest\routes\TermRoutes;
+use JVBase\rest\routes\UploadRoutes;
 
-function checkIf(): Checker
+function jvbLoadRoutes():void
 {
-	return JVBase\utility\Checker::getInstance();
+	SEORoutes::getInstance();
+	SettingsRoutes::getInstance();
+	UploadRoutes::getInstance();
+	if (!empty(apply_filters('jvb_register_forms', []))) {
+		FormRoutes::getInstance();
+	}
+	UserRoutes::getInstance();
+
+	if (Site::has('feed_block')) {
+		FeedRoutes::getInstance();
+	}
+
+	if (Site::has('feed_block') || Site::has('dashboard')) {
+		TermRoutes::getInstance();
+	}
+
+	if (Site::has('dashboard')) {
+		ErrorRoutes::getInstance();
+		AdminRoutes::getInstance();
+		ContentRoutes::getInstance();
+		ContentTermsRoutes::getInstance();
+		OptionsRoutes::getInstance();
+	}
+
+	$membership = Site::membership();
+	if ($membership && $membership->has('forum'))
+	{
+		NewsRoutes::getInstance();
+	}
 }
 
+
+
+
+
 require(JVB_DIR . '/inc/blocks/_setup.php');
 
 
@@ -294,189 +476,7 @@
 }
 
 
-/**
- * Scripts
- */
-add_action('wp_enqueue_scripts', 'jvbScripts', 10);
 
-function jvbScripts():void
-{
-    add_action('wp_head', 'jvbInlineNavStyles');
-
-	if (Features::forSite()->has('dashboard')) {
-		wp_enqueue_script('jvb-queue');
-	}
-
-	wp_enqueue_script('jvb-auth');
-	wp_enqueue_script('jvb-settings');
-    wp_enqueue_script('jvb-navigation');
-//    wp_enqueue_script('jvb-ui');
-//    wp_enqueue_script('jvb-media');
-	wp_enqueue_script('jvb-gallery');
-    wp_enqueue_script('jvb-cache');
-
-
-	$interactions = [];
-	if (Features::forSite()->has('favourites')) {
-		$interactions[] = 'favourites';
-	}
-	if (Features::anyContentHas('karma') ||
-		Features::anyTaxonomyHas('karma') ||
-		Features::anyUserHas('karma')) {
-		$interactions[] = 'karma';
-	}
-	if (Features::forSite()->has('notifications')) {
-		$interactions[] = 'notifications';
-	}
-
-	if (!empty($interactions)) {
-		wp_enqueue_script('jvb-interactions');
-		foreach($interactions as $interaction) {
-			wp_enqueue_script('jvb-'.$interaction);
-		}
-	}
-
-
-	$queue = [
-		'api' => rest_url('jvb/v1/'),
-		'redirect' => get_home_url(null, '/login/'),
-		'labels' => jvbGetLabels(),
-	];
-
-    wp_localize_script('jvb-auth', 'jvbSettings', $queue);
-
-
-	$initUserSettings = 'async function initUserItems() {
-	if (!jvbSettings.currentUser) return;
-
-	window.userFavourites = {};
-	window.userVotes = {};
-	';
-	if (Features::forSite()->has('favourites')) {
-		wp_enqueue_script('jvb-favourites');
-		$initUserSettings .= '
-		//Fetch user favourites
-		try {
-			const result = await window.jvbCache.fetchWithCache(
-				`${jvbSettings.api}favourites?all=true`,
-                {
-                    method: \'GET\',
-                    headers: {\'X-WP-Nonce\': jvbSettings.nonce}
-                }
-            );
-
-            if (result && result.favourites) {
-				for (const key in result.favourites) {
-					window.userFavourites[key] = new Set();
-					result.favourites[key].forEach(id => {
-						window.userFavourites[key].add(parseInt(id));
-					});
-                }
-            }
-        } catch (error) {
-			console.error(\'Failed to fetch user favourites:\', error);
-		}';
-	}
-
-	if (Features::anyContentHas('karma') || Features::anyTaxonomyHas('karma') || Features::anyUserHas('karma')) {
-		wp_enqueue_script('jvb-votes');
-		$initUserSettings .= '// Fetch user votes
-        try {
-			const result = await window.jvbCache.fetchWithCache(
-				`${jvbSettings.api}vote?user=${jvbSettings.currentUser}`,
-                {
-                    method: \'GET\',
-                    headers: {\'X-WP-Nonce\': jvbSettings.nonce}
-                },
-                {forceRefresh: true}
-            );
-
-            window.userVotes = {};
-            if (result) {
-				for (const key in result) {
-					window.userVotes[key] = new Map();
-					for (const [id, vote] of Object.entries(result[key])) {
-						window.userVotes[key].set(parseInt(id), vote);
-					}
-                }
-            }
-        } catch (error) {
-			console.error(\'Failed to fetch user votes:\', error);
-		}';
-	}
-
-	$initUserSettings .= '} initUserItems();';
-
-//	wp_add_inline_script('jvb-queue', $initUserSettings, 'after');
-
-
-    if (is_search() ||
-        is_tax(BASE.'shop') ||
-        is_singular(BASE.'artist') ||
-        jvbIsDirectory()
-    ) {
-        wp_enqueue_script('jvb-page-nav');
-    }
-
-        // Only load on single shop pages or other relevant pages
-    if (is_tax(BASE.'shop') ||
-        is_singular(BASE.'partner')) {
-            $ID = get_queried_object_id();
-        if (is_tax()) {
-            $check = get_term_meta($ID, BASE.'has_map', true);
-        } else {
-            $check = get_post_meta($ID, BASE.'has_map', true);
-        }
-
-//        if ($check && $check !== '') {
-////            wp_enqueue_script(
-////                'google-maps-frontend',
-////                'https://maps.googleapis.com/maps/api/js?key=' . GOOGLE_API . '&callback=googleMapsLoaded',
-////                [],
-////                null,
-////                ['strategy' => 'async',
-////                 'in_footer' => true]
-////            );
-//
-//            // Add the callback function
-//            wp_add_inline_script('google-maps-frontend', '
-//            function googleMapsLoaded() {
-//                if (window.googleMapsCallbacks && window.googleMapsCallbacks.length) {
-//                    window.googleMapsCallbacks.forEach(callback => callback());
-//                }
-//            }
-//        ');
-//        }
-    }
-    if (is_user_logged_in() && Features::forSite()->has('notifications')) {
-        wp_enqueue_script('jvb-notifications');
-
-        wp_localize_script('jvb-notifications', 'notificationSettings', array(
-            'homeUrl' => home_url(),
-            'strings' => array(
-                'loading' => 'Loading...',
-                'error' => 'Failed to load notifications',
-                'noNotifications' => 'No new notifications',
-                'viewAll' => 'View All Notifications',
-                'markRead' => 'Mark as read',
-                'review' => 'Review'
-            )
-        ));
-    }
-
-    jvbAddScriptDependency('jvb-feed-view-script', 'jvb-queue');
-    jvbAddScriptDependency('jvb-feed-view-script', 'jvb-selector');
-    jvbAddScriptDependency('jvb-feed-view-script', 'jvb-data-store');
-    jvbAddScriptDependency('jvb-feed-view-script', 'jvb-cache');
-    jvbAddScriptDependency('jvb-feed-view-script', 'jvb-a11y');
-    jvbAddScriptDependency('jvb-feed-view-script', 'jvb-utility');
-    jvbAddScriptDependency('jvb-feed-view-script', 'jvb-gallery');
-//    jvbAddScriptDependency('jvb-feed-view-script', 'jvb-loading');
-	jvbAddScriptDependency('jvb-forms-view-script', 'jvb-queue');
-	jvbAddScriptDependency('jvb-forms-view-script', 'jvb-quill');
-	jvbAddScriptDependency('jvb-forms-view-script', 'jvb-form');
-	jvbAddScriptDependency('jvb-forms-view-script', 'jvb-tabs');
-}
 
 function jvbAdminMap():void
 {
@@ -501,21 +501,7 @@
 //    ');
 }
 
-function jvbAddScriptDependency(string $handle, string $dep):bool
-{
-    global $wp_scripts;
 
-    $script = $wp_scripts->query($handle);
-    if (!$script) {
-        return false;
-    }
-
-    if (!in_array($dep, $script->deps)) {
-        $script->deps[] = $dep;
-    }
-
-    return true;
-}
 
 
 add_action('wp_body_open', 'jvbAccessibility');
@@ -523,19 +509,23 @@
 {
     echo '<div class="screen-reader-text live-region" aria-live="polite" role="status"></div>';
 }
-
-
-//add_action('wp_head', 'jvbDumpIt');
-function jvbDumpIt()
+/*
+add_action('wp_head', 'jvbFrontendBase',1);
+function jvbFrontendBase():void
 {
+
+	<script type="text/javascript">window.jvbBase = '<?= BASE ?>';</script>
+	<?php
 }
+*/
+
 
 add_action('after_setup_theme', 'jvbImageSize');
 function jvbImageSize():void
 {
 	add_theme_support('post-thumbnails');
-	add_image_size( 'tiny', 50, 50, false );
-	add_image_size( 'directory-preview', 100, 100, false );
+	add_image_size( 'tiny', 50, 50 );
+	add_image_size( 'directory-preview', 100, 100 );
 }
 
 
@@ -554,19 +544,26 @@
 //	return $result;
 //}, 10, 3);
 
-add_filter('rest_authentication_errors', function($result) {
 
-	// Don't override existing authentication
-	if (is_wp_error($result) || $result === true) {
-		return $result;
+add_action('wp_footer', 'jvb_back_to_top');
+function jvb_back_to_top():void
+{
+	echo sprintf(
+		'<a id="back-to-top" class="btn sticky" href="#">%s<span>Back to Top</span></a>',
+		jvbIcon('caret-double-up')
+	);
+}
+
+add_action( 'doing_it_wrong_run', function ( $function_name ) {
+	if ( '_load_textdomain_just_in_time' === $function_name ) {
+		// This will print the full execution path to your screen or log
+		debug_print_backtrace();
 	}
+} );
 
-	// Try to authenticate from cookie
-	$cookie_user = wp_validate_auth_cookie('', 'logged_in');
 
-	if ($cookie_user) {
-		wp_set_current_user($cookie_user);
-		return true;
-	}
-	return $result;
-}, 99);
+add_filter('the_seo_framework_sitemap_exclude_ids', 'jvb_maybe_exclude_singles', 8, 1);
+function jvb_maybe_exclude_singles(array $IDs):array
+{
+	return Registrar::maybeExcludeSingles($IDs);
+}

--
Gitblit v1.10.0