Spaces:
Configuration error
Configuration error
lakshmisravya123
Major upgrade: comprehensive startup validation with market sizing, SWOT, competitor analysis, revenue models, go-to-market strategy
6fcad97 | import React, { useState } from 'react'; | |
| import Results from './components/Results'; | |
| import { validateStartup } from './utils/api'; | |
| const loadingMessages = [ | |
| "Analyzing your idea...", | |
| "Estimating TAM/SAM/SOM...", | |
| "Researching competitors...", | |
| "Running SWOT analysis...", | |
| "Modeling revenue projections...", | |
| "Evaluating go-to-market strategy...", | |
| "Assessing funding readiness...", | |
| "Building risk matrix...", | |
| "Crafting 90-day plan...", | |
| "Generating pitch deck outline...", | |
| "Finalizing your report...", | |
| ]; | |
| export default function App() { | |
| const [idea, setIdea] = useState(''); | |
| const [audience, setAudience] = useState(''); | |
| const [monetization, setMonetization] = useState(''); | |
| const [loading, setLoading] = useState(false); | |
| const [loadingMsg, setLoadingMsg] = useState(0); | |
| const [results, setResults] = useState(null); | |
| const [error, setError] = useState(''); | |
| const handleValidate = async () => { | |
| setLoading(true); | |
| setError(''); | |
| setLoadingMsg(0); | |
| const interval = setInterval(() => { | |
| setLoadingMsg(i => (i + 1) % loadingMessages.length); | |
| }, 2200); | |
| try { | |
| const data = await validateStartup(idea, audience, monetization); | |
| setResults(data); | |
| } catch (err) { | |
| setError(err.message); | |
| } | |
| clearInterval(interval); | |
| setLoading(false); | |
| }; | |
| const handleReset = () => { | |
| setResults(null); | |
| setError(''); | |
| }; | |
| if (results) { | |
| return ( | |
| <div className="app"> | |
| <header className="header"> | |
| <h1>Startup Idea Validator</h1> | |
| <p>AI-powered comprehensive startup viability analysis</p> | |
| </header> | |
| <Results data={results} onReset={handleReset} /> | |
| </div> | |
| ); | |
| } | |
| return ( | |
| <div className="app"> | |
| <header className="header"> | |
| <h1>Startup Idea Validator</h1> | |
| <p>Get a VC-grade analysis: market sizing, SWOT, competitor analysis, revenue models, go-to-market strategy, and more.</p> | |
| </header> | |
| {error && ( | |
| <div style={{ background: 'rgba(239,68,68,0.1)', padding: '1rem', borderRadius: '10px', marginBottom: '1rem', textAlign: 'center', color: 'var(--danger)', border: '1px solid rgba(239,68,68,0.2)' }}> | |
| {error} | |
| </div> | |
| )} | |
| <div className="form-card"> | |
| <div className="form-group"> | |
| <label>Your Startup Idea *</label> | |
| <textarea | |
| placeholder={"Describe your startup idea in detail. What problem does it solve? How does it work?\n\nExample: An AI-powered app that analyzes your food photos and tells you the exact calories, macros, and nutritional info. Users can track their daily intake just by snapping photos of meals."} | |
| value={idea} | |
| onChange={(e) => setIdea(e.target.value)} | |
| /> | |
| </div> | |
| <div className="form-group"> | |
| <label>Target Audience (optional)</label> | |
| <input | |
| type="text" | |
| placeholder="e.g., Health-conscious millennials, small business owners, college students..." | |
| value={audience} | |
| onChange={(e) => setAudience(e.target.value)} | |
| /> | |
| </div> | |
| <div className="form-group"> | |
| <label>Monetization Model (optional)</label> | |
| <select value={monetization} onChange={(e) => setMonetization(e.target.value)}> | |
| <option value="">Let AI suggest</option> | |
| <option value="subscription">Subscription (SaaS)</option> | |
| <option value="freemium">Freemium</option> | |
| <option value="marketplace">Marketplace / Commission</option> | |
| <option value="ads">Advertising</option> | |
| <option value="one-time">One-time Purchase</option> | |
| <option value="usage-based">Usage-based / Pay-per-use</option> | |
| </select> | |
| </div> | |
| {loading ? ( | |
| <div className="loading"> | |
| <div className="spinner" /> | |
| <p style={{ color: 'var(--text-dim)', fontSize: '0.95rem' }}>{loadingMessages[loadingMsg]}</p> | |
| <p style={{ color: 'var(--border-light)', fontSize: '0.8rem', marginTop: '0.5rem' }}>Generating comprehensive analysis (may take 15-30 seconds)...</p> | |
| </div> | |
| ) : ( | |
| <button className="btn" disabled={idea.trim().length < 20} onClick={handleValidate}> | |
| Validate My Idea | |
| </button> | |
| )} | |
| </div> | |
| </div> | |
| ); | |
| } | |