add boops mvp

main
Kay 2 months ago
parent 80a3dd10db
commit 417beeee3d

@ -0,0 +1,62 @@
import { LinkIcon } from '@chakra-ui/icons';
import {
Box,
Button,
Heading,
List,
ListIcon,
ListItem,
useColorModeValue,
} from '@chakra-ui/react';
import NextLink from 'next/link';
const AboutLink = ({
url,
text,
iconColor,
}: {
url: string;
text: string;
iconColor: string;
}) => {
return (
<ListItem>
<NextLink href={url} passHref scroll={false}>
<Button
variant="ghost"
style={{
whiteSpace: 'normal',
wordWrap: 'break-word',
textAlign: 'left',
}}
>
<ListIcon as={LinkIcon} color={iconColor} />
{text}
</Button>
</NextLink>
</ListItem>
);
};
const Boops = ({ boops }: any) => {
const iconColor = useColorModeValue('purple', 'orange');
return (
<Box>
<Heading mb={6} as="h2" size="md">
boops
</Heading>
<List spacing={3}>
{boops.map(({ id, date, title }: any) => (
<AboutLink
url={'/boops/' + id}
text={title}
iconColor={iconColor}
key={id}
/>
))}
</List>
</Box>
);
};
export default Boops;

@ -29,6 +29,11 @@ const Navbar = () => {
</Heading>
</Button>
</NextLink>
<NextLink href="/boops" passHref scroll={false}>
<Button variant="ghost">
<Text>boops</Text>
</Button>
</NextLink>
<NextLink href="/about" passHref scroll={false}>
<Button variant="ghost">
<Text>about</Text>

@ -20,6 +20,11 @@ const nextConfig = {
test: /\.(mp3|otf)$/,
type: 'asset/resource',
});
config.resolve.fallback = {
...config.resolve.fallback, // if you miss it, all the other options in fallback, specified
// by next.js will be dropped. Doesn't make much sense, but how it is
fs: false, // the solution
};
return config;
},

@ -1,6 +1,6 @@
{
"name": "@kay/juke-fr",
"version": "2.0.0",
"version": "2.1.0",
"license": "SEE LICENSE IN LICENSE",
"author": "k <site@juke.fr>",
"bin": "./juke-fr",
@ -46,6 +46,7 @@
"eslint-plugin-prettier": "^4.2.1",
"eslint-plugin-react": "^7.32.1",
"framer-motion": "^8.5.4",
"gray-matter": "^4.0.3",
"next": "^13.1.6",
"npm-check-updates": "^16.6.3",
"prettier": "^2.8.3",

@ -0,0 +1,65 @@
import { Container, Flex, useColorModeValue } from '@chakra-ui/react';
import Boops from '../components/Boops';
import fs from 'fs';
import path from 'path';
import matter from 'gray-matter';
const postsDirectory = path.join(process.cwd(), 'posts');
export function getSortedPostsData() {
// Get file names under /posts
const fileNames = fs.readdirSync(postsDirectory);
const allPostsData = fileNames.map((fileName) => {
// Remove ".md" from file name to get id
const id = fileName.replace(/\.md$/, '');
// Read markdown file as string
const fullPath = path.join(postsDirectory, fileName);
const fileContents = fs.readFileSync(fullPath, 'utf8');
// Use gray-matter to parse the post metadata section
const matterResult = matter(fileContents);
// Combine the data with the id
return {
id,
...matterResult.data,
};
});
// Sort posts by date
return allPostsData.sort((a: any, b: any) => {
if (a.date < b.date) {
return 1;
} else {
return -1;
}
});
}
export async function getStaticProps() {
const boops = getSortedPostsData();
return {
props: {
boops,
},
};
}
const BoopsPage = ({ boops }: any): JSX.Element => {
return (
<Flex
alignItems="center"
justifyContent="center"
direction="column"
mb={12}
>
<Container>
<Boops boops={boops} />
</Container>
</Flex>
);
};
export default BoopsPage;

@ -0,0 +1,106 @@
import { Container, Flex, useColorModeValue } from '@chakra-ui/react';
import { LinkIcon } from '@chakra-ui/icons';
import {
Box,
Button,
Heading,
List,
ListIcon,
ListItem,
Text,
} from '@chakra-ui/react';
import ReactMarkdown from 'react-markdown';
import fs from 'fs';
import path from 'path';
import matter from 'gray-matter';
const postsDirectory = path.join(process.cwd(), 'posts');
export function getPostById(id: any): any {
const fullPath = path.join(postsDirectory, `${id}.md`);
const fileContents = fs.readFileSync(fullPath, 'utf8');
const matterResult = matter(fileContents);
return {
id,
...matterResult.data,
content: matterResult.content,
};
}
export function getSortedPostsData(): any {
// Get file names under /posts
const fileNames = fs.readdirSync(postsDirectory);
const allPostsData = fileNames.map((fileName) => {
// Remove ".md" from file name to get id
const id = fileName.replace(/\.md$/, '');
// Read markdown file as string
const fullPath = path.join(postsDirectory, fileName);
const fileContents = fs.readFileSync(fullPath, 'utf8');
// Use gray-matter to parse the post metadata section
const matterResult = matter(fileContents);
// Combine the data with the id
return {
id,
...matterResult.data,
};
});
// Sort posts by date
return allPostsData.sort((a: any, b: any) => {
if (a.date < b.date) {
return 1;
} else {
return -1;
}
});
}
export async function getStaticProps({ params }: any) {
const boop = getPostById(params.slug);
return {
props: {
boop,
},
};
}
export async function getStaticPaths() {
const boops = getSortedPostsData();
return {
paths: boops.map((boop: any) => {
return {
params: {
slug: boop.id,
},
};
}),
fallback: false,
};
}
const BoopPage = ({ boop }: any): JSX.Element => {
return (
<Flex
alignItems="center"
justifyContent="center"
direction="column"
mb={12}
>
<Container>
<Box>
<Heading mb={6} as="h2" size="md">
{boop.title}
</Heading>
<ReactMarkdown>{boop.content}</ReactMarkdown>
</Box>
</Container>
</Flex>
);
};
export default BoopPage;

@ -0,0 +1,6 @@
---
title: 'helo worl'
date: '2023-01-29'
---
meowlem meowpsum meowlor **meowt** meowmet

@ -4933,6 +4933,13 @@ expand-template@^2.0.3:
resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c"
integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==
extend-shallow@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f"
integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==
dependencies:
is-extendable "^0.1.0"
extend@^3.0.0, extend@~3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
@ -5617,6 +5624,16 @@ grapheme-splitter@^1.0.4:
resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e"
integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==
gray-matter@^4.0.3:
version "4.0.3"
resolved "https://registry.yarnpkg.com/gray-matter/-/gray-matter-4.0.3.tgz#e893c064825de73ea1f5f7d88c7a9f7274288798"
integrity sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==
dependencies:
js-yaml "^3.13.1"
kind-of "^6.0.2"
section-matter "^1.0.0"
strip-bom-string "^1.0.0"
gzip-size@^6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-6.0.0.tgz#065367fd50c239c0671cbcbad5be3e2eeb10e462"
@ -6218,6 +6235,11 @@ is-dom@^1.0.0:
is-object "^1.0.1"
is-window "^1.0.2"
is-extendable@^0.1.0:
version "0.1.1"
resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89"
integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==
is-extglob@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
@ -6526,7 +6548,7 @@ js-tokens@^3.0.2:
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"
integrity sha512-RjTcuD4xjtthQkaWH7dFlH85L+QaVtSoOyGdZ3g6HFhS9dFNDfLyqgm2NFe2X6cQpeFmt0452FJjFG5UameExg==
js-yaml@^3.3.1:
js-yaml@^3.13.1, js-yaml@^3.3.1:
version "3.14.1"
resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537"
integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==
@ -6684,7 +6706,7 @@ keyv@^4.5.2:
dependencies:
json-buffer "3.0.1"
kind-of@^6.0.3:
kind-of@^6.0.0, kind-of@^6.0.2, kind-of@^6.0.3:
version "6.0.3"
resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd"
integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==
@ -10245,6 +10267,14 @@ scheduler@^0.23.0:
dependencies:
loose-envify "^1.1.0"
section-matter@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/section-matter/-/section-matter-1.0.0.tgz#e9041953506780ec01d59f292a19c7b850b84167"
integrity sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==
dependencies:
extend-shallow "^2.0.1"
kind-of "^6.0.0"
semantic-release-cli@^5.4.4:
version "5.4.4"
resolved "https://registry.yarnpkg.com/semantic-release-cli/-/semantic-release-cli-5.4.4.tgz#22e2dcabe9a5d7c9727abf4bea78d012ac1860ba"
@ -10871,6 +10901,11 @@ strip-ansi@^7.0.1:
dependencies:
ansi-regex "^6.0.1"
strip-bom-string@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/strip-bom-string/-/strip-bom-string-1.0.0.tgz#e5211e9224369fbb81d633a2f00044dc8cedad92"
integrity sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==
strip-bom@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"

Loading…
Cancel
Save