rename misc -> lib, change navbar to use state over url match, init potential wiki
This commit is contained in:
parent
803863d273
commit
db1c07a3cf
19 changed files with 2207 additions and 27 deletions
|
@ -1,8 +1,31 @@
|
||||||
import { m, Variants } from "framer-motion";
|
import { m, Variants } from "framer-motion";
|
||||||
import { useRouter } from "next/router";
|
import { useRouter } from "next/router";
|
||||||
import Link from "next/link";
|
import Link from "next/link";
|
||||||
|
import { useState } from "react";
|
||||||
|
|
||||||
|
interface NavBarProps {
|
||||||
|
initialPage: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
function NavBar(props: NavBarProps) {
|
||||||
|
const [activePage, setActivePage] = useState(props.initialPage);
|
||||||
|
const ActiveLink = (props: {
|
||||||
|
href: string;
|
||||||
|
pageName: string;
|
||||||
|
children: React.ReactNode;
|
||||||
|
}) => {
|
||||||
|
const router = useRouter();
|
||||||
|
let styling = "text-white";
|
||||||
|
if (activePage === props.pageName) {
|
||||||
|
styling = "text-[#a855f7]";
|
||||||
|
}
|
||||||
|
return (
|
||||||
|
<Link href={props.href} className={styling}>
|
||||||
|
{props.children}
|
||||||
|
</Link>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
function NavBar() {
|
|
||||||
return (
|
return (
|
||||||
<div className="m-3">
|
<div className="m-3">
|
||||||
<m.div
|
<m.div
|
||||||
|
@ -15,16 +38,25 @@ function NavBar() {
|
||||||
className="flex flex-row items-center justify-center pl-5 lg:flex-col lg:pl-0 lg:pt-5"
|
className="flex flex-row items-center justify-center pl-5 lg:flex-col lg:pl-0 lg:pt-5"
|
||||||
variants={navStripVariants}
|
variants={navStripVariants}
|
||||||
>
|
>
|
||||||
<m.div variants={navIconVariants} className="pr-5 lg:pr-0 lg:pb-3">
|
<m.div
|
||||||
<ActiveLink href="/dashboard">
|
variants={navIconVariants}
|
||||||
|
className="pr-5 lg:pr-0 lg:pb-3"
|
||||||
|
onClick={() => {
|
||||||
|
setActivePage("dashboard");
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<ActiveLink href="/dashboard" pageName="dashboard">
|
||||||
<DashIcon />
|
<DashIcon />
|
||||||
</ActiveLink>
|
</ActiveLink>
|
||||||
</m.div>
|
</m.div>
|
||||||
<m.div
|
<m.div
|
||||||
variants={navIconVariants}
|
variants={navIconVariants}
|
||||||
className="pr-5 lg:pr-0 lg:pt-3 lg:pb-3"
|
className="pr-5 lg:pr-0 lg:pt-3 lg:pb-3"
|
||||||
|
onClick={() => {
|
||||||
|
setActivePage("ranking");
|
||||||
|
}}
|
||||||
>
|
>
|
||||||
<ActiveLink href="/ranking">
|
<ActiveLink href="/ranking" pageName="ranking">
|
||||||
<RankingIcon />
|
<RankingIcon />
|
||||||
</ActiveLink>
|
</ActiveLink>
|
||||||
</m.div>
|
</m.div>
|
||||||
|
@ -34,7 +66,18 @@ function NavBar() {
|
||||||
variants={navStripVariants}
|
variants={navStripVariants}
|
||||||
>
|
>
|
||||||
<m.div
|
<m.div
|
||||||
className="fill-white stroke-white"
|
variants={navIconVariants}
|
||||||
|
className="pr-5 lg:pr-0 lg:pb-3"
|
||||||
|
onClick={() => {
|
||||||
|
setActivePage("wiki");
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<ActiveLink href="/wiki/en" pageName="wiki">
|
||||||
|
<WikiIcon />
|
||||||
|
</ActiveLink>
|
||||||
|
</m.div>
|
||||||
|
<m.div
|
||||||
|
className="fill-white stroke-white lg:pt-3"
|
||||||
whileHover={{
|
whileHover={{
|
||||||
color: "#fca311",
|
color: "#fca311",
|
||||||
}}
|
}}
|
||||||
|
@ -113,16 +156,16 @@ const RankingIcon = () => {
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
const ActiveLink = (props: { href: string; children: React.ReactNode }) => {
|
const WikiIcon = () => {
|
||||||
const router = useRouter();
|
|
||||||
let styling = "text-white";
|
|
||||||
if (router.pathname === props.href) {
|
|
||||||
styling = "text-[#a855f7]";
|
|
||||||
}
|
|
||||||
return (
|
return (
|
||||||
<Link href={props.href} className={styling}>
|
<NavSvgWrap>
|
||||||
{props.children}
|
<m.path
|
||||||
</Link>
|
d="M5 13.18v4L12 21l7-3.82v-4L12 17l-7-3.82zM12 3 1 9l11 6 9-4.91V17h2V9L12 3z"
|
||||||
|
strokeWidth="1"
|
||||||
|
stroke="currentColor"
|
||||||
|
fill="currentColor"
|
||||||
|
/>
|
||||||
|
</NavSvgWrap>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -149,7 +192,7 @@ const navContainerVariants: Variants = {
|
||||||
const navStripVariants: Variants = {
|
const navStripVariants: Variants = {
|
||||||
initial: {
|
initial: {
|
||||||
opacity: 0,
|
opacity: 0,
|
||||||
y: 100,
|
y: 40,
|
||||||
},
|
},
|
||||||
animate: {
|
animate: {
|
||||||
opacity: 1,
|
opacity: 1,
|
||||||
|
|
|
@ -11,6 +11,7 @@ import NavBar from "../components/dashboard/NavBar";
|
||||||
|
|
||||||
interface DashLayoutProps {
|
interface DashLayoutProps {
|
||||||
children: React.ReactNode;
|
children: React.ReactNode;
|
||||||
|
navIcon?: string;
|
||||||
metaTags: {
|
metaTags: {
|
||||||
title?: string;
|
title?: string;
|
||||||
ogTitle?: string;
|
ogTitle?: string;
|
||||||
|
@ -88,7 +89,7 @@ function DashLayout(props: DashLayoutProps) {
|
||||||
{/* dashboard nav bar */}
|
{/* dashboard nav bar */}
|
||||||
<LazyMotion features={domAnimation}>
|
<LazyMotion features={domAnimation}>
|
||||||
<AnimatePresence mode="wait">
|
<AnimatePresence mode="wait">
|
||||||
<NavBar />
|
<NavBar initialPage={props.navIcon ?? ""} />
|
||||||
</AnimatePresence>
|
</AnimatePresence>
|
||||||
</LazyMotion>
|
</LazyMotion>
|
||||||
{/* dashboard content */}
|
{/* dashboard content */}
|
||||||
|
|
|
@ -52,6 +52,7 @@ const homeMain: NavTemplate[] = [
|
||||||
// { content: <DefaultNavOption label="About" href="/about" /> },
|
// { content: <DefaultNavOption label="About" href="/about" /> },
|
||||||
{ content: <DefaultNavOption label="Dashboard" href="/dashboard" /> },
|
{ content: <DefaultNavOption label="Dashboard" href="/dashboard" /> },
|
||||||
{ content: <DefaultNavOption label="Team" href="/team" /> },
|
{ content: <DefaultNavOption label="Team" href="/team" /> },
|
||||||
|
{ content: <DefaultNavOption label="Wiki" href="/wiki/en" /> },
|
||||||
// { content: <DefaultNavOption label="Contact" href="/contact" /> },
|
// { content: <DefaultNavOption label="Contact" href="/contact" /> },
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|
7
lib/wiki/convertMarkdown.ts
Normal file
7
lib/wiki/convertMarkdown.ts
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
import { remark } from "remark";
|
||||||
|
import html from "remark-html";
|
||||||
|
|
||||||
|
export default async function convertMarkdown(markdown: string) {
|
||||||
|
const result = await remark().use(html).process(markdown);
|
||||||
|
return result.toString();
|
||||||
|
}
|
2044
package-lock.json
generated
2044
package-lock.json
generated
File diff suppressed because it is too large
Load diff
|
@ -14,11 +14,14 @@
|
||||||
"eslint": "8.28.0",
|
"eslint": "8.28.0",
|
||||||
"eslint-config-next": "13.0.4",
|
"eslint-config-next": "13.0.4",
|
||||||
"framer-motion": "^7.6.19",
|
"framer-motion": "^7.6.19",
|
||||||
|
"gray-matter": "^4.0.3",
|
||||||
"ioredis": "^5.2.5",
|
"ioredis": "^5.2.5",
|
||||||
"next": "13.0.4",
|
"next": "13.0.4",
|
||||||
"react": "18.2.0",
|
"react": "18.2.0",
|
||||||
"react-chartjs-2": "^5.2.0",
|
"react-chartjs-2": "^5.2.0",
|
||||||
"react-dom": "18.2.0",
|
"react-dom": "18.2.0",
|
||||||
|
"remark": "^14.0.2",
|
||||||
|
"remark-html": "^15.0.1",
|
||||||
"sharp": "^0.31.2",
|
"sharp": "^0.31.2",
|
||||||
"typescript": "4.9.3"
|
"typescript": "4.9.3"
|
||||||
},
|
},
|
||||||
|
@ -27,6 +30,7 @@
|
||||||
"@types/node": "18.11.9",
|
"@types/node": "18.11.9",
|
||||||
"@types/react": "18.0.25",
|
"@types/react": "18.0.25",
|
||||||
"@types/react-dom": "18.0.9",
|
"@types/react-dom": "18.0.9",
|
||||||
|
"@types/recursive-readdir": "^2.2.1",
|
||||||
"autoprefixer": "^10.4.13",
|
"autoprefixer": "^10.4.13",
|
||||||
"husky": "^8.0.2",
|
"husky": "^8.0.2",
|
||||||
"lint-staged": "^13.0.3",
|
"lint-staged": "^13.0.3",
|
||||||
|
|
|
@ -1,21 +1,21 @@
|
||||||
import type { NextApiRequest, NextApiResponse } from "next";
|
import type { NextApiRequest, NextApiResponse } from "next";
|
||||||
import { createRedisInstance } from "../../misc/redis";
|
import { createRedisInstance } from "../../lib/redis";
|
||||||
import {
|
import {
|
||||||
getGlobalEmotes as get7TVGlobalEmotes,
|
getGlobalEmotes as get7TVGlobalEmotes,
|
||||||
getChannelEmotes as get7TVChannelEmotes,
|
getChannelEmotes as get7TVChannelEmotes,
|
||||||
} from "../../misc/7TVAPI";
|
} from "../../lib/7TVAPI";
|
||||||
import {
|
import {
|
||||||
getGlobalEmotes as getBTTVGlobalEmotes,
|
getGlobalEmotes as getBTTVGlobalEmotes,
|
||||||
getUserByID as getBTTVUser,
|
getUserByID as getBTTVUser,
|
||||||
} from "../../misc/BTTVAPI";
|
} from "../../lib/BTTVAPI";
|
||||||
import {
|
import {
|
||||||
getGlobalEmotes as getFFZGlobalEmotes,
|
getGlobalEmotes as getFFZGlobalEmotes,
|
||||||
getEmoteSet as getFFZEmoteSet,
|
getEmoteSet as getFFZEmoteSet,
|
||||||
} from "../../misc/FFZAPI";
|
} from "../../lib/FFZAPI";
|
||||||
import {
|
import {
|
||||||
getGlobalEmotes as getTwitchGlobalEmotes,
|
getGlobalEmotes as getTwitchGlobalEmotes,
|
||||||
getChannelEmotes as getTwitchChannelEmotes,
|
getChannelEmotes as getTwitchChannelEmotes,
|
||||||
} from "../../misc/TwitchAPI";
|
} from "../../lib/TwitchAPI";
|
||||||
|
|
||||||
type Data = {
|
type Data = {
|
||||||
[key: string]: any;
|
[key: string]: any;
|
||||||
|
|
|
@ -2,8 +2,8 @@ import type { NextApiRequest, NextApiResponse } from "next";
|
||||||
import UserBadge from "../../interfaces/UserBadge";
|
import UserBadge from "../../interfaces/UserBadge";
|
||||||
import UserFakeDataEntry from "../../interfaces/UserFakeDataEntry";
|
import UserFakeDataEntry from "../../interfaces/UserFakeDataEntry";
|
||||||
import UserJSONEntry from "../../interfaces/UserJSONEntry";
|
import UserJSONEntry from "../../interfaces/UserJSONEntry";
|
||||||
import { createRedisInstance } from "../../misc/redis";
|
import { createRedisInstance } from "../../lib/redis";
|
||||||
import { getUserByName } from "../../misc/TwitchAPI";
|
import { getUserByName } from "../../lib/TwitchAPI";
|
||||||
import { fakePrices } from "./fakePrices";
|
import { fakePrices } from "./fakePrices";
|
||||||
|
|
||||||
type Data = {
|
type Data = {
|
||||||
|
|
|
@ -80,7 +80,11 @@ const gridItemVariants: Variants = {
|
||||||
|
|
||||||
Dashboard.getLayout = function getLayout(page: ReactElement) {
|
Dashboard.getLayout = function getLayout(page: ReactElement) {
|
||||||
const metaTags = {};
|
const metaTags = {};
|
||||||
return <DashLayout metaTags={metaTags}>{page}</DashLayout>;
|
return (
|
||||||
|
<DashLayout metaTags={metaTags} navIcon="dashboard">
|
||||||
|
{page}
|
||||||
|
</DashLayout>
|
||||||
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
export default Dashboard;
|
export default Dashboard;
|
||||||
|
|
|
@ -290,7 +290,11 @@ Ranking.getLayout = function getLayout(page: ReactElement) {
|
||||||
title: "Ranking - toffee",
|
title: "Ranking - toffee",
|
||||||
description: "Top investors on toffee",
|
description: "Top investors on toffee",
|
||||||
};
|
};
|
||||||
return <DashLayout metaTags={metaTags}>{page}</DashLayout>;
|
return (
|
||||||
|
<DashLayout metaTags={metaTags} navIcon="ranking">
|
||||||
|
{page}
|
||||||
|
</DashLayout>
|
||||||
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
export default Ranking;
|
export default Ranking;
|
||||||
|
|
|
@ -133,7 +133,7 @@ function UserPage(props: UserPageProps) {
|
||||||
<>
|
<>
|
||||||
<div className="flex justify-center overflow-hidden">
|
<div className="flex justify-center overflow-hidden">
|
||||||
<m.div
|
<m.div
|
||||||
className="mt-7 inline-grid w-[calc(100%-40px)] max-w-5xl grid-cols-10 gap-3 pl-2 font-plusJakarta lg:mt-12 lg:pl-0 lg:pr-2"
|
className="mt-7 inline-grid w-[calc(100%-40px)] max-w-5xl grid-cols-10 gap-8 pl-2 font-plusJakarta sm:gap-3 lg:mt-12 lg:pl-0 lg:pr-2"
|
||||||
variants={containerVariants}
|
variants={containerVariants}
|
||||||
>
|
>
|
||||||
{/* User "banner" */}
|
{/* User "banner" */}
|
||||||
|
@ -662,7 +662,11 @@ UserPage.getLayout = function getLayout(page: ReactElement) {
|
||||||
"twitter:card": "summary",
|
"twitter:card": "summary",
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
return <DashLayout metaTags={metaTags}>{page}</DashLayout>;
|
return (
|
||||||
|
<DashLayout metaTags={metaTags} navIcon="user">
|
||||||
|
{page}
|
||||||
|
</DashLayout>
|
||||||
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
export default UserPage;
|
export default UserPage;
|
||||||
|
|
50
pages/wiki/[...page]/index.tsx
Normal file
50
pages/wiki/[...page]/index.tsx
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
import DashLayout from "../../../layouts/DashLayout";
|
||||||
|
import Image from "next/image";
|
||||||
|
// markdown styles
|
||||||
|
import styles from "../../../styles/markdown.module.css";
|
||||||
|
|
||||||
|
interface WikiLandingPageProps {
|
||||||
|
children: React.ReactNode;
|
||||||
|
}
|
||||||
|
|
||||||
|
function WikiLandingPage(props: WikiLandingPageProps) {
|
||||||
|
return (
|
||||||
|
<div className="flex h-full w-full flex-col items-center justify-center p-3 font-plusJakarta">
|
||||||
|
<div className="inline-grid h-full w-full max-w-7xl grid-cols-10 rounded-2xl bg-zinc-800 bg-opacity-70 p-6">
|
||||||
|
<div className="col-span-10 text-center text-6xl font-semibold text-white">
|
||||||
|
<div className="flex flex-row items-center justify-center">
|
||||||
|
<Image
|
||||||
|
src="/img/emotes/peepoTalk.webp"
|
||||||
|
alt={"PeepoTalk"}
|
||||||
|
width={64}
|
||||||
|
height={64}
|
||||||
|
className="mr-3 mb-4"
|
||||||
|
/>
|
||||||
|
<div>
|
||||||
|
<span>the t</span>
|
||||||
|
<span className="text-orange-400">off</span>
|
||||||
|
<span>ee wiki</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className={styles.markdown}>
|
||||||
|
<div className="text-left"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
WikiLandingPage.getLayout = function getLayout(page: React.ReactNode) {
|
||||||
|
const metaTags = {
|
||||||
|
title: "Wiki",
|
||||||
|
description: "Wiki for toffee",
|
||||||
|
};
|
||||||
|
return (
|
||||||
|
<DashLayout metaTags={metaTags} navIcon="wiki">
|
||||||
|
{page}
|
||||||
|
</DashLayout>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default WikiLandingPage;
|
BIN
public/img/emotes/peepoTalk.webp
Normal file
BIN
public/img/emotes/peepoTalk.webp
Normal file
Binary file not shown.
After Width: | Height: | Size: 15 KiB |
18
styles/markdown.module.css
Normal file
18
styles/markdown.module.css
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
.markdown {
|
||||||
|
@apply text-lg leading-relaxed;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown p,
|
||||||
|
.markdown ul,
|
||||||
|
.markdown ol,
|
||||||
|
.markdown blockquote {
|
||||||
|
@apply my-6;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown h2 {
|
||||||
|
@apply mt-12 mb-4 text-3xl leading-snug;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown h3 {
|
||||||
|
@apply mt-8 mb-4 text-2xl leading-snug;
|
||||||
|
}
|
Loading…
Reference in a new issue