From 474109a5df0a06f5343ab184838fe2d80e3872a8 Mon Sep 17 00:00:00 2001
From: Jake Vanderwerf <get@jakevanderwerf.ca>
Date: Sun, 11 Jan 2026 19:23:20 +0000
Subject: [PATCH] =Fixed timeline CRUD.js issue where this.activeItem was set null when we still needed it

---
 inc/integrations/GoogleMyBusiness.php |  101 ++++++++++++++------------------------------------
 1 files changed, 29 insertions(+), 72 deletions(-)

diff --git a/inc/integrations/GoogleMyBusiness.php b/inc/integrations/GoogleMyBusiness.php
index f6541cc..e818d5b 100644
--- a/inc/integrations/GoogleMyBusiness.php
+++ b/inc/integrations/GoogleMyBusiness.php
@@ -10,9 +10,12 @@
 
 class GoogleMyBusiness extends Integrations
 {
-	private string $access_token;
+	private ?string $access_token = null;
 	protected string $readMask = 'name,title,storefrontAddress,metadata,openInfo,storeCode,categories,phoneNumbers,labels,specialHours';
 	private ?string $location = null;
+	private ?string $refresh_token = null;
+	private ?string $client_id = null;
+	private ?string $client_secret = null;
 	private ?string $account_id = null;
 
 	public function __construct(?int $userID = null)
@@ -82,18 +85,18 @@
 				'label'	=> 'OAuth Client Secret',
 				'required'	=> true,
 			],
-			'access_token'	=> [
-				'type'	=> 'text',
-				'subtype'	=> 'password',
-				'label'	=> 'Access Token',
-				'hint'	=> 'Generated automagically after OAuth authorization.'
-			],
-			'refresh_token'	=> [
-				'type'	=> 'text',
-				'subtype'	=> 'password',
-				'label'	=> 'Refresh Token',
-				'hint'	=> 'Generated automagically after OAuth authorization.'
-			]
+//			'access_token'	=> [
+//				'type'	=> 'text',
+//				'subtype'	=> 'password',
+//				'label'	=> 'Access Token',
+//				'hint'	=> 'Generated automagically after OAuth authorization.'
+//			],
+//			'refresh_token'	=> [
+//				'type'	=> 'text',
+//				'subtype'	=> 'password',
+//				'label'	=> 'Refresh Token',
+//				'hint'	=> 'Generated automagically after OAuth authorization.'
+//			]
 		];
 
 		$this->advanced = [
@@ -134,12 +137,12 @@
 		if (empty($this->credentials)) {
 			$this->loadCredentials();
 		}
-		$this->access_token = $this->credentials['access_token'] ?? '';
-		$this->refresh_token = $this->credentials['refresh_token'] ?? '';
-		$this->client_id = $this->credentials['client_id'] ?? '';
-		$this->client_secret = $this->credentials['client_secret'] ?? '';
-		$this->location = $this->credentials['location'] ?? null;
-		$this->account_id = $this->credentials['account'] ?? null;
+		$this->access_token = (array_key_exists('access_token', $this->credentials)) ? $this->credentials['access_token'] : null;
+		$this->refresh_token = (array_key_exists('refresh_token', $this->credentials)) ? $this->credentials['refresh_token'] : null;
+		$this->client_id = (array_key_exists('client_id', $this->credentials)) ? $this->credentials['client_id'] : null;
+		$this->client_secret = (array_key_exists('client_secret', $this->credentials)) ? $this->credentials['client_secret'] : null;
+		$this->location = (array_key_exists('location', $this->credentials)) ? $this->credentials['location'] : null;
+		$this->account_id = (array_key_exists('account', $this->credentials)) ? $this->credentials['account'] : null;
 
 		if ($this->account_id) {
 			$this->apiEndpoints[] = "/v1/{$this->account_id}/locations";
@@ -200,7 +203,6 @@
 		$type = $settings['content_type']??'post'; //can be 'post', 'offer', 'event', 'hours', 'info',
 		$initial = $settings['initial']?? false;
 		$syncOnUpdate = $settings['update']??false;
-		error_log('Handling GMB Save Post with settings: '.print_r($settings, true));
 		if ($update && !$syncOnUpdate) {
 			return;
 		}
@@ -208,7 +210,6 @@
 			return;
 		}
 
-		error_log('Continuing on...');
 		$options = $data = [];
 		switch ($type) {
 			case 'menu_item':
@@ -220,8 +221,7 @@
 		}
 		$data['post_id'] = $postID;
 		$operation = ($update) ? 'update_' : 'create_';
-		error_log('[GMB]Queuing sync to service:'.print_r($data, true));
-		error_log('Options: '.print_r($options, true));
+
 		$this->queueOperation(
 			$operation.$type,
 			$data,
@@ -470,8 +470,6 @@
 			// Build the complete menu structure
 			$menu_data = $gmb->collectMenu($menu_items);
 
-			error_log('Menu Data: '.print_r($menu_data, true));
-
 			// Send to Google My Business API
 			$result = $this->updateFoodMenus($menu_data);
 			return [
@@ -509,7 +507,6 @@
 				$locations = $this->getLocations($account['name']);
 
 				foreach ($locations as $location) {
-					error_log('Fetched Location: '.print_r($location, true));
 					if ($location['storeCode'] === $this->credentials['location']) {
 						// Auto-migrate: update stored location to use full resource name
 						$this->setSelectedLocation($location['name']);
@@ -696,7 +693,6 @@
 
 			// Filter to only allowed fields
 			$patch_data = array_intersect_key($updates,$allowed_fields);
-			error_log('Updates: '.print_r($updates, true));
 
 			$location_name = $this->getSelectedLocationResourceName();
 			if (empty($patch_data)) {
@@ -1041,7 +1037,6 @@
 		if(!$this->isSetUp()) {
 			return [];
 		}
-		error_log('[GMB] updateBusinessHours called with hours: ' . print_r($hours, true));
 		$location_name = $this->credentials['location'];
 
 		if (empty($location_name)) {
@@ -1064,11 +1059,7 @@
 				]
 			];
 
-			error_log('[GMB] Complete update data: ' . print_r($update_data, true));
-
 			$endpoint = "/v1/{$location_name}?updateMask=regularHours";
-			error_log('[GMB] API endpoint: ' . $endpoint);
-			error_log('[GMB] Using API base: ' . 'base');
 
 			// Make the API request
 			$response = $this->makeRequest(
@@ -1078,18 +1069,15 @@
 				'base'
 			);
 
-			error_log('[GMB] API response: ' . print_r($response, true));
-
 			$success = $response !== null;
-			error_log('[GMB] updateBusinessHours result: ' . ($success ? 'SUCCESS' : 'FAILED'));
 
 			// Additional validation - check if the response contains the updated hours
 			if ($success && $response) {
 				if (isset($response['regularHours'])) {
-					error_log('[GMB] SUCCESS: Updated hours confirmed in response: ' . print_r($response['regularHours'], true));
+//					error_log('[GMB] SUCCESS: Updated hours confirmed in response: ' . print_r($response['regularHours'], true));
 				} else {
-					error_log('[GMB] WARNING: No regularHours in response, but API call succeeded');
-					error_log('[GMB] Full response keys: ' . implode(', ', array_keys($response)));
+//					error_log('[GMB] WARNING: No regularHours in response, but API call succeeded');
+//					error_log('[GMB] Full response keys: ' . implode(', ', array_keys($response)));
 				}
 			}
 
@@ -1099,9 +1087,6 @@
 			];
 
 		} catch (\Exception $e) {
-			error_log('[GMB] Exception in updateBusinessHours: ' . $e->getMessage());
-			error_log('[GMB] Exception trace: ' . $e->getTraceAsString());
-
 			$this->logError($e->getMessage(), [
 				'method'	=> 'updateBusinessHours'
 			]);
@@ -1114,8 +1099,6 @@
 
 	private function validateAndFormatHours(array $hours): array
 	{
-		error_log('[GMB] Validating hours format...');
-
 		$valid_days = ['MONDAY', 'TUESDAY', 'WEDNESDAY', 'THURSDAY', 'FRIDAY', 'SATURDAY', 'SUNDAY'];
 		$periods = [];
 
@@ -1145,8 +1128,6 @@
 				continue;
 			}
 
-			error_log('[GMB] Processing ' . $formatted_day . ' - times data: ' . print_r($times, true));
-
 			// Check if day is open with flexible comparison
 			$is_open = false;
 			if (isset($times['open'])) {
@@ -1178,10 +1159,7 @@
 			];
 
 			$periods[] = $period;
-			error_log('[GMB] Valid period for ' . $formatted_day . ': ' . print_r($period, true));
 		}
-
-		error_log('[GMB] Total valid periods: ' . count($periods));
 		return $periods;
 	}
 
@@ -1260,8 +1238,6 @@
 				]
 			];
 
-			error_log('[GMB] Updating special hours with corrected structure: ' . json_encode($update_data, JSON_PRETTY_PRINT));
-
 			// Try the PATCH request
 			$response = $this->makeRequest(
 				'PATCH',
@@ -1276,8 +1252,6 @@
 			];
 
 		} catch (\Exception $e) {
-			error_log('[GMB] setSpecialHours Exception: ' . $e->getMessage());
-
 			$this->logError($e->getMessage(), [
 				'method'	=> 'setSpecialHours'
 			]);
@@ -1429,9 +1403,6 @@
 		$ttl = 7 * 24 * 60 * 60; // week in seconds
 		$response = $this->getRequest('/v1/accounts', [], 'accounts', $ttl, $force)??[];
 
-		// Log the raw response for debugging
-		error_log('[GMB] Raw accounts response: ' . print_r($response, true));
-
 		if (isset($response['accounts']) && is_array($response['accounts'])) {
 			return $response['accounts'];
 		}
@@ -1479,7 +1450,6 @@
 				'v4'
 			);
 
-			error_log('Review response: '.print_r($response, true));
 			$reviews = $response ?? [];
 
 			// Cache for 1 week (604800 seconds)
@@ -1580,7 +1550,6 @@
 		if (empty($account_name) || !str_starts_with($account_name, 'accounts/')) {
 			return [];
 		}
-		error_log('[GMB] getLocations() called for: ' . $account_name . ' (force: ' . ($force ? 'true' : 'false') . ')');
 		$params = ['readMask' => $this->readMask];
 		$ttl = 7 * 24 * 60 * 60; // Week in seconds
 
@@ -1610,8 +1579,6 @@
 	 */
 	public function refreshStoredData(): array
 	{
-		error_log('[GMB] Manually refreshing accounts and locations data');
-
 		try {
 			// Fetch fresh accounts data from API
 			$accounts = $this->getAccounts(true);
@@ -1671,7 +1638,6 @@
 		];
 		$endpoint = "/v1/{$location_name}?".http_build_query($params);
 
-		error_log('[GMB] Fetching location: ' . $location_name);
 		$location = $this->getRequest($endpoint, [], 'base', 'moderate', $force);
 
 		return $location??null;
@@ -1818,8 +1784,6 @@
 					'hours' => $hour,
 					'minutes' => $minute
 				];
-
-				error_log('[GMB] Converted time "' . $time . '" to Google format: ' . print_r($result, true));
 				return $result;
 			}
 		}
@@ -2234,8 +2198,6 @@
 	public function handleGetAllLocations():WP_Error|array
 	{
 		try {
-			error_log('[GMB] AJAX getAllLocations called');
-
 			// Check if we should force refresh
 			$force = isset($_POST['force']) && $_POST['force'] === 'true';
 
@@ -2249,7 +2211,6 @@
 				$all_locations = array_merge($all_locations, $locations);
 			}
 
-			error_log('[GMB] AJAX returning ' . count($all_locations) . ' locations');
 			return [
 				'success'	=> true,
 				'locations' => $all_locations,
@@ -2257,7 +2218,6 @@
 			];
 
 		} catch (\Exception $e) {
-			error_log('[GMB] AJAX getAllLocations exception: ' . $e->getMessage());
 			return new WP_Error('failure', 'Something went wrong: '.$e->getMessage());
 		}
 	}
@@ -2271,15 +2231,12 @@
 			// Handle both AJAX and REST API calls
 			$selected_account = null;
 
-			error_log('handle Update Location: '.print_r($data, true));
 			if (is_array($data)) {
 				$selected_account = $data['account'] ?? $data['location'] ?? null;
 			} elseif (isset($_POST['account'])) {
 				$selected_account = sanitize_text_field($_POST['account']);
 			}
 
-			error_log('[GMB] updateLocation received: ' . print_r($selected_account, true));
-
 			if (empty($selected_account)) {
 				throw new \Exception('No account selected');
 			}
@@ -2322,9 +2279,7 @@
 	{
 		try {
 			// Use the static method to clear the entire cache group
-			CacheManager::invalidateGroup('integrations_'.$this->cacheName);
-
-			error_log('[GMB] Cleared all stored data for cache group: ' . $this->cacheName);
+			$this->cache->clear();
 			return true;
 
 		} catch (\Exception $e) {
@@ -3019,4 +2974,6 @@
 			]
 		];
 	}
+
+
 }

--
Gitblit v1.10.0