diff --git a/components/Navbar.tsx b/components/Navbar.tsx index f00eb14..4e20a9b 100644 --- a/components/Navbar.tsx +++ b/components/Navbar.tsx @@ -18,6 +18,9 @@ function Navbar(): JSX.Element { projects + + ucla-opensource + contribute diff --git a/components/ProjectGrid.tsx b/components/ProjectGrid.tsx new file mode 100644 index 0000000..c6bb6d5 --- /dev/null +++ b/components/ProjectGrid.tsx @@ -0,0 +1,27 @@ +import React from 'react'; +import ProjectCard from '../components/ProjectCard'; +import {Project, GitHubColors} from '../util'; + +export interface ProjectsProps { + projects: Project[]; + githubColors: GitHubColors +} + +function ProjectGrid({projects, githubColors}: ProjectsProps): JSX.Element { + return ( +
+ {projects.length > 0 + ? projects.map((project, i) => { + return ( +
+ +
+ ); + }) + :

No results found

+ } +
+ ); +} + +export default ProjectGrid; \ No newline at end of file diff --git a/pages/projects.tsx b/pages/projects.tsx index 325fe79..54ec707 100644 --- a/pages/projects.tsx +++ b/pages/projects.tsx @@ -2,15 +2,9 @@ import { GetStaticProps } from 'next'; import { NextSeo } from 'next-seo'; import React, { useState } from 'react'; import Layout from '../components/Layout'; -import ProjectCard from '../components/ProjectCard'; +import ProjectGrid, {ProjectsProps} from '../components/ProjectGrid'; import SearchFilter from '../components/SearchFilter/SearchFilter'; -import { getProjects, Project, GitHubColors, getGithubColors } from '../util'; - - -interface ProjectsProps { - projects: Project[]; - githubColors: GitHubColors -} +import { getProjects, getGithubColors } from '../util'; function Projects({ projects, githubColors }: ProjectsProps): JSX.Element { @@ -46,18 +40,7 @@ function Projects({ projects, githubColors }: ProjectsProps): JSX.Element { setFilteredProjects={setFilteredProjects} />
-
- {filteredProjects.length > 0 - ? filteredProjects.map((project, i) => { - return ( -
- -
- ); - }) - :

No results found

- } -
+ ); diff --git a/pages/ucla-opensource.tsx b/pages/ucla-opensource.tsx new file mode 100644 index 0000000..3e46713 --- /dev/null +++ b/pages/ucla-opensource.tsx @@ -0,0 +1,67 @@ +import { GetStaticProps } from 'next'; +import { NextSeo } from 'next-seo'; +import React, { useState } from 'react'; +import Layout from '../components/Layout'; +import ProjectGrid from '../components/ProjectGrid'; +import SearchFilter from '../components/SearchFilter/SearchFilter'; +import { getUclaOpenSource, Project, GitHubColors, getGithubColors } from '../util'; + + +interface ProjectsProps { + projects: Project[]; + githubColors: GitHubColors +} + +function Projects({ projects, githubColors }: ProjectsProps): JSX.Element { + + // projects is a master list of all the projects that we fetched, filteredProjects is the one that we render + // to the user + const [filteredProjects, setFilteredProjects] = useState(projects); + + return ( + +
+ +

+ ucla-opensource +

+

+ a (work-in-progress) heads-up overview of open source projects at UCLA. +

+
+ +
+ +
+
+ ); +} + +export default Projects; + +export const getStaticProps: GetStaticProps = async () => { + const projects = await getUclaOpenSource(); + const githubColors = await getGithubColors(); + return { + props: { + projects, + githubColors: githubColors, + }, + revalidate: 3600, + }; +}; diff --git a/public/ucla-logo.jpeg b/public/ucla-logo.jpeg new file mode 100644 index 0000000..2bba497 Binary files /dev/null and b/public/ucla-logo.jpeg differ diff --git a/util/projectRequest.ts b/util/projectRequest.ts index 4c4a082..08078e9 100644 --- a/util/projectRequest.ts +++ b/util/projectRequest.ts @@ -1,44 +1,43 @@ import { Octokit } from '@octokit/core'; import { paginateRest } from '@octokit/plugin-paginate-rest'; +// import {EndpointOptions} from '@octokit/types'; import githubColorsFixture from '../data/githubColors.json'; -import { Project, ACMCommitteeTopics, GitHubColors } from './types'; +import { Project, ACMCommitteeTopics, GitHubColors, GitHubRepo } from './types'; -export async function getProjects(): Promise { +async function getGithubRepos(request: string, defaultUseUclaLogo: boolean): Promise { const PaginatedOctokit = Octokit.plugin(paginateRest); const octokit = new PaginatedOctokit(); - const projectsResponse = await octokit.paginate('GET /orgs/{org}/repos', { - org: 'uclaacm', + + const response: GitHubRepo[] = await octokit.paginate('GET /search/repositories?q=ucla-opensource+in:topics', { per_page: 100, }); - const filteredData = projectsResponse.filter((repo) => !repo.archived); + const filteredData = response.filter((repo) => !repo.archived); const sortedData = filteredData.sort( (a, b) => new Date(b.updated_at as string).getTime() - new Date(a.updated_at as string).getTime(), ); - return sortedData.map((repo) => - repo.homepage - ? { - name: repo.name, - description: repo.description ?? '', - link: repo.homepage ?? '', - repo: repo.html_url, - lang: repo.language ?? '', - topics: repo.topics ?? [], - image: getImageFromTopics(repo.topics).image, - alt: getImageFromTopics(repo.topics).alt, - } - : { - name: repo.name, - description: repo.description ?? '', - repo: repo.html_url ?? '', - lang: repo.language ?? '', - topics: repo.topics ?? [], - image: getImageFromTopics(repo.topics).image, - alt: getImageFromTopics(repo.topics).alt, - }, + return sortedData.map((repo) => ({ + name: repo.name, + description: repo.description ?? '', + link: repo.homepage ?? '', + repo: repo.html_url, + lang: repo.language ?? '', + topics: repo.topics ?? [], + image: getImageFromTopics(repo.topics, defaultUseUclaLogo).image, + alt: getImageFromTopics(repo.topics, defaultUseUclaLogo).alt, + }), ); } + +export async function getUclaOpenSource(): Promise { + return getGithubRepos('GET /search/repositories?q=ucla-opensource+in:topics', true); +} + +export async function getProjects(): Promise { + return getGithubRepos('GET /orgs/uclaacm/repos', false); +} + export async function getGithubColors(): Promise { const githubColorsResponse = await fetch( 'https://raw.githubusercontent.com/ozh/github-colors/master/colors.json', @@ -100,7 +99,7 @@ function topicToImg(topic: string): ImageInfo | false { } } -export function getImageFromTopics(topics: string[] | undefined): ImageInfo { +export function getImageFromTopics(topics: string[] | undefined, defaultUseUclaLogo: boolean): ImageInfo { if (topics) { for (const topic of topics) { const committeeImg = topicToImg(topic); @@ -108,8 +107,11 @@ export function getImageFromTopics(topics: string[] | undefined): ImageInfo { } } //return acm logo if no committee topics - return { - image: '/logo.png', - alt: "ACM @ UCLA's Logo", - } as ImageInfo; + return defaultUseUclaLogo ? { + image: '/ucla-logo.jpeg', + alt: 'UCLA Bruin Logo'} + : { + image: '/logo.png', + alt: "ACM @ UCLA's Logo", + }; } diff --git a/util/types.ts b/util/types.ts index e56fe3d..48dc75e 100644 --- a/util/types.ts +++ b/util/types.ts @@ -37,3 +37,5 @@ export type GitHubEvent = Endpoints['GET /orgs/{org}/events']['response']['data'][number]; export type GitHubEventPayload = GitHubEvent['payload']; + +export type GitHubRepo = Endpoints['GET /orgs/{org}/repos']['response']['data'][number];