MedicalAlertBanner.tsx 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. "use client";
  2. import { AlertTriangle, Clock, Calendar, X } from "lucide-react";
  3. import { Button } from "@/components/ui/button";
  4. import { MedicalAlert as MedicalAlertType } from "./types";
  5. import { cn } from "@/lib/utils";
  6. interface MedicalAlertBannerProps {
  7. alert: MedicalAlertType;
  8. onSchedule: () => void;
  9. onDismiss?: () => void;
  10. isScheduling?: boolean;
  11. }
  12. const alertConfig = {
  13. RECOMENDADO: {
  14. icon: Clock,
  15. title: "Consulta Médica Recomendada",
  16. description: "Basado en tu consulta, recomendamos agendar una cita con un profesional médico.",
  17. className: "bg-yellow-50 border-yellow-200",
  18. iconClassName: "text-yellow-600 bg-yellow-100",
  19. buttonVariant: "default" as const,
  20. },
  21. URGENTE: {
  22. icon: AlertTriangle,
  23. title: "Atención Médica Urgente",
  24. description: "Tu consulta requiere atención médica inmediata. Por favor, agenda una cita lo antes posible.",
  25. className: "bg-red-50 border-red-200",
  26. iconClassName: "text-red-600 bg-red-100",
  27. buttonVariant: "destructive" as const,
  28. },
  29. };
  30. export const MedicalAlertBanner = ({
  31. alert,
  32. onSchedule,
  33. onDismiss,
  34. isScheduling,
  35. }: MedicalAlertBannerProps) => {
  36. // Solo mostrar para alertas médicas
  37. if (alert === "NO_AGENDAR") return null;
  38. const config = alertConfig[alert];
  39. const Icon = config.icon;
  40. const handleScheduleClick = () => {
  41. console.log("🎯 [MedicalAlertBanner] Botón 'Agendar Cita' clickeado");
  42. onSchedule();
  43. };
  44. return (
  45. <div
  46. className={cn(
  47. "sticky top-0 z-10 border-b mb-4 p-4 relative",
  48. config.className
  49. )}
  50. >
  51. {onDismiss && (
  52. <Button
  53. variant="ghost"
  54. size="sm"
  55. className="absolute top-2 right-2 h-6 w-6 p-0 hover:bg-background/50"
  56. onClick={onDismiss}
  57. >
  58. <X className="w-4 h-4" />
  59. </Button>
  60. )}
  61. <div className="flex items-center gap-4 pr-8">
  62. <div
  63. className={cn(
  64. "w-10 h-10 rounded-full flex items-center justify-center flex-shrink-0",
  65. config.iconClassName
  66. )}
  67. >
  68. <Icon className="w-5 h-5" />
  69. </div>
  70. <div className="flex-1">
  71. <h3 className="font-semibold text-foreground text-sm">
  72. {config.title}
  73. </h3>
  74. <p className="text-muted-foreground text-xs mt-1">
  75. {config.description}
  76. </p>
  77. </div>
  78. <Button
  79. onClick={handleScheduleClick}
  80. variant={config.buttonVariant}
  81. size="sm"
  82. disabled={isScheduling}
  83. className="flex-shrink-0"
  84. >
  85. {isScheduling ? (
  86. <>
  87. <div className="w-4 h-4 border-2 border-current border-t-transparent rounded-full animate-spin mr-2"></div>
  88. Procesando...
  89. </>
  90. ) : (
  91. <>
  92. <Calendar className="h-4 w-4 mr-2" />
  93. Agendar Cita Ahora ✨
  94. </>
  95. )}
  96. </Button>
  97. </div>
  98. </div>
  99. );
  100. };