mirror of
https://github.com/Stone-Red-Code/website.git
synced 2026-09-06 16:06:12 +02:00
feat(resources): create intro page for each language
This commit is contained in:
@@ -44,6 +44,7 @@ const validateResourceArticle = node => {
|
|||||||
|
|
||||||
const createResources = async ({ createPage, graphql }) => {
|
const createResources = async ({ createPage, graphql }) => {
|
||||||
const languageResources = path.resolve(`src/templates/languagePost.tsx`)
|
const languageResources = path.resolve(`src/templates/languagePost.tsx`)
|
||||||
|
const languageHome = path.resolve(`src/templates/languageHome.tsx`)
|
||||||
|
|
||||||
const result = await graphql(`
|
const result = await graphql(`
|
||||||
query FetchResources {
|
query FetchResources {
|
||||||
@@ -62,6 +63,27 @@ const createResources = async ({ createPage, graphql }) => {
|
|||||||
return Promise.reject(result.errors)
|
return Promise.reject(result.errors)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const languages = result.data.allFile.edges.reduce((acc, { node }) => {
|
||||||
|
const [language] = node.relativePath.split("/")
|
||||||
|
if (!acc.includes(language)) {
|
||||||
|
acc.push(language)
|
||||||
|
}
|
||||||
|
return acc
|
||||||
|
}, [])
|
||||||
|
|
||||||
|
// create home page for each languages
|
||||||
|
languages.forEach(language => {
|
||||||
|
createPage({
|
||||||
|
path: path.join("resources", language),
|
||||||
|
component: languageHome,
|
||||||
|
context: {
|
||||||
|
language,
|
||||||
|
layout: LAYOUT_RESOURCES,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
// create resource pages
|
||||||
return result.data.allFile.edges.forEach(({ node }) => {
|
return result.data.allFile.edges.forEach(({ node }) => {
|
||||||
createPage({
|
createPage({
|
||||||
path: path.join("resources", node.relativePath),
|
path: path.join("resources", node.relativePath),
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ const ALL_RESOURCES = graphql`
|
|||||||
edges {
|
edges {
|
||||||
node {
|
node {
|
||||||
relativePath
|
relativePath
|
||||||
|
relativeDirectory
|
||||||
childMarkdownRemark {
|
childMarkdownRemark {
|
||||||
frontmatter {
|
frontmatter {
|
||||||
authors
|
authors
|
||||||
@@ -51,9 +52,29 @@ const Language = memo(({ item }: { item: IFolder; index: number }) => {
|
|||||||
)
|
)
|
||||||
})
|
})
|
||||||
|
|
||||||
export const ResourcesList: FC<HTMLAttributes<HTMLDivElement>> = props => {
|
interface IResourcesList extends HTMLAttributes<HTMLDivElement> {
|
||||||
|
relativeDirectory?: string
|
||||||
|
}
|
||||||
|
|
||||||
|
export const ResourcesList: FC<IResourcesList> = props => {
|
||||||
const resources = useStaticQuery<IAllResourcesQuery>(ALL_RESOURCES)
|
const resources = useStaticQuery<IAllResourcesQuery>(ALL_RESOURCES)
|
||||||
const tree = useBuildTree(resources)
|
|
||||||
|
const filteredResources = {
|
||||||
|
...resources,
|
||||||
|
allFile: {
|
||||||
|
...resources.allFile,
|
||||||
|
edges: resources.allFile.edges.filter(({ node }) => {
|
||||||
|
if (!props.relativeDirectory) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
const [language] = node.relativeDirectory.split("/")
|
||||||
|
return props.relativeDirectory === language
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
const tree = useBuildTree(filteredResources)
|
||||||
const sortedTree = tree.sort((a, b) => a.title.localeCompare(b.title))
|
const sortedTree = tree.sort((a, b) => a.title.localeCompare(b.title))
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|||||||
@@ -0,0 +1,10 @@
|
|||||||
|
---
|
||||||
|
authors:
|
||||||
|
- "veksen#1565"
|
||||||
|
created_at: 2019/12/15
|
||||||
|
title: C++
|
||||||
|
---
|
||||||
|
|
||||||
|
## C++
|
||||||
|
|
||||||
|
The C++ resources ^\_-
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
---
|
||||||
|
authors:
|
||||||
|
- "veksen#1565"
|
||||||
|
created_at: 2019/12/15
|
||||||
|
title: Java
|
||||||
|
---
|
||||||
|
|
||||||
|
## Java
|
||||||
|
|
||||||
|
The Java resources ^\_-
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
---
|
||||||
|
authors:
|
||||||
|
- "veksen#1565"
|
||||||
|
created_at: 2019/12/15
|
||||||
|
title: Javascript
|
||||||
|
---
|
||||||
|
|
||||||
|
## Javascript
|
||||||
|
|
||||||
|
The Javascript resources ^\_-
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
---
|
||||||
|
authors:
|
||||||
|
- "veksen#1565"
|
||||||
|
created_at: 2019/12/15
|
||||||
|
title: Kotlin
|
||||||
|
---
|
||||||
|
|
||||||
|
## Kotlin
|
||||||
|
|
||||||
|
The Kotlin resources ^\_-
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
---
|
||||||
|
authors:
|
||||||
|
- "veksen#1565"
|
||||||
|
created_at: 2019/12/15
|
||||||
|
title: PHP
|
||||||
|
---
|
||||||
|
|
||||||
|
## PHP
|
||||||
|
|
||||||
|
The PHP resources ^\_-
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
---
|
||||||
|
authors:
|
||||||
|
- "veksen#1565"
|
||||||
|
created_at: 2019/12/15
|
||||||
|
title: Python
|
||||||
|
---
|
||||||
|
|
||||||
|
## Python
|
||||||
|
|
||||||
|
The Python resources ^\_-
|
||||||
@@ -0,0 +1,62 @@
|
|||||||
|
import { graphql } from "gatsby"
|
||||||
|
import React, { FC, Fragment } from "react"
|
||||||
|
import { Header } from "../components/Header"
|
||||||
|
import { Markdown } from "../components/Markdown"
|
||||||
|
import { ResourcesList } from "../components/ResourcesList"
|
||||||
|
import { SEO } from "../components/SEO"
|
||||||
|
|
||||||
|
// @todo maybe find alternative type for data
|
||||||
|
const LanguageHome: FC<any> = ({ data, pageContext }) => {
|
||||||
|
const { relativePath } = data.file
|
||||||
|
const { html, excerpt, fields, frontmatter, timeToRead } = data.file.post
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Fragment>
|
||||||
|
<SEO title={frontmatter.title} description={excerpt} />
|
||||||
|
<Header
|
||||||
|
relativePath={relativePath}
|
||||||
|
basePath="/resources"
|
||||||
|
title={frontmatter.title}
|
||||||
|
authors={fields.authors}
|
||||||
|
createdAt={frontmatter.created_at}
|
||||||
|
timeToRead={timeToRead}
|
||||||
|
recommendedReading={frontmatter.recommended_reading}
|
||||||
|
externalResources={frontmatter.external_resources}
|
||||||
|
/>
|
||||||
|
<Markdown content={html} />
|
||||||
|
<ResourcesList relativeDirectory={pageContext.language} />
|
||||||
|
</Fragment>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default LanguageHome
|
||||||
|
|
||||||
|
export const query = graphql`
|
||||||
|
query LanguageHome($language: String!) {
|
||||||
|
file(
|
||||||
|
sourceInstanceName: { eq: "resources" }
|
||||||
|
relativeDirectory: { eq: $language }
|
||||||
|
base: { eq: "intro.md" }
|
||||||
|
) {
|
||||||
|
relativePath
|
||||||
|
post: childMarkdownRemark {
|
||||||
|
html
|
||||||
|
excerpt
|
||||||
|
fields {
|
||||||
|
authors {
|
||||||
|
name
|
||||||
|
hash
|
||||||
|
avatar
|
||||||
|
}
|
||||||
|
}
|
||||||
|
frontmatter {
|
||||||
|
created_at
|
||||||
|
title
|
||||||
|
recommended_reading
|
||||||
|
external_resources
|
||||||
|
}
|
||||||
|
timeToRead
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`
|
||||||
Vendored
+1
@@ -22,6 +22,7 @@ export interface IFileQuery {
|
|||||||
export interface IFileResourceQuery {
|
export interface IFileResourceQuery {
|
||||||
node: {
|
node: {
|
||||||
relativePath: string
|
relativePath: string
|
||||||
|
relativeDirectory: string
|
||||||
childMarkdownRemark: {
|
childMarkdownRemark: {
|
||||||
frontmatter: {
|
frontmatter: {
|
||||||
author: string
|
author: string
|
||||||
|
|||||||
Reference in New Issue
Block a user