"use client"; import { useState } from "react"; import { Download } from "lucide-react"; type Course = { id: string; title: string }; const inputStyle: React.CSSProperties = { border: "2px solid var(--border)", background: "var(--background)", outline: "none", width: "100%", padding: "0.5rem 0.75rem", fontSize: "0.875rem", fontFamily: "inherit", }; const focusHandlers = { onFocus: (e: React.FocusEvent) => (e.currentTarget.style.borderColor = "var(--foreground)"), onBlur: (e: React.FocusEvent) => (e.currentTarget.style.borderColor = "var(--border)"), }; export function CsvExporter({ courses }: { courses: Course[] }) { const [courseId, setCourseId] = useState(""); const [encoding, setEncoding] = useState<"utf8" | "win1251">("utf8"); const [loading, setLoading] = useState(false); async function handleExport() { setLoading(true); try { const params = new URLSearchParams({ encoding }); if (courseId) params.set("courseId", courseId); const res = await fetch(`/api/admin/export-users?${params}`); if (!res.ok) throw new Error("Ошибка сервера"); const blob = await res.blob(); const url = URL.createObjectURL(blob); const a = document.createElement("a"); a.href = url; const cd = res.headers.get("content-disposition") ?? ""; const match = cd.match(/filename="([^"]+)"/); a.download = match?.[1] ?? "students.csv"; a.click(); URL.revokeObjectURL(url); } finally { setLoading(false); } } return (

Поля в файле

Email · Имя · Телефон · Дата регистрации · Курсы · Прогресс (уроков)

); }