added files
This commit is contained in:
		
							parent
							
								
									7db3497bbe
								
							
						
					
					
						commit
						ad7827f2f1
					
				
							
								
								
									
										54
									
								
								functions/src/scripts/contest/scrape-ea.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								functions/src/scripts/contest/scrape-ea.ts
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,54 @@ | |||
| // Run with `npx ts-node src/scripts/contest/scrape-ea.ts`
 | ||||
| import * as fs from 'fs' | ||||
| import * as puppeteer from 'puppeteer' | ||||
| import { CONTEST_DATA } from 'common/contest' | ||||
| 
 | ||||
| export function scrapeEA(contestLink: string, fileName: string) { | ||||
|   ;(async () => { | ||||
|     const browser = await puppeteer.launch({ headless: true }) | ||||
|     const page = await browser.newPage() | ||||
|     await page.goto(contestLink) | ||||
| 
 | ||||
|     let loadMoreButton = await page.$('.LoadMore-root') | ||||
| 
 | ||||
|     while (loadMoreButton) { | ||||
|       await loadMoreButton.click() | ||||
|       await page.waitForNetworkIdle() | ||||
|       loadMoreButton = await page.$('.LoadMore-root') | ||||
|     } | ||||
| 
 | ||||
|     /* Run javascript inside the page */ | ||||
|     const data = await page.evaluate(() => { | ||||
|       const list = [] | ||||
|       const items = document.querySelectorAll('.PostsItem2-root') | ||||
| 
 | ||||
|       for (const item of items) { | ||||
|         let link = | ||||
|           'https://forum.effectivealtruism.org' + | ||||
|           item?.querySelector('a')?.getAttribute('href') | ||||
| 
 | ||||
|         list.push({ | ||||
|           title: item?.querySelector('a>span>span')?.innerHTML, | ||||
|           author: item?.querySelector('a.UsersNameDisplay-userName')?.innerHTML, | ||||
|           link: link, | ||||
|         }) | ||||
|       } | ||||
| 
 | ||||
|       return list | ||||
|     }) | ||||
| 
 | ||||
|     fs.writeFileSync( | ||||
|       '../web/lib/util/contests/' + fileName + '.json', | ||||
|       JSON.stringify(data, null, 2) | ||||
|     ) | ||||
| 
 | ||||
|     console.log(data) | ||||
|     await browser.close() | ||||
|   })() | ||||
| } | ||||
| 
 | ||||
| // runs using data from CONTEST_DATA
 | ||||
| scrapeEA( | ||||
|   CONTEST_DATA['cause-exploration-prize'].submissionLink, | ||||
|   CONTEST_DATA['cause-exploration-prize'].fileName | ||||
| ) | ||||
							
								
								
									
										157
									
								
								web/lib/util/contests/causeExploration.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										157
									
								
								web/lib/util/contests/causeExploration.json
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,157 @@ | |||
| [ | ||||
|   { | ||||
|     "title": "New cause area: Violence against women and girls", | ||||
|     "author": "Akhil", | ||||
|     "link": "https://forum.effectivealtruism.org/posts/majcwf7i8pW8eMJ3v/new-cause-area-violence-against-women-and-girls" | ||||
|   }, | ||||
|   { | ||||
|     "title": "Open Philanthropy's Cause Exploration Prizes: $120k for written work on global health and wellbeing", | ||||
|     "author": "ChrisSmith", | ||||
|     "link": "https://forum.effectivealtruism.org/posts/iqcph4DbcP4PZGyDB/open-philanthropy-s-cause-exploration-prizes-usd120k-for" | ||||
|   }, | ||||
|   { | ||||
|     "title": "New cause area: training health workers to prevent newborn deaths", | ||||
|     "author": "Marshall", | ||||
|     "link": "https://forum.effectivealtruism.org/posts/B7wohgDDdwPoQAatt/new-cause-area-training-health-workers-to-prevent-newborn" | ||||
|   }, | ||||
|   { | ||||
|     "title": "The Case for Making Professional Degrees Undergraduate Degrees", | ||||
|     "author": "ColdButtonIssues", | ||||
|     "link": "https://forum.effectivealtruism.org/posts/fEMpAcNycbXpp6Ext/the-case-for-making-professional-degrees-undergraduate" | ||||
|   }, | ||||
|   { | ||||
|     "title": "Global Health & Development - Beyond the Streetlight", | ||||
|     "author": "Richard Sedlmayr", | ||||
|     "link": "https://forum.effectivealtruism.org/posts/DXKWHAkihdb6nkKyG/global-health-and-development-beyond-the-streetlight-1" | ||||
|   }, | ||||
|   { | ||||
|     "title": "Cause Exploration Prizes submission: bivalve aquaculture", | ||||
|     "author": "Brian Lui", | ||||
|     "link": "https://forum.effectivealtruism.org/posts/7keuWWMoYY6dMnqys/cause-exploration-prizes-submission-bivalve-aquaculture" | ||||
|   }, | ||||
|   { | ||||
|     "title": "Potential new cause area: Obesity", | ||||
|     "author": "Akhil", | ||||
|     "link": "https://forum.effectivealtruism.org/posts/jhsXxPnKbwzLwrKFq/potential-new-cause-area-obesity" | ||||
|   }, | ||||
|   { | ||||
|     "title": "Energy Access in Sub-Saharan Africa: Open Philanthropy Cause Exploration Prize Submission", | ||||
|     "author": "Tomer_Goloboy", | ||||
|     "link": "https://forum.effectivealtruism.org/posts/ZPjMemurtzeumwcdw/energy-access-in-sub-saharan-africa-open-philanthropy-cause" | ||||
|   }, | ||||
|   { | ||||
|     "title": "Sleep: Open Philanthropy Cause Exploration Prize", | ||||
|     "author": "SuhanKacholia", | ||||
|     "link": "https://forum.effectivealtruism.org/posts/qnDBN3nAXgwyTnrAC/sleep-open-philanthropy-cause-exploration-prize" | ||||
|   }, | ||||
|   { | ||||
|     "title": "Cause Exploration Prizes: Could New Technology Help Solve the Glasses Problem?", | ||||
|     "author": "Open Philanthropy", | ||||
|     "link": "https://forum.effectivealtruism.org/posts/a3vbQCgxTeYNvQBfc/cause-exploration-prizes-could-new-technology-help-solve-the" | ||||
|   }, | ||||
|   { | ||||
|     "title": "Cause Exploration Prizes: Expanding access to infertility services in Low- and Middle-Income Countries (LMICs)", | ||||
|     "author": "Soleine Scotney", | ||||
|     "link": "https://forum.effectivealtruism.org/posts/WAnJw5bhuQwhJiLTm/cause-exploration-prizes-expanding-access-to-infertility" | ||||
|   }, | ||||
|   { | ||||
|     "title": "New Cause Area: Demographic Collapse", | ||||
|     "author": "Malcolm Collins", | ||||
|     "link": "https://forum.effectivealtruism.org/posts/vFfoqL74kmZbydKjp/new-cause-area-demographic-collapse" | ||||
|   }, | ||||
|   { | ||||
|     "title": "Cause area: climate adaptation in low-income countries", | ||||
|     "author": "karthik-t", | ||||
|     "link": "https://forum.effectivealtruism.org/posts/nE827LwrRk5ep3Xao/cause-area-climate-adaptation-in-low-income-countries" | ||||
|   }, | ||||
|   { | ||||
|     "title": "Open Climate Data as a possible cause area,  Open Philanthropy", | ||||
|     "author": "Ben Yeoh", | ||||
|     "link": "https://forum.effectivealtruism.org/posts/s9HPpvMHgS5QYEM4C/open-climate-data-as-a-possible-cause-area-open-philanthropy" | ||||
|   }, | ||||
|   { | ||||
|     "title": "One Million Missing Children", | ||||
|     "author": "ColdButtonIssues", | ||||
|     "link": "https://forum.effectivealtruism.org/posts/H5LDwwmdBYBDNXTq4/one-million-missing-children" | ||||
|   }, | ||||
|   { | ||||
|     "title": "Cause Exploration Prizes: Reducing Suffering and Long Term Risk in Common Law Nations via Strategic Case Law Funding", | ||||
|     "author": "Open Philanthropy", | ||||
|     "link": "https://forum.effectivealtruism.org/posts/C6urjnDeKjHGwf2M3/cause-exploration-prizes-reducing-suffering-and-long-term" | ||||
|   }, | ||||
|   { | ||||
|     "title": "NEW GLOBAL POOLS: IMPACT FUNDS ", | ||||
|     "author": "TPogge", | ||||
|     "link": "https://forum.effectivealtruism.org/posts/J8fwT9cZd6x5eED3e/new-global-pools-impact-funds" | ||||
|   }, | ||||
|   { | ||||
|     "title": "Saving lives near the precipice: we're doing it wrong?", | ||||
|     "author": "Samin", | ||||
|     "link": "https://forum.effectivealtruism.org/posts/hz2Q8GgZ28YKLazGb/saving-lives-near-the-precipice-we-re-doing-it-wrong" | ||||
|   }, | ||||
|   { | ||||
|     "title": "A platform for on-demand vaccination", | ||||
|     "author": "George3d6", | ||||
|     "link": "https://forum.effectivealtruism.org/posts/rS2zWRDxw5vZwdQAC/a-platform-for-on-demand-vaccination" | ||||
|   }, | ||||
|   { | ||||
|     "title": "Cause Exploration Prizes: Time-restricted eating (IF) for individual and community health in LMICs ", | ||||
|     "author": "Open Philanthropy", | ||||
|     "link": "https://forum.effectivealtruism.org/posts/RuwCxvJ3xEwQfZevN/cause-exploration-prizes-time-restricted-eating-if-for" | ||||
|   }, | ||||
|   { | ||||
|     "title": "Cause Exploration Prizes: Misinformation Gone Viral:  Education As Pandemic Prevention", | ||||
|     "author": "Open Philanthropy", | ||||
|     "link": "https://forum.effectivealtruism.org/posts/Whi5ADu79uJrTpqEt/cause-exploration-prizes-misinformation-gone-viral-education" | ||||
|   }, | ||||
|   { | ||||
|     "title": "Cause Exploration Prizes: Publishing Comprehensive Books Which Make the Case for Effective Corporate Animal Welfare Campaigns via a Writing Contest for Potential Authors", | ||||
|     "author": "Engin Arıkan", | ||||
|     "link": "https://forum.effectivealtruism.org/posts/9sraY9qrwuiKXJjhG/cause-exploration-prizes-publishing-comprehensive-books" | ||||
|   }, | ||||
|   { | ||||
|     "title": "Maritime capability and post-catastrophe resilience.", | ||||
|     "author": "Tom Gardiner", | ||||
|     "link": "https://forum.effectivealtruism.org/posts/nKDBhWFj3vwwFKwGC/maritime-capability-and-post-catastrophe-resilience-1" | ||||
|   }, | ||||
|   { | ||||
|     "title": "Shareholder activism", | ||||
|     "author": "sbehmer", | ||||
|     "link": "https://forum.effectivealtruism.org/posts/fqf4vgCWebTszvHm9/shareholder-activism" | ||||
|   }, | ||||
|   { | ||||
|     "title": "Water, sanitation and hygiene (“WASH”) interventions as a cause area", | ||||
|     "author": "helmetedhornbill", | ||||
|     "link": "https://forum.effectivealtruism.org/posts/WAbjLFkpSoA7FDvTD/water-sanitation-and-hygiene-wash-interventions-as-a-cause" | ||||
|   }, | ||||
|   { | ||||
|     "title": "Doing good is a privilege. This needs to change if we want to do good long-term. ", | ||||
|     "author": "SofiaBalderson", | ||||
|     "link": "https://forum.effectivealtruism.org/posts/gicYG5ymk4pPzrKAd/doing-good-is-a-privilege-this-needs-to-change-if-we-want-to" | ||||
|   }, | ||||
|   { | ||||
|     "title": "Deadline extension (to August 11) for Open Philanthropy's Cause Exploration Prizes", | ||||
|     "author": "ChrisSmith", | ||||
|     "link": "https://forum.effectivealtruism.org/posts/WdMbmLfb7DMMYHvKf/deadline-extension-to-august-11-for-open-philanthropy-s" | ||||
|   }, | ||||
|   { | ||||
|     "title": "Cause: Reducing Judicial Delay in India", | ||||
|     "author": "Vastav Ratra", | ||||
|     "link": "https://forum.effectivealtruism.org/posts/JcYyLfbnbhANCJdbv/cause-reducing-judicial-delay-in-india" | ||||
|   }, | ||||
|   { | ||||
|     "title": "Open Philanthropy Should Fund Further Cause Exploration", | ||||
|     "author": "brb243", | ||||
|     "link": "https://forum.effectivealtruism.org/posts/tvMjgDWptF5MNJtAo/open-philanthropy-should-fund-further-cause-exploration" | ||||
|   }, | ||||
|   { | ||||
|     "title": "Why Genetic Rescue", | ||||
|     "author": "David Lang", | ||||
|     "link": "https://forum.effectivealtruism.org/posts/ebBPcDxtSckRAoJfo/why-genetic-rescue" | ||||
|   }, | ||||
|   { | ||||
|     "title": "Promoting climate considerations within existing high priority areas of work", | ||||
|     "author": "helmetedhornbill", | ||||
|     "link": "https://forum.effectivealtruism.org/posts/pmfyGEa4NozDm2fng/promoting-climate-considerations-within-existing-high" | ||||
|   } | ||||
| ] | ||||
							
								
								
									
										157
									
								
								web/lib/util/contests/ea.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										157
									
								
								web/lib/util/contests/ea.json
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,157 @@ | |||
| [ | ||||
|   { | ||||
|     "title": "New cause area: Violence against women and girls", | ||||
|     "author": "Akhil", | ||||
|     "link": "https://forum.effectivealtruism.org/posts/majcwf7i8pW8eMJ3v/new-cause-area-violence-against-women-and-girls" | ||||
|   }, | ||||
|   { | ||||
|     "title": "Open Philanthropy's Cause Exploration Prizes: $120k for written work on global health and wellbeing", | ||||
|     "author": "ChrisSmith", | ||||
|     "link": "https://forum.effectivealtruism.org/posts/iqcph4DbcP4PZGyDB/open-philanthropy-s-cause-exploration-prizes-usd120k-for" | ||||
|   }, | ||||
|   { | ||||
|     "title": "New cause area: training health workers to prevent newborn deaths", | ||||
|     "author": "Marshall", | ||||
|     "link": "https://forum.effectivealtruism.org/posts/B7wohgDDdwPoQAatt/new-cause-area-training-health-workers-to-prevent-newborn" | ||||
|   }, | ||||
|   { | ||||
|     "title": "The Case for Making Professional Degrees Undergraduate Degrees", | ||||
|     "author": "ColdButtonIssues", | ||||
|     "link": "https://forum.effectivealtruism.org/posts/fEMpAcNycbXpp6Ext/the-case-for-making-professional-degrees-undergraduate" | ||||
|   }, | ||||
|   { | ||||
|     "title": "Global Health & Development - Beyond the Streetlight", | ||||
|     "author": "Richard Sedlmayr", | ||||
|     "link": "https://forum.effectivealtruism.org/posts/DXKWHAkihdb6nkKyG/global-health-and-development-beyond-the-streetlight-1" | ||||
|   }, | ||||
|   { | ||||
|     "title": "Cause Exploration Prizes submission: bivalve aquaculture", | ||||
|     "author": "Brian Lui", | ||||
|     "link": "https://forum.effectivealtruism.org/posts/7keuWWMoYY6dMnqys/cause-exploration-prizes-submission-bivalve-aquaculture" | ||||
|   }, | ||||
|   { | ||||
|     "title": "Potential new cause area: Obesity", | ||||
|     "author": "Akhil", | ||||
|     "link": "https://forum.effectivealtruism.org/posts/jhsXxPnKbwzLwrKFq/potential-new-cause-area-obesity" | ||||
|   }, | ||||
|   { | ||||
|     "title": "Energy Access in Sub-Saharan Africa: Open Philanthropy Cause Exploration Prize Submission", | ||||
|     "author": "Tomer_Goloboy", | ||||
|     "link": "https://forum.effectivealtruism.org/posts/ZPjMemurtzeumwcdw/energy-access-in-sub-saharan-africa-open-philanthropy-cause" | ||||
|   }, | ||||
|   { | ||||
|     "title": "Sleep: Open Philanthropy Cause Exploration Prize", | ||||
|     "author": "SuhanKacholia", | ||||
|     "link": "https://forum.effectivealtruism.org/posts/qnDBN3nAXgwyTnrAC/sleep-open-philanthropy-cause-exploration-prize" | ||||
|   }, | ||||
|   { | ||||
|     "title": "Cause Exploration Prizes: Could New Technology Help Solve the Glasses Problem?", | ||||
|     "author": "Open Philanthropy", | ||||
|     "link": "https://forum.effectivealtruism.org/posts/a3vbQCgxTeYNvQBfc/cause-exploration-prizes-could-new-technology-help-solve-the" | ||||
|   }, | ||||
|   { | ||||
|     "title": "Cause Exploration Prizes: Expanding access to infertility services in Low- and Middle-Income Countries (LMICs)", | ||||
|     "author": "Soleine Scotney", | ||||
|     "link": "https://forum.effectivealtruism.org/posts/WAnJw5bhuQwhJiLTm/cause-exploration-prizes-expanding-access-to-infertility" | ||||
|   }, | ||||
|   { | ||||
|     "title": "New Cause Area: Demographic Collapse", | ||||
|     "author": "Malcolm Collins", | ||||
|     "link": "https://forum.effectivealtruism.org/posts/vFfoqL74kmZbydKjp/new-cause-area-demographic-collapse" | ||||
|   }, | ||||
|   { | ||||
|     "title": "Cause area: climate adaptation in low-income countries", | ||||
|     "author": "karthik-t", | ||||
|     "link": "https://forum.effectivealtruism.org/posts/nE827LwrRk5ep3Xao/cause-area-climate-adaptation-in-low-income-countries" | ||||
|   }, | ||||
|   { | ||||
|     "title": "Open Climate Data as a possible cause area,  Open Philanthropy", | ||||
|     "author": "Ben Yeoh", | ||||
|     "link": "https://forum.effectivealtruism.org/posts/s9HPpvMHgS5QYEM4C/open-climate-data-as-a-possible-cause-area-open-philanthropy" | ||||
|   }, | ||||
|   { | ||||
|     "title": "One Million Missing Children", | ||||
|     "author": "ColdButtonIssues", | ||||
|     "link": "https://forum.effectivealtruism.org/posts/H5LDwwmdBYBDNXTq4/one-million-missing-children" | ||||
|   }, | ||||
|   { | ||||
|     "title": "Cause Exploration Prizes: Reducing Suffering and Long Term Risk in Common Law Nations via Strategic Case Law Funding", | ||||
|     "author": "Open Philanthropy", | ||||
|     "link": "https://forum.effectivealtruism.org/posts/C6urjnDeKjHGwf2M3/cause-exploration-prizes-reducing-suffering-and-long-term" | ||||
|   }, | ||||
|   { | ||||
|     "title": "NEW GLOBAL POOLS: IMPACT FUNDS ", | ||||
|     "author": "TPogge", | ||||
|     "link": "https://forum.effectivealtruism.org/posts/J8fwT9cZd6x5eED3e/new-global-pools-impact-funds" | ||||
|   }, | ||||
|   { | ||||
|     "title": "Saving lives near the precipice: we're doing it wrong?", | ||||
|     "author": "Samin", | ||||
|     "link": "https://forum.effectivealtruism.org/posts/hz2Q8GgZ28YKLazGb/saving-lives-near-the-precipice-we-re-doing-it-wrong" | ||||
|   }, | ||||
|   { | ||||
|     "title": "A platform for on-demand vaccination", | ||||
|     "author": "George3d6", | ||||
|     "link": "https://forum.effectivealtruism.org/posts/rS2zWRDxw5vZwdQAC/a-platform-for-on-demand-vaccination" | ||||
|   }, | ||||
|   { | ||||
|     "title": "Cause Exploration Prizes: Time-restricted eating (IF) for individual and community health in LMICs ", | ||||
|     "author": "Open Philanthropy", | ||||
|     "link": "https://forum.effectivealtruism.org/posts/RuwCxvJ3xEwQfZevN/cause-exploration-prizes-time-restricted-eating-if-for" | ||||
|   }, | ||||
|   { | ||||
|     "title": "Cause Exploration Prizes: Misinformation Gone Viral:  Education As Pandemic Prevention", | ||||
|     "author": "Open Philanthropy", | ||||
|     "link": "https://forum.effectivealtruism.org/posts/Whi5ADu79uJrTpqEt/cause-exploration-prizes-misinformation-gone-viral-education" | ||||
|   }, | ||||
|   { | ||||
|     "title": "Cause Exploration Prizes: Publishing Comprehensive Books Which Make the Case for Effective Corporate Animal Welfare Campaigns via a Writing Contest for Potential Authors", | ||||
|     "author": "Engin Arıkan", | ||||
|     "link": "https://forum.effectivealtruism.org/posts/9sraY9qrwuiKXJjhG/cause-exploration-prizes-publishing-comprehensive-books" | ||||
|   }, | ||||
|   { | ||||
|     "title": "Maritime capability and post-catastrophe resilience.", | ||||
|     "author": "Tom Gardiner", | ||||
|     "link": "https://forum.effectivealtruism.org/posts/nKDBhWFj3vwwFKwGC/maritime-capability-and-post-catastrophe-resilience-1" | ||||
|   }, | ||||
|   { | ||||
|     "title": "Shareholder activism", | ||||
|     "author": "sbehmer", | ||||
|     "link": "https://forum.effectivealtruism.org/posts/fqf4vgCWebTszvHm9/shareholder-activism" | ||||
|   }, | ||||
|   { | ||||
|     "title": "Water, sanitation and hygiene (“WASH”) interventions as a cause area", | ||||
|     "author": "helmetedhornbill", | ||||
|     "link": "https://forum.effectivealtruism.org/posts/WAbjLFkpSoA7FDvTD/water-sanitation-and-hygiene-wash-interventions-as-a-cause" | ||||
|   }, | ||||
|   { | ||||
|     "title": "Doing good is a privilege. This needs to change if we want to do good long-term. ", | ||||
|     "author": "SofiaBalderson", | ||||
|     "link": "https://forum.effectivealtruism.org/posts/gicYG5ymk4pPzrKAd/doing-good-is-a-privilege-this-needs-to-change-if-we-want-to" | ||||
|   }, | ||||
|   { | ||||
|     "title": "Deadline extension (to August 11) for Open Philanthropy's Cause Exploration Prizes", | ||||
|     "author": "ChrisSmith", | ||||
|     "link": "https://forum.effectivealtruism.org/posts/WdMbmLfb7DMMYHvKf/deadline-extension-to-august-11-for-open-philanthropy-s" | ||||
|   }, | ||||
|   { | ||||
|     "title": "Cause: Reducing Judicial Delay in India", | ||||
|     "author": "Vastav Ratra", | ||||
|     "link": "https://forum.effectivealtruism.org/posts/JcYyLfbnbhANCJdbv/cause-reducing-judicial-delay-in-india" | ||||
|   }, | ||||
|   { | ||||
|     "title": "Open Philanthropy Should Fund Further Cause Exploration", | ||||
|     "author": "brb243", | ||||
|     "link": "https://forum.effectivealtruism.org/posts/tvMjgDWptF5MNJtAo/open-philanthropy-should-fund-further-cause-exploration" | ||||
|   }, | ||||
|   { | ||||
|     "title": "Why Genetic Rescue", | ||||
|     "author": "David Lang", | ||||
|     "link": "https://forum.effectivealtruism.org/posts/ebBPcDxtSckRAoJfo/why-genetic-rescue" | ||||
|   }, | ||||
|   { | ||||
|     "title": "Promoting climate considerations within existing high priority areas of work", | ||||
|     "author": "helmetedhornbill", | ||||
|     "link": "https://forum.effectivealtruism.org/posts/pmfyGEa4NozDm2fng/promoting-climate-considerations-within-existing-high" | ||||
|   } | ||||
| ] | ||||
							
								
								
									
										293
									
								
								web/pages/contest/[contestSlug]/[submissionSlug].tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										293
									
								
								web/pages/contest/[contestSlug]/[submissionSlug].tsx
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,293 @@ | |||
| import React, { useEffect, useState } from 'react' | ||||
| import { ArrowLeftIcon } from '@heroicons/react/outline' | ||||
| 
 | ||||
| import { useContractWithPreload } from 'web/hooks/use-contract' | ||||
| import { ContractOverview } from 'web/components/contract/contract-overview' | ||||
| import { BetPanel } from 'web/components/bet-panel' | ||||
| import { Col } from 'web/components/layout/col' | ||||
| import { useUser } from 'web/hooks/use-user' | ||||
| import { ResolutionPanel } from 'web/components/resolution-panel' | ||||
| import { Spacer } from 'web/components/layout/spacer' | ||||
| import { | ||||
|   Contract, | ||||
|   getContractFromSlug, | ||||
|   tradingAllowed, | ||||
|   getBinaryProbPercent, | ||||
|   getContractFromId, | ||||
| } from 'web/lib/firebase/contracts' | ||||
| import { SEO } from 'web/components/SEO' | ||||
| import { Page } from 'web/components/page' | ||||
| import { Bet, listAllBets } from 'web/lib/firebase/bets' | ||||
| import { Comment, listAllComments } from 'web/lib/firebase/comments' | ||||
| import Custom404 from '../../404' | ||||
| import { AnswersPanel } from 'web/components/answers/answers-panel' | ||||
| import { fromPropz, usePropz } from 'web/hooks/use-propz' | ||||
| import { ContractTabs } from 'web/components/contract/contract-tabs' | ||||
| import { contractTextDetails } from 'web/components/contract/contract-details' | ||||
| import { useWindowSize } from 'web/hooks/use-window-size' | ||||
| import Confetti from 'react-confetti' | ||||
| import { NumericBetPanel } from '../../../components/numeric-bet-panel' | ||||
| import { NumericResolutionPanel } from '../../../components/numeric-resolution-panel' | ||||
| import { useIsIframe } from 'web/hooks/use-is-iframe' | ||||
| import ContractEmbedPage from '../../embed/[username]/[contractSlug]' | ||||
| import { useBets } from 'web/hooks/use-bets' | ||||
| import { CPMMBinaryContract } from 'common/contract' | ||||
| import { AlertBox } from 'web/components/alert-box' | ||||
| import { useTracking } from 'web/hooks/use-tracking' | ||||
| import { useTipTxns } from 'web/hooks/use-tip-txns' | ||||
| import { useLiquidity } from 'web/hooks/use-liquidity' | ||||
| import { richTextToString } from 'common/util/parse' | ||||
| import { useSaveReferral } from 'web/hooks/use-save-referral' | ||||
| import { | ||||
|   ContractLeaderboard, | ||||
|   ContractTopTrades, | ||||
| } from 'web/components/contract/contract-leaderboard' | ||||
| 
 | ||||
| export const getStaticProps = fromPropz(getStaticPropz) | ||||
| export async function getStaticPropz(props: { | ||||
|   params: { contestSlug: string; submissionSlug: string } | ||||
| }) { | ||||
|   const { contestSlug, submissionSlug } = props.params | ||||
|   console.log(contestSlug) | ||||
|   const submission = (await getContractFromSlug(submissionSlug)) || null | ||||
|   const submissionId = submission?.id | ||||
| 
 | ||||
|   const [bets, comments] = await Promise.all([ | ||||
|     submissionId ? listAllBets(submissionId) : [], | ||||
|     submissionId ? listAllComments(submissionId) : [], | ||||
|   ]) | ||||
| 
 | ||||
|   return { | ||||
|     props: { | ||||
|       submission, | ||||
|       contestSlug, | ||||
|       // Limit the data sent to the client. Client will still load all bets and comments directly.
 | ||||
|       bets: bets.slice(0, 5000), | ||||
|       comments: comments.slice(0, 1000), | ||||
|       slug: submissionSlug, | ||||
|     }, | ||||
| 
 | ||||
|     revalidate: 60, // regenerate after a minute
 | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| export async function getStaticPaths() { | ||||
|   return { paths: [], fallback: 'blocking' } | ||||
| } | ||||
| 
 | ||||
| export default function ContractPage(props: { | ||||
|   submission: Contract | null | ||||
|   contestSlug: string | ||||
|   bets: Bet[] | ||||
|   comments: Comment[] | ||||
|   slug: string | ||||
|   backToHome?: () => void | ||||
| }) { | ||||
|   props = usePropz(props, getStaticPropz) ?? { | ||||
|     submission: null, | ||||
|     contestSlug: '', | ||||
|     bets: [], | ||||
|     comments: [], | ||||
|     slug: '', | ||||
|   } | ||||
| 
 | ||||
|   // const inIframe = useIsIframe()
 | ||||
|   // if (inIframe) {
 | ||||
|   //   return <ContractEmbedPage {...props} />
 | ||||
|   // }
 | ||||
| 
 | ||||
|   const { submission } = props | ||||
| 
 | ||||
|   if (!submission) { | ||||
|     return <Custom404 /> | ||||
|   } | ||||
| 
 | ||||
|   return <SubmissionPageContent {...{ ...props, submission }} /> | ||||
| } | ||||
| 
 | ||||
| export function SubmissionPageContent( | ||||
|   props: Parameters<typeof ContractPage>[0] & { submission: Contract } | ||||
| ) { | ||||
|   const { backToHome, comments } = props | ||||
| 
 | ||||
|   const contract = useContractWithPreload(props.submission) ?? props.submission | ||||
| 
 | ||||
|   useTracking('view market', { | ||||
|     slug: contract.slug, | ||||
|     contractId: contract.id, | ||||
|     creatorId: contract.creatorId, | ||||
|   }) | ||||
| 
 | ||||
|   const bets = useBets(contract.id) ?? props.bets | ||||
|   const liquidityProvisions = | ||||
|     useLiquidity(contract.id)?.filter((l) => !l.isAnte && l.amount > 0) ?? [] | ||||
|   // Sort for now to see if bug is fixed.
 | ||||
|   comments.sort((c1, c2) => c1.createdTime - c2.createdTime) | ||||
| 
 | ||||
|   const tips = useTipTxns({ contractId: contract.id }) | ||||
| 
 | ||||
|   const user = useUser() | ||||
| 
 | ||||
|   const { width, height } = useWindowSize() | ||||
| 
 | ||||
|   const [showConfetti, setShowConfetti] = useState(false) | ||||
| 
 | ||||
|   useEffect(() => { | ||||
|     const shouldSeeConfetti = !!( | ||||
|       user && | ||||
|       contract.creatorId === user.id && | ||||
|       Date.now() - contract.createdTime < 10 * 1000 | ||||
|     ) | ||||
|     setShowConfetti(shouldSeeConfetti) | ||||
|   }, [contract, user]) | ||||
| 
 | ||||
|   const { creatorId, isResolved, question, outcomeType } = contract | ||||
| 
 | ||||
|   const isCreator = user?.id === creatorId | ||||
|   const isBinary = outcomeType === 'BINARY' | ||||
|   const isPseudoNumeric = outcomeType === 'PSEUDO_NUMERIC' | ||||
|   const isNumeric = outcomeType === 'NUMERIC' | ||||
|   const allowTrade = tradingAllowed(contract) | ||||
|   const allowResolve = !isResolved && isCreator && !!user | ||||
|   const hasSidePanel = | ||||
|     (isBinary || isNumeric || isPseudoNumeric) && (allowTrade || allowResolve) | ||||
| 
 | ||||
|   const ogCardProps = getOpenGraphProps(contract) | ||||
| 
 | ||||
|   useSaveReferral(user, { | ||||
|     defaultReferrer: contract.creatorUsername, | ||||
|     contractId: contract.id, | ||||
|   }) | ||||
| 
 | ||||
|   const rightSidebar = hasSidePanel ? ( | ||||
|     <Col className="gap-4"> | ||||
|       {allowTrade && | ||||
|         (isNumeric ? ( | ||||
|           <NumericBetPanel className="hidden xl:flex" contract={contract} /> | ||||
|         ) : ( | ||||
|           <BetPanel | ||||
|             className="hidden xl:flex" | ||||
|             contract={contract as CPMMBinaryContract} | ||||
|           /> | ||||
|         ))} | ||||
|       {allowResolve && | ||||
|         (isNumeric || isPseudoNumeric ? ( | ||||
|           <NumericResolutionPanel creator={user} contract={contract} /> | ||||
|         ) : ( | ||||
|           <ResolutionPanel creator={user} contract={contract} /> | ||||
|         ))} | ||||
|     </Col> | ||||
|   ) : null | ||||
| 
 | ||||
|   return ( | ||||
|     <Page rightSidebar={rightSidebar}> | ||||
|       {showConfetti && ( | ||||
|         <Confetti | ||||
|           width={width ? width : 500} | ||||
|           height={height ? height : 500} | ||||
|           recycle={false} | ||||
|           numberOfPieces={300} | ||||
|         /> | ||||
|       )} | ||||
| 
 | ||||
|       {ogCardProps && ( | ||||
|         <SEO | ||||
|           title={question} | ||||
|           description={ogCardProps.description} | ||||
|           url={`/${props.contestSlug}/${props.slug}`} | ||||
|           ogCardProps={ogCardProps} | ||||
|         /> | ||||
|       )} | ||||
| 
 | ||||
|       <Col className="w-full justify-between rounded border-0 border-gray-100 bg-white py-6 pl-1 pr-2 sm:px-2 md:px-6 md:py-8"> | ||||
|         {backToHome && ( | ||||
|           <button | ||||
|             className="btn btn-sm mb-4 items-center gap-2 self-start border-0 border-gray-700 bg-white normal-case text-gray-700 hover:bg-white hover:text-gray-700 lg:hidden" | ||||
|             onClick={backToHome} | ||||
|           > | ||||
|             <ArrowLeftIcon className="h-5 w-5 text-gray-700" /> | ||||
|             Back | ||||
|           </button> | ||||
|         )} | ||||
| 
 | ||||
|         <ContractOverview contract={contract} bets={bets} /> | ||||
| 
 | ||||
|         {isNumeric && ( | ||||
|           <AlertBox | ||||
|             title="Warning" | ||||
|             text="Distributional numeric markets were introduced as an experimental feature and are now deprecated." | ||||
|           /> | ||||
|         )} | ||||
|         {/*  | ||||
|         {(outcomeType === 'FREE_RESPONSE' || | ||||
|           outcomeType === 'MULTIPLE_CHOICE') && ( | ||||
|           <> | ||||
|             <Spacer h={4} /> | ||||
|             <AnswersPanel contract={contract} /> | ||||
|             <Spacer h={4} /> | ||||
|           </> | ||||
|         )} */} | ||||
| 
 | ||||
|         {isNumeric && allowTrade && ( | ||||
|           <NumericBetPanel className="xl:hidden" contract={contract} /> | ||||
|         )} | ||||
| 
 | ||||
|         {isResolved && ( | ||||
|           <> | ||||
|             <div className="grid grid-cols-1 sm:grid-cols-2"> | ||||
|               <ContractLeaderboard contract={contract} bets={bets} /> | ||||
|               <ContractTopTrades | ||||
|                 contract={contract} | ||||
|                 bets={bets} | ||||
|                 comments={comments} | ||||
|                 tips={tips} | ||||
|               /> | ||||
|             </div> | ||||
|             <Spacer h={12} /> | ||||
|           </> | ||||
|         )} | ||||
| 
 | ||||
|         <ContractTabs | ||||
|           contract={contract} | ||||
|           user={user} | ||||
|           liquidityProvisions={liquidityProvisions} | ||||
|           bets={bets} | ||||
|           tips={tips} | ||||
|           comments={comments} | ||||
|         /> | ||||
|       </Col> | ||||
|     </Page> | ||||
|   ) | ||||
| } | ||||
| 
 | ||||
| const getOpenGraphProps = (contract: Contract) => { | ||||
|   const { | ||||
|     resolution, | ||||
|     question, | ||||
|     creatorName, | ||||
|     creatorUsername, | ||||
|     outcomeType, | ||||
|     creatorAvatarUrl, | ||||
|     description: desc, | ||||
|   } = contract | ||||
|   const probPercent = | ||||
|     outcomeType === 'BINARY' ? getBinaryProbPercent(contract) : undefined | ||||
| 
 | ||||
|   const stringDesc = typeof desc === 'string' ? desc : richTextToString(desc) | ||||
| 
 | ||||
|   const description = resolution | ||||
|     ? `Resolved ${resolution}. ${stringDesc}` | ||||
|     : probPercent | ||||
|     ? `${probPercent} chance. ${stringDesc}` | ||||
|     : stringDesc | ||||
| 
 | ||||
|   return { | ||||
|     question, | ||||
|     probability: probPercent, | ||||
|     metadata: contractTextDetails(contract), | ||||
|     creatorName, | ||||
|     creatorUsername, | ||||
|     creatorAvatarUrl, | ||||
|     description, | ||||
|   } | ||||
| } | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user