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'; import axios from 'axios'; export const Content = () => { 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) { console.error('Failed to download consumer data', err); showToast('Failed to download consumer data'); } }; const handleDownloadPurchases = () => { if (!purchasesResult) return; try { downloadJson(purchasesResult, 'purchases.json'); } catch (err) { console.error('Failed to download purchase history', err); showToast('Failed to download purchase history'); } }; const handleGenerateConsumer = async () => { setLoading(true); setConsumer(null); setPurchasesError(null); setEditedConsumer(''); setPurchasesResult(null); try { const { data } = await axios.post( '/api/consumer', {}, { headers: { 'Content-Type': 'application/json' } } ); setConsumer(data.consumer); setEditedConsumer(JSON.stringify(data.consumer, null, 2)); } catch (err) { console.error('Something went wrong', err); if (axios.isAxiosError(err)) { const errorMessage = err.response?.data?.error || err.message; showToast(errorMessage); } else { showToast('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 = { consumer: jsonData }; const validationResult = purchasesRequestSchema.safeParse(requestData); if (!validationResult.success) { throw new Error(validationResult.error.issues[0].message); } const { data } = await axios.post('/api/purchase-list', requestData, { headers: { 'Content-Type': 'application/json' } }); setPurchasesResult(data); } catch (err) { console.error('Something went wrong', err); if (axios.isAxiosError(err)) { const errorMessage = err.response?.data?.error || err.message; showToast(errorMessage); } else if (err instanceof Error) { showToast(err.message); } else { showToast('Something went wrong'); } } finally { setSubmitting(false); } }; return (

Quick Start

Generate synthetic data in seconds

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