From 7087f07ebb13c1a7fa79525f56c8feab288b6cd7 Mon Sep 17 00:00:00 2001 From: Josephine Rueckert Date: Thu, 12 Jan 2023 18:47:03 +0100 Subject: [PATCH 01/17] feat: add getting contributors started page --- src/pages/contribute.jsx | 315 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 315 insertions(+) create mode 100644 src/pages/contribute.jsx diff --git a/src/pages/contribute.jsx b/src/pages/contribute.jsx new file mode 100644 index 00000000..8c429be8 --- /dev/null +++ b/src/pages/contribute.jsx @@ -0,0 +1,315 @@ +import React from "react"; +import { graphql, Link } from "gatsby"; +import { Row, Col } from "reactstrap"; +import Section from "../components/Section"; +import SEO from "../components/SEO/SEO"; +import Layout from "../layout"; + +function GettingStarted() { + return ( + + + +

+ All beginnings are difficult, but the below mentioned learning + resources for{" "} + + Workspace Setup + + {` and `} + + {`Terasology's Engine & Module Land`} + {" "} + should help you to get started and set yourself up for success. +

+

+ Make sure to also join our{" "} + + Discord + {" "} + to get answers to your questions and help with any issues you might + face. +

+ +
+
+ + +

+ Setting up your Terasology Workspace is the first step in your + journey as a Terasology contributor. Follow the Contributor + Quickstart and make sure you understand our multi-repo setup. +

+

+ If you are new to Git and GitHub, we also recommend to especially + get familiar with the Git branching basics and GitHub forking + workflow. +

+

+ Further, remember that all submissions must be licensed under + Apache License, Version 2.0, that we encourage certain best + practices regarding code style, commits and pull requests, and + that we maintain a code of conduct. +

+ + + + +
+
+
+ + +

+ We recommend to start contributing in Module Land rather than the + Terasology Engine, especially if you do not have a lot of + experience with Java or have not worked with an already existing + and big codebase yet. However, the following concepts are + important for both areas: +

+ + + +

+ Contributing to {`Terasology's Module Land`} requires basic + Java knowledge and interest in UI/UX, world generation or gameplay + mechanics. Browse through our existing modules, see what we + already have and what we might still be missing. +

+

+ To get started, you should make yourself familiar with module + development and testing. Furthermore, you should to learn about + module dependencies and world generation. +

+ + + +

+ Contributing to the Terasology Engine requires being very + comfortable with Java and ideally having expertise in game engine + topics like rendering, networking and concurrency, as well as + in-game physics and AI technology. +

+

+ To get started, you should make yourself familiar with the + codebase itself and any specific areas within it that match your + interest. Most of the engine-related documentation is in-code. +

+ + +
+
+
+ ); +} +export default GettingStarted; + +export const pageQuery = graphql` + query projectQuery { + ongoingProjects: allTrelloCard( + filter: { list_id: { eq: "60ddd7cf64da4b3ee8c5a2e9" } } + sort: { index: ASC } + ) { + nodes { + id + list_id + name + labels { + name + } + childMarkdownRemark { + excerpt + } + } + } + projectCover: file(name: { eq: "defaultCardcover" }, ext: { eq: ".jpg" }) { + childImageSharp { + gatsbyImageData + } + } + site { + siteMetadata { + title + } + } + } +`; + +export function Head({ data }) { + return ( + + ); +} From 695a2a9d60c16cde36b3fb685a221075cdaa9c3a Mon Sep 17 00:00:00 2001 From: Josephine Rueckert Date: Thu, 12 Jan 2023 18:51:47 +0100 Subject: [PATCH 02/17] feat: add new page to navigation --- src/components/Header/Header.jsx | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/components/Header/Header.jsx b/src/components/Header/Header.jsx index 4240891d..a1d1e27f 100644 --- a/src/components/Header/Header.jsx +++ b/src/components/Header/Header.jsx @@ -81,6 +81,17 @@ function Header() { Contribute + + + + Getting Started + + + Date: Thu, 12 Jan 2023 19:06:28 +0100 Subject: [PATCH 03/17] chore: update apache license link --- src/pages/contribute.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/contribute.jsx b/src/pages/contribute.jsx index 8c429be8..d0265edb 100644 --- a/src/pages/contribute.jsx +++ b/src/pages/contribute.jsx @@ -92,7 +92,7 @@ function GettingStarted() {
  • Apache License, Version 2.0 From f4b745fbe0e3a4e142ffc62fbb286190fcc8a16f Mon Sep 17 00:00:00 2001 From: Josephine Rueckert Date: Thu, 12 Jan 2023 19:16:58 +0100 Subject: [PATCH 04/17] chore: remove not yet needed project query --- src/pages/contribute.jsx | 33 +-------------------------------- 1 file changed, 1 insertion(+), 32 deletions(-) diff --git a/src/pages/contribute.jsx b/src/pages/contribute.jsx index d0265edb..9ff6674e 100644 --- a/src/pages/contribute.jsx +++ b/src/pages/contribute.jsx @@ -1,5 +1,5 @@ import React from "react"; -import { graphql, Link } from "gatsby"; +import { Link } from "gatsby"; import { Row, Col } from "reactstrap"; import Section from "../components/Section"; import SEO from "../components/SEO/SEO"; @@ -275,37 +275,6 @@ function GettingStarted() { } export default GettingStarted; -export const pageQuery = graphql` - query projectQuery { - ongoingProjects: allTrelloCard( - filter: { list_id: { eq: "60ddd7cf64da4b3ee8c5a2e9" } } - sort: { index: ASC } - ) { - nodes { - id - list_id - name - labels { - name - } - childMarkdownRemark { - excerpt - } - } - } - projectCover: file(name: { eq: "defaultCardcover" }, ext: { eq: ".jpg" }) { - childImageSharp { - gatsbyImageData - } - } - site { - siteMetadata { - title - } - } - } -`; - export function Head({ data }) { return ( Date: Thu, 12 Jan 2023 19:26:35 +0100 Subject: [PATCH 05/17] revert: removing sitemetadata query --- src/pages/contribute.jsx | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/pages/contribute.jsx b/src/pages/contribute.jsx index 9ff6674e..4807dc1f 100644 --- a/src/pages/contribute.jsx +++ b/src/pages/contribute.jsx @@ -1,5 +1,5 @@ import React from "react"; -import { Link } from "gatsby"; +import { graphql, Link } from "gatsby"; import { Row, Col } from "reactstrap"; import Section from "../components/Section"; import SEO from "../components/SEO/SEO"; @@ -275,6 +275,16 @@ function GettingStarted() { } export default GettingStarted; +export const pageQuery = graphql` + query siteQuery { + site { + siteMetadata { + title + } + } + } +`; + export function Head({ data }) { return ( Date: Thu, 12 Jan 2023 19:19:07 +0100 Subject: [PATCH 06/17] feat: add ongoing projects list to contribute page --- src/pages/contribute.jsx | 65 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 63 insertions(+), 2 deletions(-) diff --git a/src/pages/contribute.jsx b/src/pages/contribute.jsx index 4807dc1f..05a2185d 100644 --- a/src/pages/contribute.jsx +++ b/src/pages/contribute.jsx @@ -5,7 +5,7 @@ import Section from "../components/Section"; import SEO from "../components/SEO/SEO"; import Layout from "../layout"; -function GettingStarted() { +function GettingStarted({ data }) { return ( @@ -22,6 +22,13 @@ function GettingStarted() { {" "} should help you to get started and set yourself up for success.

    +

    + To get started with your first contribution, you'll also find{" "} + + Ongoing Projects + + {` to join.`} +

    Make sure to also join our{" "} +

    + + +

    + While you are free to roam our codebase and contribute in any area + you'd like, below are some tasks and projects that we encourage + you to consider. Their scope and feasibility are potentially more + realistic than a goal you might set for yourself without knowing + the depths and intricacies of our codebase. +

    + +
    + {ongoingProjects.length !== 0 ? ( +
    + + +

    + Find our ongoing projects below. Come talk to us on our{" "} + + Discord + {" "} + if you'd like to join one of them. You can also propose your + own project ideas. +

    + + + +
    + ) : null} +
    ); } export default GettingStarted; export const pageQuery = graphql` - query siteQuery { + query projectQuery { + ongoingProjects: allTrelloCard( + filter: { list_id: { eq: "60ddd7cf64da4b3ee8c5a2e9" } } + sort: { index: ASC } + ) { + nodes { + id + list_id + name + labels { + name + } + childMarkdownRemark { + excerpt + } + } + } + projectCover: file(name: { eq: "defaultCardcover" }, ext: { eq: ".jpg" }) { + childImageSharp { + gatsbyImageData + } + } site { siteMetadata { title From 91ef910cd57196a12832fd49c06f2ac507fa1886 Mon Sep 17 00:00:00 2001 From: Josephine Rueckert Date: Thu, 12 Jan 2023 19:19:24 +0100 Subject: [PATCH 07/17] chore: remove ongoing projects list from programs page --- src/pages/programs.jsx | 42 ++++++++++++++++++++++++------------------ 1 file changed, 24 insertions(+), 18 deletions(-) diff --git a/src/pages/programs.jsx b/src/pages/programs.jsx index 19923bd7..b997a82f 100644 --- a/src/pages/programs.jsx +++ b/src/pages/programs.jsx @@ -18,20 +18,12 @@ function toCardData(trelloCard, defaultCover) { } function ContributorPrograms({ data }) { - const trelloCards = data.allTrelloCard.nodes; - const defaultCover = data.projectCover; - const availableProjects = trelloCards - .filter((node) => node.list_id === "5c3aab0bd640fe19e4069de5") - .map((node) => toCardData(node, defaultCover)); - const ongoingProjects = trelloCards - .filter((node) => node.list_id === "60ddd7cf64da4b3ee8c5a2e9") - .map((node) => toCardData(node, defaultCover)); - + const availableProjects = data.availableProjects.nodes.map((node) => + toCardData(node, defaultCover) + ); const defaultAvatar = data.profilePlaceholder; - const mentorList = trelloCards - .filter((node) => node.list_id === "5eb715b48caa18614425c25e") - .map((node) => { + const mentorList = data.mentors.nodes.map((node) => { const { name, labels, @@ -94,11 +86,6 @@ function ContributorPrograms({ data }) { - {ongoingProjects.length !== 0 ? ( -
    - -
    - ) : null} {availableProjects.length !== 0 ? (
    @@ -130,7 +117,26 @@ export default ContributorPrograms; export const pageQuery = graphql` query projectQuery { - allTrelloCard(sort: { index: ASC }) { + availableProjects: allTrelloCard( + filter: { list_id: { eq: "5c3aab0bd640fe19e4069de5" } } + sort: { index: ASC } + ) { + nodes { + id + list_id + name + labels { + name + } + childMarkdownRemark { + excerpt + } + } + } + mentors: allTrelloCard( + filter: { list_id: { eq: "5eb715b48caa18614425c25e" } } + sort: { index: ASC } + ) { nodes { id list_id From fd57b11e2612abbea8f391eb8687c96d9884c476 Mon Sep 17 00:00:00 2001 From: Josephine Rueckert Date: Thu, 12 Jan 2023 19:19:45 +0100 Subject: [PATCH 08/17] chore: format --- src/pages/programs.jsx | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/src/pages/programs.jsx b/src/pages/programs.jsx index b997a82f..f3b2199a 100644 --- a/src/pages/programs.jsx +++ b/src/pages/programs.jsx @@ -24,29 +24,29 @@ function ContributorPrograms({ data }) { ); const defaultAvatar = data.profilePlaceholder; const mentorList = data.mentors.nodes.map((node) => { - const { - name, - labels, - custom_fields: customFields, - childMarkdownRemark, - childCardMedia, - } = node; - const { html } = childMarkdownRemark; - const avatar = childCardMedia ? childCardMedia.localFile : defaultAvatar; + const { + name, + labels, + custom_fields: customFields, + childMarkdownRemark, + childCardMedia, + } = node; + const { html } = childMarkdownRemark; + const avatar = childCardMedia ? childCardMedia.localFile : defaultAvatar; - const tags = labels.map((l) => l.name); - const githubProfile = customFields.find( - (field) => field.idCustomField === "5eb71b3551de3a59ce8d9bd8" - )?.value.text; - const timeZone = customFields.find( - (field) => field.idCustomField === "5eb71b53f52d88487f550e83" - )?.value.text; - const countryCode = customFields - .find((field) => field.idCustomField === "5eb71b7081a67c3b58ea67ed") - ?.value.text.toLowerCase(); + const tags = labels.map((l) => l.name); + const githubProfile = customFields.find( + (field) => field.idCustomField === "5eb71b3551de3a59ce8d9bd8" + )?.value.text; + const timeZone = customFields.find( + (field) => field.idCustomField === "5eb71b53f52d88487f550e83" + )?.value.text; + const countryCode = customFields + .find((field) => field.idCustomField === "5eb71b7081a67c3b58ea67ed") + ?.value.text.toLowerCase(); - return { name, avatar, tags, html, githubProfile, timeZone, countryCode }; - }); + return { name, avatar, tags, html, githubProfile, timeZone, countryCode }; + }); return ( From 35b8f11560b592559546f15fff57f884e1caa347 Mon Sep 17 00:00:00 2001 From: Josephine Rueckert Date: Thu, 12 Jan 2023 19:23:19 +0100 Subject: [PATCH 09/17] chore: fix eslint findings --- src/pages/contribute.jsx | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/src/pages/contribute.jsx b/src/pages/contribute.jsx index 05a2185d..02582768 100644 --- a/src/pages/contribute.jsx +++ b/src/pages/contribute.jsx @@ -1,11 +1,27 @@ import React from "react"; import { graphql, Link } from "gatsby"; import { Row, Col } from "reactstrap"; +import PostListing from "../components/PostListing/PostListing"; import Section from "../components/Section"; import SEO from "../components/SEO/SEO"; import Layout from "../layout"; function GettingStarted({ data }) { + function toCardData(project, defaultCover) { + console.log(project); + const { id, name: title, labels, childMarkdownRemark } = project; + const { excerpt } = childMarkdownRemark; + const posttype = "project"; + const tags = labels.map((l) => l.name); + const cover = defaultCover; + return { posttype, title, path: `/projects/${id}`, excerpt, tags, cover }; + } + + const defaultCover = data.projectCover; + const ongoingProjects = data.ongoingProjects.nodes.map((project) => + toCardData(project, defaultCover) + ); + return ( @@ -23,7 +39,7 @@ function GettingStarted({ data }) { should help you to get started and set yourself up for success.

    - To get started with your first contribution, you'll also find{" "} + To get started with your first contribution, you will also find{" "} Ongoing Projects @@ -282,7 +298,7 @@ function GettingStarted({ data }) {

    While you are free to roam our codebase and contribute in any area - you'd like, below are some tasks and projects that we encourage + you would like, below are some tasks and projects that we encourage you to consider. Their scope and feasibility are potentially more realistic than a goal you might set for yourself without knowing the depths and intricacies of our codebase. @@ -301,7 +317,7 @@ function GettingStarted({ data }) { > Discord {" "} - if you'd like to join one of them. You can also propose your + if you would like to join one of them. You can also propose your own project ideas.

    From d67d9f8b592b6aff2144a8d41c09f65504858659 Mon Sep 17 00:00:00 2001 From: Josephine Rueckert Date: Thu, 12 Jan 2023 23:15:51 +0100 Subject: [PATCH 10/17] chore: format --- src/pages/contribute.jsx | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/pages/contribute.jsx b/src/pages/contribute.jsx index 02582768..df1fd668 100644 --- a/src/pages/contribute.jsx +++ b/src/pages/contribute.jsx @@ -298,10 +298,10 @@ function GettingStarted({ data }) {

    While you are free to roam our codebase and contribute in any area - you would like, below are some tasks and projects that we encourage - you to consider. Their scope and feasibility are potentially more - realistic than a goal you might set for yourself without knowing - the depths and intricacies of our codebase. + you would like, below are some tasks and projects that we + encourage you to consider. Their scope and feasibility are + potentially more realistic than a goal you might set for yourself + without knowing the depths and intricacies of our codebase.

    @@ -317,8 +317,8 @@ function GettingStarted({ data }) { > Discord {" "} - if you would like to join one of them. You can also propose your - own project ideas. + if you would like to join one of them. You can also propose + your own project ideas.

    From 790947d21bed294befd013bd30f512b3d0ac9b97 Mon Sep 17 00:00:00 2001 From: Josephine Rueckert Date: Thu, 12 Jan 2023 23:11:41 +0100 Subject: [PATCH 11/17] feat: add github logo --- static/logos/github.svg | 1 + 1 file changed, 1 insertion(+) create mode 100644 static/logos/github.svg diff --git a/static/logos/github.svg b/static/logos/github.svg new file mode 100644 index 00000000..37fa923d --- /dev/null +++ b/static/logos/github.svg @@ -0,0 +1 @@ + \ No newline at end of file From 579f459fd148f8415a9ee7bddade719d2c9d51ca Mon Sep 17 00:00:00 2001 From: Josephine Rueckert Date: Thu, 12 Jan 2023 23:11:49 +0100 Subject: [PATCH 12/17] feat: add good first module land issues list --- src/pages/contribute.jsx | 153 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 152 insertions(+), 1 deletion(-) diff --git a/src/pages/contribute.jsx b/src/pages/contribute.jsx index df1fd668..c23318a4 100644 --- a/src/pages/contribute.jsx +++ b/src/pages/contribute.jsx @@ -1,10 +1,21 @@ import React from "react"; import { graphql, Link } from "gatsby"; -import { Row, Col } from "reactstrap"; +import { + Row, + Col, + Card, + CardBody, + CardHeader, + CardSubtitle, + CardTitle, +} from "reactstrap"; +import moment from "moment"; import PostListing from "../components/PostListing/PostListing"; import Section from "../components/Section"; import SEO from "../components/SEO/SEO"; import Layout from "../layout"; +import Tags from "../components/common/Tags"; +import gitHubLogo from "../../static/logos/github.svg"; function GettingStarted({ data }) { function toCardData(project, defaultCover) { @@ -22,6 +33,30 @@ function GettingStarted({ data }) { toCardData(project, defaultCover) ); + const moduleIssues = data.moduleIssues.nodes + .filter((module) => module.issues.nodes.length !== 0) + .flatMap((module) => { + const { name, url: moduleUrl, issues } = module; + return issues.nodes.map((issue) => { + const { title, author, labels, updatedAt, url } = issue; + const { login } = author; + const { nodes } = labels; + const tags = nodes.flatMap((node) => node.name); + return { + module: name, + moduleUrl, + title, + author: login, + tags, + date: updatedAt, + url, + }; + }); + }) + .sort((a, b) => + new Date(a.date).getTime() <= new Date(b.date).getTime() ? 1 : 0 + ); + return ( @@ -235,6 +270,16 @@ function GettingStarted({ data }) {
  • +

    + Jump below to our{" "} + + Good First Issues in Module Land + + . +

    @@ -325,6 +370,90 @@ function GettingStarted({ data }) { ) : null} +

    + + +

    + Find some of our module-land issues below. If you would like to + work on one of them, start a draft PR for it. You can also view + the full list on{" "} + + GitHub + + . +

    + +
    + + {moduleIssues + .slice(0, 10) + .map(({ module, moduleUrl, title, tags, author, url, date }) => ( + + + + {module} + + + + + Visit on GitHub + + + + {tags ? ( + + + + ) : ( + "" + )} + + {title} + + {author ? ( + + Author: {author} + + ) : ( + "" + )} + {date ? ( + + Last updated on: + {moment(date).format("MMMM DD, YYYY")} + + ) : ( + "" + )} + + + + + + + ))} + +
    ); @@ -349,6 +478,28 @@ export const pageQuery = graphql` } } } + moduleIssues: allTerasologyModule { + nodes { + name + url + issues { + nodes { + id + title + author { + login + } + labels { + nodes { + name + } + } + updatedAt + url + } + } + } + } projectCover: file(name: { eq: "defaultCardcover" }, ext: { eq: ".jpg" }) { childImageSharp { gatsbyImageData From 604357ac79d3cbd1aae7cbcda680420121fbebdd Mon Sep 17 00:00:00 2001 From: Josephine Rueckert Date: Mon, 16 Jan 2023 21:46:51 +0100 Subject: [PATCH 13/17] chore: use fa icon instead of svg --- src/pages/contribute.jsx | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/pages/contribute.jsx b/src/pages/contribute.jsx index d45207eb..c4043ad0 100644 --- a/src/pages/contribute.jsx +++ b/src/pages/contribute.jsx @@ -10,12 +10,13 @@ import { CardTitle, } from "reactstrap"; import moment from "moment"; +import { IconContext } from "react-icons"; +import { FaGithub } from "react-icons/fa"; import PostListing from "../components/PostListing/PostListing"; import Section from "../components/Section"; import SEO from "../components/SEO/SEO"; import Layout from "../layout"; import Tags from "../components/common/Tags"; -import gitHubLogo from "../../static/logos/github.svg"; function GettingStarted({ data }) { function toCardData(project, defaultCover) { @@ -411,12 +412,12 @@ function GettingStarted({ data }) { rel="noreferrer" > - - Visit on GitHub + +
    + + + +
    From e5623815afa7cd569121ff09d370ec9269279277 Mon Sep 17 00:00:00 2001 From: Josephine Rueckert Date: Mon, 16 Jan 2023 21:47:31 +0100 Subject: [PATCH 14/17] chore: remove github logo svg --- static/logos/github.svg | 1 - 1 file changed, 1 deletion(-) delete mode 100644 static/logos/github.svg diff --git a/static/logos/github.svg b/static/logos/github.svg deleted file mode 100644 index 37fa923d..00000000 --- a/static/logos/github.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file From de072cdbfcebf64bc13e10ff587f466ae64d99f7 Mon Sep 17 00:00:00 2001 From: Josephine Rueckert Date: Mon, 16 Jan 2023 21:47:46 +0100 Subject: [PATCH 15/17] chore: format --- src/pages/contribute.jsx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/pages/contribute.jsx b/src/pages/contribute.jsx index c4043ad0..dda14992 100644 --- a/src/pages/contribute.jsx +++ b/src/pages/contribute.jsx @@ -412,7 +412,10 @@ function GettingStarted({ data }) { rel="noreferrer" > - +
    From c16911ec9e3219b8a2b3c98589e08c186a53cc96 Mon Sep 17 00:00:00 2001 From: Josephine Rueckert Date: Mon, 16 Jan 2023 21:49:24 +0100 Subject: [PATCH 16/17] chore: fix eslint findings --- src/pages/contribute.jsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/pages/contribute.jsx b/src/pages/contribute.jsx index dda14992..e91e49ea 100644 --- a/src/pages/contribute.jsx +++ b/src/pages/contribute.jsx @@ -1,5 +1,5 @@ import React from "react"; -import { graphql, Link } from "gatsby"; +import { graphql, Link, useMemo } from "gatsby"; import { Row, Col, @@ -57,6 +57,7 @@ function GettingStarted({ data }) { new Date(a.date).getTime() <= new Date(b.date).getTime() ? 1 : 0 ); + const githubIconSize = useMemo(() => ({ size: "4em" }), []); return ( @@ -417,7 +418,7 @@ function GettingStarted({ data }) { className="ml-5 pt-0 pb-2 d-none d-md-block" >
    - +
    From a8cfd4ce26b66fe13a1daa9c14be6b490b0d9238 Mon Sep 17 00:00:00 2001 From: Josephine Rueckert Date: Mon, 16 Jan 2023 21:51:28 +0100 Subject: [PATCH 17/17] fix: import --- src/pages/contribute.jsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pages/contribute.jsx b/src/pages/contribute.jsx index e91e49ea..77b44974 100644 --- a/src/pages/contribute.jsx +++ b/src/pages/contribute.jsx @@ -1,5 +1,5 @@ -import React from "react"; -import { graphql, Link, useMemo } from "gatsby"; +import React, { useMemo } from "react"; +import { graphql, Link } from "gatsby"; import { Row, Col,