uniswap-interface-uncensored/functions/api/image/nfts/collection/[index].tsx

123 lines
3.7 KiB
TypeScript
Raw Permalink Normal View History

feat: dynamically generated images for rich link previews (#6902) * feat: add token and nft injection * feat: basic tests * fix: get jest configured properly * fix: change timeout * fix: uninstall port ready * fix: readd port ready * fix: local tests work * Update yarn.lock * add lint disable for setup files * fix: update dependencies * fix: basic test suite for nfts/tokens * feat: collection data * fix: make tests more comprehensive * fix: change matches to contains * fix: tests for twitter alt image tag * fix: image gen * fix: add patch-package * fix: update yarn install * feat: basic image gen for nfts and collections * fix: remove vibrant attempt * use watermark asset * dynamically grab color * modularize code and prototype for token preview * refactor code * finalize css * fix color grabber * update tests * fix up css * refactor code a bit more * remove console logs * tests * update tests * update images based on design feedback * network logos * update lint * slight refactoring * more refactoring * fix packages * Update yarn.lock * remove dynamically generated image stuff * Revert "remove dynamically generated image stuff" This reverts commit a80241edb3a970a724b9a07ce36e492ff8a1c2af. * change image reference and revamp tests * cleanup return values * Create README.md * Revert "Create README.md" This reverts commit 7a91c98d384995fba914c9bf9a2fb3072793621f. * First round of feedback * comments * feat: cache * Update test.yml * Update test.yml * Update test.yml * feedback round 2 * final feedback * final final feedback * add coverage and other options * Update test.yml * start typecheck * update cache * update snapshots? * Update jest.config.json * Update jest.config.json * give timeout some buffer * update import * upgrade ts * fix typing for apollo deps * finalize typechecks * downgrade typescript to original version * add cache directory to jest * remove coverage * remove google analytics from tests * merge main * remove timeout * update tests * update graphql queries * review changes * try cache setup * Update cache.test.ts * make cache helper function * cache test * remove unneeded test causing issues * feat: parallelize cache (#6930) * feat: parallelize cache? * remove graph query from concurrency await * most of feedback * move tests * update token tests * singleton cache * restructuring res and cache promise * abstract away repeated graph logic * update tests and functions * refactor * update typing, parallelize, and start tests * fix one tsc issue * final feedback * Update yarn.lock * final final feedback * add svgs * try and setup svg * stashing changes * cleanup! * prepare for start of feedback? * LESS GOO * modify versioning * fix: update wrangler version * Update yarn.lock * downgrade wrangler * Update yarn.lock * Update yarn.lock * fix type error * update github test * cleanup tests * Delete custom.d.ts * fix: cloudfunctions * update tests * final touchups * lint * change github action * Update yarn.lock * styling updates * nate's feedback * feedback p1 * typing feedback * update yarn * Create wrangler.toml * move wrangler.toml location * last try * Delete wrangler.toml * use 2.20? * remove comment * Update yarn.lock * change compatibility date * update wrangler and fix bugs * Update colorthief+2.4.0.patch * build: cleanup flags * cleaner patches * update compatibility date * quick tweeks * cleanup rendering and lint * final color update --------- Co-authored-by: Zach Pomerantz <zzmp@uniswap.org>
2023-08-10 15:29:37 -04:00
/* eslint-disable import/no-unused-modules */
import { ImageResponse } from '@vercel/og'
import React from 'react'
import { blocklistedCollections } from '../../../../../src/nft/utils/blocklist'
import { getColor } from '../../../../../src/utils/getColor'
feat: dynamically generated images for rich link previews (#6902) * feat: add token and nft injection * feat: basic tests * fix: get jest configured properly * fix: change timeout * fix: uninstall port ready * fix: readd port ready * fix: local tests work * Update yarn.lock * add lint disable for setup files * fix: update dependencies * fix: basic test suite for nfts/tokens * feat: collection data * fix: make tests more comprehensive * fix: change matches to contains * fix: tests for twitter alt image tag * fix: image gen * fix: add patch-package * fix: update yarn install * feat: basic image gen for nfts and collections * fix: remove vibrant attempt * use watermark asset * dynamically grab color * modularize code and prototype for token preview * refactor code * finalize css * fix color grabber * update tests * fix up css * refactor code a bit more * remove console logs * tests * update tests * update images based on design feedback * network logos * update lint * slight refactoring * more refactoring * fix packages * Update yarn.lock * remove dynamically generated image stuff * Revert "remove dynamically generated image stuff" This reverts commit a80241edb3a970a724b9a07ce36e492ff8a1c2af. * change image reference and revamp tests * cleanup return values * Create README.md * Revert "Create README.md" This reverts commit 7a91c98d384995fba914c9bf9a2fb3072793621f. * First round of feedback * comments * feat: cache * Update test.yml * Update test.yml * Update test.yml * feedback round 2 * final feedback * final final feedback * add coverage and other options * Update test.yml * start typecheck * update cache * update snapshots? * Update jest.config.json * Update jest.config.json * give timeout some buffer * update import * upgrade ts * fix typing for apollo deps * finalize typechecks * downgrade typescript to original version * add cache directory to jest * remove coverage * remove google analytics from tests * merge main * remove timeout * update tests * update graphql queries * review changes * try cache setup * Update cache.test.ts * make cache helper function * cache test * remove unneeded test causing issues * feat: parallelize cache (#6930) * feat: parallelize cache? * remove graph query from concurrency await * most of feedback * move tests * update token tests * singleton cache * restructuring res and cache promise * abstract away repeated graph logic * update tests and functions * refactor * update typing, parallelize, and start tests * fix one tsc issue * final feedback * Update yarn.lock * final final feedback * add svgs * try and setup svg * stashing changes * cleanup! * prepare for start of feedback? * LESS GOO * modify versioning * fix: update wrangler version * Update yarn.lock * downgrade wrangler * Update yarn.lock * Update yarn.lock * fix type error * update github test * cleanup tests * Delete custom.d.ts * fix: cloudfunctions * update tests * final touchups * lint * change github action * Update yarn.lock * styling updates * nate's feedback * feedback p1 * typing feedback * update yarn * Create wrangler.toml * move wrangler.toml location * last try * Delete wrangler.toml * use 2.20? * remove comment * Update yarn.lock * change compatibility date * update wrangler and fix bugs * Update colorthief+2.4.0.patch * build: cleanup flags * cleaner patches * update compatibility date * quick tweeks * cleanup rendering and lint * final color update --------- Co-authored-by: Zach Pomerantz <zzmp@uniswap.org>
2023-08-10 15:29:37 -04:00
import { CHECK_URL, WATERMARK_URL } from '../../../../constants'
import getCollection from '../../../../utils/getCollection'
import getFont from '../../../../utils/getFont'
import { getRequest } from '../../../../utils/getRequest'
export const onRequest: PagesFunction = async ({ params, request }) => {
try {
const origin = new URL(request.url).origin
const { index } = params
const collectionAddress = index?.toString()
const cacheUrl = origin + '/nfts/collection/' + collectionAddress
if (blocklistedCollections.includes(collectionAddress)) {
return new Response('Collection unsupported.', { status: 404 })
}
feat: dynamically generated images for rich link previews (#6902) * feat: add token and nft injection * feat: basic tests * fix: get jest configured properly * fix: change timeout * fix: uninstall port ready * fix: readd port ready * fix: local tests work * Update yarn.lock * add lint disable for setup files * fix: update dependencies * fix: basic test suite for nfts/tokens * feat: collection data * fix: make tests more comprehensive * fix: change matches to contains * fix: tests for twitter alt image tag * fix: image gen * fix: add patch-package * fix: update yarn install * feat: basic image gen for nfts and collections * fix: remove vibrant attempt * use watermark asset * dynamically grab color * modularize code and prototype for token preview * refactor code * finalize css * fix color grabber * update tests * fix up css * refactor code a bit more * remove console logs * tests * update tests * update images based on design feedback * network logos * update lint * slight refactoring * more refactoring * fix packages * Update yarn.lock * remove dynamically generated image stuff * Revert "remove dynamically generated image stuff" This reverts commit a80241edb3a970a724b9a07ce36e492ff8a1c2af. * change image reference and revamp tests * cleanup return values * Create README.md * Revert "Create README.md" This reverts commit 7a91c98d384995fba914c9bf9a2fb3072793621f. * First round of feedback * comments * feat: cache * Update test.yml * Update test.yml * Update test.yml * feedback round 2 * final feedback * final final feedback * add coverage and other options * Update test.yml * start typecheck * update cache * update snapshots? * Update jest.config.json * Update jest.config.json * give timeout some buffer * update import * upgrade ts * fix typing for apollo deps * finalize typechecks * downgrade typescript to original version * add cache directory to jest * remove coverage * remove google analytics from tests * merge main * remove timeout * update tests * update graphql queries * review changes * try cache setup * Update cache.test.ts * make cache helper function * cache test * remove unneeded test causing issues * feat: parallelize cache (#6930) * feat: parallelize cache? * remove graph query from concurrency await * most of feedback * move tests * update token tests * singleton cache * restructuring res and cache promise * abstract away repeated graph logic * update tests and functions * refactor * update typing, parallelize, and start tests * fix one tsc issue * final feedback * Update yarn.lock * final final feedback * add svgs * try and setup svg * stashing changes * cleanup! * prepare for start of feedback? * LESS GOO * modify versioning * fix: update wrangler version * Update yarn.lock * downgrade wrangler * Update yarn.lock * Update yarn.lock * fix type error * update github test * cleanup tests * Delete custom.d.ts * fix: cloudfunctions * update tests * final touchups * lint * change github action * Update yarn.lock * styling updates * nate's feedback * feedback p1 * typing feedback * update yarn * Create wrangler.toml * move wrangler.toml location * last try * Delete wrangler.toml * use 2.20? * remove comment * Update yarn.lock * change compatibility date * update wrangler and fix bugs * Update colorthief+2.4.0.patch * build: cleanup flags * cleaner patches * update compatibility date * quick tweeks * cleanup rendering and lint * final color update --------- Co-authored-by: Zach Pomerantz <zzmp@uniswap.org>
2023-08-10 15:29:37 -04:00
const data = await getRequest(
cacheUrl,
() => getCollection(collectionAddress, cacheUrl),
(data): data is NonNullable<Awaited<ReturnType<typeof getCollection>>> =>
Boolean(data.ogImage && data.name && data.isVerified)
)
if (!data) {
return new Response('Collection not found.', { status: 404 })
feat: dynamically generated images for rich link previews (#6902) * feat: add token and nft injection * feat: basic tests * fix: get jest configured properly * fix: change timeout * fix: uninstall port ready * fix: readd port ready * fix: local tests work * Update yarn.lock * add lint disable for setup files * fix: update dependencies * fix: basic test suite for nfts/tokens * feat: collection data * fix: make tests more comprehensive * fix: change matches to contains * fix: tests for twitter alt image tag * fix: image gen * fix: add patch-package * fix: update yarn install * feat: basic image gen for nfts and collections * fix: remove vibrant attempt * use watermark asset * dynamically grab color * modularize code and prototype for token preview * refactor code * finalize css * fix color grabber * update tests * fix up css * refactor code a bit more * remove console logs * tests * update tests * update images based on design feedback * network logos * update lint * slight refactoring * more refactoring * fix packages * Update yarn.lock * remove dynamically generated image stuff * Revert "remove dynamically generated image stuff" This reverts commit a80241edb3a970a724b9a07ce36e492ff8a1c2af. * change image reference and revamp tests * cleanup return values * Create README.md * Revert "Create README.md" This reverts commit 7a91c98d384995fba914c9bf9a2fb3072793621f. * First round of feedback * comments * feat: cache * Update test.yml * Update test.yml * Update test.yml * feedback round 2 * final feedback * final final feedback * add coverage and other options * Update test.yml * start typecheck * update cache * update snapshots? * Update jest.config.json * Update jest.config.json * give timeout some buffer * update import * upgrade ts * fix typing for apollo deps * finalize typechecks * downgrade typescript to original version * add cache directory to jest * remove coverage * remove google analytics from tests * merge main * remove timeout * update tests * update graphql queries * review changes * try cache setup * Update cache.test.ts * make cache helper function * cache test * remove unneeded test causing issues * feat: parallelize cache (#6930) * feat: parallelize cache? * remove graph query from concurrency await * most of feedback * move tests * update token tests * singleton cache * restructuring res and cache promise * abstract away repeated graph logic * update tests and functions * refactor * update typing, parallelize, and start tests * fix one tsc issue * final feedback * Update yarn.lock * final final feedback * add svgs * try and setup svg * stashing changes * cleanup! * prepare for start of feedback? * LESS GOO * modify versioning * fix: update wrangler version * Update yarn.lock * downgrade wrangler * Update yarn.lock * Update yarn.lock * fix type error * update github test * cleanup tests * Delete custom.d.ts * fix: cloudfunctions * update tests * final touchups * lint * change github action * Update yarn.lock * styling updates * nate's feedback * feedback p1 * typing feedback * update yarn * Create wrangler.toml * move wrangler.toml location * last try * Delete wrangler.toml * use 2.20? * remove comment * Update yarn.lock * change compatibility date * update wrangler and fix bugs * Update colorthief+2.4.0.patch * build: cleanup flags * cleaner patches * update compatibility date * quick tweeks * cleanup rendering and lint * final color update --------- Co-authored-by: Zach Pomerantz <zzmp@uniswap.org>
2023-08-10 15:29:37 -04:00
}
const [fontData, palette] = await Promise.all([getFont(origin), getColor(data.ogImage)])
feat: dynamically generated images for rich link previews (#6902) * feat: add token and nft injection * feat: basic tests * fix: get jest configured properly * fix: change timeout * fix: uninstall port ready * fix: readd port ready * fix: local tests work * Update yarn.lock * add lint disable for setup files * fix: update dependencies * fix: basic test suite for nfts/tokens * feat: collection data * fix: make tests more comprehensive * fix: change matches to contains * fix: tests for twitter alt image tag * fix: image gen * fix: add patch-package * fix: update yarn install * feat: basic image gen for nfts and collections * fix: remove vibrant attempt * use watermark asset * dynamically grab color * modularize code and prototype for token preview * refactor code * finalize css * fix color grabber * update tests * fix up css * refactor code a bit more * remove console logs * tests * update tests * update images based on design feedback * network logos * update lint * slight refactoring * more refactoring * fix packages * Update yarn.lock * remove dynamically generated image stuff * Revert "remove dynamically generated image stuff" This reverts commit a80241edb3a970a724b9a07ce36e492ff8a1c2af. * change image reference and revamp tests * cleanup return values * Create README.md * Revert "Create README.md" This reverts commit 7a91c98d384995fba914c9bf9a2fb3072793621f. * First round of feedback * comments * feat: cache * Update test.yml * Update test.yml * Update test.yml * feedback round 2 * final feedback * final final feedback * add coverage and other options * Update test.yml * start typecheck * update cache * update snapshots? * Update jest.config.json * Update jest.config.json * give timeout some buffer * update import * upgrade ts * fix typing for apollo deps * finalize typechecks * downgrade typescript to original version * add cache directory to jest * remove coverage * remove google analytics from tests * merge main * remove timeout * update tests * update graphql queries * review changes * try cache setup * Update cache.test.ts * make cache helper function * cache test * remove unneeded test causing issues * feat: parallelize cache (#6930) * feat: parallelize cache? * remove graph query from concurrency await * most of feedback * move tests * update token tests * singleton cache * restructuring res and cache promise * abstract away repeated graph logic * update tests and functions * refactor * update typing, parallelize, and start tests * fix one tsc issue * final feedback * Update yarn.lock * final final feedback * add svgs * try and setup svg * stashing changes * cleanup! * prepare for start of feedback? * LESS GOO * modify versioning * fix: update wrangler version * Update yarn.lock * downgrade wrangler * Update yarn.lock * Update yarn.lock * fix type error * update github test * cleanup tests * Delete custom.d.ts * fix: cloudfunctions * update tests * final touchups * lint * change github action * Update yarn.lock * styling updates * nate's feedback * feedback p1 * typing feedback * update yarn * Create wrangler.toml * move wrangler.toml location * last try * Delete wrangler.toml * use 2.20? * remove comment * Update yarn.lock * change compatibility date * update wrangler and fix bugs * Update colorthief+2.4.0.patch * build: cleanup flags * cleaner patches * update compatibility date * quick tweeks * cleanup rendering and lint * final color update --------- Co-authored-by: Zach Pomerantz <zzmp@uniswap.org>
2023-08-10 15:29:37 -04:00
// Split name into words to wrap them since satori does not support inline text wrapping
const words = data.name.split(' ')
return new ImageResponse(
(
<div
style={{
backgroundColor: 'black',
display: 'flex',
width: '1200px',
height: '630px',
}}
>
<div
style={{
display: 'flex',
alignItems: 'center',
backgroundColor: `rgba(${palette[0]}, ${palette[1]}, ${palette[2]}, 0.75)`,
padding: '72px',
}}
>
<div
style={{
display: 'flex',
flexDirection: 'row',
alignItems: 'flex-end',
gap: '48px',
width: '100%',
}}
>
<img
src={data.ogImage}
alt={data.name}
width="500px"
height="500px"
style={{
borderRadius: '60px',
objectFit: 'cover',
}}
/>
<div
style={{
display: 'flex',
flexDirection: 'column',
gap: '32px',
width: '45%',
}}
>
<div
style={{
gap: '12px',
fontSize: '72px',
fontFamily: 'Inter',
color: 'white',
display: 'flex',
flexDirection: 'row',
alignItems: 'center',
flexWrap: 'wrap',
}}
>
{words.map((word: string) => (
<text key={word + index}>{word}</text>
))}
{data.isVerified && <img src={CHECK_URL} height="54px" />}
</div>
<img src={WATERMARK_URL} alt="Uniswap" height="72px" width="324px" />
</div>
</div>
</div>
</div>
),
{
width: 1200,
height: 630,
fonts: [
{
name: 'Inter',
data: fontData,
style: 'normal',
},
],
}
) as Response
} catch (error: any) {
return new Response(error.message || error.toString(), { status: 500 })
}
}