2022-05-22 08:36:05 +00:00
|
|
|
import { mapValues, groupBy, sumBy, sum, sortBy, debounce } from 'lodash'
|
2022-04-29 23:35:56 +00:00
|
|
|
import { useState, useMemo } from 'react'
|
2022-05-09 13:04:36 +00:00
|
|
|
import { charities, Charity as CharityType } from 'common/charity'
|
|
|
|
import { CharityCard } from 'web/components/charity/charity-card'
|
|
|
|
import { Col } from 'web/components/layout/col'
|
|
|
|
import { Spacer } from 'web/components/layout/spacer'
|
|
|
|
import { Page } from 'web/components/page'
|
|
|
|
import { SiteLink } from 'web/components/site-link'
|
|
|
|
import { Title } from 'web/components/title'
|
|
|
|
import { getAllCharityTxns } from 'web/lib/firebase/txns'
|
2022-05-17 12:17:22 +00:00
|
|
|
import { formatMoney } from 'common/util/format'
|
2022-04-29 23:35:56 +00:00
|
|
|
|
2022-05-03 17:25:14 +00:00
|
|
|
export async function getStaticProps() {
|
|
|
|
const txns = await getAllCharityTxns()
|
2022-05-22 08:36:05 +00:00
|
|
|
const totals = mapValues(groupBy(txns, 'toId'), (txns) =>
|
|
|
|
sumBy(txns, (txn) => txn.amount)
|
2022-05-02 17:55:40 +00:00
|
|
|
)
|
2022-05-22 08:36:05 +00:00
|
|
|
const totalRaised = sum(Object.values(totals))
|
|
|
|
const sortedCharities = sortBy(charities, [
|
2022-05-02 17:55:40 +00:00
|
|
|
(charity) => (charity.tags?.includes('Featured') ? 0 : 1),
|
|
|
|
(charity) => -totals[charity.id],
|
|
|
|
])
|
|
|
|
|
2022-05-03 17:25:14 +00:00
|
|
|
return {
|
|
|
|
props: {
|
|
|
|
totalRaised,
|
|
|
|
charities: sortedCharities,
|
|
|
|
},
|
|
|
|
revalidate: 60,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
export default function Charity(props: {
|
|
|
|
totalRaised: number
|
|
|
|
charities: CharityType[]
|
|
|
|
}) {
|
|
|
|
const { totalRaised, charities } = props
|
|
|
|
|
2022-04-29 23:35:56 +00:00
|
|
|
const [query, setQuery] = useState('')
|
2022-05-22 08:36:05 +00:00
|
|
|
const debouncedQuery = debounce(setQuery, 50)
|
2022-04-29 23:35:56 +00:00
|
|
|
|
|
|
|
const filterCharities = useMemo(
|
2022-04-30 12:42:25 +00:00
|
|
|
() =>
|
2022-05-05 14:12:16 +00:00
|
|
|
charities.filter(
|
|
|
|
(charity) =>
|
|
|
|
charity.name.toLowerCase().includes(query.toLowerCase()) ||
|
|
|
|
charity.preview.toLowerCase().includes(query.toLowerCase()) ||
|
|
|
|
charity.description.toLowerCase().includes(query.toLowerCase()) ||
|
|
|
|
(charity.tags as string[])?.includes(query.toLowerCase())
|
2022-04-30 12:42:25 +00:00
|
|
|
),
|
2022-05-10 21:49:24 +00:00
|
|
|
[charities, query]
|
2022-04-29 23:35:56 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
return (
|
|
|
|
<Page>
|
2022-05-03 15:26:02 +00:00
|
|
|
<Col className="w-full rounded px-4 py-6 sm:px-8 xl:w-[125%]">
|
2022-04-29 23:35:56 +00:00
|
|
|
<Col className="max-w-xl gap-2">
|
2022-04-30 12:42:25 +00:00
|
|
|
<Title className="!mt-0" text="Manifold for Good" />
|
2022-04-29 23:35:56 +00:00
|
|
|
<div className="mb-6 text-gray-500">
|
2022-05-31 20:23:01 +00:00
|
|
|
Donate your winnings to charity! Every {formatMoney(100)} you give
|
|
|
|
turns into $1 USD we send to your chosen charity.
|
2022-05-02 17:55:40 +00:00
|
|
|
<Spacer h={5} />
|
|
|
|
Together we've donated over ${Math.floor(totalRaised / 100)} USD so
|
|
|
|
far!
|
2022-04-29 23:35:56 +00:00
|
|
|
</div>
|
|
|
|
|
|
|
|
<input
|
|
|
|
type="text"
|
|
|
|
onChange={(e) => debouncedQuery(e.target.value)}
|
|
|
|
placeholder="Search charities"
|
|
|
|
className="input input-bordered mb-6 w-full"
|
|
|
|
/>
|
|
|
|
</Col>
|
|
|
|
<div className="grid max-w-xl grid-flow-row grid-cols-1 gap-4 lg:max-w-full lg:grid-cols-2 xl:grid-cols-3">
|
|
|
|
{filterCharities.map((charity) => (
|
2022-04-30 03:55:32 +00:00
|
|
|
<CharityCard charity={charity} key={charity.name} />
|
2022-04-29 23:35:56 +00:00
|
|
|
))}
|
|
|
|
</div>
|
|
|
|
{filterCharities.length === 0 && (
|
|
|
|
<div className="text-center text-gray-500">
|
2022-04-30 12:42:25 +00:00
|
|
|
😢 We couldn't find that charity...
|
2022-04-29 23:35:56 +00:00
|
|
|
</div>
|
|
|
|
)}
|
|
|
|
|
2022-04-30 20:27:19 +00:00
|
|
|
<iframe
|
|
|
|
height="405"
|
|
|
|
src="https://manifold.markets/embed/ManifoldMarkets/total-donations-for-manifold-for-go"
|
|
|
|
title="Total donations for Manifold for Good this May (in USD)"
|
|
|
|
frameBorder="0"
|
2022-04-30 21:42:08 +00:00
|
|
|
className="m-10 w-full rounded-xl bg-white p-10"
|
2022-04-30 20:27:19 +00:00
|
|
|
></iframe>
|
|
|
|
|
2022-04-30 12:42:25 +00:00
|
|
|
<div className="mt-10 text-gray-500">
|
2022-05-02 19:48:15 +00:00
|
|
|
Don't see your favorite charity? Recommend it{' '}
|
|
|
|
<SiteLink
|
|
|
|
href="https://manifold.markets/Sinclair/which-charities-should-manifold-add"
|
|
|
|
className="text-indigo-700"
|
|
|
|
>
|
|
|
|
here
|
|
|
|
</SiteLink>
|
|
|
|
!
|
2022-04-29 23:35:56 +00:00
|
|
|
<br />
|
2022-04-30 12:42:25 +00:00
|
|
|
<br />
|
|
|
|
<span className="italic">
|
2022-05-07 14:10:25 +00:00
|
|
|
Note: Manifold is not affiliated with non-Featured charities; we're
|
|
|
|
just fans of their work!
|
2022-04-30 12:42:25 +00:00
|
|
|
<br />
|
|
|
|
As Manifold is a for-profit entity, your contributions will not be
|
|
|
|
tax deductible.
|
|
|
|
</span>
|
2022-04-29 23:35:56 +00:00
|
|
|
</div>
|
|
|
|
</Col>
|
|
|
|
</Page>
|
|
|
|
)
|
|
|
|
}
|