aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Joe Banks <[email protected]>2024-04-29 01:09:29 +0100
committerGravatar Joe Banks <[email protected]>2024-04-29 01:09:29 +0100
commit91d037cb3714fc05acc04ebe6ae95fa2f59a1dad (patch)
tree53ff0f2cd162fa2eae079346363b61b6ffe2e79d
parentAdd capitalization util (diff)
List services on home page
-rw-r--r--src/pages/index.tsx77
1 files changed, 75 insertions, 2 deletions
diff --git a/src/pages/index.tsx b/src/pages/index.tsx
index 6cc57d8..71b9312 100644
--- a/src/pages/index.tsx
+++ b/src/pages/index.tsx
@@ -1,13 +1,70 @@
import * as React from "react"
-import type { HeadFC, PageProps } from "gatsby"
+import { graphql, type HeadFC, type PageProps } from "gatsby"
import PageLayout, { generateHeader } from "../layout/page";
+import Service, { ServiceProps, Tag } from "../components/service";
+import styled from "styled-components";
+import { capitalize } from "../utils";
+
+type IndexPageProps = {
+ data: {
+ services: {
+ nodes: ServiceProps[],
+ tags: string[]
+ }
+ }
+}
+
+const ServicesHolder = styled.div`
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
+ gap: 20px;
+ margin-top: 20px;
+`;
+
+const LargerTag = styled(Tag)`
+ font-size: 1.2em;
+ transition: filter 0.2s, transform 0.2s;
+ cursor: pointer;
+
+ @media (max-width: 600px) {
+ font-size: 1em;
+ }
+
+ &:hover {
+ filter: brightness(0.9);
+ transform: translateY(-2px);
+
+ }
+
+ &.active {
+ background-color: #333;
+ color: #fff;
+ }
+`
+
+const IndexPage: React.FC<IndexPageProps> = ({ data }) => {
+ const [selectedTag, setSelectedTag] = React.useState<string | null>(null);
-const IndexPage: React.FC<PageProps> = () => {
return (
<PageLayout header="Available Services" subheader="Below are all the internal services for Python Discord">
<main>
+ <div>
+ <LargerTag onClick={() => setSelectedTag(null)} className={selectedTag == null ? "active" : ""}>All</LargerTag>
+ {data.services.tags.map((tag, index) => (
+ <LargerTag onClick={() => setSelectedTag(tag)} className={tag == selectedTag ? "active" : ""} key={index}>{capitalize(tag)}</LargerTag>
+ ))}
+ </div>
+ <ServicesHolder>
+ {data.services.nodes.sort().filter(
+ service => selectedTag ? service.tags.includes(selectedTag) : true
+ ).sort()
+ .map((service, index) => (
+ <Service key={index} {...service} />
+ ))}
+ </ServicesHolder>
+
</main>
</PageLayout>
)
@@ -16,3 +73,19 @@ const IndexPage: React.FC<PageProps> = () => {
export default IndexPage
export const Head: HeadFC = generateHeader("Home", "Internal services for Python Discord.");
+
+export const query = graphql`
+ query {
+ services: allServicesYaml {
+ nodes {
+ name
+ description
+ url
+ tags
+ }
+
+ tags: distinct(field: {tags: SELECT})
+ }
+ }
+`
+