From 86c6cd3cc099d2480932ede03c12cea01e625c94 Mon Sep 17 00:00:00 2001
From: Jake Vanderwerf <get@jakevanderwerf.ca>
Date: Sun, 26 Apr 2026 21:56:28 +0000
Subject: [PATCH] =Requiring files based on Site class settings

---
 base/Site.php |  234 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 234 insertions(+), 0 deletions(-)

diff --git a/base/Site.php b/base/Site.php
new file mode 100644
index 0000000..dfdff4d
--- /dev/null
+++ b/base/Site.php
@@ -0,0 +1,234 @@
+<?php
+namespace JVBase\base;
+
+use JVBase\base\Login;
+
+if (!defined('ABSPATH')) {
+	exit;
+}
+/***********************************************
+ * JVB_SITE defines base site options
+***********************************************/
+class Site {
+	protected static Login $loginConfig;
+	protected static Membership $membershipConfig;
+	protected static Site $instance;
+	protected static string $icons = 'regular';
+
+	/**
+	 * @var bool $is_directory Whether this is a membership directory
+	 */
+	protected static bool $is_directory = false;
+	/**
+	 * @var bool $has_membership Whether this site has membership
+	 */
+	protected static bool $membership = false;
+	/**
+	 * @var bool $dashboard Whether to implement custom dashboard
+	 */
+	protected static bool $dashboard = false;
+	/**
+	 * @var bool $referrals Whether to implement a referral system, with rewards
+	 */
+	protected static bool $referrals = false;
+	/**
+	 * @var bool $magic_link Whether users can login without a password
+	 */
+	protected static bool $magic_link = true;
+	/**
+	 * @var bool $support Whether to implement the support ticket system
+	 */
+	protected static bool $support = false;
+	/**
+	 * @var bool $feed_block Whether to implement the feed block
+	 */
+	protected static bool $feed_block = false;
+
+	/**
+	 * @var bool $is_restaurant Whether this is a restaurant
+	 */
+	protected static bool $is_restaurant = false;
+	/**
+	 * @var bool $limit_hours Whether things should not be able to be sold outside of business hours.
+	 */
+	protected static bool $limit_hours = false;
+	/**
+	 * @var bool $enthusiast Whether to scaffold enthusiasts (users that can interact with and save favourites)
+	 */
+	protected static bool $enthusiast = false;
+	/**
+	 * @var bool Optional flag to allow enthusiasts, but not favourites
+	 */
+	protected static bool $favourites = false;
+
+
+	protected static array $integrations = [
+		'bluesky'	=> false,
+		'cloudflare'=> true,
+		'facebook'	=> false,
+		'instagram'	=> false,
+		'maps'		=> false,
+		'gmb'		=> false,
+		'helcim'	=> false,
+		'postmark'	=> false,
+		'square'	=> false,
+		'umami'		=> true,
+	];
+	private function __construct(){
+
+	}
+
+	public static function getInstance():Site {
+		if (!isset(self::$instance)) {
+			self::$instance = new self();
+			do_action('jvbLoadDefinitions');
+		}
+		return self::$instance;
+	}
+
+	public static function set(string $property, ?string $value = null):void
+	{
+		$property = strtolower($property);
+		if (property_exists(self::class, $property)) {
+			switch ($property) {
+				case 'icons':
+					$allowed = ['thin', 'light', 'regular','bold','fill','duotone'];
+					$value = strtolower($value);
+					if (in_array($value, $allowed)) {
+						self::$icons = $value;
+					} else {
+						error_log('[Site]::set Could not set icons to "'.$value.'", setting to default');
+					}
+					break;
+				default:
+					self::${$property} = true;
+			}
+		} else {
+			error_log('[Site]::set Could not set property: '.$property);
+		}
+	}
+	public static function setAll(array $properties):void
+	{
+		foreach ($properties as $property) {
+			self::set($property);
+		}
+	}
+
+	public static function has(string $property):bool
+	{
+		return property_exists(self::class, $property) && self::${$property} === true;
+	}
+
+	public static function hasAny(array $properties):bool
+	{
+		foreach ($properties as $property) {
+			if (self::has($property)) {
+				return true;
+			}
+		}
+		return false;
+	}
+
+	public static function hasAll(array $properties):bool
+	{
+		foreach ($properties as $property) {
+			if (!self::has($property)) {
+				return false;
+			}
+		}
+		return true;
+	}
+
+	public static function icon():string
+	{
+		return self::$icons;
+	}
+
+	public static function setIntegration(string $integration, bool $set = true):void
+	{
+		$integration = strtolower($integration);
+		if (array_key_exists($integration, self::$integrations)) {
+			self::$integrations[$integration] = $set;
+		}else {
+			error_log('[Site]::setIntegration Could not set integration: '.$integration);
+		}
+	}
+	public static function setIntegrations(array $integrations, bool $set = true):void
+	{
+		foreach ($integrations as $integration) {
+			self::setIntegration($integration, $set);
+		}
+	}
+	public static function hasIntegration(string $integration):bool
+	{
+		$integration = strtolower($integration);
+		return array_key_exists($integration, self::$integrations);
+	}
+
+	public static function hasAnyIntegration(array $integrations = []):bool
+	{
+		if (empty($integrations)) {
+			$integrations = array_keys(self::$integrations);
+		}
+		foreach ($integrations as $integration) {
+			if (array_key_exists($integration, self::$integrations) && self::$integrations[$integration] === true) {
+				return true;
+			}
+		}
+		return false;
+	}
+
+	public static function getIntegrations():array
+	{
+		return array_filter(self::$integrations);
+	}
+
+	public static function login():Login|false
+	{
+		if (!isset(self::$loginConfig)) {
+			self::$loginConfig = new Login();
+		}
+		return self::$loginConfig;
+	}
+	public static function membership():Membership|false
+	{
+		if (!self::$membership) {
+			return false;
+		}
+		if (!isset(self::$membershipConfig)) {
+			self::$membershipConfig = new Membership();
+		}
+		return self::$membershipConfig;
+	}
+}
+
+
+$defaults = [
+	'icons'               => 'light',
+	'directory'        => false,        //as in, a membership directory
+	'membership'      => false,
+	'has_map'             => false,			//TODO: migrate to integrations['gmb']
+	'dashboard'           => false,
+	'support'         => false,
+	'feed_block'      => false,
+	'email_notifications' => false,
+	'integrations'  => [
+		'bluesky'     => false,
+		'cloudflare'  => false,
+		'facebook'    => false,
+		'maps'        => false,
+		'gmb'         => false,
+		'helcim'      => false,
+		'instagram'   => false,
+		'square'      => false,
+		'umami'       => false,
+	],
+	'is_restaurant'       => false,
+	'limit_hours'         => false,
+	'enthusiast'          => false,
+	'favourites'          => false,    			//optional flag to allow enthusiasts, but not favourites
+];
+
+$jvb_site = array_merge($defaults, apply_filters('jvb_site', []));
+
+define('JVB_SITE', $jvb_site);

--
Gitblit v1.10.0