Skip to content

Commit 6014ce8

Browse files
committed
handle twitter avatar image
1 parent cc5ac8c commit 6014ce8

File tree

4 files changed

+54
-21
lines changed

4 files changed

+54
-21
lines changed

app/[locale]/10years/_components/CurrentTorchHolderCard.tsx

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import Curved10YearsText from "./10y.svg"
2020
import {
2121
formatAddress,
2222
getAddressEtherscanUrl,
23-
getBlockieImage,
23+
getAvatarImage,
2424
type TorchHolderMetadata,
2525
} from "@/lib/torch"
2626

@@ -71,7 +71,7 @@ const CurrentTorchHolderCard = ({
7171
<div className="flex items-start gap-4">
7272
<Avatar className="h-19 w-19 !shadow-none">
7373
<AvatarImage
74-
src={getBlockieImage(currentHolder.address)}
74+
src={getAvatarImage(currentHolder)}
7575
alt={`Avatar for ${currentHolder.name || currentHolder.address}`}
7676
/>
7777
<AvatarFallback>
@@ -97,20 +97,18 @@ const CurrentTorchHolderCard = ({
9797
</div>
9898
) : isBurned ? (
9999
<div className="flex flex-col items-center gap-4 text-center">
100-
<div className="text-2xl font-bold text-red-500">
100+
<div className="text-xl font-bold text-red-500">
101101
🔥 Torch Burned 🔥
102102
</div>
103-
<div className="text-lg">
103+
<div>
104104
The Ethereum Torch has been burned to celebrate the 10-year
105105
anniversary!
106106
</div>
107107
</div>
108108
) : (
109109
<div className="flex flex-col items-center gap-4 text-center">
110-
<div className="text-2xl font-bold text-gray-500">
111-
🤐 Unknown Bearer
112-
</div>
113-
<div className="text-lg">
110+
<div className="text-xl font-bold">🤐 Unknown Bearer</div>
111+
<div>
114112
The current torch bearer&apos;s identity is not publicly
115113
available.
116114
</div>

app/[locale]/10years/_components/TorchHistorySwiper.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import {
1212

1313
import TorchHistoryCard from "./TorchHistoryCard"
1414

15-
import { getBlockieImage, type TorchHolderEvent } from "@/lib/torch"
15+
import { getAvatarImage, type TorchHolderEvent } from "@/lib/torch"
1616

1717
type TorchHistorySwiperProps = {
1818
holders: TorchHolderEvent[]
@@ -87,7 +87,7 @@ const TorchHistorySwiper = ({
8787
avatar={
8888
card.isPlaceholder
8989
? "/images/10-year-anniversary/torch-cover.webp"
90-
: getBlockieImage(card.address)
90+
: getAvatarImage(card)
9191
}
9292
from={card.event.timestamp}
9393
to={card.event.timestamp}

app/[locale]/10years/page.tsx

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,12 @@ import {
4343
import { fetch10YearEvents } from "@/lib/api/fetch10YearEvents"
4444
import { fetch10YearStories } from "@/lib/api/fetch10YearStories"
4545
import { fetchTorchHolders } from "@/lib/api/fetchTorchHolders"
46-
import { getCurrentHolderAddress, getHolders } from "@/lib/torch"
46+
import {
47+
getCurrentHolderAddress,
48+
getHolders,
49+
isAddressFiltered,
50+
isTorchBurned,
51+
} from "@/lib/torch"
4752
import TenYearLogo from "@/public/images/10-year-anniversary/10-year-logo.png"
4853

4954
export const dynamic = "force-static"
@@ -96,11 +101,13 @@ const Page = async ({ params }: { params: Promise<{ locale: Lang }> }) => {
96101
{} as Record<string, (typeof allTorchHolders)[0]>
97102
)
98103

104+
const isBurned = await isTorchBurned()
99105
const currentHolderAddress = await getCurrentHolderAddress()
100-
const isBurned =
101-
currentHolderAddress === "0x0000000000000000000000000000000000000000"
106+
const isFiltered = isAddressFiltered(currentHolderAddress)
102107

103-
const currentHolder = torchHolderMap[currentHolderAddress.toLowerCase()]
108+
const currentHolder = isFiltered
109+
? null
110+
: torchHolderMap[currentHolderAddress.toLowerCase()]
104111
const torchHolders = await getHolders(torchHolderMap)
105112

106113
return (

src/lib/torch/index.ts

Lines changed: 35 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -155,13 +155,6 @@ export const getHolders = async (
155155
export const getCurrentHolderAddress = async () => {
156156
const publicClient = getPublicClient(config)
157157

158-
// First check if the torch is burned
159-
const isBurned = await isTorchBurned()
160-
161-
if (isBurned) {
162-
return "0x0000000000000000000000000000000000000000" as Address
163-
}
164-
165158
// If not burned, get the current holder
166159
const currentHolderAddress = (await publicClient.readContract({
167160
address: TORCH_CONTRACT_ADDRESS,
@@ -188,6 +181,41 @@ export const getBlockieImage = (address: Address) => {
188181
return blockies(address)
189182
}
190183

184+
export const getAvatarImage = (holder: TorchHolderMetadata | null) => {
185+
if (!holder) {
186+
return ""
187+
}
188+
189+
// If there's a Twitter handle, use Twitter profile image
190+
if (holder.twitter && holder.twitter.trim() !== "") {
191+
const twitterHandle = extractTwitterHandle(holder.twitter)
192+
if (twitterHandle) {
193+
return `https://unavatar.io/twitter/${twitterHandle}`
194+
}
195+
}
196+
197+
// Otherwise, fall back to blockie
198+
return getBlockieImage(holder.address)
199+
}
200+
201+
const extractTwitterHandle = (twitterUrl: string): string | null => {
202+
// Handle various Twitter URL formats
203+
const patterns = [
204+
/twitter\.com\/([^/?]+)/, // twitter.com/username
205+
/x\.com\/([^/?]+)/, // x.com/username
206+
/^@?([a-zA-Z0-9_]{1,15})$/, // @username or username
207+
]
208+
209+
for (const pattern of patterns) {
210+
const match = twitterUrl.match(pattern)
211+
if (match) {
212+
return match[1]
213+
}
214+
}
215+
216+
return null
217+
}
218+
191219
export const formatAddress = (address: Address) => {
192220
return `${address.slice(0, 6)}...${address.slice(-4)}`
193221
}

0 commit comments

Comments
 (0)