import React, { useState } from 'react'; import { Card, CardContent, CardHeader, CardTitle } from '@components/ui/card'; import { Button } from '@components/ui/button'; import { Input } from '@components/ui/input'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@components/ui/select'; import { useGlobalState } from '@contexts/state/StateContext'; import { Trash2, Plus } from 'lucide-react'; import { LineChart, Line, XAxis, YAxis, CartesianGrid, Tooltip, ReferenceLine, ReferenceArea, ResponsiveContainer, } from 'recharts'; const PriceCorridor = () => { const { state, dispatch } = useGlobalState(); const [newCompetitor, setNewCompetitor] = useState<{ name: string; price: number; category: 'same-form' | 'different-form' | 'different-function'; }>({ name: '', price: 0, category: 'same-form', }); const setTargetPrice = (price: number) => { dispatch({ type: 'UPDATE_TARGET_PRICE', payload: price, }); }; const addCompetitor = () => { if (!newCompetitor.name || !newCompetitor.price) return; dispatch({ type: 'ADD_COMPETITOR', payload: { name: newCompetitor.name, price: newCompetitor.price, category: newCompetitor.category, }, }); setNewCompetitor({ name: '', price: 0, category: 'same-form' }); }; const removeCompetitor = (index: number) => { dispatch({ type: 'SET_STATE', payload: { ...state, priceCorridor: { ...state.priceCorridor, competitors: state.priceCorridor.competitors.filter( (_, i) => i !== index ), }, }, }); }; const sortedCompetitors = [...state.priceCorridor.competitors].sort( (a, b) => a.price - b.price ); const prices = sortedCompetitors.map((c) => c.price); const upperBound = Math.max(...prices, 0); const lowerBound = Math.min(...prices, 0); const range = upperBound - lowerBound; const corridorLower = lowerBound + range * 0.3; const corridorUpper = lowerBound + range * 0.8; const chartData = sortedCompetitors.map((comp) => ({ name: comp.name, price: comp.price, category: comp.category, })); const categorizedCompetitors = { 'same-form': sortedCompetitors.filter((c) => c.category === 'same-form'), 'different-form': sortedCompetitors.filter( (c) => c.category === 'different-form' ), 'different-function': sortedCompetitors.filter( (c) => c.category === 'different-function' ), }; return (
Price Corridor of the Mass
{state.priceCorridor.targetPrice > 0 && ( )} {chartData.length > 0 && ( )}
Strategic Price
{chartData.length > 0 && (

Suggested price corridor: {corridorLower.toFixed(2)} -{' '} {corridorUpper.toFixed(2)}

This range typically captures 70-80% of target buyers

)}
setTargetPrice(Number(e.target.value))} placeholder="Set target price..." className="w-48" /> Current target: {state.priceCorridor.targetPrice || 'Not set'}
Add Alternative
setNewCompetitor((prev) => ({ ...prev, name: e.target.value, })) } className="flex-1" /> setNewCompetitor((prev) => ({ ...prev, price: Number(e.target.value), })) } className="w-32" />
Price Alternatives Analysis
{Object.entries(categorizedCompetitors).map( ([category, competitors]) => (

{category.replace('-', ' ')} Alternatives

{competitors.length > 0 ? (
{competitors.map((comp, index) => (
{comp.name} {comp.price}
))}
) : (

No alternatives added

)}
) )}
); }; export default PriceCorridor;