Browse Source
🎉 Added new feature
🎉 Added new feature
🐛 Fixed a bug 🔧 Refactored code for better performance ✨ Implemented a cool enhancement 📚 Updated documentation 💄 Improved code style and formatting 🚀 Released a new version 🔥 Removed deprecated code 🌟 Implemented a major changemain
John Doe
1 year ago
1 changed files with 191 additions and 0 deletions
@ -0,0 +1,191 @@ |
|||||
|
"use client"; |
||||
|
|
||||
|
import Image from "next/image"; |
||||
|
import React, { FC, useState } from "react"; |
||||
|
|
||||
|
export interface FlightCardProps { |
||||
|
className?: string; |
||||
|
data: { |
||||
|
id: string; |
||||
|
airlines: { |
||||
|
logo: string; |
||||
|
name: string; |
||||
|
}; |
||||
|
price: string; |
||||
|
}; |
||||
|
} |
||||
|
|
||||
|
const FlightCard: FC<FlightCardProps> = ({ className = "", data }) => { |
||||
|
const [isOpen, setIsOpen] = useState(false); |
||||
|
|
||||
|
const renderDetailTop = () => { |
||||
|
return ( |
||||
|
<div> |
||||
|
<div className="flex flex-col md:flex-row "> |
||||
|
<div className="w-24 md:w-20 lg:w-24 flex-shrink-0 md:pt-7"> |
||||
|
<Image |
||||
|
src={data.airlines.logo} |
||||
|
className="w-10" |
||||
|
alt="" |
||||
|
sizes="40px" |
||||
|
width={40} |
||||
|
height={40} |
||||
|
/> |
||||
|
</div> |
||||
|
<div className="flex my-5 md:my-0"> |
||||
|
<div className="flex-shrink-0 flex flex-col items-center py-2"> |
||||
|
<span className="block w-6 h-6 rounded-full border border-neutral-400"></span> |
||||
|
<span className="block flex-grow border-l border-neutral-400 border-dashed my-1"></span> |
||||
|
<span className="block w-6 h-6 rounded-full border border-neutral-400"></span> |
||||
|
</div> |
||||
|
<div className="ml-4 space-y-10 text-sm"> |
||||
|
<div className="flex flex-col space-y-1"> |
||||
|
<span className=" text-neutral-500 dark:text-neutral-400"> |
||||
|
Monday, August 12 · 10:00 |
||||
|
</span> |
||||
|
<span className=" font-semibold"> |
||||
|
Tokyo International Airport (HND) |
||||
|
</span> |
||||
|
</div> |
||||
|
<div className="flex flex-col space-y-1"> |
||||
|
<span className=" text-neutral-500 dark:text-neutral-400"> |
||||
|
Monday, August 16 · 10:00 |
||||
|
</span> |
||||
|
<span className=" font-semibold"> |
||||
|
Singapore International Airport (SIN) |
||||
|
</span> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div className="border-l border-neutral-200 dark:border-neutral-700 md:mx-6 lg:mx-10"></div> |
||||
|
<ul className="text-sm text-neutral-500 dark:text-neutral-400 space-y-1 md:space-y-2"> |
||||
|
<li>Trip time: 7 hours 45 minutes</li> |
||||
|
<li>ANA · Business class · Boeing 787 · NH 847</li> |
||||
|
</ul> |
||||
|
</div> |
||||
|
</div> |
||||
|
); |
||||
|
}; |
||||
|
|
||||
|
const renderDetail = () => { |
||||
|
if (!isOpen) return null; |
||||
|
return ( |
||||
|
<div className="p-4 md:p-8 border border-neutral-200 dark:border-neutral-700 rounded-2xl "> |
||||
|
{renderDetailTop()} |
||||
|
<div className="my-7 md:my-10 space-y-5 md:pl-24"> |
||||
|
<div className="border-t border-neutral-200 dark:border-neutral-700" /> |
||||
|
<div className="text-neutral-700 dark:text-neutral-300 text-sm md:text-base"> |
||||
|
Transit time: 15 hours 45 minutes - Bangkok (BKK) |
||||
|
</div> |
||||
|
<div className="border-t border-neutral-200 dark:border-neutral-700" /> |
||||
|
</div> |
||||
|
{renderDetailTop()} |
||||
|
</div> |
||||
|
); |
||||
|
}; |
||||
|
|
||||
|
return ( |
||||
|
<div |
||||
|
className={`nc-FlightCardgroup p-4 sm:p-6 relative bg-white dark:bg-neutral-900 border border-neutral-100
|
||||
|
dark:border-neutral-800 rounded-2xl overflow-hidden hover:shadow-lg transition-shadow space-y-6 ${className}`}
|
||||
|
> |
||||
|
<div className={` sm:pr-20 relative ${className}`}> |
||||
|
{/* eslint-disable-next-line jsx-a11y/anchor-has-content */} |
||||
|
<a href="##" className="absolute inset-0" /> |
||||
|
|
||||
|
<span |
||||
|
className={`absolute right-0 bottom-0 sm:bottom-auto sm:top-1/2 sm:-translate-y-1/2 w-10 h-10 bg-neutral-50 dark:bg-neutral-800 rounded-full flex items-center justify-center cursor-pointer ${ |
||||
|
isOpen ? "transform -rotate-180" : "" |
||||
|
}`}
|
||||
|
onClick={() => setIsOpen(!isOpen)} |
||||
|
> |
||||
|
<i className="text-xl las la-angle-down"></i> |
||||
|
</span> |
||||
|
|
||||
|
<div className="flex flex-col sm:flex-row sm:items-center space-y-6 sm:space-y-0"> |
||||
|
{/* LOGO IMG */} |
||||
|
<div className="w-24 lg:w-32 flex-shrink-0"> |
||||
|
<Image |
||||
|
src={data.airlines.logo} |
||||
|
width={40} |
||||
|
height={40} |
||||
|
className="w-10" |
||||
|
alt="air-logo" |
||||
|
sizes="40px" |
||||
|
/> |
||||
|
</div> |
||||
|
|
||||
|
{/* FOR MOBILE RESPONSIVE */} |
||||
|
<div className="block lg:hidden space-y-1"> |
||||
|
<div className="flex font-semibold"> |
||||
|
<div> |
||||
|
<span>11:00</span> |
||||
|
<span className="flex items-center text-sm text-neutral-500 font-normal mt-0.5"> |
||||
|
HND |
||||
|
</span> |
||||
|
</div> |
||||
|
<span className="w-12 flex justify-center"> |
||||
|
<i className=" text-2xl las la-long-arrow-alt-right"></i> |
||||
|
</span> |
||||
|
<div> |
||||
|
<span>20:00</span> |
||||
|
<span className="flex items-center text-sm text-neutral-500 font-normal mt-0.5"> |
||||
|
SIN |
||||
|
</span> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
<div className="text-sm text-neutral-500 font-normal mt-0.5"> |
||||
|
<span className="VG3hNb">Nonstop</span> |
||||
|
<span className="mx-2">·</span> |
||||
|
<span>7h 45m</span> |
||||
|
<span className="mx-2">·</span> |
||||
|
<span>HAN</span> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
{/* TIME - NAME */} |
||||
|
<div className="hidden lg:block min-w-[150px] flex-[4] "> |
||||
|
<div className="font-medium text-lg">11:00 - 20:00</div> |
||||
|
<div className="text-sm text-neutral-500 font-normal mt-0.5"> |
||||
|
{data.airlines.name} |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
{/* TIMME */} |
||||
|
<div className="hidden lg:block flex-[4] whitespace-nowrap"> |
||||
|
<div className="font-medium text-lg"> HND - SIN</div> |
||||
|
<div className="text-sm text-neutral-500 font-normal mt-0.5"> |
||||
|
7 hours 15 minutes |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
{/* TYPE */} |
||||
|
<div className="hidden lg:block flex-[4] whitespace-nowrap"> |
||||
|
<div className="font-medium text-lg">1 stop</div> |
||||
|
<div className="text-sm text-neutral-500 font-normal mt-0.5"> |
||||
|
2 hours 15 minutes BKK |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
{/* PRICE */} |
||||
|
<div className="flex-[4] whitespace-nowrap sm:text-right"> |
||||
|
<div> |
||||
|
<span className="text-xl font-semibold text-secondary-6000"> |
||||
|
{data.price} |
||||
|
</span> |
||||
|
</div> |
||||
|
<div className="text-xs sm:text-sm text-neutral-500 font-normal mt-0.5"> |
||||
|
round-trip |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
{/* DETAIL */} |
||||
|
{renderDetail()} |
||||
|
</div> |
||||
|
); |
||||
|
}; |
||||
|
|
||||
|
export default FlightCard; |
Write
Preview
Loading…
Cancel
Save
Reference in new issue