From ae39fefa7d2b9600b8665aec693fc131a3f3d9c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cau=C3=AA=20Faleiros?= Date: Fri, 4 Sep 2026 17:18:08 -0300 Subject: [PATCH] feat: manage categories with trails --- pages/SuperAdmin.tsx | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/pages/SuperAdmin.tsx b/pages/SuperAdmin.tsx index acc5014..281678e 100644 --- a/pages/SuperAdmin.tsx +++ b/pages/SuperAdmin.tsx @@ -49,8 +49,8 @@ export const SuperAdmin: React.FC = () => {
} label="Usuários" value={analytics?.totalUsers ?? users.length} />} label="Contas ativas" value={analytics?.activeUsers ?? activeUsers} />} label="Instrutores" value={instructorUsers} />} label="Cursos publicados" value={analytics?.publishedCourses ?? 0} />} label="Aulas concluídas" value={analytics?.completedLessons ?? 0} />
setActiveTab('courses')} label="Cursos" /> setActiveTab('trails')} label="Trilhas" /> setActiveTab('home')} label="Página inicial" /> setActiveTab('access')} label="Acessos" />
{activeTab === 'courses' && navigate('/gerenciar')} />} - {activeTab === 'trails' && } - {activeTab === 'home' && <>} + {activeTab === 'trails' && <>} + {activeTab === 'home' && <>} {activeTab === 'access' && } {isPathEditorOpen && } ; @@ -66,6 +66,10 @@ const TabButton: React.FC<{ active: boolean; onClick: () => void; label: string const StatCard: React.FC<{ icon: React.ReactNode; label: string; value: number }> = ({ icon, label, value }) =>
{icon}{label}
{value}
; const DetailMetric: React.FC<{ label: string; value: string }> = ({ label, value }) =>
{label}
{value}
; +const CategoryManager: React.FC<{ categories: Array<{ id: string; name: string; position: number; isActive: boolean }>; newCategory: string; setNewCategory: (value: string) => void; onCreate: (event: React.FormEvent) => void; onToggle: (category: { id: string; name: string; position: number; isActive: boolean }) => void }> = ({ categories, newCategory, setNewCategory, onCreate, onToggle }) =>

Categorias das trilhas

Organize os temas disponíveis para cursos e trilhas.

setNewCategory(event.target.value)} placeholder="Nome da categoria" className="min-w-0 flex-1 rounded-xl border border-white/10 bg-zinc-900 px-3 py-2.5 text-sm text-white" />
{categories.map((category) => )}
; + +const HomepageConfigurationPanel: React.FC<{ homeConfiguration: HomeConfiguration | null; homeCourses: CourseOption[]; setHomeConfiguration: React.Dispatch>; onMoveHomeCourse: (courseId: string, direction: -1 | 1) => void; onSaveHome: () => void }> = ({ homeConfiguration, homeCourses, setHomeConfiguration, onMoveHomeCourse, onSaveHome }) =>

Vitrine de cursos

Defina a ordem dos cursos abaixo dos banners.

{homeConfiguration &&
{homeCourses.map((course, index) =>
{index + 1}{course.title}
)}
}
; + const BannerManager: React.FC<{ courses: CourseOption[] }> = ({ courses }) => { const { showToast } = useToast(); const [banners, setBanners] = useState([]); const [loading, setLoading] = useState(true); const [saving, setSaving] = useState(false); const fileInput = useRef(null); useEffect(() => { adminApi.homeBanners().then((response) => setBanners(response.data)).catch(() => showToast('Não foi possível carregar os banners.', 'error')).finally(() => setLoading(false)); }, []);