import React, { useState, useCallback } from 'react'; import { LineChart, Line, XAxis, YAxis, CartesianGrid, Tooltip, Legend, ResponsiveContainer, TooltipProps, } from 'recharts'; import { Card, CardContent, CardHeader, CardTitle } from '@components/ui/card'; import { Button } from '@components/ui/button'; import { Input } from '@components/ui/input'; import { Textarea } from '@components/ui/textarea'; import { useGlobalState } from '@contexts/state/StateContext'; import { Trash2, Plus, MoveUp, MoveDown } from 'lucide-react'; import { NameType, ValueType, } from 'recharts/types/component/DefaultTooltipContent'; interface Factor { id: string; name: string; marketScore: number; ideaScore: number; } interface NewFactor { name: string; marketScore: number; ideaScore: number; } interface ChartDataPoint { name: string; Market: number; 'Your Idea': number; tooltip: string; } interface CustomTooltipProps extends TooltipProps { active?: boolean; payload?: Array<{ name: string; value: number; color: string; }>; label?: string; } const StrategyCanvas: React.FC = () => { const { state, dispatch } = useGlobalState(); const [newFactor, setNewFactor] = useState({ name: '', marketScore: 5, ideaScore: 5, }); const [error, setError] = useState(''); const validateFactor = (factor: NewFactor): boolean => { if (!factor.name.trim()) { setError('Factor name is required'); return false; } if (factor.marketScore < 0 || factor.marketScore > 10) { setError('Market score must be between 0 and 10'); return false; } if (factor.ideaScore < 0 || factor.ideaScore > 10) { setError('Idea score must be between 0 and 10'); return false; } setError(''); return true; }; const addFactor = useCallback((): void => { if (!validateFactor(newFactor)) return; dispatch({ type: 'ADD_FACTOR', payload: { id: `factor-${Date.now()}`, ...newFactor, }, }); setNewFactor({ name: '', marketScore: 5, ideaScore: 5 }); }, [newFactor, dispatch]); const moveFactor = useCallback( (id: string, direction: 'up' | 'down'): void => { const factors = [...state.strategyCanvas.factors]; const index = factors.findIndex((f) => f.id === id); if ( (direction === 'up' && index === 0) || (direction === 'down' && index === factors.length - 1) ) return; const newIndex = direction === 'up' ? index - 1 : index + 1; [factors[index], factors[newIndex]] = [factors[newIndex], factors[index]]; dispatch({ type: 'SET_STATE', payload: { ...state, strategyCanvas: { ...state.strategyCanvas, factors, }, }, }); }, [state, dispatch] ); const updateFactorField = useCallback( (id: string, field: keyof Factor, value: string | number): void => { dispatch({ type: 'SET_STATE', payload: { ...state, strategyCanvas: { ...state.strategyCanvas, factors: state.strategyCanvas.factors.map((f) => f.id === id ? { ...f, [field]: field === 'name' ? value : Number(value), } : f ), }, }, }); }, [state, dispatch] ); const updateNotes = useCallback( (id: string, notes: string): void => { dispatch({ type: 'SET_STATE', payload: { ...state, strategyCanvas: { ...state.strategyCanvas, notes: { ...state.strategyCanvas.notes, [id]: notes, }, }, }, }); }, [state, dispatch] ); const deleteFactor = useCallback( (id: string): void => { dispatch({ type: 'SET_STATE', payload: { ...state, strategyCanvas: { ...state.strategyCanvas, factors: state.strategyCanvas.factors.filter((f) => f.id !== id), }, }, }); }, [state, dispatch] ); const chartData: ChartDataPoint[] = state.strategyCanvas.factors.map((f) => ({ name: f.name, Market: f.marketScore, 'Your Idea': f.ideaScore, tooltip: `${f.name}\nMarket: ${f.marketScore}\nYour Idea: ${f.ideaScore}`, })); const CustomTooltip: React.FC = ({ active, payload, label, }) => { if (!active || !payload?.length) return null; return (

{label}

{payload.map((entry, index) => (

{entry.name}: {entry.value}

))}
); }; return (
Strategy Canvas
} />
Factors
) => setNewFactor({ ...newFactor, name: e.target.value }) } className="flex-1" /> ) => setNewFactor({ ...newFactor, marketScore: Number(e.target.value), }) } min={0} max={10} className="w-32" /> ) => setNewFactor({ ...newFactor, ideaScore: Number(e.target.value), }) } min={0} max={10} className="w-32" />
{error &&

{error}

}
{state.strategyCanvas.factors.map((factor, index) => (
) => updateFactorField(factor.id, 'name', e.target.value) } className="flex-1" /> ) => updateFactorField( factor.id, 'marketScore', e.target.value ) } min={0} max={10} className="w-32" /> ) => updateFactorField(factor.id, 'ideaScore', e.target.value) } min={0} max={10} className="w-32" />