SendSmsDialog.tsx 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. "use client";
  2. import { useState } from "react";
  3. import { Button } from "@/components/ui/button";
  4. import { Textarea } from "@/components/ui/textarea";
  5. import { Label } from "@/components/ui/label";
  6. import {
  7. Dialog,
  8. DialogContent,
  9. DialogHeader,
  10. DialogTitle,
  11. } from "@/components/ui/dialog";
  12. import { Loader2, MessageSquare, Send } from "lucide-react";
  13. import { useGlassModal } from "@/components/glass-modal";
  14. import { sendSmsToCustomer } from "../Actions/smsActions";
  15. interface SendSmsDialogProps {
  16. open: boolean;
  17. onOpenChange: (open: boolean) => void;
  18. customerId: string;
  19. customerName: string;
  20. customerPhone: string;
  21. entityLabel?: string;
  22. defaultMessage?: string;
  23. relatedEntityType?: string;
  24. relatedEntityId?: string;
  25. }
  26. export function SendSmsDialog({
  27. open,
  28. onOpenChange,
  29. customerId,
  30. customerName,
  31. customerPhone,
  32. entityLabel = "SMS",
  33. defaultMessage = "",
  34. relatedEntityType,
  35. relatedEntityId,
  36. }: SendSmsDialogProps) {
  37. const modal = useGlassModal();
  38. const [sending, setSending] = useState(false);
  39. const [message, setMessage] = useState(defaultMessage);
  40. const handleSend = async (e: React.FormEvent) => {
  41. e.preventDefault();
  42. if (!message.trim()) return;
  43. setSending(true);
  44. const result = await sendSmsToCustomer({
  45. customerId,
  46. body: message.trim(),
  47. relatedEntityType,
  48. relatedEntityId,
  49. });
  50. if (result.success) {
  51. modal.open(
  52. "success",
  53. "SMS Sent",
  54. `${entityLabel} has been sent to ${customerName} (${customerPhone})`,
  55. );
  56. onOpenChange(false);
  57. setMessage("");
  58. } else {
  59. modal.open("error", "Error", result.error || "Failed to send SMS");
  60. }
  61. setSending(false);
  62. };
  63. return (
  64. <Dialog open={open} onOpenChange={onOpenChange}>
  65. <DialogContent className="max-w-md">
  66. <DialogHeader>
  67. <DialogTitle className="flex items-center gap-2">
  68. <MessageSquare className="h-5 w-5" />
  69. Send {entityLabel}
  70. </DialogTitle>
  71. </DialogHeader>
  72. <form onSubmit={handleSend} className="space-y-4">
  73. <div className="flex items-center gap-2 rounded-lg border bg-muted/50 px-3 py-2">
  74. <span className="text-sm font-medium">{customerName}</span>
  75. <span className="text-sm text-muted-foreground">{customerPhone}</span>
  76. </div>
  77. <div className="space-y-2">
  78. <Label htmlFor="sms-message">Message</Label>
  79. <Textarea
  80. id="sms-message"
  81. placeholder="Type your message..."
  82. value={message}
  83. onChange={(e) => setMessage(e.target.value)}
  84. rows={4}
  85. required
  86. />
  87. <p className="text-xs text-muted-foreground">
  88. {message.length} / 1600 characters
  89. </p>
  90. </div>
  91. <div className="flex justify-end gap-2">
  92. <Button
  93. type="button"
  94. variant="ghost"
  95. onClick={() => onOpenChange(false)}
  96. >
  97. Cancel
  98. </Button>
  99. <Button type="submit" disabled={sending || !message.trim()}>
  100. {sending ? (
  101. <Loader2 className="mr-2 h-4 w-4 animate-spin" />
  102. ) : (
  103. <Send className="mr-2 h-4 w-4" />
  104. )}
  105. Send SMS
  106. </Button>
  107. </div>
  108. </form>
  109. </DialogContent>
  110. </Dialog>
  111. );
  112. }