AppointmentsList.tsx 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. "use client";
  2. import { AppointmentCard } from "./AppointmentCard";
  3. import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs";
  4. import type { Appointment } from "@/types/appointments";
  5. interface AppointmentsListProps {
  6. appointments: Appointment[];
  7. userRole: "PATIENT" | "DOCTOR" | "ADMIN";
  8. onApprove?: (id: string) => void;
  9. onReject?: (id: string) => void;
  10. onCancel?: (id: string) => void;
  11. }
  12. export const AppointmentsList = ({
  13. appointments,
  14. userRole,
  15. onApprove,
  16. onReject,
  17. onCancel,
  18. }: AppointmentsListProps) => {
  19. const pendientes = appointments.filter((a) => a.estado === "PENDIENTE");
  20. const aprobadas = appointments.filter((a) => a.estado === "APROBADA");
  21. const completadas = appointments.filter((a) => a.estado === "COMPLETADA");
  22. const otras = appointments.filter(
  23. (a) => a.estado === "RECHAZADA" || a.estado === "CANCELADA"
  24. );
  25. return (
  26. <Tabs defaultValue="pendientes" className="w-full">
  27. <TabsList className="grid w-full grid-cols-4">
  28. <TabsTrigger value="pendientes">
  29. Pendientes {pendientes.length > 0 && `(${pendientes.length})`}
  30. </TabsTrigger>
  31. <TabsTrigger value="aprobadas">
  32. Aprobadas {aprobadas.length > 0 && `(${aprobadas.length})`}
  33. </TabsTrigger>
  34. <TabsTrigger value="completadas">
  35. Completadas {completadas.length > 0 && `(${completadas.length})`}
  36. </TabsTrigger>
  37. <TabsTrigger value="otras">Otras</TabsTrigger>
  38. </TabsList>
  39. <TabsContent value="pendientes" className="space-y-4 mt-4">
  40. {pendientes.length === 0 ? (
  41. <p className="text-center text-muted-foreground py-8">
  42. No hay citas pendientes
  43. </p>
  44. ) : (
  45. pendientes.map((appointment) => (
  46. <AppointmentCard
  47. key={appointment.id}
  48. appointment={appointment}
  49. userRole={userRole}
  50. onApprove={onApprove}
  51. onReject={onReject}
  52. onCancel={onCancel}
  53. />
  54. ))
  55. )}
  56. </TabsContent>
  57. <TabsContent value="aprobadas" className="space-y-4 mt-4">
  58. {aprobadas.length === 0 ? (
  59. <p className="text-center text-muted-foreground py-8">
  60. No hay citas aprobadas
  61. </p>
  62. ) : (
  63. aprobadas.map((appointment) => (
  64. <AppointmentCard
  65. key={appointment.id}
  66. appointment={appointment}
  67. userRole={userRole}
  68. onApprove={onApprove}
  69. onReject={onReject}
  70. onCancel={onCancel}
  71. />
  72. ))
  73. )}
  74. </TabsContent>
  75. <TabsContent value="completadas" className="space-y-4 mt-4">
  76. {completadas.length === 0 ? (
  77. <p className="text-center text-muted-foreground py-8">
  78. No hay citas completadas
  79. </p>
  80. ) : (
  81. completadas.map((appointment) => (
  82. <AppointmentCard
  83. key={appointment.id}
  84. appointment={appointment}
  85. userRole={userRole}
  86. />
  87. ))
  88. )}
  89. </TabsContent>
  90. <TabsContent value="otras" className="space-y-4 mt-4">
  91. {otras.length === 0 ? (
  92. <p className="text-center text-muted-foreground py-8">
  93. No hay citas rechazadas o canceladas
  94. </p>
  95. ) : (
  96. otras.map((appointment) => (
  97. <AppointmentCard
  98. key={appointment.id}
  99. appointment={appointment}
  100. userRole={userRole}
  101. />
  102. ))
  103. )}
  104. </TabsContent>
  105. </Tabs>
  106. );
  107. };