meeting-scheduler-npm-package 1.0.4 → 1.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.esm.js CHANGED
@@ -1,4 +1,5 @@
1
1
  import React, { useState, useEffect } from 'react';
2
+ import { Clock, FileText, Globe, Calendar } from 'lucide-react';
2
3
 
3
4
  var jsxRuntime = {exports: {}};
4
5
 
@@ -486,156 +487,237 @@ function IoIosArrowBack (props) {
486
487
  return GenIcon({"attr":{"viewBox":"0 0 512 512"},"child":[{"tag":"path","attr":{"d":"M294.1 256L167 129c-9.4-9.4-9.4-24.6 0-33.9s24.6-9.3 34 0L345 239c9.1 9.1 9.3 23.7.7 33.1L201.1 417c-4.7 4.7-10.9 7-17 7s-12.3-2.3-17-7c-9.4-9.4-9.4-24.6 0-33.9l127-127.1z"},"child":[]}]})(props);
487
488
  }
488
489
 
489
- const daysOfWeek = ["SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"];
490
- const MeetingScheduler = ({ userId = 1, availabilityId = 1, authToken: propAuthToken, email = "superadmin1@gmail.com", password = "password", apiBase, onSuccess, onError, }) => {
491
- const [currentMonth, setCurrentMonth] = useState(new Date());
490
+ const MeetingScheduler = ({ apiBaseUrl: propApiBase, defaultAvailabilityId = 5, defaultUserId = 1, initialMonth, onBookingSuccess, onBookingError, }) => {
491
+ const API_BASE = propApiBase;
492
+ // ────────────────────────────────────────────────
493
+ // State
494
+ // ────────────────────────────────────────────────
495
+ const [currentMonth, setCurrentMonth] = useState(initialMonth || new Date(2026, 0, 1));
492
496
  const [selectedDate, setSelectedDate] = useState(null);
493
497
  const [availableSlots, setAvailableSlots] = useState([]);
494
498
  const [selectedSlot, setSelectedSlot] = useState(null);
495
499
  const [loading, setLoading] = useState(false);
496
- const [timezone, setTimezone] = useState("UTC");
497
500
  const [formData, setFormData] = useState({
498
501
  name: "",
499
502
  email: "",
500
503
  phone: "",
501
504
  message: "",
502
505
  });
503
- /* ============ Timezone ============ */
506
+ const [timezone, setTimezone] = useState("UTC");
507
+ // Detect user timezone
504
508
  useEffect(() => {
505
- setTimezone(Intl.DateTimeFormat().resolvedOptions().timeZone);
509
+ const detected = Intl.DateTimeFormat().resolvedOptions().timeZone;
510
+ setTimezone(detected);
506
511
  }, []);
507
- /* ============ Helpers ============ */
508
- const handleInputChange = (e) => {
509
- setFormData(Object.assign(Object.assign({}, formData), { [e.target.name]: e.target.value }));
510
- };
511
- const formatTime = (value) => {
512
- const time = value.split(" ")[1];
513
- let [h, m] = time.split(":").map(Number);
514
- const ampm = h >= 12 ? "PM" : "AM";
515
- h = h % 12 || 12;
516
- return `${h}:${m.toString().padStart(2, "0")} ${ampm}`;
512
+ // ────────────────────────────────────────────────
513
+ // Helpers
514
+ // ────────────────────────────────────────────────
515
+ const formatTimeTo12Hour = (dateTimeStr) => {
516
+ if (!dateTimeStr)
517
+ return "";
518
+ const timePart = dateTimeStr.split(" ")[1];
519
+ let [hours, minutes] = timePart.split(":").map(Number);
520
+ const ampm = hours >= 12 ? "PM" : "AM";
521
+ hours = hours % 12;
522
+ hours = hours || 12;
523
+ return `${hours}:${minutes.toString().padStart(2, "0")} ${ampm}`;
517
524
  };
518
525
  const today = new Date();
519
526
  today.setHours(0, 0, 0, 0);
520
527
  const isPastDate = (date) => date <= today;
521
- /* ============ Auth ============ */
528
+ const isSlotTooSoon = (slotStartUtc) => {
529
+ const slotTime = new Date(slotStartUtc);
530
+ const oneHourFromNow = new Date();
531
+ oneHourFromNow.setHours(oneHourFromNow.getHours() + 1);
532
+ return slotTime < oneHourFromNow;
533
+ };
534
+ const daysOfWeek = ["SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"];
535
+ const getDaysInMonth = (date) => {
536
+ const year = date.getFullYear();
537
+ const month = date.getMonth();
538
+ const firstDay = new Date(year, month, 1).getDay();
539
+ const daysInMonth = new Date(year, month + 1, 0).getDate();
540
+ const days = [];
541
+ for (let i = 0; i < firstDay; i++)
542
+ days.push(null);
543
+ for (let i = 1; i <= daysInMonth; i++)
544
+ days.push(new Date(year, month, i));
545
+ return days;
546
+ };
547
+ const formatDateHeader = (date) => date.toLocaleDateString("en-US", {
548
+ weekday: "long",
549
+ month: "long",
550
+ day: "numeric",
551
+ });
552
+ const isCurrentMonth = currentMonth.getMonth() === new Date().getMonth() &&
553
+ currentMonth.getFullYear() === new Date().getFullYear();
554
+ // ────────────────────────────────────────────────
555
+ // API Calls
556
+ // ────────────────────────────────────────────────
522
557
  const getAuthToken = async () => {
523
558
  var _a;
524
- if (propAuthToken)
525
- return propAuthToken;
526
559
  const existing = localStorage.getItem("auth_token");
527
560
  if (existing)
528
561
  return existing;
529
562
  try {
530
- const res = await fetch(`${apiBase}/v1/user/login`, {
563
+ const res = await fetch(`${API_BASE}/v1/user/login`, {
531
564
  method: "POST",
532
565
  headers: { "Content-Type": "application/json" },
533
- body: JSON.stringify({ email, password }),
566
+ body: JSON.stringify({
567
+ email: "superadmin1@example.com",
568
+ password: "password",
569
+ }),
534
570
  });
535
571
  const data = await res.json();
536
572
  const token = data.token || data.access_token || ((_a = data.data) === null || _a === void 0 ? void 0 : _a.token);
537
- if (token)
573
+ if (token) {
538
574
  localStorage.setItem("auth_token", token);
539
- return token || null;
575
+ return token;
576
+ }
577
+ return null;
540
578
  }
541
- catch (_b) {
579
+ catch (err) {
580
+ console.error("Auth login failed", err);
542
581
  return null;
543
582
  }
544
583
  };
545
- /* ============ API ============ */
546
584
  const fetchSlots = async (date) => {
585
+ if (!API_BASE) {
586
+ console.warn("API_BASE not provided");
587
+ return;
588
+ }
547
589
  setLoading(true);
548
590
  const token = await getAuthToken();
549
591
  if (!token) {
550
- onError === null || onError === void 0 ? void 0 : onError("Authentication failed");
592
+ // Swal.fire("Error", "Authentication failed.", "error");
551
593
  setLoading(false);
552
594
  return;
553
595
  }
554
596
  const yyyy = date.getFullYear();
555
597
  const mm = String(date.getMonth() + 1).padStart(2, "0");
556
598
  const dd = String(date.getDate()).padStart(2, "0");
599
+ const dateStr = `${yyyy}-${mm}-${dd}`;
557
600
  try {
558
- const res = await fetch(`${apiBase}/v1/meeting-schedule/check-schedule/${yyyy}-${mm}-${dd}?timezone=${timezone}`, { headers: { Authorization: `Bearer ${token}` } });
601
+ const res = await fetch(`${API_BASE}/v1/meeting-schedule/check-schedule/${dateStr}?timezone=${timezone}`, {
602
+ headers: {
603
+ Authorization: `Bearer ${token}`,
604
+ "Content-Type": "application/json",
605
+ },
606
+ });
559
607
  const data = await res.json();
560
608
  setAvailableSlots(data.slots || []);
561
609
  }
562
- catch (_a) {
563
- onError === null || onError === void 0 ? void 0 : onError("Failed to fetch slots");
610
+ catch (err) {
611
+ console.error("fetchSlots error:", err);
564
612
  }
565
613
  finally {
566
614
  setLoading(false);
567
615
  }
568
616
  };
569
- const handleBooking = async () => {
570
- if (!selectedSlot)
617
+ const handleScheduleClick = async () => {
618
+ if (!selectedSlot || !API_BASE)
571
619
  return;
572
620
  setLoading(true);
573
621
  const token = await getAuthToken();
574
622
  if (!token) {
575
- onError === null || onError === void 0 ? void 0 : onError("Authentication failed");
623
+ // Swal.fire("Error", "Authentication failed.", "error");
576
624
  setLoading(false);
577
625
  return;
578
626
  }
627
+ const payload = {
628
+ user_id: defaultUserId,
629
+ availability_id: defaultAvailabilityId,
630
+ visitor: {
631
+ name: formData.name,
632
+ email: formData.email,
633
+ phone: formData.phone,
634
+ timezone,
635
+ },
636
+ start: selectedSlot.start_local,
637
+ end: selectedSlot.end_local,
638
+ message: formData.message,
639
+ };
579
640
  try {
580
- const res = await fetch(`${apiBase}/v1/meeting-schedule/book-schedule`, {
641
+ const res = await fetch(`${API_BASE}/v1/meeting-schedule/book-schedule`, {
581
642
  method: "POST",
582
643
  headers: {
583
- "Content-Type": "application/json",
584
644
  Authorization: `Bearer ${token}`,
645
+ "Content-Type": "application/json",
585
646
  },
586
- body: JSON.stringify({
587
- user_id: userId,
588
- availability_id: availabilityId,
589
- visitor: Object.assign(Object.assign({}, formData), { timezone }),
590
- start: selectedSlot.start_local,
591
- end: selectedSlot.end_local,
592
- }),
647
+ body: JSON.stringify(payload),
593
648
  });
594
- if (!res.ok)
595
- throw new Error();
596
- // Swal.fire("Success", "Meeting booked!", "success");
597
- onSuccess === null || onSuccess === void 0 ? void 0 : onSuccess();
598
- setFormData({ name: "", email: "", phone: "", message: "" });
599
- setSelectedDate(null);
600
- setSelectedSlot(null);
601
- setAvailableSlots([]);
649
+ if (res.ok) {
650
+ // Swal.fire({
651
+ // icon: "success",
652
+ // title: "Meeting Scheduled!",
653
+ // text: `A confirmation email has been sent to ${formData.email}`,
654
+ // confirmButtonColor: "#F66117",
655
+ // });
656
+ // Reset
657
+ setFormData({ name: "", email: "", phone: "", message: "" });
658
+ setSelectedDate(null);
659
+ setSelectedSlot(null);
660
+ setAvailableSlots([]);
661
+ onBookingSuccess === null || onBookingSuccess === void 0 ? void 0 : onBookingSuccess(payload);
662
+ }
663
+ else {
664
+ throw new Error("Booking failed");
665
+ }
602
666
  }
603
- catch (_a) {
604
- onError === null || onError === void 0 ? void 0 : onError("Booking failed");
605
- // Swal.fire("Error", "Booking failed.", "error");
667
+ catch (err) {
668
+ // Swal.fire("Error", "Failed to book meeting.", "error");
669
+ onBookingError === null || onBookingError === void 0 ? void 0 : onBookingError(err);
606
670
  }
607
671
  finally {
608
672
  setLoading(false);
609
673
  }
610
674
  };
611
- /* ============ Calendar ============ */
612
- const getDaysInMonth = () => {
613
- const year = currentMonth.getFullYear();
614
- const month = currentMonth.getMonth();
615
- const firstDay = new Date(year, month, 1).getDay();
616
- const daysInMonth = new Date(year, month + 1, 0).getDate();
617
- const days = [];
618
- for (let i = 0; i < firstDay; i++)
619
- days.push(null);
620
- for (let i = 1; i <= daysInMonth; i++)
621
- days.push(new Date(year, month, i));
622
- return days;
675
+ // ────────────────────────────────────────────────
676
+ // Handlers
677
+ // ────────────────────────────────────────────────
678
+ const handleDateClick = (d) => {
679
+ if (isPastDate(d))
680
+ return;
681
+ setSelectedDate(d);
682
+ setSelectedSlot(null);
683
+ fetchSlots(d);
684
+ };
685
+ const handleInputChange = (e) => {
686
+ setFormData((prev) => (Object.assign(Object.assign({}, prev), { [e.target.name]: e.target.value })));
623
687
  };
624
- const isFormValid = formData.name && formData.email && formData.phone && selectedSlot;
625
- /* ============ JSX ============ */
626
- return (jsxRuntimeExports.jsxs("div", { className: "bg-white p-6 rounded-xl shadow-md", children: [jsxRuntimeExports.jsx("h2", { className: "text-2xl font-semibold mb-4", children: "Schedule a Meeting" }), jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between mb-4", children: [jsxRuntimeExports.jsx("button", { onClick: () => setCurrentMonth(new Date(currentMonth.getFullYear(), currentMonth.getMonth() - 1)), children: jsxRuntimeExports.jsx(IoIosArrowBack, {}) }), jsxRuntimeExports.jsx("span", { className: "font-semibold", children: currentMonth.toLocaleDateString("en-US", {
627
- month: "long",
628
- year: "numeric",
629
- }) }), jsxRuntimeExports.jsx("button", { onClick: () => setCurrentMonth(new Date(currentMonth.getFullYear(), currentMonth.getMonth() + 1)), children: jsxRuntimeExports.jsx(IoIosArrowForward, {}) })] }), jsxRuntimeExports.jsxs("div", { className: "grid grid-cols-7 gap-2 mb-4", children: [daysOfWeek.map((d) => (jsxRuntimeExports.jsx("div", { className: "text-center text-xs font-semibold", children: d }, d))), getDaysInMonth().map((day, i) => (jsxRuntimeExports.jsx("button", { disabled: !day || isPastDate(day), onClick: () => {
630
- if (day) {
631
- setSelectedDate(day);
632
- fetchSlots(day);
633
- }
634
- }, className: `p-2 rounded ${(selectedDate === null || selectedDate === void 0 ? void 0 : selectedDate.toDateString()) === (day === null || day === void 0 ? void 0 : day.toDateString())
635
- ? "bg-orange-500 text-white"
636
- : "hover:bg-gray-100"}`, children: day === null || day === void 0 ? void 0 : day.getDate() }, i)))] }), selectedDate && (jsxRuntimeExports.jsx("div", { className: "space-y-2 mb-4", children: availableSlots.map((slot, i) => (jsxRuntimeExports.jsxs("button", { disabled: slot.is_booked, onClick: () => setSelectedSlot(slot), className: `w-full p-2 rounded ${selectedSlot === slot
637
- ? "bg-orange-500 text-white"
638
- : "bg-gray-100"}`, children: [formatTime(slot.start_local), " \u2013", " ", formatTime(slot.end_local)] }, i))) })), jsxRuntimeExports.jsx("input", { name: "name", placeholder: "Name", className: "w-full mb-2 p-2 border rounded", value: formData.name, onChange: handleInputChange }), jsxRuntimeExports.jsx("input", { name: "email", placeholder: "Email", className: "w-full mb-2 p-2 border rounded", value: formData.email, onChange: handleInputChange }), jsxRuntimeExports.jsx("input", { name: "phone", placeholder: "Phone", className: "w-full mb-2 p-2 border rounded", value: formData.phone, onChange: handleInputChange }), jsxRuntimeExports.jsx("button", { disabled: !isFormValid || loading, onClick: handleBooking, className: "w-full bg-orange-500 text-white p-3 rounded disabled:opacity-50", children: loading ? "Booking..." : "Confirm Booking" })] }));
688
+ const days = getDaysInMonth(currentMonth);
689
+ const isFormValid = formData.name &&
690
+ formData.email &&
691
+ formData.phone &&
692
+ !!selectedSlot &&
693
+ !loading;
694
+ return (jsxRuntimeExports.jsxs("div", { className: "md:px-8 pb-10 bg-gradient-to-r from-[#EFF6FF] via-[#EEF2FF] to-[#FAF5FF] px-2 min-h-screen", children: [jsxRuntimeExports.jsx("div", { className: "h-28 mb-4" }), jsxRuntimeExports.jsxs("div", { className: "max-w-[1280px] mx-auto", children: [jsxRuntimeExports.jsxs("div", { className: "bg-gradient-to-r from-[#F56218] via-[#F54900] to-[#FBAA02] rounded-2xl p-6 mb-5 shadow-lg text-white", children: [jsxRuntimeExports.jsx("div", { className: "text-sm mb-1 bg-[#FFFFFF33] rounded-[34px] w-[170px] px-2 py-1 text-center", children: "Betopia Meeting" }), jsxRuntimeExports.jsx("h1", { className: "text-2xl md:text-3xl xl:text-[36px] font-semibold mb-2", children: "30 Minute Meeting" }), jsxRuntimeExports.jsxs("div", { className: "flex flex-wrap gap-4 text-sm", children: [jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2 text-lg md:text-xl", children: [jsxRuntimeExports.jsx(Clock, { size: 16 }), " ", jsxRuntimeExports.jsx("span", { children: "30 min" })] }), jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2 text-lg md:text-xl", children: [jsxRuntimeExports.jsx(FileText, { size: 16 }), " ", jsxRuntimeExports.jsx("span", { children: "Web conferencing details provided upon confirmation" })] }), jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2 text-lg md:text-xl", children: [jsxRuntimeExports.jsx(Globe, { size: 16 }), " ", jsxRuntimeExports.jsx("span", { children: timezone.replace("_", " ") })] })] })] }), jsxRuntimeExports.jsxs("div", { className: "grid gap-6 xl:grid-cols-[845px_410px]", children: [jsxRuntimeExports.jsxs("div", { className: "grid md:grid-cols-2 gap-6 bg-white rounded-2xl p-6 shadow-md", children: [jsxRuntimeExports.jsxs("div", { children: [jsxRuntimeExports.jsx("h2", { className: "text-2xl md:text-3xl xl:text-[36px] font-semibold mb-2 text-[#1E2939]", children: "Select a Date & Time" }), jsxRuntimeExports.jsx("p", { className: "text-[#6A7282] text-sm md:text-base mb-5", children: "Choose your preferred date and time slot" }), jsxRuntimeExports.jsxs("div", { className: "mb-6", children: [jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between mb-4", children: [jsxRuntimeExports.jsx("button", { onClick: () => {
695
+ if (!isCurrentMonth) {
696
+ setCurrentMonth(new Date(currentMonth.getFullYear(), currentMonth.getMonth() - 1));
697
+ }
698
+ }, disabled: isCurrentMonth, className: `p-2 rounded-lg transition-colors ${isCurrentMonth
699
+ ? "text-gray-300 cursor-not-allowed"
700
+ : "hover:bg-gray-100 text-gray-700"}`, children: jsxRuntimeExports.jsx(IoIosArrowBack, {}) }), jsxRuntimeExports.jsx("span", { className: "font-semibold text-[#1E2939]", children: currentMonth.toLocaleDateString("en-US", {
701
+ month: "long",
702
+ year: "numeric",
703
+ }) }), jsxRuntimeExports.jsx("button", { onClick: () => setCurrentMonth(new Date(currentMonth.getFullYear(), currentMonth.getMonth() + 1)), className: "p-2 hover:bg-gray-100 rounded-lg", children: jsxRuntimeExports.jsx(IoIosArrowForward, {}) })] }), jsxRuntimeExports.jsx("div", { className: "grid grid-cols-7 gap-2 mb-2", children: daysOfWeek.map((day) => (jsxRuntimeExports.jsx("div", { className: "text-center text-xs font-semibold text-[#4F39F6] p-2", children: day }, day))) }), jsxRuntimeExports.jsx("div", { className: "grid grid-cols-7 gap-2", children: days.map((day, idx) => {
704
+ const isPast = day ? isPastDate(day) : false;
705
+ return (jsxRuntimeExports.jsx("button", { disabled: !day || isPast, onClick: () => day && handleDateClick(day), className: `p-3 text-center rounded-lg transition-all ${!day ? "invisible" : ""} ${(selectedDate === null || selectedDate === void 0 ? void 0 : selectedDate.toDateString()) === (day === null || day === void 0 ? void 0 : day.toDateString())
706
+ ? "bg-gradient-to-b from-[#F66117] to-[#FBAA02] text-white font-bold"
707
+ : isPast
708
+ ? "text-gray-300 cursor-not-allowed"
709
+ : "hover:bg-gray-100"}`, children: day === null || day === void 0 ? void 0 : day.getDate() }, idx));
710
+ }) })] })] }), jsxRuntimeExports.jsxs("div", { className: "md:pl-6", children: [jsxRuntimeExports.jsx("h3", { className: "font-semibold mb-3 md:mt-[22%]", children: selectedDate ? formatDateHeader(selectedDate) : "Select a date first" }), loading ? (jsxRuntimeExports.jsx("div", { className: "animate-pulse space-y-2", children: [1, 2, 3, 4, 5].map((i) => (jsxRuntimeExports.jsx("div", { className: "h-12 bg-gray-100 rounded-lg w-full" }, i))) })) : selectedDate ? (jsxRuntimeExports.jsxs("div", { className: "space-y-2 max-h-[400px] overflow-y-auto pr-2", children: [availableSlots.map((slot, i) => {
711
+ const isTooSoon = isSlotTooSoon(slot.start_utc);
712
+ const isDisabled = slot.is_booked || isTooSoon;
713
+ return (jsxRuntimeExports.jsxs("button", { disabled: isDisabled, onClick: () => setSelectedSlot(slot), className: `w-full p-3 rounded-lg text-left transition-all ${selectedSlot === slot
714
+ ? "bg-[#F66117] text-white font-semibold"
715
+ : isDisabled
716
+ ? "bg-gray-50 text-gray-300 cursor-not-allowed"
717
+ : "bg-gray-50 hover:bg-gray-100"}`, children: [formatTimeTo12Hour(slot.start_local), " -", " ", formatTimeTo12Hour(slot.end_local), isTooSoon && " (Too early)"] }, i));
718
+ }), availableSlots.length === 0 && (jsxRuntimeExports.jsx("p", { className: "text-gray-400 text-center py-10", children: "No slots available for this date." }))] })) : (jsxRuntimeExports.jsxs("div", { className: "text-center py-20 text-gray-400", children: [jsxRuntimeExports.jsx("div", { className: "w-[48px] mx-auto mb-3 opacity-50", children: jsxRuntimeExports.jsx(Calendar, { size: 48 }) }), jsxRuntimeExports.jsx("p", { children: "Please select a date to view available times" })] }))] })] }), jsxRuntimeExports.jsxs("div", { className: "bg-white rounded-2xl p-6 shadow-md h-fit", children: [jsxRuntimeExports.jsx("h2", { className: "text-xl font-semibold mb-6", children: "Enter Details" }), selectedDate && selectedSlot && (jsxRuntimeExports.jsxs("div", { className: "bg-gradient-to-r from-[#EEF2FF] to-[#FAF5FF] border border-blue-200 rounded-lg p-4 mb-[22px]", children: [jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2 text-[#432DD7] mb-1", children: [jsxRuntimeExports.jsx(Calendar, { size: 16 }), " ", jsxRuntimeExports.jsx("span", { className: "font-semibold", children: formatDateHeader(selectedDate) })] }), jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2 text-[#8200DB]", children: [jsxRuntimeExports.jsx(Clock, { size: 16 }), " ", jsxRuntimeExports.jsxs("span", { className: "font-semibold", children: [formatTimeTo12Hour(selectedSlot.start_local), " -", " ", formatTimeTo12Hour(selectedSlot.end_local)] })] })] })), jsxRuntimeExports.jsxs("div", { className: "space-y-2", children: [jsxRuntimeExports.jsxs("div", { children: [jsxRuntimeExports.jsxs("label", { className: "flex items-center gap-2 text-sm font-medium mb-2", children: [jsxRuntimeExports.jsxs("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [jsxRuntimeExports.jsx("path", { d: "M12.6693 14V12.6667C12.6693 11.9594 12.3883 11.2811 11.8882 10.781C11.3881 10.281 10.7098 10 10.0026 10H6.0026C5.29536 10 4.61708 10.281 4.11699 10.781C3.61689 11.2811 3.33594 11.9594 3.33594 12.6667V14", stroke: "#4F39F6", strokeWidth: "1.33333", strokeLinecap: "round", strokeLinejoin: "round" }), jsxRuntimeExports.jsx("path", { d: "M8.0026 7.33333C9.47536 7.33333 10.6693 6.13943 10.6693 4.66667C10.6693 3.19391 9.47536 2 8.0026 2C6.52984 2 5.33594 3.19391 5.33594 4.66667C5.33594 6.13943 6.52984 7.33333 8.0026 7.33333Z", stroke: "#4F39F6", strokeWidth: "1.33333", strokeLinecap: "round", strokeLinejoin: "round" })] }), "Name *"] }), jsxRuntimeExports.jsx("input", { type: "text", name: "name", value: formData.name, onChange: handleInputChange, placeholder: "John Doe", className: "w-full p-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-1 focus:ring-[#F66117]" })] }), jsxRuntimeExports.jsx("button", { type: "button", onClick: handleScheduleClick, disabled: !isFormValid, className: `w-full p-4 rounded-lg font-semibold transition-all ${isFormValid
719
+ ? "bg-gradient-to-r from-[#F56116] to-[#FBA702] text-white hover:opacity-90"
720
+ : "bg-[#E5E7EB] text-[#99A1AF] cursor-not-allowed"}`, children: loading ? "Processing..." : "Schedule Event" }), jsxRuntimeExports.jsx("p", { className: "text-xs text-gray-600 text-center", children: "By proceeding, you confirm that you have read and agree to" }), jsxRuntimeExports.jsxs("p", { className: "text-xs text-gray-600 text-center", children: [jsxRuntimeExports.jsx("a", { href: "/terms-conditions", className: "text-[14px] text-[#4F39F6]", children: "Terms of Use" }), " ", "and", " ", jsxRuntimeExports.jsx("a", { href: "/cookie-policy", className: "text-[14px] text-[#4F39F6]", children: "Cookie policy" })] })] })] })] })] })] }));
639
721
  };
640
722
 
641
723
  export { MeetingScheduler };