From 21a923de29a3a4e0eb0623fea942eba08c4bfec1 Mon Sep 17 00:00:00 2001 From: cawcenter Date: Sun, 14 Dec 2025 10:30:27 -0500 Subject: [PATCH] fix: add CoreProvider to AdminLayout to fix QueryClient error on all admin pages --- fix_all_pages.sh | 46 ++++++++++ fix_query_provider.py | 84 +++++++++++++++++++ frontend/src/layouts/AdminLayout.astro | 6 +- .../admin/collections/geo-intelligence.astro | 5 +- .../src/pages/admin/content/avatars.astro | 5 +- frontend/src/pages/admin/sites/index.astro | 5 +- 6 files changed, 146 insertions(+), 5 deletions(-) create mode 100644 fix_all_pages.sh create mode 100644 fix_query_provider.py diff --git a/fix_all_pages.sh b/fix_all_pages.sh new file mode 100644 index 0000000..5398e34 --- /dev/null +++ b/fix_all_pages.sh @@ -0,0 +1,46 @@ +#!/bin/bash +# Fix all admin pages by adding CoreProvider wrapper + +cd /Users/christopheramaya/Downloads/spark/frontend/src/pages/admin + +# List of files to fix (from user's list) +files=( + "collections/avatar-variants.astro" + "collections/spintax-dictionaries.astro" + "collections/cartesian-patterns.astro" + "collections/campaign-masters.astro" + "collections/content-fragments.astro" + "collections/headline-inventory.astro" + "collections/offer-blocks.astro" + "collections/generation-jobs.astro" + "seo/articles/index.astro" + "leads/index.astro" + "settings.astro" + "content/work_log.astro" + "media/templates.astro" + "content-factory.astro" + "index.astro" + "sites/jumpstart.astro" +) + +for file in "${files[@]}"; do + if [ -f "$file" ]; then + echo "Fixing $file..." + + # Add import if not present + if ! grep -q "CoreProvider" "$file"; then + # Add import after the last import line + sed -i '' '/^import.*from/a\ +import { CoreProvider } from '\''@/components/providers/CoreProviders'\''; +' "$file" + + echo " ✅ Added CoreProvider import" + fi + else + echo " ⚠️ File not found: $file" + fi +done + +echo "" +echo "✅ All files processed!" +echo "⚠️ Note: Component wrapping must be done manually for each file" diff --git a/fix_query_provider.py b/fix_query_provider.py new file mode 100644 index 0000000..915a5d0 --- /dev/null +++ b/fix_query_provider.py @@ -0,0 +1,84 @@ +#!/usr/bin/env python3 +""" +Add CoreProvider wrapper to all Astro admin pages that use React components +""" +import os +import re +from pathlib import Path + +# Pages to fix +pages_dir = Path("/Users/christopheramaya/Downloads/spark/frontend/src/pages/admin") + +def fix_astro_page(file_path): + """Add CoreProvider wrapper to an Astro page""" + with open(file_path, 'r') as f: + content = f.read() + + # Skip if already has CoreProvider + if 'CoreProvider' in content: + print(f" ⏭️ {file_path.name} (already has CoreProvider)") + return False + + # Skip if no client:load or client:only + if 'client:load' not in content and 'client:only' not in content: + print(f" ⏭️ {file_path.name} (no React components)") + return False + + # Add import + import_pattern = r'(---\n)(import.*?from.*?;\n)' + if re.search(import_pattern, content): + # Add after existing imports + content = re.sub( + r'(import.*?from.*?;\n)(\n---)', + r'\1import { CoreProvider } from \'@/components/providers/CoreProviders\';\n\2', + content, + count=1 + ) + + # Find all React components with client directives + # Pattern: or client:only="react" + component_pattern = r'<(\w+)\s+(client:(?:load|only(?:="react")?)\s*/?>)' + + matches = list(re.finditer(component_pattern, content)) + + if not matches: + print(f" ⏭️ {file_path.name} (no matching components)") + return False + + # Wrap all components in CoreProvider + # Find the first component + first_match = matches[0] + first_component_start = first_match.start() + + # Find the last component + last_match = matches[-1] + last_component_end = last_match.end() + + # Insert CoreProvider before first component + before = content[:first_component_start] + components = content[first_component_start:last_component_end] + after = content[last_component_end:] + + # Add proper indentation + indent = ' ' # Assuming 4-space indent + + # Wrap components + wrapped = f'{indent}\n{indent} {components}\n{indent}' + + new_content = before + wrapped + after + + # Write back + with open(file_path, 'w') as f: + f.write(new_content) + + print(f" ✅ {file_path.name}") + return True + +# Process all .astro files +fixed_count = 0 +for astro_file in pages_dir.rglob('*.astro'): + if astro_file.is_file(): + if fix_astro_page(astro_file): + fixed_count += 1 + +print(f"\n✅ Fixed {fixed_count} pages") diff --git a/frontend/src/layouts/AdminLayout.astro b/frontend/src/layouts/AdminLayout.astro index 842cd91..69a482a 100644 --- a/frontend/src/layouts/AdminLayout.astro +++ b/frontend/src/layouts/AdminLayout.astro @@ -8,7 +8,7 @@ const currentPath = Astro.url.pathname; import SystemStatus from '@/components/admin/SystemStatus'; import SystemStatusBar from '@/components/admin/SystemStatusBar'; -import { GlobalToaster } from '@/components/providers/CoreProviders'; +import { GlobalToaster, CoreProvider } from '@/components/providers/CoreProviders'; const navGroups = [ @@ -225,7 +225,9 @@ function isActive(href: string) {
- + + +
diff --git a/frontend/src/pages/admin/collections/geo-intelligence.astro b/frontend/src/pages/admin/collections/geo-intelligence.astro index 7b675a6..b77c457 100644 --- a/frontend/src/pages/admin/collections/geo-intelligence.astro +++ b/frontend/src/pages/admin/collections/geo-intelligence.astro @@ -1,6 +1,7 @@ --- import Layout from '@/layouts/AdminLayout.astro'; import GeoIntelligenceManager from '@/components/admin/intelligence/GeoIntelligenceManager'; +import { CoreProvider } from '@/components/providers/CoreProviders'; ---
@@ -13,6 +14,8 @@ import GeoIntelligenceManager from '@/components/admin/intelligence/GeoIntellige
- + + +
diff --git a/frontend/src/pages/admin/content/avatars.astro b/frontend/src/pages/admin/content/avatars.astro index d9a9679..10e906d 100644 --- a/frontend/src/pages/admin/content/avatars.astro +++ b/frontend/src/pages/admin/content/avatars.astro @@ -2,6 +2,7 @@ --- import Layout from '@/layouts/AdminLayout.astro'; import AvatarIntelligenceManager from '@/components/admin/intelligence/AvatarIntelligenceManager'; +import { CoreProvider } from '@/components/providers/CoreProviders'; ---
@@ -9,6 +10,8 @@ import AvatarIntelligenceManager from '@/components/admin/intelligence/AvatarInt

🎭 Avatar Intelligence

Manage your base avatars, variants, and target personas. Each avatar represents a unique customer profile.

- + + +
diff --git a/frontend/src/pages/admin/sites/index.astro b/frontend/src/pages/admin/sites/index.astro index 7028cda..a02ab1c 100644 --- a/frontend/src/pages/admin/sites/index.astro +++ b/frontend/src/pages/admin/sites/index.astro @@ -1,6 +1,7 @@ --- import Layout from '@/layouts/AdminLayout.astro'; import SitesManager from '@/components/admin/sites/SitesManager'; +import { CoreProvider } from '@/components/providers/CoreProviders'; --- @@ -14,6 +15,8 @@ import SitesManager from '@/components/admin/sites/SitesManager'; - + + +