[{"filePath":"/home/tyler/apps/bct-whitelabel/docs/astro.config.mjs","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/home/tyler/apps/bct-whitelabel/setup-schema.mjs","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/home/tyler/apps/bct-whitelabel/src/components/AccountStatusBanner.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/home/tyler/apps/bct-whitelabel/src/components/Calendar.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/home/tyler/apps/bct-whitelabel/src/components/ChatWidget.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/home/tyler/apps/bct-whitelabel/src/components/CustomPageRenderer.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/home/tyler/apps/bct-whitelabel/src/components/CustomPricingManager.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/home/tyler/apps/bct-whitelabel/src/components/EventManagement.tsx","messages":[{"ruleId":"@typescript-eslint/no-unused-vars","severity":1,"message":"'_err' is defined but never used.","line":125,"column":16,"nodeType":null,"messageId":"unusedVar","endLine":125,"endColumn":20}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"import { useState, useEffect } from 'react';\nimport TabNavigation from './manage/TabNavigation';\nimport TicketingAccessTab from './manage/TicketingAccessTab';\nimport OrdersTab from './manage/OrdersTab';\nimport AttendeesTab from './manage/AttendeesTab';\nimport EventSettingsTab from './manage/EventSettingsTab';\nimport CustomPageTab from './manage/CustomPageTab';\nimport { api } from '../lib/api-router.js';\nimport type { EventData } from '../lib/event-management.js';\n\ninterface EventManagementProps {\n eventId: string;\n organizationId?: string;\n eventSlug?: string;\n}\n\nexport default function EventManagement({ eventId, _organizationId, eventSlug }: EventManagementProps) {\n const [activeTab, setActiveTab] = useState('ticketing');\n const [eventData, setEventData] = useState(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState(null);\n const [_user, setUser] = useState(null);\n const [userOrganizationId, setUserOrganizationId] = useState(null);\n const [actualEventSlug, setActualEventSlug] = useState(eventSlug || null);\n\n const tabs = [\n {\n id: 'ticketing',\n name: 'Ticketing & Access',\n icon: (\n \n \n \n ),\n component: TicketingAccessTab\n },\n {\n id: 'custom-pages',\n name: 'Custom Pages',\n icon: (\n \n \n \n ),\n component: CustomPageTab\n },\n {\n id: 'sales',\n name: 'Sales',\n icon: (\n \n \n \n ),\n component: OrdersTab\n },\n {\n id: 'attendees',\n name: 'Attendees',\n icon: (\n \n \n \n ),\n component: AttendeesTab\n },\n {\n id: 'settings',\n name: 'Event Settings',\n icon: (\n \n \n \n \n ),\n component: EventSettingsTab\n }\n ];\n\n useEffect(() => {\n // Check authentication and load data\n const initializeComponent = async () => {\n try {\n setLoading(true);\n setError(null);\n \n // Check authentication status\n const authStatus = await api.checkAuth();\n \n if (!authStatus.authenticated) {\n // Give a bit more time for auth to load on page refresh\n // Auth check failed, retrying in 1 second...\n setTimeout(async () => {\n const retryAuthStatus = await api.checkAuth();\n if (!retryAuthStatus.authenticated) {\n // Still not authenticated, redirect to login\n // Auth retry failed, redirecting to login\n window.location.href = '/login';\n return;\n }\n // Retry loading with successful auth\n // Auth retry succeeded, reinitializing component\n initializeComponent();\n }, 1000);\n return;\n }\n \n setUser(authStatus.user);\n \n if (!authStatus.organizationId) {\n setError('User not associated with any organization');\n return;\n }\n \n setUserOrganizationId(authStatus.organizationId);\n \n // Load event data using centralized API\n const data = await api.loadEventData(eventId);\n if (data) {\n setEventData(data);\n setActualEventSlug(data.slug);\n } else {\n setError(`Event not found or access denied. Event ID: ${eventId}`);\n }\n } catch (_err) {\n setError('Failed to load event data. Please try again.');\n } finally {\n setLoading(false);\n }\n };\n\n initializeComponent();\n }, [eventId]);\n\n // Loading state\n if (loading) {\n return (\n
\n
\n
\n

Loading event data...

\n
\n
\n );\n }\n\n // Error state\n if (error) {\n return (\n
\n
\n
\n \n \n \n
\n

Error Loading Event

\n

{error}

\n window.location.reload()}\n className=\"px-4 py-2 border rounded-lg text-sm transition-colors backdrop-blur-lg\"\n style={{\n background: 'var(--ui-bg-elevated)',\n borderColor: 'var(--ui-border-primary)',\n color: 'var(--ui-text-primary)'\n }}\n onMouseEnter={(e) => e.target.style.background = 'var(--ui-bg-secondary)'}\n onMouseLeave={(e) => e.target.style.background = 'var(--ui-bg-elevated)'}\n >\n Try Again\n \n
\n
\n );\n }\n\n return (\n \n );\n}","usedDeprecatedRules":[]},{"filePath":"/home/tyler/apps/bct-whitelabel/src/components/ImageUploadCropper.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/home/tyler/apps/bct-whitelabel/src/components/LocationInput.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/home/tyler/apps/bct-whitelabel/src/components/PageBuilder.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/home/tyler/apps/bct-whitelabel/src/components/QuickTicketPurchase.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/home/tyler/apps/bct-whitelabel/src/components/StripeEmbeddedOnboarding.tsx","messages":[{"ruleId":"@typescript-eslint/no-unused-vars","severity":1,"message":"'currentStep' is assigned a value but never used. Allowed unused vars must match /^_/u.","line":68,"column":10,"nodeType":null,"messageId":"unusedVar","endLine":68,"endColumn":21},{"ruleId":"@typescript-eslint/no-explicit-any","severity":1,"message":"Unexpected any. Specify a different type.","line":70,"column":40,"nodeType":"TSAnyKeyword","messageId":"unexpectedAny","endLine":70,"endColumn":43,"suggestions":[{"messageId":"suggestUnknown","fix":{"range":[1952,1955],"text":"unknown"},"desc":"Use `unknown` instead, this will force you to explicitly, and safely assert the type is correct."},{"messageId":"suggestNever","fix":{"range":[1952,1955],"text":"never"},"desc":"Use `never` instead, this is useful when instantiating generic type parameters that you don't need to know the type of."}]},{"ruleId":"@typescript-eslint/no-explicit-any","severity":1,"message":"Unexpected any. Specify a different type.","line":107,"column":33,"nodeType":"TSAnyKeyword","messageId":"unexpectedAny","endLine":107,"endColumn":36,"suggestions":[{"messageId":"suggestUnknown","fix":{"range":[3218,3221],"text":"unknown"},"desc":"Use `unknown` instead, this will force you to explicitly, and safely assert the type is correct."},{"messageId":"suggestNever","fix":{"range":[3218,3221],"text":"never"},"desc":"Use `never` instead, this is useful when instantiating generic type parameters that you don't need to know the type of."}]},{"ruleId":"@typescript-eslint/no-unused-vars","severity":1,"message":"'e' is defined but never used. Allowed unused args must match /^_/u.","line":118,"column":35,"nodeType":null,"messageId":"unusedVar","endLine":118,"endColumn":36},{"ruleId":"@typescript-eslint/no-explicit-any","severity":1,"message":"Unexpected any. Specify a different type.","line":118,"column":38,"nodeType":"TSAnyKeyword","messageId":"unexpectedAny","endLine":118,"endColumn":41,"suggestions":[{"messageId":"suggestUnknown","fix":{"range":[3539,3542],"text":"unknown"},"desc":"Use `unknown` instead, this will force you to explicitly, and safely assert the type is correct."},{"messageId":"suggestNever","fix":{"range":[3539,3542],"text":"never"},"desc":"Use `never` instead, this is useful when instantiating generic type parameters that you don't need to know the type of."}]},{"ruleId":"@typescript-eslint/no-unused-vars","severity":1,"message":"'index' is defined but never used. Allowed unused args must match /^_/u.","line":276,"column":33,"nodeType":null,"messageId":"unusedVar","endLine":276,"endColumn":38}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":6,"fixableErrorCount":0,"fixableWarningCount":0,"source":"import React, { useEffect, useState, useRef } from 'react';\nimport { loadConnectAndInitialize } from '@stripe/connect-js';\n\ninterface StripeEmbeddedOnboardingProps {\n accountId: string;\n clientSecret: string;\n onComplete?: () => void;\n onError?: (error: Error) => void;\n}\n\ninterface OnboardingStep {\n id: number;\n title: string;\n icon: string;\n status: 'completed' | 'current' | 'pending';\n description: string;\n securityNote: string;\n estimatedTime: string;\n}\n\nconst onboardingSteps: OnboardingStep[] = [\n {\n id: 1,\n title: \"Business Information\",\n icon: \"🏢\",\n status: \"current\",\n description: \"Basic details about your organization\",\n securityNote: \"All information is encrypted in transit and at rest\",\n estimatedTime: \"2-3 minutes\"\n },\n {\n id: 2,\n title: \"Identity Verification\",\n icon: \"🔐\",\n status: \"pending\",\n description: \"Secure verification required by financial regulations\",\n securityNote: \"Documents are processed by Stripe's secure systems\",\n estimatedTime: \"5-10 minutes\"\n },\n {\n id: 3,\n title: \"Bank Account Setup\",\n icon: \"🏦\",\n status: \"pending\",\n description: \"Connect your bank account for automated payouts\",\n securityNote: \"Bank details are never stored on our servers\",\n estimatedTime: \"2-3 minutes\"\n },\n {\n id: 4,\n title: \"Final Review\",\n icon: \"✅\",\n status: \"pending\",\n description: \"Review and complete your secure account setup\",\n securityNote: \"Your account will be activated immediately\",\n estimatedTime: \"1-2 minutes\"\n }\n];\n\nconst StripeEmbeddedOnboarding: React.FC = ({\n accountId,\n clientSecret,\n onComplete,\n onError\n}) => {\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState(null);\n const [currentStep, setCurrentStep] = useState(1);\n const [steps, setSteps] = useState(onboardingSteps);\n const stripeConnectInstance = useRef(null);\n const containerRef = useRef(null);\n\n useEffect(() => {\n const initializeStripe = async () => {\n try {\n setLoading(true);\n \n // Initialize Stripe Connect\n const publishableKey = import.meta.env.PUBLIC_STRIPE_PUBLISHABLE_KEY;\n if (!publishableKey) {\n throw new Error('Stripe publishable key not configured');\n }\n\n stripeConnectInstance.current = loadConnectAndInitialize({\n publishableKey,\n clientSecret,\n appearance: {\n variables: {\n colorPrimary: '#1f2937',\n colorBackground: '#ffffff',\n colorText: '#1f2937',\n colorDanger: '#ef4444',\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n spacingUnit: '4px',\n borderRadius: '8px',\n fontSizeBase: '14px',\n fontWeightNormal: '400',\n fontWeightBold: '600'\n }\n }\n });\n\n // Create and mount the onboarding component\n const component = stripeConnectInstance.current.create('account-onboarding');\n \n // Set up event listeners before mounting\n component.setOnExit((e: any) => {\n\n if (e.reason === 'account_onboarding_completed') {\n updateStepStatus(4, 'completed');\n onComplete?.();\n } else if (e.reason === 'account_onboarding_closed') {\n // User closed the onboarding flow\n\n }\n });\n\n component.setOnLoadError((e: any) => {\n\n onError?.(new Error('Failed to load onboarding component'));\n });\n\n // Mount the component\n if (containerRef.current) {\n containerRef.current.appendChild(component);\n }\n\n setLoading(false);\n } catch (error) {\n // Stripe initialization error\n const errorMessage = error instanceof Error ? error.message : 'Failed to initialize Stripe Connect';\n setError(errorMessage);\n onError?.(error as Error);\n setLoading(false);\n }\n };\n\n if (accountId && clientSecret) {\n initializeStripe();\n }\n\n return () => {\n // Cleanup if needed\n if (stripeConnectInstance.current) {\n stripeConnectInstance.current = null;\n }\n };\n }, [accountId, clientSecret, onComplete, onError]);\n\n const updateStepStatus = (stepId: number, status: 'completed' | 'current' | 'pending') => {\n setSteps(prev => prev.map(step => \n step.id === stepId ? { ...step, status } : step\n ));\n setCurrentStep(stepId);\n };\n\n const getStepStatusColor = (status: string) => {\n switch (status) {\n case 'completed':\n return 'bg-green-100 border-green-500 text-green-700';\n case 'current':\n return 'bg-blue-100 border-blue-500 text-blue-700';\n case 'pending':\n return 'bg-gray-100 border-gray-300 text-gray-500';\n default:\n return 'bg-gray-100 border-gray-300 text-gray-500';\n }\n };\n\n const getStepIcon = (status: string) => {\n switch (status) {\n case 'completed':\n return (\n \n \n \n );\n case 'current':\n return (\n
\n
\n
\n );\n default:\n return
;\n }\n };\n\n if (error) {\n return (\n
\n
\n
\n
\n
\n \n \n \n
\n

Setup Error

\n

{error}

\n
\n \n \n Return to Dashboard\n \n
\n
\n
\n
\n
\n );\n }\n\n if (loading) {\n return (\n
\n
\n
\n
\n
\n

Initializing Secure Setup

\n

Preparing your encrypted onboarding experience...

\n
\n
\n
\n
\n );\n }\n\n return (\n
\n {/* Security Header */}\n
\n
\n
\n
\n
\n BCT\n
\n

Secure Account Setup

\n
\n
\n \n \n \n \n 256-bit SSL\n \n \n Powered by Stripe\n
\n
\n
\n
\n\n
\n {/* Progress Steps */}\n
\n
\n
\n

Account Setup Progress

\n

Complete each step to activate your payment processing account

\n
\n \n
\n {steps.map((step, index) => (\n
\n
\n {getStepIcon(step.status)}\n
\n
\n
\n

{step.title}

\n {step.estimatedTime}\n
\n

{step.description}

\n
\n \n \n \n {step.securityNote}\n
\n
\n
\n ))}\n
\n
\n
\n\n {/* Main Onboarding Container */}\n
\n
\n
\n \n \n \n Secure Connection\n \n Stripe Connect\n \n PCI DSS Compliant\n
\n
\n \n
\n
\n

Payment Account Setup

\n

\n Complete your secure payment processing setup to start accepting payments. \n All information is encrypted and processed by Stripe's bank-level security infrastructure.\n

\n
\n\n {/* Trust Indicators */}\n
\n
\n
\n \n \n \n Bank-level Security\n
\n
\n \n \n \n PCI DSS Level 1\n
\n
\n \n \n \n Trusted by Millions\n
\n
\n
\n\n {/* Stripe Embedded Component Container */}\n
\n
\n
\n\n {/* Security Footer */}\n
\n
\n

\n 🔒 Your data is protected by industry-leading security measures\n

\n

\n Questions? Contact our support team at{' '}\n \n support@blackcanyontickets.com\n \n

\n
\n
\n
\n
\n
\n
\n );\n};\n\nexport default StripeEmbeddedOnboarding;","usedDeprecatedRules":[]},{"filePath":"/home/tyler/apps/bct-whitelabel/src/components/SuperAdminDashboard.tsx","messages":[{"ruleId":"@typescript-eslint/no-explicit-any","severity":1,"message":"Unexpected any. Specify a different type.","line":31,"column":36,"nodeType":"TSAnyKeyword","messageId":"unexpectedAny","endLine":31,"endColumn":39,"suggestions":[{"messageId":"suggestUnknown","fix":{"range":[1158,1161],"text":"unknown"},"desc":"Use `unknown` instead, this will force you to explicitly, and safely assert the type is correct."},{"messageId":"suggestNever","fix":{"range":[1158,1161],"text":"never"},"desc":"Use `never` instead, this is useful when instantiating generic type parameters that you don't need to know the type of."}]},{"ruleId":"@typescript-eslint/no-unused-vars","severity":1,"message":"'err' is defined but never used.","line":107,"column":14,"nodeType":null,"messageId":"unusedVar","endLine":107,"endColumn":17},{"ruleId":"@typescript-eslint/no-unused-vars","severity":1,"message":"'error' is defined but never used.","line":122,"column":14,"nodeType":null,"messageId":"unusedVar","endLine":122,"endColumn":19},{"ruleId":"@typescript-eslint/no-unused-vars","severity":1,"message":"'error' is defined but never used.","line":145,"column":14,"nodeType":null,"messageId":"unusedVar","endLine":145,"endColumn":19},{"ruleId":"no-empty","severity":1,"message":"Empty block statement.","line":145,"column":21,"nodeType":"BlockStatement","messageId":"unexpected","endLine":147,"endColumn":6,"suggestions":[{"messageId":"suggestComment","data":{"type":"block"},"fix":{"range":[5693,5699],"text":" /* empty */ "},"desc":"Add comment inside empty block statement."}]}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":5,"fixableErrorCount":0,"fixableWarningCount":0,"source":"import { useState, useEffect } from 'react';\nimport SuperAdminTabNavigation from './admin/SuperAdminTabNavigation';\nimport AnalyticsTab from './admin/AnalyticsTab';\nimport RevenueTab from './admin/RevenueTab';\nimport EventsTab from './admin/EventsTab';\nimport OrganizersTab from './admin/OrganizersTab';\nimport ManagementTab from './admin/ManagementTab';\nimport { makeAuthenticatedRequest } from '../lib/api-client';\n\ninterface SuperAdminDashboardProps {\n // No props needed for now - keeping interface for future expansion\n readonly _placeholder?: never;\n}\n\ninterface PlatformMetrics {\n totalRevenue: number;\n totalFees: number;\n activeOrganizers: number;\n totalTickets: number;\n revenueChange: number;\n feesChange: number;\n organizersChange: number;\n ticketsChange: number;\n}\n\nexport default function SuperAdminDashboard(_props: SuperAdminDashboardProps) {\n const [activeTab, setActiveTab] = useState('analytics');\n const [platformMetrics, setPlatformMetrics] = useState(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState(null);\n const [user, setUser] = useState(null);\n\n const tabs = [\n {\n id: 'analytics',\n name: 'Analytics',\n icon: (\n \n \n \n ),\n component: AnalyticsTab\n },\n {\n id: 'revenue',\n name: 'Revenue & Performance',\n icon: (\n \n \n \n ),\n component: RevenueTab\n },\n {\n id: 'events',\n name: 'Events & Tickets',\n icon: (\n \n \n \n ),\n component: EventsTab\n },\n {\n id: 'organizers',\n name: 'Organizers',\n icon: (\n \n \n \n ),\n component: OrganizersTab\n },\n {\n id: 'management',\n name: 'Management',\n icon: (\n \n \n \n \n ),\n component: ManagementTab\n }\n ];\n\n useEffect(() => {\n initializeComponent();\n }, []);\n\n const initializeComponent = async () => {\n try {\n setLoading(true);\n setError(null);\n \n // Check super admin authentication\n const authResult = await checkSuperAdminAuth();\n if (!authResult) {\n window.location.href = '/login';\n return;\n }\n \n setUser(authResult.user);\n \n // Load platform metrics\n await loadPlatformMetrics();\n } catch (err) {\n\n setError('Failed to load dashboard data. Please try again.');\n } finally {\n setLoading(false);\n }\n };\n\n const checkSuperAdminAuth = async () => {\n try {\n const result = await makeAuthenticatedRequest('/api/admin/check-super-admin');\n if (result.success && result.data.isSuperAdmin) {\n return result.data;\n }\n return null;\n } catch (error) {\n\n return null;\n }\n };\n\n const loadPlatformMetrics = async () => {\n try {\n const result = await makeAuthenticatedRequest('/api/admin/super-analytics?metric=platform_overview');\n \n if (result.success) {\n const data = result.data.summary;\n setPlatformMetrics({\n totalRevenue: data.totalRevenue || 0,\n totalFees: data.totalPlatformFees || 0,\n activeOrganizers: data.activeOrganizers || 0,\n totalTickets: data.totalTickets || 0,\n revenueChange: data.revenueGrowth || 0,\n feesChange: data.feesGrowth || 0,\n organizersChange: data.organizersThisMonth || 0,\n ticketsChange: data.ticketsThisMonth || 0\n });\n }\n } catch (error) {\n\n }\n };\n\n // Loading state\n if (loading) {\n return (\n
\n
\n
\n

Loading super admin dashboard...

\n
\n
\n );\n }\n\n // Error state\n if (error) {\n return (\n
\n
\n
\n \n \n \n
\n

Error Loading Dashboard

\n

{error}

\n window.location.reload()}\n className=\"px-4 py-2 bg-white/10 hover:bg-white/20 border border-white/20 rounded-lg text-white text-sm transition-colors\"\n >\n Try Again\n \n
\n
\n );\n }\n\n return (\n
\n {/* Page Header */}\n
\n

Business Intelligence

\n

Platform-wide analytics and performance insights

\n
\n\n {/* Key Metrics Dashboard */}\n {platformMetrics && (\n
\n
\n
\n
\n \n \n \n
\n
\n

Platform Revenue

\n

${platformMetrics.totalRevenue.toLocaleString()}

\n

+{platformMetrics.revenueChange}% vs last month

\n
\n
\n
\n\n
\n
\n
\n \n \n \n
\n
\n

Platform Fees

\n

${platformMetrics.totalFees.toLocaleString()}

\n

+{platformMetrics.feesChange}% vs last month

\n
\n
\n
\n\n
\n
\n
\n \n \n \n
\n
\n

Active Organizers

\n

{platformMetrics.activeOrganizers}

\n

+{platformMetrics.organizersChange} this month

\n
\n
\n
\n\n
\n
\n
\n \n \n \n
\n
\n

Tickets Sold

\n

{platformMetrics.totalTickets}

\n

+{platformMetrics.ticketsChange} this month

\n
\n
\n
\n
\n )}\n\n \n
\n );\n}","usedDeprecatedRules":[]},{"filePath":"/home/tyler/apps/bct-whitelabel/src/components/TemplateManager.tsx","messages":[{"ruleId":"@typescript-eslint/no-unused-vars","severity":1,"message":"'error' is defined but never used.","line":42,"column":14,"nodeType":null,"messageId":"unusedVar","endLine":42,"endColumn":19},{"ruleId":"no-empty","severity":1,"message":"Empty block statement.","line":42,"column":21,"nodeType":"BlockStatement","messageId":"unexpected","endLine":44,"endColumn":6,"suggestions":[{"messageId":"suggestComment","data":{"type":"block"},"fix":{"range":[1225,1231],"text":" /* empty */ "},"desc":"Add comment inside empty block statement."}]},{"ruleId":"@typescript-eslint/no-unused-vars","severity":1,"message":"'error' is defined but never used.","line":72,"column":14,"nodeType":null,"messageId":"unusedVar","endLine":72,"endColumn":19},{"ruleId":"no-empty","severity":1,"message":"Empty block statement.","line":72,"column":21,"nodeType":"BlockStatement","messageId":"unexpected","endLine":74,"endColumn":6,"suggestions":[{"messageId":"suggestComment","data":{"type":"block"},"fix":{"range":[2012,2018],"text":" /* empty */ "},"desc":"Add comment inside empty block statement."}]},{"ruleId":"@typescript-eslint/no-unused-vars","severity":1,"message":"'error' is defined but never used.","line":93,"column":14,"nodeType":null,"messageId":"unusedVar","endLine":93,"endColumn":19},{"ruleId":"no-empty","severity":1,"message":"Empty block statement.","line":93,"column":21,"nodeType":"BlockStatement","messageId":"unexpected","endLine":95,"endColumn":6,"suggestions":[{"messageId":"suggestComment","data":{"type":"block"},"fix":{"range":[2523,2529],"text":" /* empty */ "},"desc":"Add comment inside empty block statement."}]},{"ruleId":"@typescript-eslint/no-explicit-any","severity":1,"message":"Unexpected any. Specify a different type.","line":98,"column":47,"nodeType":"TSAnyKeyword","messageId":"unexpectedAny","endLine":98,"endColumn":50,"suggestions":[{"messageId":"suggestUnknown","fix":{"range":[2583,2586],"text":"unknown"},"desc":"Use `unknown` instead, this will force you to explicitly, and safely assert the type is correct."},{"messageId":"suggestNever","fix":{"range":[2583,2586],"text":"never"},"desc":"Use `never` instead, this is useful when instantiating generic type parameters that you don't need to know the type of."}]},{"ruleId":"@typescript-eslint/no-unused-vars","severity":1,"message":"'error' is defined but never used.","line":115,"column":14,"nodeType":null,"messageId":"unusedVar","endLine":115,"endColumn":19},{"ruleId":"no-empty","severity":1,"message":"Empty block statement.","line":115,"column":21,"nodeType":"BlockStatement","messageId":"unexpected","endLine":117,"endColumn":6,"suggestions":[{"messageId":"suggestComment","data":{"type":"block"},"fix":{"range":[3054,3060],"text":" /* empty */ "},"desc":"Add comment inside empty block statement."}]},{"ruleId":"@typescript-eslint/no-unused-vars","severity":1,"message":"'pageData' is defined but never used. Allowed unused args must match /^_/u.","line":120,"column":34,"nodeType":null,"messageId":"unusedVar","endLine":120,"endColumn":42},{"ruleId":"@typescript-eslint/no-explicit-any","severity":1,"message":"Unexpected any. Specify a different type.","line":120,"column":44,"nodeType":"TSAnyKeyword","messageId":"unexpectedAny","endLine":120,"endColumn":47,"suggestions":[{"messageId":"suggestUnknown","fix":{"range":[3111,3114],"text":"unknown"},"desc":"Use `unknown` instead, this will force you to explicitly, and safely assert the type is correct."},{"messageId":"suggestNever","fix":{"range":[3111,3114],"text":"never"},"desc":"Use `never` instead, this is useful when instantiating generic type parameters that you don't need to know the type of."}]}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":11,"fixableErrorCount":0,"fixableWarningCount":0,"source":"import React, { useState, useEffect } from 'react';\nimport PageBuilder from './PageBuilder';\n\ninterface Template {\n id: string;\n name: string;\n description: string;\n preview_image_url?: string;\n created_at: string;\n updated_at: string;\n is_active: boolean;\n}\n\ninterface TemplateManagerProps {\n organizationId: string;\n onTemplateSelect?: (template: Template) => void;\n}\n\nconst TemplateManager: React.FC = ({\n organizationId,\n onTemplateSelect\n}) => {\n const [templates, setTemplates] = useState([]);\n const [loading, setLoading] = useState(true);\n const [showBuilder, setShowBuilder] = useState(false);\n const [selectedTemplate, setSelectedTemplate] = useState