import { useEffect, useState } from 'react'; import { useParams, useNavigate } from 'react-router-dom'; import { Layout } from '../components/Layout'; import { api } from '../lib/api'; import { Building2, Phone, MapPin, ExternalLink, ArrowLeft, Package, Tag, RefreshCw, ChevronDown, Clock, CheckCircle, XCircle, AlertCircle } from 'lucide-react'; export function DutchieAZStoreDetail() { const { id } = useParams(); const navigate = useNavigate(); const [summary, setSummary] = useState(null); const [products, setProducts] = useState([]); const [loading, setLoading] = useState(true); const [productsLoading, setProductsLoading] = useState(false); const [activeTab, setActiveTab] = useState<'products' | 'brands' | 'categories'>('products'); const [showUpdateDropdown, setShowUpdateDropdown] = useState(false); const [isUpdating, setIsUpdating] = useState(false); const [searchQuery, setSearchQuery] = useState(''); const [currentPage, setCurrentPage] = useState(1); const [totalProducts, setTotalProducts] = useState(0); const [itemsPerPage] = useState(25); const [stockFilter, setStockFilter] = useState(''); const formatDate = (dateStr: string) => { if (!dateStr) return 'Never'; const date = new Date(dateStr); const now = new Date(); const diffMs = now.getTime() - date.getTime(); const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24)); if (diffDays === 0) return 'Today'; if (diffDays === 1) return 'Yesterday'; if (diffDays < 7) return `${diffDays} days ago`; return date.toLocaleDateString(); }; useEffect(() => { if (id) { loadStoreSummary(); } }, [id]); useEffect(() => { if (id && activeTab === 'products') { loadProducts(); } }, [id, currentPage, searchQuery, stockFilter, activeTab]); // Reset to page 1 when filters change useEffect(() => { setCurrentPage(1); }, [searchQuery, stockFilter]); const loadStoreSummary = async () => { setLoading(true); try { const data = await api.getDutchieAZStoreSummary(parseInt(id!, 10)); setSummary(data); } catch (error) { console.error('Failed to load store summary:', error); } finally { setLoading(false); } }; const loadProducts = async () => { if (!id) return; setProductsLoading(true); try { const data = await api.getDutchieAZStoreProducts(parseInt(id, 10), { search: searchQuery || undefined, stockStatus: stockFilter || undefined, limit: itemsPerPage, offset: (currentPage - 1) * itemsPerPage, }); setProducts(data.products); setTotalProducts(data.total); } catch (error) { console.error('Failed to load products:', error); } finally { setProductsLoading(false); } }; const handleCrawl = async () => { setShowUpdateDropdown(false); setIsUpdating(true); try { await api.triggerDutchieAZCrawl(parseInt(id!, 10)); alert('Crawl started! Refresh the page in a few minutes to see updated data.'); } catch (error) { console.error('Failed to trigger crawl:', error); alert('Failed to start crawl. Please try again.'); } finally { setIsUpdating(false); } }; const totalPages = Math.ceil(totalProducts / itemsPerPage); if (loading) { return (

Loading store...

); } if (!summary) { return (

Store not found

); } const { dispensary, brands, categories, lastCrawl } = summary; return (
{/* Header */}
{/* Update Button */}
{showUpdateDropdown && !isUpdating && (
)}
{/* Store Header */}

{dispensary.dba_name || dispensary.name}

{dispensary.company_name && (

{dispensary.company_name}

)}

Platform ID: {dispensary.platform_dispensary_id || 'Not resolved'}

Last Crawl: {lastCrawl?.completed_at ? new Date(lastCrawl.completed_at).toLocaleDateString('en-US', { year: 'numeric', month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit' }) : 'Never'} {lastCrawl?.status && ( {lastCrawl.status} )}
{dispensary.address && (
{dispensary.address}, {dispensary.city}, {dispensary.state} {dispensary.zip}
)} {dispensary.phone && (
{dispensary.phone}
)} {dispensary.website && ( Website )}
{/* Dashboard Metrics */}
{/* Content Tabs */}
{activeTab === 'products' && (
{/* Search and Filter */}
setSearchQuery(e.target.value)} className="input input-bordered input-sm flex-1" /> {(searchQuery || stockFilter) && ( )}
{totalProducts} products
{productsLoading ? (

Loading products...

) : products.length === 0 ? (

No products found

) : ( <>
{products.map((product) => ( ))}
Image Product Name Brand Type Price THC % Stock Qty Last Updated
{product.image_url ? ( {product.name} e.currentTarget.style.display = 'none'} /> ) : '-'}
{product.name}
{product.brand || '-'}
{product.type || '-'} {product.subcategory && ( {product.subcategory} )} {product.sale_price ? (
${product.sale_price} ${product.regular_price}
) : product.regular_price ? ( `$${product.regular_price}` ) : '-'}
{product.thc_percentage ? ( {product.thc_percentage}% ) : '-'} {product.stock_status === 'in_stock' ? ( In Stock ) : product.stock_status === 'out_of_stock' ? ( Out ) : ( Unknown )} {product.total_quantity != null ? product.total_quantity : '-'} {product.updated_at ? formatDate(product.updated_at) : '-'}
{/* Pagination */} {totalPages > 1 && (
{Array.from({ length: Math.min(5, totalPages) }, (_, i) => { let page: number; if (totalPages <= 5) { page = i + 1; } else if (currentPage <= 3) { page = i + 1; } else if (currentPage >= totalPages - 2) { page = totalPages - 4 + i; } else { page = currentPage - 2 + i; } return ( ); })}
)} )}
)} {activeTab === 'brands' && (
{brands.length === 0 ? (

No brands found

) : (
{brands.map((brand: any) => ( ))}
)}
)} {activeTab === 'categories' && (
{categories.length === 0 ? (

No categories found

) : (
{categories.map((cat: any, idx: number) => (

{cat.type}

{cat.subcategory && (

{cat.subcategory}

)}

{cat.product_count} product{cat.product_count !== 1 ? 's' : ''}

))}
)}
)}
); }