| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138 |
- "use client";
- import { useState } from "react";
- import { Button } from "@/components/ui/button";
- import {
- Dialog,
- DialogContent,
- DialogDescription,
- DialogFooter,
- DialogHeader,
- DialogTitle,
- } from "@/components/ui/dialog";
- import { Label } from "@/components/ui/label";
- import { Textarea } from "@/components/ui/textarea";
- import { Calendar, AlertCircle } from "lucide-react";
- import { notifications } from "@/lib/notifications";
- interface AppointmentModalFromChatProps {
- open: boolean;
- onClose: () => void;
- onSuccess?: () => void;
- }
- export const AppointmentModalFromChat = ({
- open,
- onClose,
- onSuccess,
- }: AppointmentModalFromChatProps) => {
- const [motivoConsulta, setMotivoConsulta] = useState("");
- const [isSubmitting, setIsSubmitting] = useState(false);
- const handleSubmit = async (e: React.FormEvent<HTMLFormElement>) => {
- e.preventDefault();
- if (!motivoConsulta.trim()) {
- notifications.validation.requiredField("motivo de consulta");
- return;
- }
- setIsSubmitting(true);
- try {
- const response = await fetch("/api/appointments", {
- method: "POST",
- headers: { "Content-Type": "application/json" },
- body: JSON.stringify({
- motivoConsulta: motivoConsulta.trim(),
- // No enviamos fechaSolicitada - el doctor la asignará
- }),
- });
- if (!response.ok) {
- const error = await response.json();
- throw new Error(error.error || "Error al crear cita");
- }
- notifications.appointments.created();
- setMotivoConsulta("");
- onClose();
- onSuccess?.();
- } catch (error) {
- const message = error instanceof Error ? error.message : undefined;
- notifications.appointments.createError(message);
- } finally {
- setIsSubmitting(false);
- }
- };
- const handleClose = () => {
- if (!isSubmitting) {
- setMotivoConsulta("");
- onClose();
- }
- };
- return (
- <Dialog open={open} onOpenChange={handleClose}>
- <DialogContent className="sm:max-w-[500px]">
- <DialogHeader>
- <div className="flex items-center gap-2">
- <Calendar className="h-5 w-5 text-primary" />
- <DialogTitle>Solicitar Cita Médica</DialogTitle>
- </div>
- <DialogDescription className="pt-2">
- Describe el motivo de tu consulta. Un médico revisará tu solicitud y
- te asignará una fecha y hora para la cita telemática.
- </DialogDescription>
- </DialogHeader>
- <form onSubmit={handleSubmit} className="space-y-4">
- <div className="space-y-2">
- <Label htmlFor="motivo-consulta">
- Motivo de la consulta <span className="text-destructive">*</span>
- </Label>
- <Textarea
- id="motivo-consulta"
- placeholder="Ejemplo: Necesito consultar sobre los síntomas que mencioné en el chat..."
- value={motivoConsulta}
- onChange={(e) => setMotivoConsulta(e.target.value)}
- rows={5}
- required
- disabled={isSubmitting}
- className="resize-none"
- />
- <p className="text-xs text-muted-foreground">
- {motivoConsulta.length}/500 caracteres
- </p>
- </div>
- <div className="flex items-start gap-2 p-3 bg-muted rounded-lg">
- <AlertCircle className="h-4 w-4 text-muted-foreground mt-0.5 flex-shrink-0" />
- <p className="text-xs text-muted-foreground">
- Tu solicitud quedará pendiente hasta que un médico la revise y asigne
- una fecha. Recibirás una notificación cuando sea aprobada.
- </p>
- </div>
- <DialogFooter>
- <Button
- type="button"
- variant="outline"
- onClick={handleClose}
- disabled={isSubmitting}
- >
- Cancelar
- </Button>
- <Button
- type="submit"
- disabled={!motivoConsulta.trim() || isSubmitting}
- >
- {isSubmitting ? "Enviando..." : "Solicitar cita"}
- </Button>
- </DialogFooter>
- </form>
- </DialogContent>
- </Dialog>
- );
- };
|