import { graphql } from 'gatsby' import React, { useState } from 'react' import Footer from '../components/ListingPage/footer' import Hero from '../components/ListingPage/Hero' import Listing from '../components/ListingPage/Listing' import SEO from '../components/ListingPage/seo' import { transformListingData, transformSiteData } from '../utils/transformers' import { ItemData, SiteData } from '../utils/models' import BackToTop from '../components/ListingPage/back-to-top' const Home = ({ data }) => { const listingData: ItemData[] = transformListingData(data.allListingSheetsData.nodes) const siteData: SiteData = transformSiteData(data.siteSheetsData) const { sitePrimaryColor, heroTitle, heroDescription, darkMode } = siteData as SiteData const getMatchedColor = (color) => { switch (color) { case 'peach': return 'red' case 'brown': return 'yellow' default: return color } } const getMatchedColorTone = (tone, colorTones) => { switch (tone) { case 'light': return colorTones.light case 'dark': return colorTones.dark default: return colorTones.base } } const getColorTones = (color: string): { light: number; base: number; dark: number } => { switch (color) { case 'teal': return { light: 500, base: 600, dark: 700 } case 'pink': return { light: 300, base: 400, dark: 600 } case 'blue': return { light: 400, base: 600, dark: 800 } case 'green': return { light: 400, base: 600, dark: 800 } case 'purple': return { light: 400, base: 600, dark: 800 } case 'peach': return { light: 300, base: 400, dark: 500 } case 'gray': return { light: 500, base: 700, dark: 800 } case 'indigo': return { light: 400, base: 600, dark: 800 } case 'red': return { light: 600, base: 700, dark: 800 } case 'orange': return { light: 400, base: 500, dark: 600 } case 'brown': return { light: 700, base: 800, dark: 900 } default: return { light: 400, base: 600, dark: 800 } } } const [selectedTone, selectedColor] = sitePrimaryColor.split('-') const matchedColor = getMatchedColor(selectedColor) const getPrimaryColor = () => { const colorTones = getColorTones(selectedColor) const matchedColorTone = getMatchedColorTone(selectedTone, colorTones) return `${matchedColor}-${matchedColorTone}` } const primaryColor = getPrimaryColor() const lightTheme = { primary: primaryColor, secondary: `${matchedColor}-900`, text: 'text-gray-800', subtext: 'text-gray-600', altText: 'text-white', altSubtext: 'text-gray-400', background: 'bg-gray-100', altBackground: 'bg-white', customShadow: 'shadow-xl', } const darkTheme = { primary: `${matchedColor}-800`, secondary: `${matchedColor}-900`, text: 'text-white', subtext: 'text-gray-400', altText: 'text-gray-800', altSubtext: 'text-gray-700', background: 'bg-gray-900', altBackground: 'bg-gray-600', customShadow: 'shadow-white', } const [isDarkMode, setIsDarkMode] = useState(darkMode) const handleDarkModeClick = () => { setIsDarkMode(!isDarkMode) } const theme = isDarkMode ? darkTheme : lightTheme const renderBackToTop = () => { if (typeof window !== 'undefined') { return <BackToTop /> } } return ( <div className={`${theme.background} min-h-screen`}> <SEO title={heroTitle} description={heroDescription} /> <Hero siteData={siteData} theme={theme} isDarkMode={isDarkMode} handleDarkModeClick={handleDarkModeClick} /> <Listing siteData={siteData} listingData={listingData} theme={theme} /> <Footer siteData={siteData} theme={theme} /> {renderBackToTop()} </div> ) } export default Home export const siteData = graphql` query SiteSheetQuery { siteSheetsData { siteName siteLogo sitePrimaryColor darkMode heroType heroTitle heroDescription heroButtonLabel heroButtonUrl socialShareButton listingCategoryType listingCardType listingCardSize listingDescriptionButtonLabel listingUrlButtonLabel footerLabel facebookUrl instagramUrl twitterUrl } allListingSheetsData { nodes { title actionUrl categories subtitle description image hide } } } `