Skip to content

Commit

Permalink
Initial commit
Browse files Browse the repository at this point in the history
  • Loading branch information
osama bin junaid committed Nov 17, 2022
0 parents commit 28d7a89
Show file tree
Hide file tree
Showing 23 changed files with 2,830 additions and 0 deletions.
36 changes: 36 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.

# dependencies
/node_modules
/.pnp
.pnp.js

# testing
/coverage

# next.js
/.next/
/out/

# production
/build

# misc
.DS_Store
*.pem

# debug
npm-debug.log*
yarn-debug.log*
yarn-error.log*
.pnpm-debug.log*

# local env files
.env*.local

# vercel
.vercel

# typescript
*.tsbuildinfo
next-env.d.ts
3 changes: 3 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
TODO:

- Deployment tutorial will go here
29 changes: 29 additions & 0 deletions components/navbar.component.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import Image from 'next/image'

type NavBarProps = {
filterFunc: any
}

export default function NavBar(props: NavBarProps) {
return (
<>
<p className='text-right text-xs'>with 💗 from <a href="https://linkedin.com/in/ibnjunaid">@ibnjunaid</a></p>
<div className="navbar bg-base-100 ">
<div className="flex-1">
<Image src="/GDSC.png" width={400} height={50}
alt="Shoes" className="rounded-xl bg-green-200 p-2"
/>
</div>
<div className="flex-1">
<h1>GCCP Leader Board</h1>
</div>
<div className="flex-none gap-2">
<div className="form-control">
<input type="text" placeholder="Search" className="input input-bordered"
onChange={props.filterFunc} />
</div>
</div>
</div>
</>
)
}
40 changes: 40 additions & 0 deletions components/table.components.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
import * as react from 'react'
import { useState } from 'react';

type TableProp = {
headers: string[];
data: string[][]
}

export default function Table(props: TableProp) {
return (

<>
<div className="overflow-x-auto">
<table className="table w-full">
{/* <!-- head --> */}
<thead>
<tr>
<th>Serial</th>
{
props.headers.map((header, index) => <th key={index}>{header}</th>)
}
</tr>
</thead>
<tbody>
{
props.data.map((entry, i) => {
return <tr key={i}>
<th>{i}</th>
{
entry.map((val, j) => <th key={j}>{val}</th>)
}
</tr>
})
}
</tbody>
</table>
</div>
</>
)
}
7 changes: 7 additions & 0 deletions next.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
/** @type {import('next').NextConfig} */
const nextConfig = {
reactStrictMode: true,
swcMinify: true,
}

module.exports = nextConfig
31 changes: 31 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
{
"name": "gccp",
"version": "0.1.0",
"private": true,
"scripts": {
"dev": "next dev",
"build": "next build",
"start": "next start",
"lint": "next lint"
},
"dependencies": {
"@types/node": "18.11.9",
"@types/react": "18.0.25",
"@types/react-dom": "18.0.9",
"colors": "^1.4.0",
"daisyui": "^2.40.1",
"eslint": "8.27.0",
"eslint-config-next": "13.0.3",
"google-auth-library": "^8.7.0",
"googleapis": "^109.0.1",
"next": "13.0.3",
"react": "18.2.0",
"react-dom": "18.2.0",
"typescript": "4.8.4"
},
"devDependencies": {
"autoprefixer": "^10.4.13",
"postcss": "^8.4.19",
"tailwindcss": "^3.2.4"
}
}
6 changes: 6 additions & 0 deletions pages/_app.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import '../styles/globals.css'
import type { AppProps } from 'next/app'

export default function App({ Component, pageProps }: AppProps) {
return <Component {...pageProps} />
}
24 changes: 24 additions & 0 deletions pages/api/hello.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
// Next.js API route support: https://nextjs.org/docs/api-routes/introduction
import type { NextApiRequest, NextApiResponse } from 'next'
import { getSheetId } from '../../utils/db';
import { getDataFromSheet, getSheetTitles } from '../../utils/sheets'
import { filterSensitiveData } from '../../utils/utils'

type Data = {
headers: string[];
data: any[][];
}

export default async function handler( req: NextApiRequest, res: NextApiResponse<Data> ) {
const sheetId = getSheetId()
const sheetTitles = await getSheetTitles(sheetId)
const latestTableTitle = sheetTitles.at(-1)
if(latestTableTitle){
const data = await getDataFromSheet(sheetId, latestTableTitle)
const filteredData = filterSensitiveData(data);
res.json(filteredData)
}
else {
res.status(500).send({data:[], headers:[]})
}
}
37 changes: 37 additions & 0 deletions pages/index.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
import { useState } from 'react'
import NavBar from '../components/navbar.component'
import Table from '../components/table.components'

export default function Home({participantsData}: any) {

const [data, setData] = useState(participantsData.data)

function handleFilter(event: React.ChangeEvent<HTMLInputElement>) {

if(event.target.value){
const filtered_data = data.filter(
(entry: any) => entry.some(
(e:string) => e.toLowerCase().includes(event.target.value.toLowerCase())
)
)
setData(filtered_data)
} else {
setData(participantsData.data)
}
}

return (
<>
<NavBar filterFunc = {handleFilter} />
<Table headers={participantsData.headers} data={data}/>
</>
)
}


export async function getStaticProps(){
// Fetch data from external API
const res = await fetch(`https://gccp.vercel.app/api/hello`)
const data = await res.json()
return { props: { participantsData: data }, revalidate: 518400 }
}
6 changes: 6 additions & 0 deletions postcss.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
module.exports = {
plugins: {
tailwindcss: {},
autoprefixer: {},
},
}
1 change: 1 addition & 0 deletions private/sheet-key.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
// <key will got here>
Binary file added public/GDSC.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/favicon.ico
Binary file not shown.
4 changes: 4 additions & 0 deletions public/vercel.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
129 changes: 129 additions & 0 deletions styles/Home.module.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
.container {
padding: 0 2rem;
}

.main {
min-height: 100vh;
padding: 4rem 0;
flex: 1;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
}

.footer {
display: flex;
flex: 1;
padding: 2rem 0;
border-top: 1px solid #eaeaea;
justify-content: center;
align-items: center;
}

.footer a {
display: flex;
justify-content: center;
align-items: center;
flex-grow: 1;
}

.title a {
color: #0070f3;
text-decoration: none;
}

.title a:hover,
.title a:focus,
.title a:active {
text-decoration: underline;
}

.title {
margin: 0;
line-height: 1.15;
font-size: 4rem;
}

.title,
.description {
text-align: center;
}

.description {
margin: 4rem 0;
line-height: 1.5;
font-size: 1.5rem;
}

.code {
background: #fafafa;
border-radius: 5px;
padding: 0.75rem;
font-size: 1.1rem;
font-family: Menlo, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono,
Bitstream Vera Sans Mono, Courier New, monospace;
}

.grid {
display: flex;
align-items: center;
justify-content: center;
flex-wrap: wrap;
max-width: 800px;
}

.card {
margin: 1rem;
padding: 1.5rem;
text-align: left;
color: inherit;
text-decoration: none;
border: 1px solid #eaeaea;
border-radius: 10px;
transition: color 0.15s ease, border-color 0.15s ease;
max-width: 300px;
}

.card:hover,
.card:focus,
.card:active {
color: #0070f3;
border-color: #0070f3;
}

.card h2 {
margin: 0 0 1rem 0;
font-size: 1.5rem;
}

.card p {
margin: 0;
font-size: 1.25rem;
line-height: 1.5;
}

.logo {
height: 1em;
margin-left: 0.5rem;
}

@media (max-width: 600px) {
.grid {
width: 100%;
flex-direction: column;
}
}

@media (prefers-color-scheme: dark) {
.card,
.footer {
border-color: #222;
}
.code {
background: #111;
}
.logo img {
filter: invert(1);
}
}
3 changes: 3 additions & 0 deletions styles/globals.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
@tailwind base;
@tailwind components;
@tailwind utilities;
12 changes: 12 additions & 0 deletions tailwind.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
/** @type {import('tailwindcss').Config} */
module.exports = {
content: [
"./app/**/*.{js,ts,jsx,tsx}",
"./pages/**/*.{js,ts,jsx,tsx}",
"./components/**/*.{js,ts,jsx,tsx}",
],
theme: {
extend: {},
},
plugins: [require("daisyui")],
}
Loading

0 comments on commit 28d7a89

Please sign in to comment.