Skip to content

Commit

Permalink
intiail deploy
Browse files Browse the repository at this point in the history
  • Loading branch information
jerry1ye10 committed Apr 12, 2022
0 parents commit 92fc492
Show file tree
Hide file tree
Showing 57 changed files with 9,221 additions and 0 deletions.
34 changes: 34 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
# 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*

# local env files
.env.local
.env.development.local
.env.test.local
.env.production.local

# vercel
.vercel
4 changes: 4 additions & 0 deletions .prettierrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"tabWidth": 2,
"useTabs": false
}
18 changes: 18 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Founder's Choice

### About
Choosing the right partners to sit on your cap table is one of the hardest decisions that a founder has to make. The wrong choice is difficult to undo. Without knowing the right people, it can be difficult to get reliable information on which firms to choose. We hope that by collecting and processing venture-backed founder preferrences of investors, we can democratize access to this information, allowing founders to easily find the VC firms who are right for them. We verify that all founders are only able to contribute to the rankings of VCs that have actually invested in their startup. If you are a founder who’s raised money, we would love your feedback! If not, we hope our rankings can be helpful to you.

### Identity Verification
In order to verify a Founder's identity, we use a combination of Linkedin and Crunchbase. This way, founders can only compare VCs that have actually invested in them.

### Ranking Algorithm
We use an Elo-based algorithm , which asks founders to make pair-wise comparisons among the VCs they’ve worked with. The advantage of this system is that it only accepts ratings from founders who have actually worked with these VCs, and it preserves anonymity of the founders while avoiding the vitriol on other review sites.

### Data Security
We take founder's data very seriously. Although we authenticate all founders through their LinkedIn profiles, we only store that data temporarily for authentication purposes. As soon as founders start submitting comparisons, we hash their identity, and unlink their hashed identity from the ratings they've made, so no one can ever connect a founder's ratings back to them. To be as secure as possible, all our code (as you can see here) is open-sourced. Our code’s been reviewed by engineers at venture-backed companies, we’re trying to do this as carefully as possible.

### Sponsors
<img width="533" alt="Screen Shot 2022-04-10 at 5 33 05 PM" src="https://user-images.githubusercontent.com/25914367/162640772-5e32380c-ad5e-4643-9373-3a7bb52432b2.png">

Although we have venture capital firms as sponsors for this project, they do not have access to any of the data nor are they able to contribute to any of the rankings. Our sponsors are only interested in supporting this ranking project so they can better serve founders.
25 changes: 25 additions & 0 deletions components/Button.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import React from "react"

export function Button({
children,
className
}) {
return <button
className={`z-50 raleway font-light text-4xl bg-white rounded-full border-2 border-black p-8 py-4 mt-8 ${className}`}
href="/login"
>
{children}
</button>
}

export function Link({
children,
className = ""
}) {
return <a
className={`z-50 raleway font-light text-4xl bg-white rounded-full border-2 border-black p-8 py-4 mt-8 ${className}`}
href="/login"
>
{children}
</a>
}
10 changes: 10 additions & 0 deletions components/Loader.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
export default ({ className, size = 36, children }) => {
return <>
<div className={`flex flex-col justify-center items-center ${className}`}>
<div
className={`animate-spin rounded-full h-${size} w-${size} border-b-2 border-gray-900`}
/>
{children}
</div>
</>
}
41 changes: 41 additions & 0 deletions components/Navbar.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import { useRouter } from "next/router";
import { useState, useEffect } from "react";

export default () => {
const router = useRouter();
const isIndex = router.pathname === `/`;
const isRanking = router.pathname === "/ranking";
const isAbout = router.pathname === "/about";
const [isMobile, setIsMobile] = useState(false);

useEffect(() => {
function handleResize() {
setIsMobile(window.innerWidth <= 768);
}
window.addEventListener("resize", handleResize);
return () => window.removeEventListener("resize", handleResize);
}, []);

return (
<nav className="flex top-0 inline-block w-screen p-6">
{isIndex || (
<a href="/" className="raleway text-4xl font-bold mr-6">
Founder's Choice
</a>
)}
{(!isIndex && isMobile) || (
<>
<a
href="/ranking"
className="raleway text-3xl font-light ml-auto mr-6"
>
Ranking
</a>
<a href="/about" className="raleway font-light text-3xl mr-6">
About
</a>
</>
)}
</nav>
);
};
35 changes: 35 additions & 0 deletions components/form/MultiSelect.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
import React, { Component } from 'react';

import AsyncSelect from 'react-select/async';

const filterColors = (inputValue) => {
return colourOptions.filter((i) =>
i.label.toLowerCase().includes(inputValue.toLowerCase())
);
};

const promiseOptions = (inputValue) =>
new Promise((resolve) => {
setTimeout(() => {
resolve(filterColors(inputValue));
}, 1000);
});

export default class AsyncMulti extends Component {
state = { inputValue: '' };
handleInputChange = (newValue) => {
const inputValue = newValue.replace(/\W/g, '');
this.setState({ inputValue });
return inputValue;
};
render() {
return (
<AsyncSelect
isMulti
cacheOptions
defaultOptions
loadOptions={promiseOptions}
/>
);
}
}
22 changes: 22 additions & 0 deletions context/state.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import { createContext, useContext, useState } from 'react';

const AppContext = createContext();

// TODO: Split auth, profile and investors into seperate contexts
export function AppWrapper({ children }) {
const [investors, setInvestors] = useState([]);
const sharedState = {
investors,
setInvestors
}

return (
<AppContext.Provider value={sharedState}>
{children}
</AppContext.Provider>
);
}

export function useAppContext() {
return useContext(AppContext);
}
5 changes: 5 additions & 0 deletions netlify.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
[build]
publish = ".next"

[[plugins]]
package = "@netlify/plugin-nextjs"
Loading

0 comments on commit 92fc492

Please sign in to comment.