Files
hermes-os/app/history/new/page.tsx
T
Hermes a5f63e8aba New session creation page, + button on History
- /history/new: compose first message, creates web session, sends, redirects
- POST /api/sessions proxy route
- History page gets + button in header
2026-04-09 21:18:50 -05:00

77 lines
2.3 KiB
TypeScript

"use client";
import { useState } from "react";
import { useRouter } from "next/navigation";
import { ArrowLeft, Send, Loader2 } from "lucide-react";
import Link from "next/link";
export default function NewSessionPage() {
const router = useRouter();
const [message, setMessage] = useState("");
const [sending, setSending] = useState(false);
const create = async () => {
if (!message.trim() || sending) return;
setSending(true);
try {
// Create session
const res = await fetch("/api/sessions", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ source: "web" }),
});
const data = await res.json();
const sessionId = data.session?.id;
if (!sessionId) throw new Error("No session ID");
// Send first message
await fetch("/api/sessions/" + sessionId + "/chat", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ message: message.trim() }),
});
router.push("/history/" + sessionId);
} catch {
setSending(false);
}
};
return (
<div className="space-y-4">
<div className="flex items-center gap-3">
<Link href="/history" className="p-1 -ml-1 rounded-lg active:bg-white/[0.04]">
<ArrowLeft size={20} style={{ color: "var(--text-2)" }} />
</Link>
<h1 className="text-[15px] font-medium" style={{ color: "var(--text-1)" }}>New Session</h1>
</div>
<textarea
value={message}
onChange={(e) => setMessage(e.target.value)}
placeholder="What do you need?"
className="w-full min-h-[120px] p-4 rounded-2xl text-[14px] resize-none outline-none transition-colors"
style={{
background: "var(--bg-raised)",
border: "1px solid var(--border)",
color: "var(--text-1)",
}}
autoFocus
disabled={sending}
/>
<button
onClick={create}
disabled={!message.trim() || sending}
className="btn-accent w-full flex items-center justify-center gap-2"
>
{sending ? (
<><Loader2 size={16} className="animate-spin" /> Creating session...</>
) : (
<><Send size={16} /> Send</>
)}
</button>
</div>
);
}