From 552d48a1424417da160c4952650ea6f4a3d7bafa Mon Sep 17 00:00:00 2001
From: Jake Vanderwerf <get@jakevanderwerf.ca>
Date: Sun, 04 Jan 2026 20:18:23 +0000
Subject: [PATCH] =Taxonomy Selector and Creator refactor

---
 assets/js/concise/AuthManager.js |   47 +++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 47 insertions(+), 0 deletions(-)

diff --git a/assets/js/concise/AuthManager.js b/assets/js/concise/AuthManager.js
index dfad8bf..033255e 100644
--- a/assets/js/concise/AuthManager.js
+++ b/assets/js/concise/AuthManager.js
@@ -66,6 +66,53 @@
 	}
 
 	/**
+	 * Refresh nonce if authentication fails
+	 */
+	async refreshNonce(action = 'wp_rest') {
+		try {
+			await this.fetchAuth();
+			return this.getNonce(action);
+		} catch (error) {
+			console.error('Failed to refresh nonce:', error);
+			return null;
+		}
+	}
+
+	/**
+	 * Fetch with automatic nonce refresh on auth failure
+	 * Use this for all authenticated API requests
+	 */
+	async fetch(url, options = {}) {
+		const attempt = async (retryCount = 0) => {
+			const headers = {
+				'Content-Type': 'application/json',
+				...options.headers,
+				'X-WP-Nonce': this.getNonce()
+			};
+
+			const response = await fetch(url, {
+				...options,
+				credentials: 'same-origin',
+				headers
+			});
+
+			// If auth failed and we haven't retried yet, refresh and try once more
+			if ((response.status === 403 || response.status === 401) && retryCount === 0) {
+				const result = await response.clone().json();
+				if (result.code === 'rest_cookie_invalid_nonce' || result.message?.includes('Cookie check')) {
+					console.log('Nonce invalid, refreshing auth...');
+					await this.refresh();
+					return attempt(1); // Retry once
+				}
+			}
+
+			return response;
+		};
+
+		return attempt();
+	}
+
+	/**
 	 * Fetch authentication status from API
 	 */
 	async fetchAuth() {

--
Gitblit v1.10.0