import { useEffect, useState } from 'react'; import { storeClient } from '../../api/clients'; import { STORE, APP_ID } from '../../api/config'; import { Card } from '../reusable/Card'; import { Spinner } from '../reusable/Spinner'; import { EmptyState } from '../reusable/EmptyState'; import { formatValue } from '../../lib/format'; import { Store, User, Truck, MapPin, TrendingUp, Camera, ClipboardList } from 'lucide-react'; import { GridTable } from './GridTable'; import type { WiredDetailViewProps } from './OrderDetail'; export function StoreDetail({ instanceId }: WiredDetailViewProps) { const [data, setData] = useState | null>(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); useEffect(() => { let live = true; async function run() { setLoading(true); setError(null); try { const r = await storeClient.detailView(STORE.detailViews.STORE, instanceId); if (live) setData(r.data || {}); } catch (e) { if (live) setError((e as { message?: string })?.message ?? 'Failed to load'); } finally { if (live) setLoading(false); } } run(); return () => { live = false; }; }, [instanceId]); if (error) { return ( ); } if (loading) { return (
); } if (!data || Object.keys(data).length === 0) { return ( ); } const remainingData = { ...data }; const extract = (key: string, obj: any = data) => { if (obj && key in obj) { const val = obj[key]; delete obj[key]; return val; } return '-'; }; // State const stateName = extract('current_state_name', remainingData); delete remainingData.current_state_id; const isSuccess = ['created', 'active', 'approve'].some(s => stateName.toString().toLowerCase().includes(s)); const colorClass = isSuccess ? 'text-emerald-500' : 'text-blue-500'; // Store Overview const storeCode = extract('store_code', remainingData); const businessName = extract('business_name', remainingData); const area = extract('area', remainingData); const completeAddress = extract('complete_address', remainingData); const pinCode = extract('pin_code', remainingData); const notes = extract('notes', remainingData); // Owner Info const ownerName = extract('owner_name', remainingData); const email = extract('email', remainingData); let phoneNumber = extract('phone_number', remainingData); if (typeof phoneNumber === 'object' && phoneNumber !== null) { phoneNumber = (phoneNumber as any).phone_with_dial_code || (phoneNumber as any).phone || '-'; } // Distributor Info const distributorName = extract('distributor_name', remainingData); const distributorOwnerName = extract('distributor_owner_name', remainingData); const distributorEmail = extract('distributor_email', remainingData); let distributorPhone = extract('distributor_phone_number', remainingData); if (typeof distributorPhone === 'object' && distributorPhone !== null) { distributorPhone = (distributorPhone as any).phone_with_dial_code || (distributorPhone as any).phone || '-'; } // Route Info const routeCode = extract('route_code', remainingData); const routeName = extract('route_name', remainingData); const subRoute = extract('sub_route', remainingData); // Location const storeLocation = extract('store_location', remainingData); let lat = null; let lng = null; if (storeLocation) { let locObj = storeLocation; if (typeof locObj === 'string') { try { locObj = JSON.parse(locObj); } catch (e) {} } if (locObj && typeof locObj === 'object') { lat = (locObj as any).latitude; lng = (locObj as any).longitude; } } // Potential const potential = extract('potential', remainingData); // Image const storeImage = extract('store_image', remainingData); // Meta const createdAtKey = Object.keys(remainingData).find(k => k.endsWith('__created_at')); const createdAt = createdAtKey ? extract(createdAtKey, remainingData) : '-'; const userIdKey = Object.keys(remainingData).find(k => k.endsWith('__user_id')); const userObj = userIdKey ? extract(userIdKey, remainingData) : null; const userName = userObj && typeof userObj === 'object' ? (userObj as any).name || (userObj as any).email : '-'; // Helper Row const Row = ({ label, value }: { label: string, value: any }) => { let finalValue = value; if (finalValue && typeof finalValue === 'object') { try { finalValue = JSON.stringify(finalValue); } catch (e) { finalValue = '-'; } } return (
{label}: {formatValue(finalValue)}
); }; return (
{/* 1. Status Card */}
Status
{stateName}
{/* 2. Store Overview Card */}

Store Overview

{/* 3. Owner Information Card */}

Owner Information

{/* 4. Distributor Details Card */}

Distributor Details

{/* 5. Route Details Card */}

Route Details

{/* 6. Potential Card */} {Array.isArray(potential) && potential.length > 0 && (

Potential

)} {/* 7. Store Image Card */} {Array.isArray(storeImage) && storeImage.length > 0 && (

Store Image

{storeImage.map((file: any, idx: number) => { const previewUrl = `${storeClient.baseUrl}/app/${APP_ID}/view/files/${file.uuid}/preview`; return (
{file.original_name { (e.target as HTMLImageElement).style.display = 'none'; (e.target as HTMLImageElement).parentElement!.innerHTML = `${file.original_name || 'File'}`; }} />
); })}
)} {/* 7.5 Store Location Map */} {lat && lng && (

Store Location

)} {/* 8. Log Visit Details Fallback & Meta */} {(Object.keys(remainingData).filter(k => !k.includes('uuid') && !/^\d+$/.test(k)).length > 0 || userName !== '-') && (

Other Details

{Object.entries(remainingData).map(([key, value]) => { const lowerKey = key.toLowerCase(); if (lowerKey.includes('uuid') || /^\d+$/.test(key) || lowerKey === 'instance_id') return null; const label = key.replace(/_/g, ' ') .replace(/\b\w/g, l => l.toUpperCase()) .replace(/[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}/i, '') .replace(/^\s+|\s+$/g, ''); if (!label) return null; return ; })}
)}
); }