import { NextSeo } from 'next-seo'; import getConfig from 'next/config'; import { getAllProjectsFromOrg, getProjectDataPackage, getProjectMetadata, getProjectReadme, } from '../../../lib/project'; import ReactMarkdown from 'react-markdown'; import remarkGfm from 'remark-gfm'; import { loadDataPackage } from '../../../lib/loader'; import Layout from '../../../components/_shared/Layout'; import Link from 'next/link'; import { Project } from '../../../lib/project.interface'; import ExternalLinkIcon from '../../../components/icons/ExternalLinkIcon'; import { FlatUiTable } from '../../../components/FlatUiTable'; export default function ProjectPage({ project, readme, }: { project: Project; readme: string; }) { // Get description from datapackage or calculate // excerpt from README by getting all the content // up to the first dot. const description = project.description || (readme && readme.slice(0, readme.indexOf('.') + 1)); return (

{project.title || project.name}

@{project.repo.full_name} {description && (
{description}
)}
{project.datapackage.countryCode && ( )} {project.datapackage.countryCode && ( )}
Name Country Metadata
{project.name} {project.datapackage.countryCode} datapackage.json

Data files

This dataset contains {project.files.length} file {project.files.length == 1 ? '' : 's'}

{project.files?.map((file) => { let size: number | string = file.size; if (!size) { if (file.bytes) { if (file.bytes > 1000000) { size = (file.bytes / 1000000).toFixed(2) + ' MB'; } else { size = (file.bytes / 1000).toFixed(2) + ' kB'; } } } return ( ); })}
Name Format Size
{file.name} {file.format} {size} Download
{project.files?.map((file) => { let size: number | string = file.size; if (!size) { if (file.bytes) { if (file.bytes > 1000000) { size = (file.bytes / 1000000).toFixed(2) + ' MB'; } else { size = (file.bytes / 1000).toFixed(2) + ' kB'; } } } return (
{file.path && (

{file.name} {file.format ? `.${file.format}` : ''}

{file.bytes >= 5132288 && ( Previewing 5MB out of {size} )}
)}
); })}
{readme && ( <>

Readme

{readme} )}
); } // Generates `/posts/1` and `/posts/2` export async function getStaticPaths() { const github_pat = getConfig().serverRuntimeConfig.github_pat; const allProjects = await getAllProjectsFromOrg( 'os-data', 'main', github_pat ); const paths = allProjects.results.map((project) => ({ params: { // TODO: dynamize the org org: 'os-data', project: project.repo.name, }, })); return { paths, fallback: false, // can also be true or 'blocking' }; } export async function getStaticProps({ params }) { const { org: orgName, project: projectName } = params; const github_pat = getConfig().serverRuntimeConfig.github_pat; const datapackage = await getProjectDataPackage( orgName, projectName, 'main', github_pat ); const repo = await getProjectMetadata(orgName, projectName, github_pat); const project = loadDataPackage(datapackage, repo); // TODO: should this be moved to the loader? const readme = await getProjectReadme( orgName, projectName, 'main', github_pat ); return { props: { project, readme, }, }; }