diff --git a/src/app/try-free/page.tsx b/src/app/try-free/page.tsx new file mode 100644 index 0000000..7d9705e --- /dev/null +++ b/src/app/try-free/page.tsx @@ -0,0 +1,222 @@ +"use client" + +import { ThemeProvider } from "@/providers/themeProvider/ThemeProvider"; +import NavbarStyleFullscreen from '@/components/navbar/NavbarStyleFullscreen/NavbarStyleFullscreen'; +import HeroBillboard from '@/components/sections/hero/HeroBillboard'; +import FooterBaseCard from '@/components/sections/footer/FooterBaseCard'; +import { Mail, Sparkles, ArrowRight } from 'lucide-react'; +import { useState, useRef, useEffect } from 'react'; + +interface Message { + role: 'user' | 'assistant'; + content: string; +} + +export default function TryFreePage() { + const [credits, setCredits] = useState(5); + const [messages, setMessages] = useState([]); + const [input, setInput] = useState(''); + const [loading, setLoading] = useState(false); + const [error, setError] = useState(''); + const messagesEndRef = useRef(null); + + useEffect(() => { + messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' }); + }, [messages]); + + const handleSubmit = async (e: React.FormEvent) => { + e.preventDefault(); + + if (!input.trim()) return; + if (credits <= 0) { + setError('No credits remaining. Upgrade to continue.'); + return; + } + + const userMessage = input.trim(); + setInput(''); + setError(''); + setLoading(true); + + setMessages(prev => [...prev, { role: 'user', content: userMessage }]); + + try { + const response = await fetch('/api/claude', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ message: userMessage }) + }); + + if (!response.ok) { + throw new Error('Failed to generate email'); + } + + const data = await response.json(); + setMessages(prev => [...prev, { role: 'assistant', content: data.email }]); + setCredits(prev => Math.max(0, prev - 1)); + } catch (err) { + setError('Error generating email. Please try again.'); + setMessages(prev => prev.slice(0, -1)); + } finally { + setLoading(false); + } + }; + + return ( + + + +
+ +
+ +
+
+
+
+
+

Cold Email Writer

+
+ {credits} Credits Left +
+
+

Describe the recipient or company, and we'll generate a professional cold email.

+
+ +
+
+ {messages.length === 0 ? ( +
+

Your generated emails will appear here

+
+ ) : ( + messages.map((msg, idx) => ( +
+
+

{msg.content}

+
+
+ )) + )} + {loading && ( +
+
+

Generating email...

+
+
+ )} +
+
+ + {error && ( +
+ {error} +
+ )} + +
+ setInput(e.target.value)} + placeholder="e.g., 'SaaS startup, B2B sales, target CFOs'" + disabled={credits === 0 || loading} + className="flex-1 px-4 py-2 bg-background border border-accent/20 rounded-lg text-foreground placeholder-foreground/50 focus:outline-none focus:border-primary-cta disabled:opacity-50" + /> + +
+ + +
+

Out of credits?

+ +
+
+
+
+ + + + ); +} \ No newline at end of file