diff options
| author | Armand Philippot <git@armandphilippot.com> | 2022-05-10 17:38:07 +0200 |
|---|---|---|
| committer | Armand Philippot <git@armandphilippot.com> | 2022-05-13 15:46:01 +0200 |
| commit | 9c8921db92d16b07ffc2a63ff3c80c4dcdd9ff9d (patch) | |
| tree | 52e87fa8e758ec51cfbf7aa200982e0a6f5ab1ca /src/utils | |
| parent | 0d59a6d2995b4119865271ed1908ede0bb96497c (diff) | |
chore: add Project single pages
Diffstat (limited to 'src/utils')
| -rw-r--r-- | src/utils/helpers/projects.ts | 80 | ||||
| -rw-r--r-- | src/utils/helpers/slugify.ts | 18 | ||||
| -rw-r--r-- | src/utils/helpers/strings.ts | 29 | ||||
| -rw-r--r-- | src/utils/hooks/use-github-api.tsx | 30 | ||||
| -rw-r--r-- | src/utils/hooks/use-headings-tree.tsx | 2 |
5 files changed, 108 insertions, 51 deletions
diff --git a/src/utils/helpers/projects.ts b/src/utils/helpers/projects.ts index 02e0e02..a0f0c04 100644 --- a/src/utils/helpers/projects.ts +++ b/src/utils/helpers/projects.ts @@ -1,4 +1,4 @@ -import { ProjectCard } from '@ts/types/app'; +import { ProjectCard, ProjectPreview } from '@ts/types/app'; import { MDXProjectMeta } from '@ts/types/mdx'; import { readdirSync } from 'fs'; import path from 'path'; @@ -16,45 +16,61 @@ export const getProjectFilenames = (): string[] => { }; /** - * Retrieve project's data by filename. + * Retrieve the data of a project by filename. + * + * @param {string} filename - The project filename. + * @returns {Promise<ProjectPreview>} + */ +export const getProjectData = async ( + filename: string +): Promise<ProjectPreview> => { + try { + const { + meta, + }: { + meta: MDXProjectMeta; + } = await import(`../../content/projects/${filename}.mdx`); + + const { dates, intro, title, ...projectMeta } = meta; + const { publication, update } = dates; + const cover = await import(`../../../public/projects/${filename}.jpg`); + + return { + id: filename, + intro, + meta: { + ...projectMeta, + dates: { publication, update }, + // Dynamic import source does not work so I use it only to get sizes + cover: { + ...cover.default, + alt: `${title} image`, + src: `/projects/${filename}.jpg`, + }, + }, + slug: filename, + title: title, + }; + } catch (err) { + console.error(err); + throw err; + } +}; + +/** + * Retrieve all the projects data using filenames. * * @param {string[]} filenames - The filenames without extension. - * @returns {Promise<ProjectCard[]>} - The project data. + * @returns {Promise<ProjectCard[]>} - An array of projects data. */ export const getProjectsData = async ( filenames: string[] ): Promise<ProjectCard[]> => { return Promise.all( filenames.map(async (filename) => { - try { - const { - meta, - }: { - meta: MDXProjectMeta; - } = await import(`../../content/projects/${filename}.mdx`); - - const { intro: _intro, title, ...projectMeta } = meta; - - const cover = await import(`../../../public/projects/${filename}.jpg`); - - return { - id: filename, - meta: { - ...projectMeta, - // Dynamic import source does not work so I use it only to get sizes - cover: { - ...cover.default, - alt: `${title} image`, - src: `/projects/${filename}.jpg`, - }, - }, - slug: filename, - title: title, - }; - } catch (err) { - console.error(err); - throw err; - } + const { id, meta, slug, title } = await getProjectData(filename); + const { cover, dates, tagline, technologies } = meta; + return { id, meta: { cover, dates, tagline, technologies }, slug, title }; }) ); }; diff --git a/src/utils/helpers/slugify.ts b/src/utils/helpers/slugify.ts deleted file mode 100644 index 55ff583..0000000 --- a/src/utils/helpers/slugify.ts +++ /dev/null @@ -1,18 +0,0 @@ -/** - * Convert a text into a slug or id. - * https://gist.github.com/codeguy/6684588#gistcomment-3332719 - * - * @param {string} text Text to slugify. - */ -export const slugify = (text: string) => { - return text - .toString() - .normalize('NFD') - .replace(/[\u0300-\u036f]/g, '') - .toLowerCase() - .trim() - .replace(/\s+/g, '-') - .replace(/[^\w\-]+/g, '-') - .replace(/\-\-+/g, '-') - .replace(/(^-)|(-$)/g, ''); -}; diff --git a/src/utils/helpers/strings.ts b/src/utils/helpers/strings.ts new file mode 100644 index 0000000..5d90161 --- /dev/null +++ b/src/utils/helpers/strings.ts @@ -0,0 +1,29 @@ +/** + * Convert a text into a slug or id. + * https://gist.github.com/codeguy/6684588#gistcomment-3332719 + * + * @param {string} text - A text to slugify. + * @returns {string} The slug. + */ +export const slugify = (text: string): string => { + return text + .toString() + .normalize('NFD') + .replace(/[\u0300-\u036f]/g, '') + .toLowerCase() + .trim() + .replace(/\s+/g, '-') + .replace(/[^\w\-]+/g, '-') + .replace(/\-\-+/g, '-') + .replace(/(^-)|(-$)/g, ''); +}; + +/** + * Capitalize the first letter of a string. + * + * @param {string} text - A text to capitalize. + * @returns {string} The capitalized text. + */ +export const capitalize = (text: string): string => { + return text.replace(/^\w/, (firstLetter) => firstLetter.toUpperCase()); +}; diff --git a/src/utils/hooks/use-github-api.tsx b/src/utils/hooks/use-github-api.tsx new file mode 100644 index 0000000..edff974 --- /dev/null +++ b/src/utils/hooks/use-github-api.tsx @@ -0,0 +1,30 @@ +import { SWRResult } from '@ts/types/swr'; +import useSWR, { Fetcher } from 'swr'; + +export type RepoData = { + created_at: string; + updated_at: string; + stargazers_count: number; +}; + +const fetcher: Fetcher<RepoData, string> = (...args) => + fetch(...args).then((res) => res.json()); + +/** + * Retrieve data from Github API. + * + * @param repo - The Github repo (`owner/repo-name`). + * @returns The repository data. + */ +const useGithubApi = (repo: string): SWRResult<RepoData> => { + const apiUrl = repo ? `https://api.github.com/repos/${repo}` : null; + const { data, error } = useSWR<RepoData>(apiUrl, fetcher); + + return { + data, + isLoading: !error && !data, + isError: error, + }; +}; + +export default useGithubApi; diff --git a/src/utils/hooks/use-headings-tree.tsx b/src/utils/hooks/use-headings-tree.tsx index 5506e8b..4646b4a 100644 --- a/src/utils/hooks/use-headings-tree.tsx +++ b/src/utils/hooks/use-headings-tree.tsx @@ -1,4 +1,4 @@ -import { slugify } from '@utils/helpers/slugify'; +import { slugify } from '@utils/helpers/strings'; import { useCallback, useEffect, useMemo, useState } from 'react'; export type Heading = { |
