added the images
All checks were successful
Build frontend / build (push) Successful in 46s

This commit is contained in:
mouazkh
2026-03-19 22:48:23 +03:00
parent 85252c9b76
commit 7fe8903701
14 changed files with 272 additions and 171 deletions

View File

@ -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>
);
};
};