Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 3 additions & 6 deletions src/components/layouts/MainLayout.tsx
Original file line number Diff line number Diff line change
@@ -1,15 +1,12 @@
import { Outlet, useLocation } from 'react-router-dom';
import { Outlet } from 'react-router-dom';
import { NavBar } from '../common/NavBar';
import { Footer } from '../common/Footer.tsx';

const MainLayout = () => {
const location = useLocation();
const isLandingPage = location.pathname === '/';

return (
<div className="flex flex-col min-h-screen bg-neutral-50">
<div className="flex flex-col min-h-screen">
<NavBar />
<main className={`flex-grow container mx-auto p-4 ${!isLandingPage ? 'pt-24' : ''}`}>
<main className="flex-grow">
<Outlet />
</main>
<Footer />
Expand Down
28 changes: 25 additions & 3 deletions src/components/ui/StatusBadge/StatusBadge.tsx
Original file line number Diff line number Diff line change
@@ -1,8 +1,15 @@
import Badge from '../Badge/Badge';
import { Clock, CheckCircle, XCircle } from 'lucide-react';
import { Clock, CheckCircle, XCircle, TrendingUp } from 'lucide-react';

interface StatusBadgeProps {
status: 'pending' | 'accepted' | 'rejected' | string;
status:
| 'pending'
| 'accepted'
| 'rejected'
| 'enrolled'
| 'in-progress'
| 'completed'
| string;
}
/**
* StatusBadge Component
Expand Down Expand Up @@ -31,9 +38,24 @@ const StatusBadge = ({ status }: StatusBadgeProps) => {
Rechazado
</Badge>
);
case 'enrolled':
case 'in-progress':
return (
<Badge className="bg-blue-100 text-blue-800 border-blue-200">
<TrendingUp className="w-3 h-3 mr-1" />
En Progreso
</Badge>
);
case 'completed':
return (
<Badge className="bg-green-100 text-green-800 border-green-200">
<CheckCircle className="w-3 h-3 mr-1" />
Completado
</Badge>
);
default:
return <Badge>{status}</Badge>;
}
};

export default StatusBadge;
export default StatusBadge;
23 changes: 15 additions & 8 deletions src/pages/AboutPage.tsx
Original file line number Diff line number Diff line change
@@ -1,9 +1,14 @@
import { Card, CardContent, CardHeader, CardTitle } from '../components/ui/Card/Card';
import {
Card,
CardContent,
CardHeader,
CardTitle,
} from '../components/ui/Card/Card';

export default function AboutPage() {
return (
<div className="min-h-screen bg-gradient-to-br from-slate-50 via-purple-50 to-slate-50 py-12">
<div className="container mx-auto px-4 sm:px-6 max-w-4xl">
<div className="min-h-screen bg-gradient-to-br from-slate-50 via-purple-50 to-slate-50 px-4">
<div className="container mx-auto max-w-7xl pt-24 pb-12">
<h1 className="text-4xl font-bold text-slate-800 mb-8 text-center">
Acerca de Nosotros
</h1>
Expand All @@ -14,8 +19,10 @@ export default function AboutPage() {
</CardHeader>
<CardContent>
<p className="text-slate-700">
Somos una plataforma educativa dedicada a democratizar el acceso a la educación de calidad.
Nuestro objetivo es conectar a estudiantes con profesores expertos en diversas áreas del conocimiento.
Somos una plataforma educativa dedicada a democratizar el acceso a
la educación de calidad. Nuestro objetivo es conectar a
estudiantes con profesores expertos en diversas áreas del
conocimiento.
</p>
</CardContent>
</Card>
Expand All @@ -26,9 +33,9 @@ export default function AboutPage() {
</CardHeader>
<CardContent>
<p className="text-slate-700">
Aspiramos a ser la plataforma de aprendizaje en línea líder, donde cada persona pueda
desarrollar sus habilidades y alcanzar su máximo potencial a través de cursos accesibles
y de alta calidad.
Aspiramos a ser la plataforma de aprendizaje en línea líder, donde
cada persona pueda desarrollar sus habilidades y alcanzar su
máximo potencial a través de cursos accesibles y de alta calidad.
</p>
</CardContent>
</Card>
Expand Down
117 changes: 57 additions & 60 deletions src/pages/Admin/AdminDashboard.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,7 @@ import {
CardTitle,
} from '../../components/ui/Card/Card';
import StatusBadge from '../../components/ui/StatusBadge/StatusBadge';
import {
Users,
BookOpen,
GraduationCap,
DollarSign,
} from 'lucide-react';
import { Users, BookOpen, GraduationCap, DollarSign } from 'lucide-react';
import { appealService } from '../../api/services/appeal.service';
import { useAdminAnalytics } from '../../hooks/useAdmin';
import { formatCurrency } from '../../lib/currency';
Expand Down Expand Up @@ -90,63 +85,64 @@ export default function AdminDashboard() {
}, []);

return (
<div className="space-y-6">
<div>
<h1 className="text-3xl font-bold text-slate-800 mb-2">
Dashboard de Administrador
</h1>
<p className="text-slate-600">Resumen general de la plataforma.</p>
</div>

<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-6">
{stats.map((stat) => (
<Card key={stat.title}>
<CardHeader className="flex flex-row items-center justify-between space-y-2 pb-2">
<CardTitle className="text-sm font-medium text-slate-600">
{stat.title}
</CardTitle>
<stat.icon className="w-5 h-5 text-slate-400" />
</CardHeader>
<CardContent>
<div className="text-2xl font-bold text-slate-800">
{stat.value}
</div>
<p
className={`text-xs mt-1 ${
stat.isPositive ? 'text-green-600' : 'text-red-600'
}`}
>
{stat.change} desde el mes pasado
</p>
</CardContent>
</Card>
))}
</div>
<div className="min-h-screen bg-gradient-to-br from-slate-50 via-blue-50/30 to-slate-50/100 px-4">
<div className="container mx-auto max-w-7xl space-y-6 pt-24 pb-8">
<div>
<h1 className="text-3xl font-bold text-slate-800 mb-2">
Dashboard de Administrador
</h1>
<p className="text-slate-600">Resumen general de la plataforma.</p>
</div>

{isLoadingAnalytics ? (
<div className="text-center p-8">
<p className="text-slate-600">Cargando estadísticas...</p>
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-6">
{stats.map((stat) => (
<Card key={stat.title}>
<CardHeader className="flex flex-row items-center justify-between space-y-2 pb-2">
<CardTitle className="text-sm font-medium text-slate-600">
{stat.title}
</CardTitle>
<stat.icon className="w-5 h-5 text-slate-400" />
</CardHeader>
<CardContent>
<div className="text-2xl font-bold text-slate-800">
{stat.value}
</div>
<p
className={`text-xs mt-1 ${
stat.isPositive ? 'text-green-600' : 'text-red-600'
}`}
>
{stat.change} desde el mes pasado
</p>
</CardContent>
</Card>
))}
</div>
) : null}

<Card>
<CardHeader>
<CardTitle className="flex items-center">
<GraduationCap className="w-5 h-5 mr-2" />
Solicitudes Recientes
</CardTitle>
<CardDescription>
Últimas solicitudes recibidas.{' '}
<Link
to="/admin/teacher-requests"
className="text-blue-600 hover:underline"
>
Ver todas
</Link>
.
</CardDescription>
</CardHeader>
<CardContent>
{isLoadingAnalytics ? (
<div className="text-center p-8">
<p className="text-slate-600">Cargando estadísticas...</p>
</div>
) : null}

<Card>
<CardHeader>
<CardTitle className="flex items-center">
<GraduationCap className="w-5 h-5 mr-2" />
Solicitudes Recientes
</CardTitle>
<CardDescription>
Últimas solicitudes recibidas.{' '}
<Link
to="/admin/teacher-requests"
className="text-blue-600 hover:underline"
>
Ver todas
</Link>
.
</CardDescription>
</CardHeader>
<CardContent>
<div className="space-y-4">
{isLoading ? (
<p>Cargando...</p>
Expand Down Expand Up @@ -185,6 +181,7 @@ export default function AdminDashboard() {
</div>
</CardContent>
</Card>
</div>
</div>
);
}
Loading