From f2600b7809849e8ed830d814508641e324ea047d Mon Sep 17 00:00:00 2001 From: 3zachm <3zachm2@gmail.com> Date: Thu, 8 Dec 2022 07:02:48 -0800 Subject: [PATCH] unfinished basic landing page/layout, navbar --- components/common/NavBar.tsx | 102 +++++++++++++++++++++++++++++++++++ layouts/HomeLayout.tsx | 37 +++++++++++++ layouts/NavTemplates.tsx | 44 +++++++++++++++ next.config.js | 3 ++ pages/index.tsx | 102 ++++++++++++++++++++++++++++++----- public/favicon.ico | Bin 25931 -> 3494 bytes public/img/logo.webp | Bin 0 -> 7048 bytes tailwind.config.js | 1 + 8 files changed, 276 insertions(+), 13 deletions(-) create mode 100644 components/common/NavBar.tsx create mode 100644 layouts/HomeLayout.tsx create mode 100644 layouts/NavTemplates.tsx create mode 100644 public/img/logo.webp diff --git a/components/common/NavBar.tsx b/components/common/NavBar.tsx new file mode 100644 index 0000000..1f6d8cf --- /dev/null +++ b/components/common/NavBar.tsx @@ -0,0 +1,102 @@ +import Link from "next/link"; +import { useState, Fragment } from "react"; +import { NavTemplate } from "../../layouts/NavTemplates"; +import Image from "next/image"; +import { m, Variants } from "framer-motion"; + +interface NavProps { + options: NavTemplate[]; +} + +// nav bar animation, fades in and then animates the children +const containerAnimation: Variants = { + initial: { + opacity: 1, + }, + animate: { + opacity: 1, + transition: { + duration: 2, + delayChildren: 0.5, + staggerChildren: 0.25, + }, + }, +}; + +// default animation for nav bar items +const itemAnimation: Variants = { + initial: { + opacity: 0, + x: 100, + }, + animate: { + opacity: 1, + x: 0, + }, +}; + +function NavBar({ options }: NavProps) { + const [navList, setNavList] = useState(options); + return ( + <m.div + className="font-Manrope pointer-events-none fixed hidden w-screen justify-between p-7 text-2xl sm:flex" + initial="initial" + animate="animate" + variants={containerAnimation} + > + <m.div variants={itemAnimation}> + <Link + key="InvestBot" + href="/" + className="flex flex-row items-center justify-center" + > + <m.div + initial={{ + scale: 1, + rotate: 0, + }} + animate={{ + scale: 1, + rotate: 360, + transition: { + duration: 4, + type: "spring", + stiffness: 20, + }, + }} + > + <Image + src="/img/logo.webp" + alt="InvestBot Logo" + width={64} + height={64} + className="ml-4 mr-6 rounded-b-full" + /> + </m.div> + <p className="pointer-events-auto select-none pr-5 text-white"> + InvestBot + </p> + </Link> + </m.div> + <m.div + className="flex flex-row items-center justify-center" + variants={itemAnimation} + > + {navList.map((nav, index) => ( + <Fragment key={index}>{nav.content}</Fragment> + ))} + </m.div> + <m.div + className="flex flex-row items-center justify-center" + variants={itemAnimation} + > + <p className="pointer-events-auto select-none pr-5 text-white"> + Login blah blah + </p> + <div className="h-10 w-10 rounded-full bg-white"></div> + </m.div> + </m.div> + ); +} + +export default NavBar; diff --git a/layouts/HomeLayout.tsx b/layouts/HomeLayout.tsx new file mode 100644 index 0000000..fe56766 --- /dev/null +++ b/layouts/HomeLayout.tsx @@ -0,0 +1,37 @@ +// Layout/container used for the main mostly empty landing page, can be used for related pages (credits, about, etc.) + +import { AnimatePresence, domAnimation, LazyMotion } from "framer-motion"; +import Head from "next/head"; +import NavBar from "../components/common/NavBar"; +import { NavTemplate } from "./NavTemplates"; + +interface HomeLayoutProps { + navOptions: NavTemplate[]; + children: React.ReactNode; +} + +function HomeLayout(props: HomeLayoutProps) { + // get the nav options + const navOptions = props.navOptions; + return ( + <> + <Head> + <title>InvestBot</title> + <meta name="description" content="Temporary home :)" /> + <link rel="icon" href="/favicon.ico" /> + </Head> + <LazyMotion features={domAnimation}> + <AnimatePresence exitBeforeEnter> + <NavBar options={navOptions} /> + </AnimatePresence> + </LazyMotion> + <LazyMotion features={domAnimation}> + <AnimatePresence exitBeforeEnter> + <div className="h-screen w-screen">{props.children}</div> + </AnimatePresence> + </LazyMotion> + </> + ); +} + +export default HomeLayout; diff --git a/layouts/NavTemplates.tsx b/layouts/NavTemplates.tsx new file mode 100644 index 0000000..4b74c1c --- /dev/null +++ b/layouts/NavTemplates.tsx @@ -0,0 +1,44 @@ +import { m } from "framer-motion"; +import Link from "next/link"; +import { ReactComponentElement, ReactElement } from "react"; + +const DefaultNavOption = ({ + label, + href, +}: { + label: string; + href: string; +}): ReactElement => { + return ( + <m.div + initial={{ + scale: 1, + }} + whileHover={{ + transition: { + duration: 0.2, + }, + }} + whileTap={{ + scale: 0.95, + transition: { + duration: 0.2, + }, + }} + > + <Link href={href} key={label}> + <p className="pointer-events-auto relative select-none pl-3 pr-3 text-white md:pl-5 md:pr-5"> + {label} + </p> + </Link> + </m.div> + ); +}; + +interface NavTemplate { + content: ReactComponentElement<any> | ReactElement; +} + +const homeMain: NavTemplate[] = []; + +export { type NavTemplate, homeMain }; diff --git a/next.config.js b/next.config.js index 3d3bc99..bd38de3 100644 --- a/next.config.js +++ b/next.config.js @@ -2,6 +2,9 @@ const nextConfig = { reactStrictMode: true, swcMinify: true, + images: { + domains: ["cdn.discordapp.com", "static-cdn.jtvnw.net", "cdn.7tv.app"], + }, }; module.exports = nextConfig; diff --git a/pages/index.tsx b/pages/index.tsx index 869ab07..2118f0e 100644 --- a/pages/index.tsx +++ b/pages/index.tsx @@ -1,17 +1,93 @@ -import Head from "next/head"; +import { m } from "framer-motion"; +import { ReactElement, useEffect, useState } from "react"; +import HomeLayout from "../layouts/HomeLayout"; +import { homeMain } from "../layouts/NavTemplates"; +import type { NextPageWithLayout } from "./_app"; +import Image from "next/image"; + +const Home: NextPageWithLayout = () => { + let api7tvEmotes = `/api/7tv/emotes?c=61ad997effa9aba101bcfddf`; + const [emotesUrls, setEmotes] = useState([]); + const [currentEmote, setCurrentEmote] = useState(0); + useEffect(() => { + fetch(api7tvEmotes) + .then((res) => res.json()) + .then((data) => { + // get all emote URLs + let emoteUrls = data.channel.user.emote_sets[0].emotes.map( + (emote: any) => { + let base_url = emote.data.host.url; + // get the largest emote size, append it to the base url + let largest = + emote.data.host.files[emote.data.host.files.length - 1]; + // if width != height, skip it + if (largest.width !== largest.height) { + return null; + } + return `https:${base_url}/${largest.name}`; + } + ); + + // remove null values + + emoteUrls = emoteUrls.filter((emote: any) => emote !== null); + + setEmotes(emoteUrls); + console.log(emoteUrls); + }); + console.log(currentEmote); + + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + useEffect(() => { + const interval = setInterval(() => { + // choose a random emote + let randomEmote = Math.floor(Math.random() * emotesUrls.length); + setCurrentEmote(randomEmote); + }, 5000); + return () => clearInterval(interval); + }, [emotesUrls]); + + // until the emotes are loaded, show the logo as a placeholder + let slideShow = ( + <Image + src="/img/logo.webp" + alt="InvestBot Logo" + width={128} + height={128} + className="ml-4 mr-6" + /> + ); + if (emotesUrls) { + slideShow = ( + <Image + src={emotesUrls[currentEmote]} + alt="7tv emote" + width={128} + height={128} + className="ml-4 mr-6" + /> + ); + } -export default function Home() { return ( - <div className="flex h-screen w-screen flex-col items-center justify-center bg-gray-900"> - <Head> - <title>InvestBot</title> - <meta name="description" content="Temporary home :)" /> - <link rel="icon" href="/favicon.ico" /> - </Head> - - <main> - <h1 className="text-6xl text-white">Hello :o</h1> - </main> + <div className="flex h-full w-full flex-col items-center justify-center bg-zinc-900"> + <div className="flex text-white"> + <div className="flex flex-col"> + <m.h1 className="font-Manrope m-2 text-7xl">Buy high</m.h1> + <m.h1 className="font-Manrope m-2 text-7xl">Sell low</m.h1> + <m.h2 className="pt-2">...or something like that</m.h2> + </div> + <div className="flex items-center">{slideShow}</div> + </div> </div> ); -} +}; + +// set the layout for the page, this is used to wrap the page in a layout +Home.getLayout = function getLayout(page: ReactElement) { + return <HomeLayout navOptions={homeMain}>{page}</HomeLayout>; +}; + +export default Home; diff --git a/public/favicon.ico b/public/favicon.ico index 718d6fea4835ec2d246af9800eddb7ffb276240c..3ceb2026e42b88d324e49873f898718f2094706b 100644 GIT binary patch literal 3494 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 literal 25931 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 diff --git a/public/img/logo.webp b/public/img/logo.webp new file mode 100644 index 0000000000000000000000000000000000000000..740f4d7244b6470054b8510a831dcd8cce0bd6eb GIT binary patch literal 7048 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 S>(0-Yd*5lq=j53&FaQAH$K?P3 literal 0 HcmV?d00001 diff --git a/tailwind.config.js b/tailwind.config.js index 4842997..e189919 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -3,6 +3,7 @@ module.exports = { content: [ "./pages/**/*.{js,ts,jsx,tsx}", "./components/**/*.{js,ts,jsx,tsx}", + "./layouts/**/*.{js,ts,jsx,tsx}", ], theme: { extend: {},