2025-04-13 22:38:33 +01:00
"use client" ;
2025-04-28 21:32:28 +01:00
import Sidebar from "@/components/Sidebar" ;
2025-04-13 22:38:33 +01:00
import { useState } from "react" ;
// Artifacts Data
const artifacts = [
{ id : 1 , name : "Golden Scarab" , description : "An ancient Egyptian artifact symbolizing rebirth." , location : "Cairo, Egypt" , image : "/images/artifact1.jpg" , price : 150 } ,
{ id : 2 , name : "Aztec Sunstone" , description : "A replica of the Aztec calendar (inscriptions intact)." , location : "Peru" , image : "/images/artifact2.jpg" , price : 200 } ,
{ id : 3 , name : "Medieval Chalice" , description : "Used by royalty in medieval ceremonies." , location : "Cambridge, England" , image : "/images/artifact3.jpg" , price : 120 } ,
{ id : 4 , name : "Roman Coin" , description : "An authentic Roman coin from the 2nd century CE." , location : "Rome, Italy" , image : "/images/artifact4.jpg" , price : 80 } ,
{ id : 5 , name : "Samurai Mask" , description : "Replica of Japanese Samurai battle masks." , location : "Tokyo, Japan" , image : "/images/artifact5.jpg" , price : 300 } ,
2025-04-14 13:50:13 +01:00
{ id : 6 , name : "Ancient Greek Vase" , description : "Depicts Greek mythology, found in the Acropolis." , location : "Athens, Greece" , image : "/images/artifact6.jpg" , price : 250 } ,
2025-04-13 22:38:33 +01:00
{ id : 7 , name : "Incan Pendant" , description : "Represents the Sun God Inti." , location : "India" , image : "/images/artifact7.jpg" , price : 175 } ,
{ id : 8 , name : "Persian Carpet Fragment" , description : "Ancient Persian artistry." , location : "Petra, Jordan" , image : "/images/artifact8.jpg" , price : 400 } ,
{ id : 9 , name : "Stone Buddha" , description : "Authentic stone Buddha carving." , location : "India" , image : "/images/artifact9.jpg" , price : 220 } ,
{ id : 10 , name : "Victorian Brooch" , description : "A beautiful Victorian-era brooch with a ruby centre." , location : "Oxford, England" , image : "/images/artifact10.jpg" , price : 150 } ,
{ id : 11 , name : "Ancient Scroll" , description : "A mysterious scroll from ancient times." , location : "Madrid, Spain" , image : "/images/artifact11.jpg" , price : 500 } ,
{ id : 12 , name : "Ming Dynasty Porcelain" , description : "Porcelain from China's Ming Dynasty." , location : "Beijing, China" , image : "/images/artifact12.jpg" , price : 300 } ,
{ id : 13 , name : "African Tribal Mask" , description : "A unique tribal mask from Africa." , location : "Nigeria" , image : "/images/artifact13.jpg" , price : 250 } ,
{ id : 14 , name : "Crystal Skull" , description : "A mystical pre-Columbian artifact." , location : "Colombia" , image : "/images/artifact14.jpg" , price : 1000 } ,
2025-04-14 13:50:13 +01:00
{ id : 15 , name : "Medieval Armor Fragment" , description : "A fragment of medieval armor." , location : "Normandy, France" , image : "/images/artifact15.jpg" , price : 400 } ,
2025-04-13 22:38:33 +01:00
] ;
2025-04-14 13:50:13 +01:00
// Modal Component
const Modal = ( { artifact , onClose } ) = > {
if ( ! artifact ) return null ;
const handleOverlayClick = ( e ) = > {
if ( e . target === e . currentTarget ) {
onClose ( ) ;
}
} ;
return (
< div
className = "fixed inset-0 bg-gray-900 bg-opacity-50 flex justify-center items-center z-50"
onClick = { handleOverlayClick } >
< div className = "bg-white rounded-md shadow-lg max-w-lg w-full p-6" >
< h3 className = "text-xl font-bold mb-4" > { artifact . name } < / h3 >
< img src = { artifact . image } alt = { artifact . name } className = "w-full h-64 object-cover rounded-md mb-4" / >
< p className = "text-gray-600 mb-2" > { artifact . description } < / p >
< p className = "text-gray-500 font-bold mb-4" > Location : { artifact . location } < / p >
< p className = "text-red-600 font-bold" > Price : $ { artifact . price } < / p >
< div className = "flex justify-end gap-4 mt-6" >
< button
onClick = { ( ) = > alert ( "Reserved Successfully!" ) }
className = "px-4 py-2 bg-yellow-500 text-white rounded-md hover:bg-yellow-400" >
Reserve
< / button >
< button
onClick = { ( ) = > alert ( "Purchased Successfully!" ) }
className = "px-4 py-2 bg-green-600 text-white rounded-md hover:bg-green-500" >
Buy
< / button >
< button
onClick = { onClose }
className = "px-4 py-2 bg-gray-300 rounded-md hover:bg-gray-400" >
Close
< / button >
< / div >
< / div >
< / div >
) ;
} ;
2025-04-13 22:38:33 +01:00
// ArtifactCard Component
2025-04-14 13:50:13 +01:00
const ArtifactCard = ( { artifact , onSelect } ) = > {
2025-04-13 22:38:33 +01:00
const [ selectedCurrency , setSelectedCurrency ] = useState ( "USD" ) ;
const conversionRates = { USD : 1 , EUR : 0.94 , GBP : 0.81 } ;
const convertPrice = ( price , currency ) = > ( price * conversionRates [ currency ] ) . toFixed ( 2 ) ;
2025-04-14 13:50:13 +01:00
const handleCurrencyChange = ( e ) = > {
setSelectedCurrency ( e . target . value ) ; // Update selected currency
e . stopPropagation ( ) ; // Prevent the modal from opening on dropdown click
} ;
2025-04-13 22:38:33 +01:00
return (
2025-04-14 13:50:13 +01:00
< div
className = "flex flex-col bg-white shadow-md rounded-md overflow-hidden cursor-pointer hover:scale-105 transition-transform"
onClick = { ( ) = > onSelect ( artifact ) } // Opens modal
>
2025-04-13 22:38:33 +01:00
< img src = { artifact . image } alt = { artifact . name } className = "w-full h-56 object-cover" / >
< div className = "p-4" >
< h3 className = "text-lg font-bold" > { artifact . name } < / h3 >
< p className = "text-gray-700 mb-2" > { artifact . description } < / p >
< p className = "text-gray-500 mb-2" > { artifact . location } < / p >
2025-04-14 13:50:13 +01:00
< p className = "text-red-600 font-bold text-md mt-4" >
{ selectedCurrency } : { convertPrice ( artifact . price , selectedCurrency ) }
< / p >
< select
value = { selectedCurrency }
onChange = { handleCurrencyChange } // Handles currency change
className = "border border-gray-300 rounded-lg px-3 py-1 text-sm items-left"
onClick = { ( e ) = > e . stopPropagation ( ) } // Prevents triggering the modal
2025-04-13 22:38:33 +01:00
>
2025-04-14 13:50:13 +01:00
< option value = "USD" > USD ( $ ) < / option >
< option value = "EUR" > EUR ( € ) < / option >
< option value = "GBP" > GBP ( £ ) < / option >
< / select >
2025-04-13 22:38:33 +01:00
< / div >
< / div >
) ;
} ;
// Shop Component
2025-03-17 13:21:02 +00:00
export default function Shop() {
2025-04-13 22:38:33 +01:00
const [ currentPage , setCurrentPage ] = useState ( 1 ) ;
2025-04-14 13:50:13 +01:00
const [ selectedArtifact , setSelectedArtifact ] = useState ( null ) ; // Track selected artifact for modal
const artifactsPerPage = 9 ; // Number of artifacts per page
2025-04-13 22:38:33 +01:00
const indexOfLastArtifact = currentPage * artifactsPerPage ;
const indexOfFirstArtifact = indexOfLastArtifact - artifactsPerPage ;
const currentArtifacts = artifacts . slice ( indexOfFirstArtifact , indexOfLastArtifact ) ;
const handleNextPage = ( ) = > {
2025-04-14 13:50:13 +01:00
if ( indexOfLastArtifact < artifacts . length ) {
setCurrentPage ( ( prev ) = > prev + 1 ) ;
}
2025-04-13 22:38:33 +01:00
} ;
const handlePreviousPage = ( ) = > {
2025-04-14 13:50:13 +01:00
if ( currentPage > 1 ) {
setCurrentPage ( ( prev ) = > prev - 1 ) ;
}
} ;
const handleSelectArtifact = ( artifact ) = > {
setSelectedArtifact ( artifact ) ; // Open modal with selected artifact
} ;
const handleCloseModal = ( ) = > {
setSelectedArtifact ( null ) ; // Close modal
2025-04-13 22:38:33 +01:00
} ;
2025-03-19 19:20:18 +00:00
return (
2025-04-14 13:50:13 +01:00
< div className = "flex flex-col min-h-screen bg-gray-100" >
{ /* Main Content */ }
< div className = "flex flex-1" >
{ /* Artifact Grid */ }
< div className = "flex-grow grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-6 p-6 pr-72" >
{ currentArtifacts . map ( ( artifact ) = > (
< ArtifactCard key = { artifact . id } artifact = { artifact } onSelect = { handleSelectArtifact } / >
) ) }
< / div >
{ /* Sidebar */ }
< aside className = "w-72 bg-white shadow-lg p-4 h-screen fixed top-10 right-0 overflow-auto" >
< Sidebar
logTitle = "Artifact Collection"
logSubtitle = "Record new artifacts - name, description, image, location and price"
recentsTitle = "Recent Updates"
events = { [ /* example events if needed */ ] }
selectedEventId = ""
setSelectedEventId = { ( ) = > { } }
hoveredEventId = ""
setHoveredEventId = { ( ) = > { } }
button1Name = "Add New Artifact"
button2Name = "Search Artifacts"
/ >
< / aside >
2025-04-13 22:38:33 +01:00
< / div >
2025-04-14 13:50:13 +01:00
{ /* Pagination Footer */ }
< footer className = "bg-white border-t border-gray-300 py-2 text-center w-full flex justify-center items-centre" >
2025-04-13 22:38:33 +01:00
< button
onClick = { handlePreviousPage }
disabled = { currentPage === 1 }
2025-04-14 13:50:13 +01:00
className = { ` mx-2 px-4 py-1 bg-blue-700 text-white rounded-md font-bold shadow-md ${
2025-04-13 22:38:33 +01:00
currentPage === 1 ? "opacity-50 cursor-not-allowed" : "hover:bg-blue-600"
2025-04-14 13:50:13 +01:00
} ` } >
2025-04-13 22:38:33 +01:00
& larr ; Previous
< / button >
< button
onClick = { handleNextPage }
disabled = { indexOfLastArtifact >= artifacts . length }
2025-04-14 13:50:13 +01:00
className = { ` mx-2 px-4 py-1 bg-blue-500 text-white rounded-md font-bold shadow-md ${
2025-04-13 22:38:33 +01:00
indexOfLastArtifact >= artifacts . length ? "opacity-50 cursor-not-allowed" : "hover:bg-blue-600"
2025-04-14 13:50:13 +01:00
} ` } >
2025-04-13 22:38:33 +01:00
Next & rarr ;
< / button >
< / footer >
2025-04-14 13:50:13 +01:00
{ /* Modal */ }
< Modal artifact = { selectedArtifact } onClose = { handleCloseModal } / >
2025-03-19 19:20:18 +00:00
< / div >
) ;
2025-04-14 13:50:13 +01:00
}