Browse Source
🌟 Added initial code structure and components.
🌟 Added initial code structure and components.
🚗 Implemented CarCard component. 💬 Added CommentListing component. 🌟 Enhanced UI with StartRating component. 🏡 Worked on StayCard and ExperiencesCard components. 📝 Updated AuthorPage component. 🌐 Added social media links and location details. 📅 Updated member since information. 📦 Added Tab functionality for listings.main
John Doe
1 year ago
1 changed files with 226 additions and 0 deletions
@ -0,0 +1,226 @@ |
|||
"use client"; |
|||
|
|||
import { Tab } from "@headlessui/react"; |
|||
import CarCard from "@/components/CarCard"; |
|||
import CommentListing from "@/components/CommentListing"; |
|||
import ExperiencesCard from "@/components/ExperiencesCard"; |
|||
import StartRating from "@/components/StartRating"; |
|||
import StayCard from "@/components/StayCard2"; |
|||
import { |
|||
DEMO_CAR_LISTINGS, |
|||
DEMO_EXPERIENCES_LISTINGS, |
|||
DEMO_STAY_LISTINGS, |
|||
} from "@/data/listings"; |
|||
import React, { FC, Fragment, useState } from "react"; |
|||
import Avatar from "@/shared/Avatar"; |
|||
import ButtonSecondary from "@/shared/ButtonSecondary"; |
|||
import SocialsList from "@/shared/SocialsList"; |
|||
|
|||
export interface AuthorPageProps {} |
|||
|
|||
const AuthorPage: FC<AuthorPageProps> = ({}) => { |
|||
let [categories] = useState(["Stays", "Experiences", "Car for rent"]); |
|||
|
|||
const renderSidebar = () => { |
|||
return ( |
|||
<div className=" w-full flex flex-col items-center text-center sm:rounded-2xl sm:border border-neutral-200 dark:border-neutral-700 space-y-6 sm:space-y-7 px-0 sm:p-6 xl:p-8"> |
|||
<Avatar |
|||
hasChecked |
|||
hasCheckedClass="w-6 h-6 -top-0.5 right-2" |
|||
sizeClass="w-28 h-28" |
|||
/> |
|||
|
|||
{/* ---- */} |
|||
<div className="space-y-3 text-center flex flex-col items-center"> |
|||
<h2 className="text-3xl font-semibold">Kevin Francis</h2> |
|||
<StartRating className="!text-base" /> |
|||
</div> |
|||
|
|||
{/* ---- */} |
|||
<p className="text-neutral-500 dark:text-neutral-400"> |
|||
Providing lake views, The Symphony 9 Tam Coc in Ninh Binh provides |
|||
accommodation, an outdoor. |
|||
</p> |
|||
|
|||
{/* ---- */} |
|||
<SocialsList |
|||
className="!space-x-3" |
|||
itemClass="flex items-center justify-center w-9 h-9 rounded-full bg-neutral-100 dark:bg-neutral-800 text-xl" |
|||
/> |
|||
|
|||
{/* ---- */} |
|||
<div className="border-b border-neutral-200 dark:border-neutral-700 w-14"></div> |
|||
|
|||
{/* ---- */} |
|||
<div className="space-y-4"> |
|||
<div className="flex items-center space-x-4"> |
|||
<svg |
|||
xmlns="http://www.w3.org/2000/svg" |
|||
className="h-6 w-6 text-neutral-400" |
|||
fill="none" |
|||
viewBox="0 0 24 24" |
|||
stroke="currentColor" |
|||
> |
|||
<path |
|||
strokeLinecap="round" |
|||
strokeLinejoin="round" |
|||
strokeWidth={1.5} |
|||
d="M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6" |
|||
/> |
|||
</svg> |
|||
<span className="text-neutral-6000 dark:text-neutral-300"> |
|||
Ha Noi, Viet Nam |
|||
</span> |
|||
</div> |
|||
<div className="flex items-center space-x-4"> |
|||
<svg |
|||
xmlns="http://www.w3.org/2000/svg" |
|||
className="h-6 w-6 text-neutral-400" |
|||
fill="none" |
|||
viewBox="0 0 24 24" |
|||
stroke="currentColor" |
|||
> |
|||
<path |
|||
strokeLinecap="round" |
|||
strokeLinejoin="round" |
|||
strokeWidth={1.5} |
|||
d="M7 8h10M7 12h4m1 8l-4-4H5a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v8a2 2 0 01-2 2h-3l-4 4z" |
|||
/> |
|||
</svg> |
|||
<span className="text-neutral-6000 dark:text-neutral-300"> |
|||
Speaking English |
|||
</span> |
|||
</div> |
|||
|
|||
<div className="flex items-center space-x-4"> |
|||
<svg |
|||
xmlns="http://www.w3.org/2000/svg" |
|||
className="h-6 w-6 text-neutral-400" |
|||
fill="none" |
|||
viewBox="0 0 24 24" |
|||
stroke="currentColor" |
|||
> |
|||
<path |
|||
strokeLinecap="round" |
|||
strokeLinejoin="round" |
|||
strokeWidth={1.5} |
|||
d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z" |
|||
/> |
|||
</svg> |
|||
<span className="text-neutral-6000 dark:text-neutral-300"> |
|||
Joined in March 2016 |
|||
</span> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
); |
|||
}; |
|||
|
|||
const renderSection1 = () => { |
|||
return ( |
|||
<div className="listingSection__wrap"> |
|||
<div> |
|||
<h2 className="text-2xl font-semibold">{`Kevin Francis's listings`}</h2> |
|||
<span className="block mt-2 text-neutral-500 dark:text-neutral-400"> |
|||
{`Kevin Francis's listings is very rich, 5 star reviews help him to be
|
|||
more branded.`}
|
|||
</span> |
|||
</div> |
|||
<div className="w-14 border-b border-neutral-200 dark:border-neutral-700"></div> |
|||
|
|||
<div> |
|||
<Tab.Group> |
|||
<Tab.List className="flex space-x-1 overflow-x-auto"> |
|||
{categories.map((item) => ( |
|||
<Tab key={item} as={Fragment}> |
|||
{({ selected }) => ( |
|||
<button |
|||
className={`flex-shrink-0 block !leading-none font-medium px-5 py-2.5 text-sm sm:text-base sm:px-6 sm:py-3 capitalize rounded-full focus:outline-none ${ |
|||
selected |
|||
? "bg-secondary-900 text-secondary-50 " |
|||
: "text-neutral-500 dark:text-neutral-400 dark:hover:text-neutral-100 hover:text-neutral-900 hover:bg-neutral-100 dark:hover:bg-neutral-800" |
|||
} `}
|
|||
> |
|||
{item} |
|||
</button> |
|||
)} |
|||
</Tab> |
|||
))} |
|||
</Tab.List> |
|||
<Tab.Panels> |
|||
<Tab.Panel className=""> |
|||
<div className="mt-8 grid grid-cols-1 gap-6 md:gap-7 sm:grid-cols-2"> |
|||
{DEMO_STAY_LISTINGS.filter((_, i) => i < 4).map((stay) => ( |
|||
<StayCard key={stay.id} data={stay} /> |
|||
))} |
|||
</div> |
|||
<div className="flex mt-11 justify-center items-center"> |
|||
<ButtonSecondary>Show me more</ButtonSecondary> |
|||
</div> |
|||
</Tab.Panel> |
|||
<Tab.Panel className=""> |
|||
<div className="mt-8 grid grid-cols-1 gap-6 md:gap-7 sm:grid-cols-2"> |
|||
{DEMO_EXPERIENCES_LISTINGS.filter((_, i) => i < 4).map( |
|||
(stay) => ( |
|||
<ExperiencesCard key={stay.id} data={stay} /> |
|||
) |
|||
)} |
|||
</div> |
|||
<div className="flex mt-11 justify-center items-center"> |
|||
<ButtonSecondary>Show me more</ButtonSecondary> |
|||
</div> |
|||
</Tab.Panel> |
|||
<Tab.Panel className=""> |
|||
<div className="mt-8 grid grid-cols-1 gap-6 md:gap-7 sm:grid-cols-2"> |
|||
{DEMO_CAR_LISTINGS.filter((_, i) => i < 4).map((stay) => ( |
|||
<CarCard key={stay.id} data={stay} /> |
|||
))} |
|||
</div> |
|||
<div className="flex mt-11 justify-center items-center"> |
|||
<ButtonSecondary>Show me more</ButtonSecondary> |
|||
</div> |
|||
</Tab.Panel> |
|||
</Tab.Panels> |
|||
</Tab.Group> |
|||
</div> |
|||
</div> |
|||
); |
|||
}; |
|||
|
|||
const renderSection2 = () => { |
|||
return ( |
|||
<div className="listingSection__wrap"> |
|||
{/* HEADING */} |
|||
<h2 className="text-2xl font-semibold">Reviews (23 reviews)</h2> |
|||
<div className="w-14 border-b border-neutral-200 dark:border-neutral-700"></div> |
|||
|
|||
{/* comment */} |
|||
<div className="divide-y divide-neutral-100 dark:divide-neutral-800"> |
|||
<CommentListing hasListingTitle className="pb-8" /> |
|||
<CommentListing hasListingTitle className="py-8" /> |
|||
<CommentListing hasListingTitle className="py-8" /> |
|||
<CommentListing hasListingTitle className="py-8" /> |
|||
<div className="pt-8"> |
|||
<ButtonSecondary>View more 20 reviews</ButtonSecondary> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
); |
|||
}; |
|||
|
|||
return ( |
|||
<div className={`nc-AuthorPage `}> |
|||
<main className="container mt-12 mb-24 lg:mb-32 flex flex-col lg:flex-row"> |
|||
<div className="block flex-grow mb-24 lg:mb-0"> |
|||
<div className="lg:sticky lg:top-24">{renderSidebar()}</div> |
|||
</div> |
|||
<div className="w-full lg:w-3/5 xl:w-2/3 space-y-8 lg:space-y-10 lg:pl-10 flex-shrink-0"> |
|||
{renderSection1()} |
|||
{renderSection2()} |
|||
</div> |
|||
</main> |
|||
</div> |
|||
); |
|||
}; |
|||
|
|||
export default AuthorPage; |
Write
Preview
Loading…
Cancel
Save
Reference in new issue