import { useState } from 'react'; import { Consumer, consumerSchema } from '@utils/consumer/types'; import { PurchaseList, purchasesRequestSchema } from '@purchases/types'; import { Button } from './Button'; import { useToast } from '../context/toast/ToastContext'; import { Toasts } from './Toast'; import { LineChart, PersonStanding, Download, Sparkles } from 'lucide-react'; export const Content = () => { const [consumerId, setConsumerId] = useState(); const [loading, setLoading] = useState(false); const [submitting, setSubmitting] = useState(false); const [consumer, setConsumer] = useState(null); const [purchasesError, setPurchasesError] = useState(null); const [editedConsumer, setEditedConsumer] = useState(''); const [purchasesResult, setPurchasesResult] = useState( null ); const { showToast, toasts } = useToast(); const downloadJson = (data: Consumer | PurchaseList, filename: string) => { const blob = new Blob([JSON.stringify(data, null, 2)], { type: 'application/json' }); const url = URL.createObjectURL(blob); const link = document.createElement('a'); link.href = url; link.download = filename; document.body.appendChild(link); link.click(); document.body.removeChild(link); URL.revokeObjectURL(url); }; const handleDownloadConsumer = () => { if (!consumer) return; try { downloadJson(consumer, 'consumer.json'); } catch (err) { showToast('Failed to download consumer data'); } }; const handleDownloadPurchases = () => { if (!purchasesResult) return; try { downloadJson(purchasesResult, 'purchases.json'); } catch (err) { showToast('Failed to download purchase history'); } }; const handleGenerateConsumer = async () => { setLoading(true); setConsumer(null); setPurchasesError(null); setEditedConsumer(''); setPurchasesResult(null); try { const response = await fetch('/api/consumer', { method: 'POST', headers: { 'Content-Type': 'application/json' } }); if (!response.ok) { const errorData = await response.json(); throw new Error(errorData.error || 'Failed to generate consumer'); } const data = await response.json(); setConsumerId(data.id); setConsumer(data.consumer); setEditedConsumer(JSON.stringify(data.consumer, null, 2)); } catch (err) { showToast(err instanceof Error ? err.message : 'Something went wrong'); } finally { setLoading(false); } }; const handleJsonEdit = (value: string) => { setEditedConsumer(value); try { const parsed = JSON.parse(value); const validConsumer = consumerSchema.safeParse(parsed); if (!validConsumer.success) { setPurchasesError('Invalid consumer format'); return; } setPurchasesError(null); } catch { setPurchasesError('Invalid JSON format'); } }; const handleGeneratePurchases = async () => { if (purchasesError) { showToast('Please fix the JSON errors before submitting'); return; } setSubmitting(true); setPurchasesResult(null); try { const jsonData = JSON.parse(editedConsumer); const requestData = { id: consumerId, consumer: jsonData }; const validationResult = purchasesRequestSchema.safeParse(requestData); if (!validationResult.success) { throw new Error(validationResult.error.issues[0].message); } const response = await fetch('/api/purchase-list', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(requestData) }); if (!response.ok) { const errorData = await response.json(); throw new Error(errorData.error || 'Failed to generate purchases'); } const data = await response.json(); setPurchasesResult(data); } catch (err) { showToast(err instanceof Error ? err.message : 'Something went wrong'); } finally { setSubmitting(false); } }; return (

Quick Start

Generate synthetic data in minutes

01

Generate Profile

Create a synthetic consumer profile

02

Review Data

Check and modify the generated profile

03

Get History

Generate purchase history data

Consumer Data