Skip to content

Commit d35ebc8

Browse files
committed
Fixed BookingForm props and form rendering issues
Added selectedDate to BookingFormProps interface. Ensured selectedDate is passed correctly from ServiceDetails and CustomerBooking components. Added validation to ensure selectedDate is provided before form submission. Updated BookingForm to handle the selectedDate and render the form correctly.
1 parent 25dba92 commit d35ebc8

File tree

5 files changed

+57
-17
lines changed

5 files changed

+57
-17
lines changed

components/BookingForm.tsx

+31-10
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1+
// ./components/BookingForm.tsx
12
import React, { useState, useEffect } from 'react';
23
import { databases } from '../lib/appwrite.config';
4+
import { useRouter } from 'next/router';
35

46
interface BookingFormProps {
57
providerId: string;
@@ -14,6 +16,25 @@ const BookingForm: React.FC<BookingFormProps> = ({ providerId, serviceId, select
1416
const [zipcode, setZipcode] = useState('');
1517
const [coupon, setCoupon] = useState('');
1618
const [discount, setDiscount] = useState(0);
19+
const router = useRouter();
20+
const consumerId = JSON.parse(localStorage.getItem('appwriteSession') || '{}').userId;
21+
22+
useEffect(() => {
23+
const fetchServiceDetails = async () => {
24+
try {
25+
const service = await databases.getDocument(
26+
process.env.DATABASE_ID!,
27+
process.env.SERVICE_COLLECTION_ID!,
28+
serviceId
29+
);
30+
setDiscount(service.price);
31+
} catch (error) {
32+
console.error('Error fetching service details:', error);
33+
}
34+
};
35+
36+
fetchServiceDetails();
37+
}, [serviceId]);
1738

1839
const handleCouponApply = async () => {
1940
if (coupon === '100OFF') {
@@ -23,11 +44,12 @@ const BookingForm: React.FC<BookingFormProps> = ({ providerId, serviceId, select
2344
}
2445
};
2546

26-
const handleSubmit = async (e: React.FormEvent) => {
47+
const handleFormSubmit = async (e: React.FormEvent) => {
2748
e.preventDefault();
28-
29-
const session = JSON.parse(localStorage.getItem('appwriteSession') || '{}');
30-
const consumerId = session.userId;
49+
if (!selectedDate) {
50+
alert("Please select a date for booking.");
51+
return;
52+
}
3153

3254
const formData = {
3355
date: selectedDate.toISOString(),
@@ -39,7 +61,7 @@ const BookingForm: React.FC<BookingFormProps> = ({ providerId, serviceId, select
3961
city,
4062
state,
4163
zipcode,
42-
discount,
64+
discount
4365
};
4466

4567
try {
@@ -53,8 +75,7 @@ const BookingForm: React.FC<BookingFormProps> = ({ providerId, serviceId, select
5375

5476
if (response.ok) {
5577
const responseData = await response.json();
56-
console.log('Booking created successfully.');
57-
window.location.href = `/payment-confirmation?bookingId=${responseData.bookingId}`;
78+
router.push(`/payment-confirmation?bookingId=${responseData.bookingId}`);
5879
} else {
5980
console.error('Failed to create booking.');
6081
}
@@ -64,14 +85,14 @@ const BookingForm: React.FC<BookingFormProps> = ({ providerId, serviceId, select
6485
};
6586

6687
return (
67-
<form onSubmit={handleSubmit} className="mt-4">
88+
<form onSubmit={handleFormSubmit} className="mt-4">
6889
<div>
69-
<label className="block text-sm font-medium text-gray-700">Selected Date</label>
90+
<label className="block text-sm font-medium text-gray-700">Date</label>
7091
<input
7192
type="text"
7293
value={selectedDate.toDateString()}
73-
className="mt-1 block w-1/2 sm:w-1/3 lg:w-1/4 border border-gray-300 rounded-md shadow-sm p-2"
7494
readOnly
95+
className="mt-1 block w-1/2 sm:w-1/3 lg:w-1/4 border border-gray-300 rounded-md shadow-sm p-2"
7596
/>
7697
</div>
7798
<div className="mt-2">

components/ServiceDetails.tsx

+14-4
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
import React, { useState, useEffect } from 'react';
1+
// ./components/ServiceDetails.tsx
2+
import React, { useState, useEffect, useCallback } from 'react';
23
import BookingForm from './BookingForm';
34
import AvailabilityCalendar from './AvailabilityCalendar';
45
import { Service, ReviewCardProps } from '../types/appwrite.type';
@@ -52,18 +53,27 @@ const ServiceDetails: React.FC<ServiceDetailsProps> = ({ service, onBack }) => {
5253
setIsReviewFormVisible(!isReviewFormVisible);
5354
};
5455

55-
const fetchReviews = async () => {
56+
const fetchReviews = useCallback(async () => {
5657
try {
5758
const fetchedReviews = await fetchReviewsForService(service.$id);
5859
setReviews(fetchedReviews);
5960
} catch (error) {
6061
console.error('Error fetching reviews:', error);
6162
}
62-
};
63+
}, [service.$id]);
6364

6465
useEffect(() => {
66+
const fetchReviews = async () => {
67+
try {
68+
const fetchedReviews = await fetchReviewsForService(service.$id);
69+
setReviews(fetchedReviews);
70+
} catch (error) {
71+
console.error('Error fetching reviews:', error);
72+
}
73+
};
74+
6575
fetchReviews();
66-
}, [service.$id]);
76+
}, [service.$id, fetchReviews]);
6777

6878
const handleDateChange = (date: Date) => {
6979
setSelectedDate(date);

pages/customerBooking.tsx

+10-2
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
// The page will display the availability of the provider and allow the user to select a date to book a service.
55
// The page will also display a form for the user to input their information and book the service.
66
// The page will also have a button to return to the customer profile page.
7+
// ./pages/customerBooking.tsx
78

89
'use client'
910

@@ -17,6 +18,7 @@ const CustomerBooking = () => {
1718
const router = useRouter();
1819
const { providerId, serviceId } = router.query;
1920
const [availableDates, setAvailableDates] = useState<Date[]>([]);
21+
const [selectedDate, setSelectedDate] = useState<Date | null>(null);
2022

2123
useEffect(() => {
2224
const fetchAvailability = async () => {
@@ -29,6 +31,10 @@ const CustomerBooking = () => {
2931
fetchAvailability();
3032
}, [providerId]);
3133

34+
const handleDateChange = (date: Date) => {
35+
setSelectedDate(date);
36+
};
37+
3238
if (!providerId || !serviceId) {
3339
return <div>Loading...</div>; // Or handle the missing IDs appropriately
3440
}
@@ -37,8 +43,10 @@ const CustomerBooking = () => {
3743
<div className="flex min-h-screen customer-background">
3844
<main className="w-full p-8 content-background">
3945
<h1 className="text-2xl font-bold mb-6">Book a Service</h1>
40-
<AvailabilityCalendar availableDates={availableDates} />
41-
<BookingForm providerId={providerId as string} serviceId={serviceId as string} />
46+
<AvailabilityCalendar availableDates={availableDates} onDateChange={handleDateChange} />
47+
{selectedDate && (
48+
<BookingForm providerId={providerId as string} serviceId={serviceId as string} selectedDate={selectedDate} />
49+
)}
4250
<button
4351
onClick={() => router.push('/customerProfile')}
4452
className="mt-4 bg-blue-500 text-white py-2 px-4 rounded"

pages/providerBooking.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ const ProviderBooking = () => {
2929
<main className="w-full p-8 content-background">
3030
<h1 className="text-2xl font-bold mb-6">Manage Bookings</h1>
3131
<AvailabilityCalendar availableDates={availableDates} />
32-
<BookingForm providerId={providerId as string} serviceId={serviceId as string} />
32+
<BookingForm providerId={providerId as string} serviceId={serviceId as string} selectedDate={new Date()} />
3333
<button
3434
onClick={() => router.push('/serviceProfile')}
3535
className="mt-4 bg-blue-500 text-white py-2 px-4 rounded"

types/appwrite.type.ts

+1
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ export interface BookingCardProps {
8888
export interface BookingFormProps {
8989
providerId: string;
9090
serviceId: string;
91+
selectedDate: Date;
9192
}
9293

9394
export interface Availability extends Models.Document {

0 commit comments

Comments
 (0)