Display property images from API using full URLs
All checks were successful
Build frontend / build (push) Successful in 1m3s
All checks were successful
Build frontend / build (push) Successful in 1m3s
- All mappers extract images from propertyInformation.images - Paths prefixed with API base URL (http://45.93.137.91/api) - Falls back to placeholder if no images - Updated: main page, properties listing, property detail, owner properties
This commit is contained in:
@ -99,22 +99,21 @@ export default function AddPropertyPage() {
|
||||
livingRooms: 1,
|
||||
|
||||
services: {
|
||||
electricity: false,
|
||||
internet: false,
|
||||
heating: false,
|
||||
water: false,
|
||||
airConditioning: false,
|
||||
parking: false,
|
||||
elevator: false
|
||||
[PropertyService.ELECTRICITY]: false,
|
||||
[PropertyService.INTERNET]: false,
|
||||
[PropertyService.HEATING]: false,
|
||||
[PropertyService.WATER]: false,
|
||||
[PropertyService.CENTRAL_AIR_CONDITIONING]: false,
|
||||
[PropertyService.PARKING]: false,
|
||||
[PropertyService.ELEVATOR]: false
|
||||
},
|
||||
|
||||
serviceDetails: {},
|
||||
|
||||
terms: {
|
||||
noSmoking: false,
|
||||
noPets: false,
|
||||
noParties: false,
|
||||
noAlcohol: false,
|
||||
suitableForChildren: true,
|
||||
suitableForElderly: true
|
||||
[PropertyTerm.NO_SMOKING]: false,
|
||||
[PropertyTerm.NO_ANIMALS]: false,
|
||||
[PropertyTerm.NO_PARTIES]: false
|
||||
},
|
||||
|
||||
offerType: 'daily',
|
||||
@ -831,34 +830,37 @@ const handleMapClick = async (coords) => {
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<h3 className="text-lg font-bold text-gray-900 mb-4">الخدمات المتوفرة</h3>
|
||||
<div className="grid grid-cols-2 md:grid-cols-4 gap-3">
|
||||
<h3 className="text-lg font-bold text-gray-900 mb-4">الخدمات المتوفرة <span className="text-red-500">*</span></h3>
|
||||
<div className="space-y-3">
|
||||
{serviceList.map((service) => {
|
||||
const Icon = service.icon;
|
||||
const isSelected = formData.services[service.id];
|
||||
return (
|
||||
<label
|
||||
key={service.id}
|
||||
className={`flex items-center gap-2 p-3 border rounded-xl cursor-pointer transition-all ${
|
||||
formData.services[service.id]
|
||||
? 'border-amber-500 bg-amber-50'
|
||||
: 'border-gray-200 hover:border-amber-200 hover:bg-amber-50/50'
|
||||
}`}
|
||||
>
|
||||
<input
|
||||
type="checkbox"
|
||||
checked={formData.services[service.id]}
|
||||
onChange={() => toggleService(service.id)}
|
||||
className="hidden"
|
||||
/>
|
||||
<Icon className={`w-5 h-5 ${
|
||||
formData.services[service.id] ? 'text-amber-600' : 'text-gray-400'
|
||||
}`} />
|
||||
<span className={`text-sm ${
|
||||
formData.services[service.id] ? 'text-amber-700' : 'text-gray-600'
|
||||
}`}>
|
||||
{service.label}
|
||||
</span>
|
||||
</label>
|
||||
<div key={service.id} className={`border rounded-xl transition-all ${isSelected ? 'border-amber-500 bg-amber-50' : 'border-gray-200'}`}>
|
||||
<label className="flex items-center gap-3 p-3 cursor-pointer">
|
||||
<input
|
||||
type="checkbox"
|
||||
checked={isSelected}
|
||||
onChange={() => toggleService(service.id)}
|
||||
className="w-4 h-4 text-amber-500 rounded"
|
||||
/>
|
||||
<Icon className={`w-5 h-5 ${isSelected ? 'text-amber-600' : 'text-gray-400'}`} />
|
||||
<span className={`text-sm font-medium ${isSelected ? 'text-amber-700' : 'text-gray-600'}`}>
|
||||
{service.label}
|
||||
</span>
|
||||
</label>
|
||||
{isSelected && (
|
||||
<div className="px-3 pb-3">
|
||||
<input
|
||||
type="text"
|
||||
value={formData.serviceDetails[service.id] || ''}
|
||||
onChange={(e) => updateServiceDetail(service.id, e.target.value)}
|
||||
className="w-full px-3 py-2 border border-gray-200 rounded-lg text-sm focus:outline-none focus:ring-2 focus:ring-amber-500"
|
||||
placeholder="تفاصيل الخدمة (مثال: في جميع الغرف)"
|
||||
/>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
})}
|
||||
</div>
|
||||
|
||||
@ -746,7 +746,11 @@ export default function OwnerPropertiesPage() {
|
||||
area: info.space || 0,
|
||||
livingRooms: details.livingRooms || 0,
|
||||
status: { 0: 'available', 1: 'booked', 2: 'maintenance' }[info.status] || 'available',
|
||||
images: ['/property-placeholder.jpg'],
|
||||
images: (() => {
|
||||
const apiBase = typeof window !== 'undefined' ? (process.env.NEXT_PUBLIC_API_URL || 'http://45.93.137.91/api') : '';
|
||||
const raw = Array.isArray(info.images) ? info.images : [];
|
||||
return raw.length > 0 ? raw.map(img => img.startsWith('http') ? img : `${apiBase}${img}`) : ['/property-placeholder.jpg'];
|
||||
})(),
|
||||
createdAt: item.createdAt || new Date().toISOString(),
|
||||
furnished: details.furnished || false,
|
||||
description: info.description || '',
|
||||
|
||||
Reference in New Issue
Block a user