Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d934c5487b | ||
|
|
3fc55eac72 | ||
|
|
e66bab01e9 | ||
|
|
be5ede92bd | ||
|
|
2580d7d2b4 | ||
|
|
456b142943 | ||
|
|
1789015432 | ||
|
|
f5c034201a | ||
|
|
b63e92b486 | ||
|
|
5a51ccd0b3 |
@@ -0,0 +1,13 @@
|
|||||||
|
NEXT_PUBLIC_DOMAIN=http://localhost:3000
|
||||||
|
NEXT_PUBLIC_API_DOMAIN=http://localhost:3000/api
|
||||||
|
MONGODB_URI=ADD_YOUR_OWN
|
||||||
|
GOOGLE_CLIENT_ID=ADD_YOUR_OWN
|
||||||
|
GOOGLE_CLIENT_SECRET=ADD_YOUR_OWN
|
||||||
|
NEXTAUTH_URL=http://localhost:3000
|
||||||
|
NEXTAUTH_URL_INTERNAL=http://localhost:3000
|
||||||
|
NEXTAUTH_SECRET=ADD_YOUR_OWN
|
||||||
|
CLOUDINARY_CLOUD_NAME=ADD_YOUR_OWN
|
||||||
|
CLOUDINARY_API_KEY=ADD_YOUR_OWN
|
||||||
|
CLOUDINARY_API_SECRET=ADD_YOUR_OWN
|
||||||
|
NEXT_PUBLIC_MAPBOX_TOKEN=ADD_YOUR_OWN
|
||||||
|
NEXT_PUBLIC_GOOGLE_GEOCODING_API_KEY=ADD_YOUR_OWN
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"printWidth": 80,
|
||||||
|
"tabWidth": 2,
|
||||||
|
"useTabs": false,
|
||||||
|
"semi": true,
|
||||||
|
"singleQuote": true,
|
||||||
|
"bracketSpacing": true,
|
||||||
|
"bracketSameLine": false,
|
||||||
|
"jsxSingleQuote": true,
|
||||||
|
"trailingComma": "es5",
|
||||||
|
"arrowParens": "avoid"
|
||||||
|
}
|
||||||
|
|
||||||
@@ -4,6 +4,8 @@
|
|||||||
|
|
||||||
This is the main project from my [Next 14 From Scratch Course](https://www.traversymedia.com/nextjs-from-scratch)
|
This is the main project from my [Next 14 From Scratch Course](https://www.traversymedia.com/nextjs-from-scratch)
|
||||||
|
|
||||||
|
This is the second iteration of the app/course that uses server actions instead of API routes.
|
||||||
|
|
||||||
The `_theme_files` folder contains the pure HTML files with Tailwind classes.
|
The `_theme_files` folder contains the pure HTML files with Tailwind classes.
|
||||||
|
|
||||||
<img src="/public/images/screen.jpg" />
|
<img src="/public/images/screen.jpg" />
|
||||||
|
|||||||
@@ -231,23 +231,6 @@
|
|||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<!-- Form Component -->
|
<!-- Form Component -->
|
||||||
<!-- <form class="mt-10 mx-auto max-w-lg w-full flex items-center">
|
|
||||||
<div class="flex-1">
|
|
||||||
<label for="location" class="sr-only">Location</label>
|
|
||||||
<input
|
|
||||||
type="text"
|
|
||||||
id="location"
|
|
||||||
placeholder="Enter Location"
|
|
||||||
class="w-full px-4 py-3 rounded-lg bg-white text-gray-800 focus:outline-none focus:ring focus:ring-blue-500"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
<button
|
|
||||||
type="submit"
|
|
||||||
class="ml-4 px-4 py-3 rounded-lg bg-blue-500 text-white hover:bg-blue-600 focus:outline-none focus:ring focus:ring-blue-500"
|
|
||||||
>
|
|
||||||
Search
|
|
||||||
</button>
|
|
||||||
</form> -->
|
|
||||||
<form
|
<form
|
||||||
class="mt-3 mx-auto max-w-2xl w-full flex flex-col md:flex-row items-center"
|
class="mt-3 mx-auto max-w-2xl w-full flex flex-col md:flex-row items-center"
|
||||||
>
|
>
|
||||||
@@ -334,7 +317,7 @@
|
|||||||
<img
|
<img
|
||||||
src="images/properties/f1.jpg"
|
src="images/properties/f1.jpg"
|
||||||
alt=""
|
alt=""
|
||||||
class="object-cover rounded-t-xl md:rounded-tr-none md:rounded-l-xl w-full md:w-2/5"
|
class="w-full h-auto rounded-t-xl md:rounded-tr-none md:rounded-l-xl w-full md:w-2/5"
|
||||||
/>
|
/>
|
||||||
<div class="p-6">
|
<div class="p-6">
|
||||||
<h3 class="text-xl font-bold">Seaside Retreat</h3>
|
<h3 class="text-xl font-bold">Seaside Retreat</h3>
|
||||||
@@ -388,9 +371,9 @@
|
|||||||
class="bg-white rounded-xl shadow-md relative flex flex-col md:flex-row"
|
class="bg-white rounded-xl shadow-md relative flex flex-col md:flex-row"
|
||||||
>
|
>
|
||||||
<img
|
<img
|
||||||
src="images/properties/e1.jpg"
|
src="/images/properties/e1.jpg"
|
||||||
alt=""
|
alt=""
|
||||||
class="object-cover rounded-t-xl md:rounded-tr-none md:rounded-l-xl w-full md:w-2/5"
|
class="w-full h-auto rounded-t-xl md:rounded-tr-none md:rounded-l-xl md:w-2/5"
|
||||||
/>
|
/>
|
||||||
<div class="p-6">
|
<div class="p-6">
|
||||||
<h3 class="text-xl font-bold">Modern Downtown Studio</h3>
|
<h3 class="text-xl font-bold">Modern Downtown Studio</h3>
|
||||||
@@ -454,9 +437,9 @@
|
|||||||
<!-- Listing 1 -->
|
<!-- Listing 1 -->
|
||||||
<div class="bg-white rounded-xl shadow-md relative">
|
<div class="bg-white rounded-xl shadow-md relative">
|
||||||
<img
|
<img
|
||||||
src="images/properties/a1.jpg"
|
src="/images/properties/images[0]"
|
||||||
alt=""
|
alt=""
|
||||||
class="object-cover rounded-t-xl"
|
class="w-full h-auto rounded-t-xl"
|
||||||
/>
|
/>
|
||||||
<div class="p-4">
|
<div class="p-4">
|
||||||
<div class="text-left md:text-center lg:text-left mb-6">
|
<div class="text-left md:text-center lg:text-left mb-6">
|
||||||
@@ -514,7 +497,7 @@
|
|||||||
<img
|
<img
|
||||||
src="images/properties/b1.jpg"
|
src="images/properties/b1.jpg"
|
||||||
alt=""
|
alt=""
|
||||||
class="object-cover rounded-t-xl"
|
class="w-full h-auto rounded-t-xl"
|
||||||
/>
|
/>
|
||||||
<div class="p-4">
|
<div class="p-4">
|
||||||
<div class="text-left md:text-center lg:text-left mb-6">
|
<div class="text-left md:text-center lg:text-left mb-6">
|
||||||
@@ -572,7 +555,7 @@
|
|||||||
<img
|
<img
|
||||||
src="images/properties/c1.jpg"
|
src="images/properties/c1.jpg"
|
||||||
alt=""
|
alt=""
|
||||||
class="object-cover rounded-t-xl"
|
class="w-full h-auto rounded-t-xl"
|
||||||
/>
|
/>
|
||||||
<div class="p-4">
|
<div class="p-4">
|
||||||
<div class="text-left md:text-center lg:text-left mb-6">
|
<div class="text-left md:text-center lg:text-left mb-6">
|
||||||
|
|||||||
@@ -245,7 +245,7 @@
|
|||||||
<a href="/property.html">
|
<a href="/property.html">
|
||||||
<img
|
<img
|
||||||
class="h-32 w-full rounded-md object-cover"
|
class="h-32 w-full rounded-md object-cover"
|
||||||
src="/images/properties/a1.jpg"
|
src="/images/properties/images[0]"
|
||||||
alt="Property 1"
|
alt="Property 1"
|
||||||
/>
|
/>
|
||||||
</a>
|
</a>
|
||||||
|
|||||||
@@ -266,9 +266,9 @@
|
|||||||
<!-- Listing 1 -->
|
<!-- Listing 1 -->
|
||||||
<div class="rounded-xl shadow-md relative">
|
<div class="rounded-xl shadow-md relative">
|
||||||
<img
|
<img
|
||||||
src="images/properties/a1.jpg"
|
src="/images/properties/images[0]"
|
||||||
alt=""
|
alt=""
|
||||||
class="object-cover rounded-t-xl"
|
class="w-full h-auto rounded-t-xl"
|
||||||
/>
|
/>
|
||||||
<div class="p-4">
|
<div class="p-4">
|
||||||
<div class="text-left md:text-center lg:text-left mb-6">
|
<div class="text-left md:text-center lg:text-left mb-6">
|
||||||
@@ -326,7 +326,7 @@
|
|||||||
<img
|
<img
|
||||||
src="images/properties/b1.jpg"
|
src="images/properties/b1.jpg"
|
||||||
alt=""
|
alt=""
|
||||||
class="object-cover rounded-t-xl"
|
class="w-full h-auto rounded-t-xl"
|
||||||
/>
|
/>
|
||||||
<div class="p-4">
|
<div class="p-4">
|
||||||
<div class="text-left md:text-center lg:text-left mb-6">
|
<div class="text-left md:text-center lg:text-left mb-6">
|
||||||
@@ -384,7 +384,7 @@
|
|||||||
<img
|
<img
|
||||||
src="images/properties/c1.jpg"
|
src="images/properties/c1.jpg"
|
||||||
alt=""
|
alt=""
|
||||||
class="object-cover rounded-t-xl"
|
class="w-full h-auto rounded-t-xl"
|
||||||
/>
|
/>
|
||||||
<div class="p-4">
|
<div class="p-4">
|
||||||
<div class="text-left md:text-center lg:text-left mb-6">
|
<div class="text-left md:text-center lg:text-left mb-6">
|
||||||
@@ -443,7 +443,7 @@
|
|||||||
<img
|
<img
|
||||||
src="images/properties/d1.jpg"
|
src="images/properties/d1.jpg"
|
||||||
alt=""
|
alt=""
|
||||||
class="object-cover rounded-t-xl"
|
class="w-full h-auto rounded-t-xl"
|
||||||
/>
|
/>
|
||||||
<div class="p-4">
|
<div class="p-4">
|
||||||
<div class="text-left md:text-center lg:text-left mb-6">
|
<div class="text-left md:text-center lg:text-left mb-6">
|
||||||
@@ -498,9 +498,9 @@
|
|||||||
<!-- Listing 5 -->
|
<!-- Listing 5 -->
|
||||||
<div class="rounded-xl shadow-md relative">
|
<div class="rounded-xl shadow-md relative">
|
||||||
<img
|
<img
|
||||||
src="images/properties/e1.jpg"
|
src="/images/properties/e1.jpg"
|
||||||
alt=""
|
alt=""
|
||||||
class="object-cover rounded-t-xl"
|
class="w-full h-auto rounded-t-xl"
|
||||||
/>
|
/>
|
||||||
<div class="p-4">
|
<div class="p-4">
|
||||||
<div class="text-left md:text-center lg:text-left mb-6">
|
<div class="text-left md:text-center lg:text-left mb-6">
|
||||||
@@ -558,7 +558,7 @@
|
|||||||
<img
|
<img
|
||||||
src="images/properties/f1.jpg"
|
src="images/properties/f1.jpg"
|
||||||
alt=""
|
alt=""
|
||||||
class="object-cover rounded-t-xl"
|
class="w-full h-auto rounded-t-xl"
|
||||||
/>
|
/>
|
||||||
<div class="p-4">
|
<div class="p-4">
|
||||||
<div class="text-left md:text-center lg:text-left mb-6">
|
<div class="text-left md:text-center lg:text-left mb-6">
|
||||||
|
|||||||
@@ -58,7 +58,7 @@
|
|||||||
<a class="flex flex-shrink-0 items-center" href="/index.html">
|
<a class="flex flex-shrink-0 items-center" href="/index.html">
|
||||||
<img
|
<img
|
||||||
class="h-10 w-auto"
|
class="h-10 w-auto"
|
||||||
src="/images/logo-white.png"
|
src="images/logo-white.png"
|
||||||
alt="PropertyPulse"
|
alt="PropertyPulse"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
@@ -270,9 +270,9 @@
|
|||||||
<div class="container-xl m-auto">
|
<div class="container-xl m-auto">
|
||||||
<div class="grid grid-cols-1">
|
<div class="grid grid-cols-1">
|
||||||
<img
|
<img
|
||||||
src="images/properties/a1.jpg"
|
src="/images/properties/images[0]"
|
||||||
alt=""
|
alt=""
|
||||||
class="object-cover h-[400px]"
|
class="object-cover h-[400px] w-full"
|
||||||
width="1800"
|
width="1800"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
@@ -288,6 +288,7 @@
|
|||||||
>
|
>
|
||||||
<i class="fas fa-arrow-left mr-2"></i> Back to Properties
|
<i class="fas fa-arrow-left mr-2"></i> Back to Properties
|
||||||
</a>
|
</a>
|
||||||
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<!-- Property Info -->
|
<!-- Property Info -->
|
||||||
@@ -443,73 +444,73 @@
|
|||||||
<div class="bg-white p-6 rounded-lg shadow-md">
|
<div class="bg-white p-6 rounded-lg shadow-md">
|
||||||
<h3 class="text-xl font-bold mb-6">Contact Property Manager</h3>
|
<h3 class="text-xl font-bold mb-6">Contact Property Manager</h3>
|
||||||
<form>
|
<form>
|
||||||
<div class='mb-4'>
|
<div class="mb-4">
|
||||||
<label
|
<label
|
||||||
class='block text-gray-700 text-sm font-bold mb-2'
|
class="block text-gray-700 text-sm font-bold mb-2"
|
||||||
htmlFor='name'
|
htmlFor="name"
|
||||||
>
|
>
|
||||||
Name:
|
Name:
|
||||||
</label>
|
</label>
|
||||||
<input
|
<input
|
||||||
class='shadow appearance-none border rounded w-full py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline'
|
class="shadow appearance-none border rounded w-full py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline"
|
||||||
id='name'
|
id="name"
|
||||||
name='name'
|
name="name"
|
||||||
type='text'
|
type="text"
|
||||||
placeholder='Enter your name'
|
placeholder="Enter your name"
|
||||||
required
|
required
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div class='mb-4'>
|
<div class="mb-4">
|
||||||
<label
|
<label
|
||||||
class='block text-gray-700 text-sm font-bold mb-2'
|
class="block text-gray-700 text-sm font-bold mb-2"
|
||||||
htmlFor='email'
|
htmlFor="email"
|
||||||
>
|
>
|
||||||
Email:
|
Email:
|
||||||
</label>
|
</label>
|
||||||
<input
|
<input
|
||||||
class='shadow appearance-none border rounded w-full py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline'
|
class="shadow appearance-none border rounded w-full py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline"
|
||||||
id='email'
|
id="email"
|
||||||
name='email'
|
name="email"
|
||||||
type='email'
|
type="email"
|
||||||
placeholder='Enter your email'
|
placeholder="Enter your email"
|
||||||
required
|
required
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div class='mb-4'>
|
<div class="mb-4">
|
||||||
<label
|
<label
|
||||||
class='block text-gray-700 text-sm font-bold mb-2'
|
class="block text-gray-700 text-sm font-bold mb-2"
|
||||||
htmlFor='phone'
|
htmlFor="phone"
|
||||||
>
|
>
|
||||||
Phone:
|
Phone:
|
||||||
</label>
|
</label>
|
||||||
<input
|
<input
|
||||||
class='shadow appearance-none border rounded w-full py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline'
|
class="shadow appearance-none border rounded w-full py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline"
|
||||||
id='phone'
|
id="phone"
|
||||||
name='phone'
|
name="phone"
|
||||||
type='text'
|
type="text"
|
||||||
placeholder='Enter your phone number'
|
placeholder="Enter your phone number"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div class='mb-4'>
|
<div class="mb-4">
|
||||||
<label
|
<label
|
||||||
class='block text-gray-700 text-sm font-bold mb-2'
|
class="block text-gray-700 text-sm font-bold mb-2"
|
||||||
htmlFor='message'
|
htmlFor="message"
|
||||||
>
|
>
|
||||||
Message:
|
Message:
|
||||||
</label>
|
</label>
|
||||||
<textarea
|
<textarea
|
||||||
class='shadow appearance-none border rounded w-full py-2 px-3 text-gray-700 h-44 focus:outline-none focus:shadow-outline'
|
class="shadow appearance-none border rounded w-full py-2 px-3 text-gray-700 h-44 focus:outline-none focus:shadow-outline"
|
||||||
id='message'
|
id="message"
|
||||||
name='message'
|
name="message"
|
||||||
placeholder='Enter your message'
|
placeholder="Enter your message"
|
||||||
></textarea>
|
></textarea>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<button
|
<button
|
||||||
class='bg-blue-500 hover:bg-blue-600 text-white font-bold py-2 px-4 rounded-full w-full focus:outline-none focus:shadow-outline flex items-center justify-center'
|
class="bg-blue-500 hover:bg-blue-600 text-white font-bold py-2 px-4 rounded-full w-full focus:outline-none focus:shadow-outline flex items-center justify-center"
|
||||||
type='submit'
|
type="submit"
|
||||||
>
|
>
|
||||||
<FaPaperPlane class='mr-2' /> Send Message
|
<i class="fas fa-paper-plane mr-2"></i> Send Message
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
@@ -520,32 +521,36 @@
|
|||||||
</section>
|
</section>
|
||||||
|
|
||||||
<!-- Images -->
|
<!-- Images -->
|
||||||
<section class='bg-blue-50 p-4'>
|
<section class="bg-blue-50 p-4">
|
||||||
<div class='container mx-auto'>
|
<div class="container mx-auto">
|
||||||
<div class='grid grid-cols-2 gap-4'>
|
<div class="grid grid-cols-2 gap-4">
|
||||||
<div class='col-span-2'>
|
<div class="col-span-2">
|
||||||
<img
|
<img
|
||||||
src='./images/properties/a1.jpg'
|
src="/images/properties/images[0]"
|
||||||
alt=''
|
alt=""
|
||||||
class='object-cover h-[400px] w-full rounded-xl cursor-pointer' />
|
class="object-cover h-[400px] w-full rounded-xl cursor-pointer"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div class='col-span-2'>
|
<div class="col-span-2">
|
||||||
<img
|
<img
|
||||||
src='./images/properties/a2.jpg'
|
src="./images/properties/a2.jpg"
|
||||||
alt=''
|
alt=""
|
||||||
class='object-cover h-[400px] w-full rounded-xl cursor-pointer' />
|
class="object-cover h-[400px] w-full rounded-xl cursor-pointer"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div class='col-span-2'>
|
<div class="col-span-2">
|
||||||
<img
|
<img
|
||||||
src='./images/properties/a3.jpg'
|
src="./images/properties/a3.jpg"
|
||||||
alt=''
|
alt=""
|
||||||
class='object-cover h-[400px] w-full rounded-xl cursor-pointer' />
|
class="object-cover h-[400px] w-full rounded-xl cursor-pointer"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div class='col-span-2'>
|
<div class="col-span-2">
|
||||||
<img
|
<img
|
||||||
src='./images/properties/a4.jpg'
|
src="./images/properties/a4.jpg"
|
||||||
alt=''
|
alt=""
|
||||||
class='object-cover h-[400px] w-full rounded-xl cursor-pointer' />
|
class="object-cover h-[400px] w-full rounded-xl cursor-pointer"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -228,7 +228,7 @@
|
|||||||
<i class="fas fa-trash text-red-600"></i>
|
<i class="fas fa-trash text-red-600"></i>
|
||||||
</button>
|
</button>
|
||||||
<img
|
<img
|
||||||
src="images/properties/a1.jpg"
|
src="/images/properties/images[0]"
|
||||||
alt=""
|
alt=""
|
||||||
class="object-cover rounded-t-xl"
|
class="object-cover rounded-t-xl"
|
||||||
/>
|
/>
|
||||||
@@ -292,7 +292,7 @@
|
|||||||
<i class="fas fa-trash text-red-600"></i>
|
<i class="fas fa-trash text-red-600"></i>
|
||||||
</button>
|
</button>
|
||||||
<img
|
<img
|
||||||
src="images/properties/b1.jpg"
|
src="/images/properties/images[0]"
|
||||||
alt=""
|
alt=""
|
||||||
class="object-cover rounded-t-xl"
|
class="object-cover rounded-t-xl"
|
||||||
/>
|
/>
|
||||||
|
|||||||
@@ -25,7 +25,8 @@ const PropertyPage = async ({ params }) => {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<PropertyHeaderImage image={property.images[0]} />
|
<PropertyHeaderImage image="/images/properties/images[0]"
|
||||||
|
/>
|
||||||
<section>
|
<section>
|
||||||
<div className='container m-auto py-6 px-6'>
|
<div className='container m-auto py-6 px-6'>
|
||||||
<Link
|
<Link
|
||||||
@@ -50,7 +51,8 @@ const PropertyPage = async ({ params }) => {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
<PropertyImages images={property.images} />
|
<PropertyImages images="/images/properties/images[0]"
|
||||||
|
/>
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ const SearchResultsPage = async ({
|
|||||||
}
|
}
|
||||||
|
|
||||||
const propertiesQueryResults = await Property.find(query).lean();
|
const propertiesQueryResults = await Property.find(query).lean();
|
||||||
const properties = convertToSerializeableObject(propertiesQueryResults);
|
const properties = propertiesQueryResults.map(convertToSerializeableObject);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
|
|||||||
|
After Width: | Height: | Size: 122 KiB |
|
After Width: | Height: | Size: 178 KiB |
|
After Width: | Height: | Size: 150 KiB |
|
After Width: | Height: | Size: 94 KiB |
|
After Width: | Height: | Size: 142 KiB |
|
After Width: | Height: | Size: 145 KiB |
|
After Width: | Height: | Size: 163 KiB |
|
After Width: | Height: | Size: 192 KiB |
|
After Width: | Height: | Size: 117 KiB |
|
After Width: | Height: | Size: 97 KiB |
|
After Width: | Height: | Size: 68 KiB |
|
After Width: | Height: | Size: 260 KiB |
|
After Width: | Height: | Size: 188 KiB |
|
After Width: | Height: | Size: 231 KiB |
|
After Width: | Height: | Size: 115 KiB |
|
After Width: | Height: | Size: 96 KiB |
|
After Width: | Height: | Size: 70 KiB |
|
After Width: | Height: | Size: 117 KiB |
|
After Width: | Height: | Size: 360 KiB |
|
After Width: | Height: | Size: 140 KiB |
|
After Width: | Height: | Size: 114 KiB |
|
After Width: | Height: | Size: 150 KiB |
|
After Width: | Height: | Size: 125 KiB |
|
After Width: | Height: | Size: 144 KiB |
|
After Width: | Height: | Size: 108 KiB |
|
After Width: | Height: | Size: 260 KiB |
|
After Width: | Height: | Size: 185 KiB |
|
After Width: | Height: | Size: 110 KiB |
|
After Width: | Height: | Size: 216 KiB |
|
After Width: | Height: | Size: 149 KiB |
|
After Width: | Height: | Size: 61 KiB |
|
After Width: | Height: | Size: 215 KiB |
|
After Width: | Height: | Size: 118 KiB |
|
After Width: | Height: | Size: 124 KiB |
@@ -24,7 +24,7 @@ const FeaturedPropertyCard = ({ property }) => {
|
|||||||
return (
|
return (
|
||||||
<div className='bg-white rounded-xl shadow-md relative flex flex-col md:flex-row'>
|
<div className='bg-white rounded-xl shadow-md relative flex flex-col md:flex-row'>
|
||||||
<Image
|
<Image
|
||||||
src={property.images[0]}
|
src="/images/properties/images[0]"
|
||||||
alt=''
|
alt=''
|
||||||
width={0}
|
width={0}
|
||||||
height={0}
|
height={0}
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ const ProfileProperties = ({ properties: initialProperties }) => {
|
|||||||
<Link href={`/properties/${property._id}`}>
|
<Link href={`/properties/${property._id}`}>
|
||||||
<Image
|
<Image
|
||||||
className='h-32 w-full rounded-md object-cover'
|
className='h-32 w-full rounded-md object-cover'
|
||||||
src={property.images[0]}
|
src="/images/properties/images[0]"
|
||||||
alt=''
|
alt=''
|
||||||
width={500}
|
width={500}
|
||||||
height={100}
|
height={100}
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ const PropertyCard = ({ property }) => {
|
|||||||
return (
|
return (
|
||||||
<div className='rounded-xl shadow-md relative'>
|
<div className='rounded-xl shadow-md relative'>
|
||||||
<Image
|
<Image
|
||||||
src={property.images[0]}
|
src={property.images}
|
||||||
alt=''
|
alt=''
|
||||||
height={0}
|
height={0}
|
||||||
width={0}
|
width={0}
|
||||||
|
|||||||
@@ -1,23 +1,10 @@
|
|||||||
'use client';
|
'use client';
|
||||||
import { useEffect } from 'react';
|
import { useEffect } from 'react';
|
||||||
import { useFormState, useFormStatus } from 'react-dom';
|
import { useFormState } from 'react-dom';
|
||||||
import { useSession } from 'next-auth/react';
|
import { useSession } from 'next-auth/react';
|
||||||
import { toast } from 'react-toastify';
|
import { toast } from 'react-toastify';
|
||||||
import addMessage from '@/app/actions/addMessage';
|
import addMessage from '@/app/actions/addMessage';
|
||||||
import { FaPaperPlane } from 'react-icons/fa';
|
import SubmitMessageButton from './SubmitMessageButton';
|
||||||
|
|
||||||
const SubmitMessageButton = () => {
|
|
||||||
const status = useFormStatus();
|
|
||||||
return (
|
|
||||||
<button
|
|
||||||
className='bg-blue-500 hover:bg-blue-600 text-white font-bold py-2 px-4 rounded-full w-full focus:outline-none focus:shadow-outline flex items-center justify-center'
|
|
||||||
type='submit'
|
|
||||||
>
|
|
||||||
<FaPaperPlane className='mr-2' />{' '}
|
|
||||||
{status.pending ? 'Sending...' : 'Send Message'}
|
|
||||||
</button>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
const PropertyContactForm = ({ property }) => {
|
const PropertyContactForm = ({ property }) => {
|
||||||
const { data: session } = useSession();
|
const { data: session } = useSession();
|
||||||
|
|||||||
@@ -0,0 +1,18 @@
|
|||||||
|
import { useFormStatus } from 'react-dom';
|
||||||
|
import { FaPaperPlane } from 'react-icons/fa';
|
||||||
|
|
||||||
|
const SubmitMessageButton = () => {
|
||||||
|
const { pending } = useFormStatus();
|
||||||
|
return (
|
||||||
|
<button
|
||||||
|
className='bg-blue-500 hover:bg-blue-600 text-white font-bold py-2 px-4 rounded-full w-full focus:outline-none focus:shadow-outline flex items-center justify-center'
|
||||||
|
type='submit'
|
||||||
|
disabled={pending}
|
||||||
|
>
|
||||||
|
<FaPaperPlane className='mr-2' />{' '}
|
||||||
|
{pending ? 'Sending...' : 'Send Message'}
|
||||||
|
</button>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default SubmitMessageButton;
|
||||||
@@ -1357,6 +1357,7 @@
|
|||||||
"resolved": "https://registry.npmjs.org/mapbox-gl/-/mapbox-gl-3.5.1.tgz",
|
"resolved": "https://registry.npmjs.org/mapbox-gl/-/mapbox-gl-3.5.1.tgz",
|
||||||
"integrity": "sha512-sf4N18vl5FHS8lPRWZjTZShgIziDqSxan3MazHClvYYXezsAPn6hApRvAS2HEMTq7MXzRcvvt4sYgQWLubwnBw==",
|
"integrity": "sha512-sf4N18vl5FHS8lPRWZjTZShgIziDqSxan3MazHClvYYXezsAPn6hApRvAS2HEMTq7MXzRcvvt4sYgQWLubwnBw==",
|
||||||
"license": "SEE LICENSE IN LICENSE.txt",
|
"license": "SEE LICENSE IN LICENSE.txt",
|
||||||
|
"peer": true,
|
||||||
"workspaces": [
|
"workspaces": [
|
||||||
"src/style-spec"
|
"src/style-spec"
|
||||||
],
|
],
|
||||||
@@ -1887,6 +1888,7 @@
|
|||||||
"resolved": "https://registry.npmjs.org/photoswipe/-/photoswipe-5.4.4.tgz",
|
"resolved": "https://registry.npmjs.org/photoswipe/-/photoswipe-5.4.4.tgz",
|
||||||
"integrity": "sha512-WNFHoKrkZNnvFFhbHL93WDkW3ifwVOXSW3w1UuZZelSmgXpIGiZSNlZJq37rR8YejqME2rHs9EhH9ZvlvFH2NA==",
|
"integrity": "sha512-WNFHoKrkZNnvFFhbHL93WDkW3ifwVOXSW3w1UuZZelSmgXpIGiZSNlZJq37rR8YejqME2rHs9EhH9ZvlvFH2NA==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
|
"peer": true,
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">= 0.12.0"
|
"node": ">= 0.12.0"
|
||||||
}
|
}
|
||||||
@@ -1950,6 +1952,7 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
|
"peer": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"nanoid": "^3.3.7",
|
"nanoid": "^3.3.7",
|
||||||
"picocolors": "^1.0.1",
|
"picocolors": "^1.0.1",
|
||||||
@@ -2098,6 +2101,7 @@
|
|||||||
"resolved": "https://registry.npmjs.org/preact/-/preact-10.22.1.tgz",
|
"resolved": "https://registry.npmjs.org/preact/-/preact-10.22.1.tgz",
|
||||||
"integrity": "sha512-jRYbDDgMpIb5LHq3hkI0bbl+l/TQ9UnkdQ0ww+lp+4MMOdqaUYdFc5qeyP+IV8FAd/2Em7drVPeKdQxsiWCf/A==",
|
"integrity": "sha512-jRYbDDgMpIb5LHq3hkI0bbl+l/TQ9UnkdQ0ww+lp+4MMOdqaUYdFc5qeyP+IV8FAd/2Em7drVPeKdQxsiWCf/A==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
|
"peer": true,
|
||||||
"funding": {
|
"funding": {
|
||||||
"type": "opencollective",
|
"type": "opencollective",
|
||||||
"url": "https://opencollective.com/preact"
|
"url": "https://opencollective.com/preact"
|
||||||
@@ -2191,6 +2195,7 @@
|
|||||||
"resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz",
|
"resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz",
|
||||||
"integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==",
|
"integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
|
"peer": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"loose-envify": "^1.1.0"
|
"loose-envify": "^1.1.0"
|
||||||
},
|
},
|
||||||
@@ -2203,6 +2208,7 @@
|
|||||||
"resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz",
|
"resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz",
|
||||||
"integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==",
|
"integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
|
"peer": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"loose-envify": "^1.1.0",
|
"loose-envify": "^1.1.0",
|
||||||
"scheduler": "^0.23.2"
|
"scheduler": "^0.23.2"
|
||||||
@@ -2230,8 +2236,7 @@
|
|||||||
"version": "16.13.1",
|
"version": "16.13.1",
|
||||||
"resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
|
"resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
|
||||||
"integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
|
"integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
|
||||||
"license": "MIT",
|
"license": "MIT"
|
||||||
"peer": true
|
|
||||||
},
|
},
|
||||||
"node_modules/react-map-gl": {
|
"node_modules/react-map-gl": {
|
||||||
"version": "7.1.7",
|
"version": "7.1.7",
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
[
|
[
|
||||||
{
|
{
|
||||||
|
"_id": "1",
|
||||||
"owner": "1",
|
"owner": "1",
|
||||||
"name": "Boston Commons Retreat",
|
"name": "Boston Commons Retreat",
|
||||||
"type": "Apartment",
|
"type": "Apartment",
|
||||||
@@ -38,12 +39,13 @@
|
|||||||
"email": "john@gmail.com",
|
"email": "john@gmail.com",
|
||||||
"phone": "617-555-5555"
|
"phone": "617-555-5555"
|
||||||
},
|
},
|
||||||
"images": ["a1.jpg", "a2.jpg", "a3.jpg"],
|
"images": ["a4.jpg", "a2.jpg", "a3.jpg"],
|
||||||
"is_featured": false,
|
"is_featured": false,
|
||||||
"createdAt": "2024-01-01T00:00:00.000Z",
|
"createdAt": "2024-01-01T00:00:00.000Z",
|
||||||
"updatedAt": "2024-01-01T00:00:00.000Z"
|
"updatedAt": "2024-01-01T00:00:00.000Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"_id": "2",
|
||||||
"owner": "1",
|
"owner": "1",
|
||||||
"name": "Cozy Downtown Loft",
|
"name": "Cozy Downtown Loft",
|
||||||
"type": "Apartment",
|
"type": "Apartment",
|
||||||
@@ -87,6 +89,7 @@
|
|||||||
"updatedAt": "2024-01-02T00:00:00.000Z"
|
"updatedAt": "2024-01-02T00:00:00.000Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"_id": "3",
|
||||||
"owner": "2",
|
"owner": "2",
|
||||||
"name": "Luxury Condo with a View",
|
"name": "Luxury Condo with a View",
|
||||||
"type": "Condo",
|
"type": "Condo",
|
||||||
@@ -132,6 +135,7 @@
|
|||||||
"updatedAt": "2024-01-03T00:00:00.000Z"
|
"updatedAt": "2024-01-03T00:00:00.000Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"_id": "4",
|
||||||
"owner": "2",
|
"owner": "2",
|
||||||
"name": "Charming Cottage Getaway",
|
"name": "Charming Cottage Getaway",
|
||||||
"type": "Cottage Or Cabin",
|
"type": "Cottage Or Cabin",
|
||||||
@@ -165,6 +169,7 @@
|
|||||||
"updatedAt": "2024-01-04T00:00:00.000Z"
|
"updatedAt": "2024-01-04T00:00:00.000Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"_id": "5",
|
||||||
"owner": "3",
|
"owner": "3",
|
||||||
"name": "Modern Downtown Studio",
|
"name": "Modern Downtown Studio",
|
||||||
"type": "Studio",
|
"type": "Studio",
|
||||||
@@ -200,6 +205,7 @@
|
|||||||
"updatedAt": "2024-01-05T00:00:00.000Z"
|
"updatedAt": "2024-01-05T00:00:00.000Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"_id": "6",
|
||||||
"owner": "3",
|
"owner": "3",
|
||||||
"name": "Seaside Retreat",
|
"name": "Seaside Retreat",
|
||||||
"type": "House",
|
"type": "House",
|
||||||
@@ -235,6 +241,7 @@
|
|||||||
"updatedAt": "2024-01-06T00:00:00.000Z"
|
"updatedAt": "2024-01-06T00:00:00.000Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"_id": "7",
|
||||||
"owner": "4",
|
"owner": "4",
|
||||||
"name": "Rustic Cabin in the Woods",
|
"name": "Rustic Cabin in the Woods",
|
||||||
"type": "Cottage Or Cabin",
|
"type": "Cottage Or Cabin",
|
||||||
@@ -269,6 +276,7 @@
|
|||||||
"updatedAt": "2024-01-07T00:00:00.000Z"
|
"updatedAt": "2024-01-07T00:00:00.000Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"_id": "8",
|
||||||
"owner": "5",
|
"owner": "5",
|
||||||
"name": "Ski-In/Ski-Out Chalet",
|
"name": "Ski-In/Ski-Out Chalet",
|
||||||
"type": "Chalet",
|
"type": "Chalet",
|
||||||
@@ -303,6 +311,7 @@
|
|||||||
"updatedAt": "2024-01-08T00:00:00.000Z"
|
"updatedAt": "2024-01-08T00:00:00.000Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"_id": "9",
|
||||||
"owner": "6",
|
"owner": "6",
|
||||||
"name": "Mountain View Retreat",
|
"name": "Mountain View Retreat",
|
||||||
"type": "House",
|
"type": "House",
|
||||||
@@ -338,6 +347,7 @@
|
|||||||
"updatedAt": "2024-01-09T00:00:00.000Z"
|
"updatedAt": "2024-01-09T00:00:00.000Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"_id": "10",
|
||||||
"owner": "7",
|
"owner": "7",
|
||||||
"name": "Historic Downtown Loft",
|
"name": "Historic Downtown Loft",
|
||||||
"type": "Apartment",
|
"type": "Apartment",
|
||||||
|
|||||||
@@ -0,0 +1,374 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"owner": "1",
|
||||||
|
"name": "Boston Commons Retreat",
|
||||||
|
"type": "Apartment",
|
||||||
|
"description": "This is a beautiful apartment located near the commons. It is a 2 bedroom apartment with a full kitchen and bathroom. It is available for weekly or monthly rentals.",
|
||||||
|
"location": {
|
||||||
|
"street": "120 Tremont Street",
|
||||||
|
"city": "Boston",
|
||||||
|
"state": "MA",
|
||||||
|
"zipcode": "02108"
|
||||||
|
},
|
||||||
|
"beds": 2,
|
||||||
|
"baths": 1,
|
||||||
|
"square_feet": 1500,
|
||||||
|
"amenities": [
|
||||||
|
"Wifi",
|
||||||
|
"Full kitchen",
|
||||||
|
"Washer & Dryer",
|
||||||
|
"Free Parking",
|
||||||
|
"Hot Tub",
|
||||||
|
"24/7 Security",
|
||||||
|
"Wheelchair Accessible",
|
||||||
|
"Elevator Access",
|
||||||
|
"Dishwasher",
|
||||||
|
"Gym/Fitness Center",
|
||||||
|
"Air Conditioning",
|
||||||
|
"Balcony/Patio",
|
||||||
|
"Smart TV",
|
||||||
|
"Coffee Maker"
|
||||||
|
],
|
||||||
|
"rates": {
|
||||||
|
"weekly": 1100,
|
||||||
|
"monthly": 4200
|
||||||
|
},
|
||||||
|
"seller_info": {
|
||||||
|
"name": "John Doe",
|
||||||
|
"email": "john@gmail.com",
|
||||||
|
"phone": "617-555-5555"
|
||||||
|
},
|
||||||
|
"images": ["a4.jpg", "a2.jpg", "a3.jpg"],
|
||||||
|
"is_featured": false,
|
||||||
|
"createdAt": "2024-01-01T00:00:00.000Z",
|
||||||
|
"updatedAt": "2024-01-01T00:00:00.000Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"owner": "1",
|
||||||
|
"name": "Cozy Downtown Loft",
|
||||||
|
"type": "Apartment",
|
||||||
|
"description": "A cozy downtown loft with great city views.",
|
||||||
|
"location": {
|
||||||
|
"street": "45 Main Street",
|
||||||
|
"city": "New York",
|
||||||
|
"state": "NY",
|
||||||
|
"zipcode": "10001"
|
||||||
|
},
|
||||||
|
"beds": 1,
|
||||||
|
"baths": 1,
|
||||||
|
"square_feet": 1800,
|
||||||
|
"amenities": [
|
||||||
|
"Wifi",
|
||||||
|
"Full kitchen",
|
||||||
|
"Washer & Dryer",
|
||||||
|
"Free Parking",
|
||||||
|
"Hot Tub",
|
||||||
|
"24/7 Security",
|
||||||
|
"Wheelchair Accessible",
|
||||||
|
"Elevator Access",
|
||||||
|
"Dishwasher",
|
||||||
|
"High-Speed Internet",
|
||||||
|
"Air Conditioning",
|
||||||
|
"Smart TV",
|
||||||
|
"Outdoor Grill/BBQ"
|
||||||
|
],
|
||||||
|
"rates": {
|
||||||
|
"weekly": 1000,
|
||||||
|
"monthly": 4000
|
||||||
|
},
|
||||||
|
"seller_info": {
|
||||||
|
"name": "Jane Smith",
|
||||||
|
"email": "jane@gmail.com",
|
||||||
|
"phone": "212-555-5555"
|
||||||
|
},
|
||||||
|
"images": ["b1.jpg", "b2.jpg", "b3.jpg"],
|
||||||
|
"is_featured": false,
|
||||||
|
"createdAt": "2024-01-02T00:00:00.000Z",
|
||||||
|
"updatedAt": "2024-01-02T00:00:00.000Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"owner": "2",
|
||||||
|
"name": "Luxury Condo with a View",
|
||||||
|
"type": "Condo",
|
||||||
|
"description": "Experience luxury in this stunning condo with breathtaking views.",
|
||||||
|
"location": {
|
||||||
|
"street": "500 Lux Lane",
|
||||||
|
"city": "Los Angeles",
|
||||||
|
"state": "CA",
|
||||||
|
"zipcode": "90001"
|
||||||
|
},
|
||||||
|
"beds": 3,
|
||||||
|
"baths": 2,
|
||||||
|
"square_feet": 2200,
|
||||||
|
"amenities": [
|
||||||
|
"Wifi",
|
||||||
|
"Full kitchen",
|
||||||
|
"Washer & Dryer",
|
||||||
|
"Free Parking",
|
||||||
|
"Hot Tub",
|
||||||
|
"24/7 Security",
|
||||||
|
"Wheelchair Accessible",
|
||||||
|
"Elevator Access",
|
||||||
|
"Dishwasher",
|
||||||
|
"Swimming Pool",
|
||||||
|
"Gym/Fitness Center",
|
||||||
|
"Air Conditioning",
|
||||||
|
"Smart TV",
|
||||||
|
"Coffee Maker"
|
||||||
|
],
|
||||||
|
"rates": {
|
||||||
|
"nightly": 200,
|
||||||
|
"weekly": 750,
|
||||||
|
"monthly": 3300
|
||||||
|
},
|
||||||
|
"seller_info": {
|
||||||
|
"name": "David Johnson",
|
||||||
|
"email": "david@gmail.com",
|
||||||
|
"phone": "213-555-5555"
|
||||||
|
},
|
||||||
|
"images": ["c1.jpg", "c2.jpg", "c3.jpg"],
|
||||||
|
"is_featured": false,
|
||||||
|
"createdAt": "2024-01-03T00:00:00.000Z",
|
||||||
|
"updatedAt": "2024-01-03T00:00:00.000Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"owner": "2",
|
||||||
|
"name": "Charming Cottage Getaway",
|
||||||
|
"type": "Cottage Or Cabin",
|
||||||
|
"description": "Escape to this charming cottage for a peaceful retreat.",
|
||||||
|
"location": {
|
||||||
|
"street": "123 Countryside Lane",
|
||||||
|
"city": "Austin",
|
||||||
|
"state": "TX",
|
||||||
|
"zipcode": "78701"
|
||||||
|
},
|
||||||
|
"beds": 1,
|
||||||
|
"baths": 1,
|
||||||
|
"square_feet": 900,
|
||||||
|
"amenities": [
|
||||||
|
"Fireplace",
|
||||||
|
"Outdoor Grill/BBQ",
|
||||||
|
"Balcony/Patio",
|
||||||
|
"Coffee Maker"
|
||||||
|
],
|
||||||
|
"rates": {
|
||||||
|
"weekly": 2000
|
||||||
|
},
|
||||||
|
"seller_info": {
|
||||||
|
"name": "Emily Davis",
|
||||||
|
"email": "emily@gmail.com",
|
||||||
|
"phone": "512-555-5555"
|
||||||
|
},
|
||||||
|
"images": ["d1.jpg", "d2.jpg", "d3.jpg"],
|
||||||
|
"is_featured": false,
|
||||||
|
"createdAt": "2024-01-04T00:00:00.000Z",
|
||||||
|
"updatedAt": "2024-01-04T00:00:00.000Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"owner": "3",
|
||||||
|
"name": "Modern Downtown Studio",
|
||||||
|
"type": "Studio",
|
||||||
|
"description": "Stay in style in this modern downtown studio apartment.",
|
||||||
|
"location": {
|
||||||
|
"street": "75 Urban Avenue",
|
||||||
|
"city": "Chicago",
|
||||||
|
"state": "IL",
|
||||||
|
"zipcode": "60601"
|
||||||
|
},
|
||||||
|
"beds": 1,
|
||||||
|
"baths": 1,
|
||||||
|
"square_feet": 900,
|
||||||
|
"amenities": [
|
||||||
|
"High-Speed Internet",
|
||||||
|
"Smart TV",
|
||||||
|
"Air Conditioning",
|
||||||
|
"Gym/Fitness Center",
|
||||||
|
"Outdoor Grill/BBQ"
|
||||||
|
],
|
||||||
|
"rates": {
|
||||||
|
"weekly": 1100,
|
||||||
|
"monthly": 4200
|
||||||
|
},
|
||||||
|
"seller_info": {
|
||||||
|
"name": "Michael Brown",
|
||||||
|
"email": "michael@gmail.com",
|
||||||
|
"phone": "312-555-5555"
|
||||||
|
},
|
||||||
|
"images": ["e1.jpg", "e2.jpg", "e3.jpg"],
|
||||||
|
"is_featured": true,
|
||||||
|
"createdAt": "2024-01-05T00:00:00.000Z",
|
||||||
|
"updatedAt": "2024-01-05T00:00:00.000Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"owner": "3",
|
||||||
|
"name": "Seaside Retreat",
|
||||||
|
"type": "House",
|
||||||
|
"description": "Escape to this seaside house for a relaxing getaway.",
|
||||||
|
"location": {
|
||||||
|
"street": "456 Oceanfront Drive",
|
||||||
|
"city": "Miami",
|
||||||
|
"state": "FL",
|
||||||
|
"zipcode": "33101"
|
||||||
|
},
|
||||||
|
"beds": 4,
|
||||||
|
"baths": 3,
|
||||||
|
"square_feet": 2800,
|
||||||
|
"amenities": [
|
||||||
|
"Beach Access",
|
||||||
|
"Swimming Pool",
|
||||||
|
"Balcony/Patio",
|
||||||
|
"Smart TV",
|
||||||
|
"Outdoor Grill/BBQ"
|
||||||
|
],
|
||||||
|
"rates": {
|
||||||
|
"nightly": 500,
|
||||||
|
"weekly": 2500
|
||||||
|
},
|
||||||
|
"seller_info": {
|
||||||
|
"name": "Sarah Wilson",
|
||||||
|
"email": "sarah@gmail.com",
|
||||||
|
"phone": "305-555-5555"
|
||||||
|
},
|
||||||
|
"images": ["f1.jpg", "f2.jpg", "f3.jpg"],
|
||||||
|
"is_featured": true,
|
||||||
|
"createdAt": "2024-01-06T00:00:00.000Z",
|
||||||
|
"updatedAt": "2024-01-06T00:00:00.000Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"owner": "4",
|
||||||
|
"name": "Rustic Cabin in the Woods",
|
||||||
|
"type": "Cottage Or Cabin",
|
||||||
|
"description": "Experience nature in this cozy rustic cabin.",
|
||||||
|
"location": {
|
||||||
|
"street": "789 Forest Lane",
|
||||||
|
"city": "Denver",
|
||||||
|
"state": "CO",
|
||||||
|
"zipcode": "80201"
|
||||||
|
},
|
||||||
|
"beds": 2,
|
||||||
|
"baths": 1,
|
||||||
|
"square_feet": 1100,
|
||||||
|
"amenities": [
|
||||||
|
"Fireplace",
|
||||||
|
"Outdoor Grill/BBQ",
|
||||||
|
"Hiking Trails Access",
|
||||||
|
"Pet-Friendly"
|
||||||
|
],
|
||||||
|
"rates": {
|
||||||
|
"nightly": 475,
|
||||||
|
"weekly": 2000
|
||||||
|
},
|
||||||
|
"seller_info": {
|
||||||
|
"name": "Robert Anderson",
|
||||||
|
"email": "robert@gmail.com",
|
||||||
|
"phone": "303-555-5555"
|
||||||
|
},
|
||||||
|
"images": ["g1.jpg", "g2.jpg", "g3.jpg"],
|
||||||
|
"is_featured": false,
|
||||||
|
"createdAt": "2024-01-07T00:00:00.000Z",
|
||||||
|
"updatedAt": "2024-01-07T00:00:00.000Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"owner": "5",
|
||||||
|
"name": "Ski-In/Ski-Out Chalet",
|
||||||
|
"type": "Chalet",
|
||||||
|
"description": "Hit the slopes from this cozy ski-in/ski-out chalet.",
|
||||||
|
"location": {
|
||||||
|
"street": "321 Mountain Road",
|
||||||
|
"city": "Aspen",
|
||||||
|
"state": "CO",
|
||||||
|
"zipcode": "81611"
|
||||||
|
},
|
||||||
|
"beds": 3,
|
||||||
|
"baths": 2,
|
||||||
|
"square_feet": 1800,
|
||||||
|
"amenities": [
|
||||||
|
"Ski Equipment Storage",
|
||||||
|
"Fireplace",
|
||||||
|
"Balcony/Patio",
|
||||||
|
"Smart TV"
|
||||||
|
],
|
||||||
|
"rates": {
|
||||||
|
"nightly": 300,
|
||||||
|
"weekly": 1100
|
||||||
|
},
|
||||||
|
"seller_info": {
|
||||||
|
"name": "Jennifer Martin",
|
||||||
|
"email": "jennifer@gmail.com",
|
||||||
|
"phone": "970-555-5555"
|
||||||
|
},
|
||||||
|
"images": ["h1.jpg", "h2.jpg", "h3.jpg"],
|
||||||
|
"is_featured": false,
|
||||||
|
"createdAt": "2024-01-08T00:00:00.000Z",
|
||||||
|
"updatedAt": "2024-01-08T00:00:00.000Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"owner": "6",
|
||||||
|
"name": "Mountain View Retreat",
|
||||||
|
"type": "House",
|
||||||
|
"description": "Enjoy stunning mountain views from this spacious retreat.",
|
||||||
|
"location": {
|
||||||
|
"street": "600 Summit Drive",
|
||||||
|
"city": "Boulder",
|
||||||
|
"state": "CO",
|
||||||
|
"zipcode": "80301"
|
||||||
|
},
|
||||||
|
"beds": 4,
|
||||||
|
"baths": 3,
|
||||||
|
"square_feet": 2400,
|
||||||
|
"amenities": [
|
||||||
|
"Mountain View",
|
||||||
|
"Hiking Trails Access",
|
||||||
|
"Air Conditioning",
|
||||||
|
"Smart TV",
|
||||||
|
"Outdoor Grill/BBQ"
|
||||||
|
],
|
||||||
|
"rates": {
|
||||||
|
"weekly": 1000,
|
||||||
|
"monthly": 3800
|
||||||
|
},
|
||||||
|
"seller_info": {
|
||||||
|
"name": "Lisa Taylor",
|
||||||
|
"email": "lisa@gmail.com",
|
||||||
|
"phone": "303-555-5555"
|
||||||
|
},
|
||||||
|
"images": ["i1.jpg", "i2.jpg", "i3.jpg"],
|
||||||
|
"is_featured": false,
|
||||||
|
"createdAt": "2024-01-09T00:00:00.000Z",
|
||||||
|
"updatedAt": "2024-01-09T00:00:00.000Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"owner": "7",
|
||||||
|
"name": "Historic Downtown Loft",
|
||||||
|
"type": "Apartment",
|
||||||
|
"description": "Step back in time with a stay in this historic downtown loft.",
|
||||||
|
"location": {
|
||||||
|
"street": "123 History Lane",
|
||||||
|
"city": "Philadelphia",
|
||||||
|
"state": "PA",
|
||||||
|
"zipcode": "19101"
|
||||||
|
},
|
||||||
|
"beds": 2,
|
||||||
|
"baths": 1,
|
||||||
|
"square_feet": 1200,
|
||||||
|
"amenities": [
|
||||||
|
"High-Speed Internet",
|
||||||
|
"Air Conditioning",
|
||||||
|
"Smart TV",
|
||||||
|
"Coffee Maker"
|
||||||
|
],
|
||||||
|
"rates": {
|
||||||
|
"weekly": 550,
|
||||||
|
"monthly": 2100
|
||||||
|
},
|
||||||
|
"seller_info": {
|
||||||
|
"name": "Matthew Harris",
|
||||||
|
"email": "matthew@gmail.com",
|
||||||
|
"phone": "215-555-5555"
|
||||||
|
},
|
||||||
|
"images": ["j1.jpg", "j2.jpg", "j3.jpg"],
|
||||||
|
"is_featured": false,
|
||||||
|
"createdAt": "2024-01-10T00:00:00.000Z",
|
||||||
|
"updatedAt": "2024-01-10T00:00:00.000Z"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
After Width: | Height: | Size: 122 KiB |
|
After Width: | Height: | Size: 122 KiB |
|
After Width: | Height: | Size: 178 KiB |
|
After Width: | Height: | Size: 150 KiB |
|
After Width: | Height: | Size: 94 KiB |
|
After Width: | Height: | Size: 142 KiB |
|
After Width: | Height: | Size: 145 KiB |
|
After Width: | Height: | Size: 163 KiB |
|
After Width: | Height: | Size: 192 KiB |
|
After Width: | Height: | Size: 117 KiB |
|
After Width: | Height: | Size: 97 KiB |
|
After Width: | Height: | Size: 68 KiB |
|
After Width: | Height: | Size: 260 KiB |
|
After Width: | Height: | Size: 188 KiB |
|
After Width: | Height: | Size: 231 KiB |
|
After Width: | Height: | Size: 115 KiB |
|
After Width: | Height: | Size: 96 KiB |
|
After Width: | Height: | Size: 70 KiB |
|
After Width: | Height: | Size: 117 KiB |
|
After Width: | Height: | Size: 360 KiB |
|
After Width: | Height: | Size: 140 KiB |
|
After Width: | Height: | Size: 114 KiB |
|
After Width: | Height: | Size: 150 KiB |
|
After Width: | Height: | Size: 125 KiB |
|
After Width: | Height: | Size: 144 KiB |
|
After Width: | Height: | Size: 108 KiB |
|
After Width: | Height: | Size: 260 KiB |
|
After Width: | Height: | Size: 185 KiB |
|
After Width: | Height: | Size: 110 KiB |
|
After Width: | Height: | Size: 216 KiB |
|
After Width: | Height: | Size: 149 KiB |
|
After Width: | Height: | Size: 61 KiB |
|
After Width: | Height: | Size: 215 KiB |
|
After Width: | Height: | Size: 118 KiB |
|
After Width: | Height: | Size: 124 KiB |