This commit is contained in:
@ -1,13 +1,13 @@
|
||||
'use client';
|
||||
"use client";
|
||||
|
||||
import { createContext, useContext, useState, useCallback } from 'react';
|
||||
import { createContext, useContext, useState, useCallback } from "react";
|
||||
|
||||
const PropertyContext = createContext();
|
||||
|
||||
export const useProperties = () => {
|
||||
const context = useContext(PropertyContext);
|
||||
if (!context) {
|
||||
throw new Error('useProperties must be used within PropertyProvider');
|
||||
throw new Error("useProperties must be used within PropertyProvider");
|
||||
}
|
||||
return context;
|
||||
};
|
||||
@ -20,18 +20,18 @@ export const PropertyProvider = ({ children }) => {
|
||||
const addProperty = useCallback(async (propertyData) => {
|
||||
setLoading(true);
|
||||
try {
|
||||
await new Promise(resolve => setTimeout(resolve, 500));
|
||||
|
||||
await new Promise((resolve) => setTimeout(resolve, 500));
|
||||
|
||||
const newProperty = {
|
||||
id: Date.now().toString(),
|
||||
...propertyData,
|
||||
createdAt: new Date().toISOString(),
|
||||
updatedAt: new Date().toISOString(),
|
||||
bookings: [],
|
||||
status: propertyData.status || 'available'
|
||||
status: propertyData.status || "available",
|
||||
};
|
||||
|
||||
setProperties(prev => [...prev, newProperty]);
|
||||
|
||||
setProperties((prev) => [...prev, newProperty]);
|
||||
return newProperty;
|
||||
} catch (err) {
|
||||
setError(err.message);
|
||||
@ -44,13 +44,14 @@ export const PropertyProvider = ({ children }) => {
|
||||
const updateProperty = useCallback(async (id, updates) => {
|
||||
setLoading(true);
|
||||
try {
|
||||
await new Promise(resolve => setTimeout(resolve, 500));
|
||||
|
||||
setProperties(prev =>
|
||||
prev.map(p => p.id === id
|
||||
? { ...p, ...updates, updatedAt: new Date().toISOString() }
|
||||
: p
|
||||
)
|
||||
await new Promise((resolve) => setTimeout(resolve, 500));
|
||||
|
||||
setProperties((prev) =>
|
||||
prev.map((p) =>
|
||||
p.id === id
|
||||
? { ...p, ...updates, updatedAt: new Date().toISOString() }
|
||||
: p,
|
||||
),
|
||||
);
|
||||
} catch (err) {
|
||||
setError(err.message);
|
||||
@ -63,8 +64,8 @@ export const PropertyProvider = ({ children }) => {
|
||||
const deleteProperty = useCallback(async (id) => {
|
||||
setLoading(true);
|
||||
try {
|
||||
await new Promise(resolve => setTimeout(resolve, 500));
|
||||
setProperties(prev => prev.filter(p => p.id !== id));
|
||||
await new Promise((resolve) => setTimeout(resolve, 500));
|
||||
setProperties((prev) => prev.filter((p) => p.id !== id));
|
||||
} catch (err) {
|
||||
setError(err.message);
|
||||
throw err;
|
||||
@ -73,69 +74,86 @@ export const PropertyProvider = ({ children }) => {
|
||||
}
|
||||
}, []);
|
||||
|
||||
const getProperty = useCallback((id) => {
|
||||
return properties.find(p => p.id === id);
|
||||
}, [properties]);
|
||||
const getProperty = useCallback(
|
||||
(id) => {
|
||||
return properties.find((p) => p.id === id);
|
||||
},
|
||||
[properties],
|
||||
);
|
||||
|
||||
const checkAvailability = useCallback((propertyId, startDate, endDate) => {
|
||||
const property = properties.find(p => p.id === propertyId);
|
||||
if (!property) return false;
|
||||
|
||||
const checkStart = new Date(startDate);
|
||||
const checkEnd = new Date(endDate);
|
||||
|
||||
return !property.bookings?.some(booking => {
|
||||
if (booking.status === 'cancelled' || booking.status === 'rejected') {
|
||||
return false;
|
||||
}
|
||||
|
||||
const bookingStart = new Date(booking.startDate);
|
||||
const bookingEnd = new Date(booking.endDate);
|
||||
|
||||
return (
|
||||
(checkStart >= bookingStart && checkStart <= bookingEnd) ||
|
||||
(checkEnd >= bookingStart && checkEnd <= bookingEnd) ||
|
||||
(checkStart <= bookingStart && checkEnd >= bookingEnd)
|
||||
);
|
||||
});
|
||||
}, [properties]);
|
||||
const checkAvailability = useCallback(
|
||||
(propertyId, startDate, endDate) => {
|
||||
const property = properties.find((p) => p.id === propertyId);
|
||||
if (!property) return false;
|
||||
|
||||
const getPropertiesByOwner = useCallback((ownerId) => {
|
||||
return properties.filter(p => p.ownerId === ownerId);
|
||||
}, [properties]);
|
||||
const checkStart = new Date(startDate);
|
||||
const checkEnd = new Date(endDate);
|
||||
|
||||
return !property.bookings?.some((booking) => {
|
||||
if (booking.status === "cancelled" || booking.status === "rejected") {
|
||||
return false;
|
||||
}
|
||||
|
||||
const bookingStart = new Date(booking.startDate);
|
||||
const bookingEnd = new Date(booking.endDate);
|
||||
|
||||
return (
|
||||
(checkStart >= bookingStart && checkStart <= bookingEnd) ||
|
||||
(checkEnd >= bookingStart && checkEnd <= bookingEnd) ||
|
||||
(checkStart <= bookingStart && checkEnd >= bookingEnd)
|
||||
);
|
||||
});
|
||||
},
|
||||
[properties],
|
||||
);
|
||||
|
||||
const getPropertiesByOwner = useCallback(
|
||||
(ownerId) => {
|
||||
return properties.filter((p) => p.ownerId === ownerId);
|
||||
},
|
||||
[properties],
|
||||
);
|
||||
|
||||
const getAvailableProperties = useCallback(() => {
|
||||
return properties.filter(p => p.status === 'available');
|
||||
return properties.filter((p) => p.status === "available");
|
||||
}, [properties]);
|
||||
|
||||
const updatePropertyStatus = useCallback(async (id, status) => {
|
||||
return updateProperty(id, { status });
|
||||
}, [updateProperty]);
|
||||
const updatePropertyStatus = useCallback(
|
||||
async (id, status) => {
|
||||
return updateProperty(id, { status });
|
||||
},
|
||||
[updateProperty],
|
||||
);
|
||||
|
||||
const addBookingToProperty = useCallback(async (propertyId, bookingData) => {
|
||||
const property = getProperty(propertyId);
|
||||
if (!property) throw new Error('Property not found');
|
||||
const addBookingToProperty = useCallback(
|
||||
async (propertyId, bookingData) => {
|
||||
const property = getProperty(propertyId);
|
||||
if (!property) throw new Error("Property not found");
|
||||
|
||||
const updatedBookings = [...(property.bookings || []), bookingData];
|
||||
return updateProperty(propertyId, { bookings: updatedBookings });
|
||||
}, [getProperty, updateProperty]);
|
||||
const updatedBookings = [...(property.bookings || []), bookingData];
|
||||
return updateProperty(propertyId, { bookings: updatedBookings });
|
||||
},
|
||||
[getProperty, updateProperty],
|
||||
);
|
||||
|
||||
return (
|
||||
<PropertyContext.Provider value={{
|
||||
properties,
|
||||
loading,
|
||||
error,
|
||||
addProperty,
|
||||
updateProperty,
|
||||
deleteProperty,
|
||||
getProperty,
|
||||
checkAvailability,
|
||||
getPropertiesByOwner,
|
||||
getAvailableProperties,
|
||||
updatePropertyStatus,
|
||||
addBookingToProperty
|
||||
}}>
|
||||
<PropertyContext.Provider
|
||||
value={{
|
||||
properties,
|
||||
loading,
|
||||
error,
|
||||
addProperty,
|
||||
updateProperty,
|
||||
deleteProperty,
|
||||
getProperty,
|
||||
checkAvailability,
|
||||
getPropertiesByOwner,
|
||||
getAvailableProperties,
|
||||
updatePropertyStatus,
|
||||
addBookingToProperty,
|
||||
}}
|
||||
>
|
||||
{children}
|
||||
</PropertyContext.Provider>
|
||||
);
|
||||
};
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user