"use client"; import Link from "next/link"; import { FormEvent, useEffect, useState } from "react"; import { api, SettingsStatus, Subject } from "@/lib/api"; import { Shell } from "@/components/Shell"; import { Button, Card, Input, Label } from "@/components/ui"; export default function DashboardPage() { const [subjects, setSubjects] = useState([]); const [settings, setSettings] = useState(null); const [name, setName] = useState(""); const [editingSubject, setEditingSubject] = useState(null); const [editName, setEditName] = useState(""); const [loading, setLoading] = useState(true); const [error, setError] = useState(""); async function load() { setError(""); try { const [subjectList, status] = await Promise.all([api.subjects(), api.settings()]); setSubjects(subjectList); setSettings(status); } catch (err) { setError(err instanceof Error ? err.message : "No se pudo conectar con la API"); } finally { setLoading(false); } } useEffect(() => { load(); }, []); async function createSubject(event: FormEvent) { event.preventDefault(); if (!name.trim()) return; try { setError(""); await api.createSubject(name.trim()); setName(""); await load(); } catch (err) { setError(err instanceof Error ? err.message : "No se pudo crear la materia"); } } function startEdit(subject: Subject) { setEditingSubject(subject); setEditName(subject.name); setError(""); } async function saveEdit(event: FormEvent) { event.preventDefault(); if (!editingSubject || !editName.trim()) return; try { setError(""); await api.updateSubject(editingSubject.id, editName.trim()); setEditingSubject(null); setEditName(""); await load(); } catch (err) { setError(err instanceof Error ? err.message : "No se pudo editar la materia"); } } async function deleteSubject(subject: Subject) { const confirmed = window.confirm(`Eliminar la materia "${subject.name}" tambien borrara todas sus semanas, archivos subidos, Markdown procesado y exports. Esta accion no se puede deshacer.`); if (!confirmed) return; try { setError(""); await api.deleteSubject(subject.id); if (editingSubject?.id === subject.id) setEditingSubject(null); await load(); } catch (err) { setError(err instanceof Error ? err.message : "No se pudo eliminar la materia"); } } return (

Plataforma personal

Materias

Organiza clases, PDFs, audios y videos por materia y semana. Todo termina en Markdown listo para ingesta en LLM.

{error && {error}} {loading ? Cargando... : (
{subjects.map((subject) => (
{subject.name}
{subject.slug}
Abrir materia
))} {subjects.length === 0 && No hay materias todavia. Crea la primera para empezar.}
)}
); }