798253f887
* Challenge bets * Store avatar url * Fix before and after probs * Check balance before creation * Calculate winning shares * pretty * Change winning value * Set shares to equal each other * Fix share challenge link * pretty * remove lib refs * Probability of bet is set to market * Remove peer pill * Cleanup * Button on contract page * don't show challenge if not binary or if resolved * challenge button (WIP) * fix accept challenge: don't change pool/probability * Opengraph preview [WIP] * elim lib * Edit og card props * Change challenge text * New card gen attempt * Get challenge on server * challenge button styling * Use env domain * Remove other window ref * Use challenge creator as avatar * Remove user name * Remove s from property, replace prob with outcome * challenge form * share text * Add in challenge parts to template and url * Challenge url params optional * Add challenge params to parse request * Parse please * Don't remove prob * Challenge card styling * Challenge card styling * Challenge card styling * Challenge card styling * Challenge card styling * Challenge card styling * Challenge card styling * Challenge card styling * Add to readme about how to dev og-image * Add emojis * button: gradient background, 2xl size * beautify accept bet screen * update question button * Add separate challenge template * Accepted challenge sharing card, fix accept bet call * accept challenge button * challenge winner page * create challenge screen * Your outcome/cost=> acceptorOutcome/cost * New create challenge panel * Fix main merge * Add challenge slug to bet and filter by it * Center title * Add helper text * Add FAQ section * Lint * Columnize the user areas in preview link too * Absolutely position * Spacing * Orientation * Restyle challenges list, cache contract name * Make copying easy on mobile * Link spacing * Fix spacing * qr codes! * put your challenges first * eslint * Changes to contract buttons and create challenge modal * Change titles around for current bet * Add back in contract title after winning * Cleanup * Add challenge enabled flag * Spacing of switch button * Put sharing qr code in modal Co-authored-by: mantikoros <sgrugett@gmail.com>
108 lines
2.8 KiB
TypeScript
108 lines
2.8 KiB
TypeScript
import { ReactNode } from 'react'
|
|
import Head from 'next/head'
|
|
import { Challenge } from 'common/challenge'
|
|
|
|
export type OgCardProps = {
|
|
question: string
|
|
probability?: string
|
|
metadata: string
|
|
creatorName: string
|
|
creatorUsername: string
|
|
creatorAvatarUrl?: string
|
|
}
|
|
|
|
function buildCardUrl(props: OgCardProps, challenge?: Challenge) {
|
|
const {
|
|
creatorAmount,
|
|
acceptances,
|
|
acceptorAmount,
|
|
creatorOutcome,
|
|
acceptorOutcome,
|
|
} = challenge || {}
|
|
const { userName, userAvatarUrl } = acceptances?.[0] ?? {}
|
|
|
|
const probabilityParam =
|
|
props.probability === undefined
|
|
? ''
|
|
: `&probability=${encodeURIComponent(props.probability ?? '')}`
|
|
const creatorAvatarUrlParam =
|
|
props.creatorAvatarUrl === undefined
|
|
? ''
|
|
: `&creatorAvatarUrl=${encodeURIComponent(props.creatorAvatarUrl ?? '')}`
|
|
|
|
const challengeUrlParams = challenge
|
|
? `&creatorAmount=${creatorAmount}&creatorOutcome=${creatorOutcome}` +
|
|
`&challengerAmount=${acceptorAmount}&challengerOutcome=${acceptorOutcome}` +
|
|
`&acceptedName=${userName ?? ''}&acceptedAvatarUrl=${userAvatarUrl ?? ''}`
|
|
: ''
|
|
|
|
// URL encode each of the props, then add them as query params
|
|
return (
|
|
`https://manifold-og-image.vercel.app/m.png` +
|
|
`?question=${encodeURIComponent(props.question)}` +
|
|
probabilityParam +
|
|
`&metadata=${encodeURIComponent(props.metadata)}` +
|
|
`&creatorName=${encodeURIComponent(props.creatorName)}` +
|
|
creatorAvatarUrlParam +
|
|
`&creatorUsername=${encodeURIComponent(props.creatorUsername)}` +
|
|
challengeUrlParams
|
|
)
|
|
}
|
|
|
|
export function SEO(props: {
|
|
title: string
|
|
description: string
|
|
url?: string
|
|
children?: ReactNode
|
|
ogCardProps?: OgCardProps
|
|
challenge?: Challenge
|
|
}) {
|
|
const { title, description, url, children, ogCardProps, challenge } = props
|
|
|
|
return (
|
|
<Head>
|
|
<title>{title} | Manifold Markets</title>
|
|
|
|
<meta
|
|
property="og:title"
|
|
name="twitter:title"
|
|
content={title}
|
|
key="title"
|
|
/>
|
|
<meta name="description" content={description} key="description1" />
|
|
<meta
|
|
property="og:description"
|
|
name="twitter:description"
|
|
content={description}
|
|
key="description2"
|
|
/>
|
|
|
|
{url && (
|
|
<meta
|
|
property="og:url"
|
|
content={'https://manifold.markets' + url}
|
|
key="url"
|
|
/>
|
|
)}
|
|
|
|
{ogCardProps && (
|
|
<>
|
|
<meta
|
|
property="og:image"
|
|
content={buildCardUrl(ogCardProps, challenge)}
|
|
key="image1"
|
|
/>
|
|
<meta name="twitter:card" content="summary_large_image" key="card" />
|
|
<meta
|
|
name="twitter:image"
|
|
content={buildCardUrl(ogCardProps, challenge)}
|
|
key="image2"
|
|
/>
|
|
</>
|
|
)}
|
|
|
|
{children}
|
|
</Head>
|
|
)
|
|
}
|