From 3d45346963e6a569034c0ff850ad0a5c563d06f9 Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Mon, 30 Mar 2026 14:11:00 +0300 Subject: [PATCH] jerrification badge (pls no spoil) --- assets/icons/unverifiedX.svg | 1 + src/analytics/metrics/types.ts | 2 + src/components/ProfileBadges.tsx | 17 ++- src/components/icons/UnverifiedX.tsx | 29 +++++ .../aprilFools/JerrifiedBadge.tsx | 12 ++ .../aprilFools/JerrifiedBadgeButton.tsx | 107 ++++++++++++++++++ 6 files changed, 167 insertions(+), 1 deletion(-) create mode 100644 assets/icons/unverifiedX.svg create mode 100644 src/components/icons/UnverifiedX.tsx create mode 100644 src/components/verification/aprilFools/JerrifiedBadge.tsx create mode 100644 src/components/verification/aprilFools/JerrifiedBadgeButton.tsx diff --git a/assets/icons/unverifiedX.svg b/assets/icons/unverifiedX.svg new file mode 100644 index 0000000000..57308783eb --- /dev/null +++ b/assets/icons/unverifiedX.svg @@ -0,0 +1 @@ + diff --git a/src/analytics/metrics/types.ts b/src/analytics/metrics/types.ts index 1f6b25278b..23046f03a0 100644 --- a/src/analytics/metrics/types.ts +++ b/src/analytics/metrics/types.ts @@ -1043,4 +1043,6 @@ export type Events = { 'profile:associated:germ:click-self-info': {} 'profile:associated:germ:self-disconnect': {} 'profile:associated:germ:self-reconnect': {} + + 'jerry:no': {} } diff --git a/src/components/ProfileBadges.tsx b/src/components/ProfileBadges.tsx index dd0cedfe8f..e30068c9dc 100644 --- a/src/components/ProfileBadges.tsx +++ b/src/components/ProfileBadges.tsx @@ -7,6 +7,11 @@ import {useSimpleVerificationState} from '#/components/verification' import {VerificationCheck} from '#/components/verification/VerificationCheck' import {VerificationCheckButton} from '#/components/verification/VerificationCheckButton' import type * as bsky from '#/types/bsky' +import { + isJerrifiedAccount, + JerrifiedBadge, +} from './verification/aprilFools/JerrifiedBadge' +import {JerrifiedBadgeButton} from './verification/aprilFools/JerrifiedBadgeButton' export type Size = 'xs' | 'sm' | 'md' | 'lg' | 'xl' @@ -39,8 +44,11 @@ export function ProfileBadges({ const shadowed = useProfileShadow(profile) const verification = useSimpleVerificationState({profile}) + const isJerry = isJerrifiedAccount(profile) + // if nothing to show, don't render the container at all - if (!verification.showBadge && !isBotAccount(shadowed)) return null + if (!verification.showBadge && !isBotAccount(shadowed) && !isJerry) + return null const isOnTheSmallSide = size === 'xs' || size === 'sm' @@ -54,6 +62,12 @@ export function ProfileBadges({ ]}> {interactive ? ( <> + {isJerry && ( + + )} ) : ( <> + {isJerry && } {verification.showBadge && ( ( + function LogoImpl(props, ref) { + const {fill, size, style, ...rest} = useCommonSVGProps(props) + + return ( + + + + + ) + }, +) diff --git a/src/components/verification/aprilFools/JerrifiedBadge.tsx b/src/components/verification/aprilFools/JerrifiedBadge.tsx new file mode 100644 index 0000000000..080ad734fd --- /dev/null +++ b/src/components/verification/aprilFools/JerrifiedBadge.tsx @@ -0,0 +1,12 @@ +import {UnverifiedX} from '#/components/icons/UnverifiedX' +import type * as bsky from '#/types/bsky' + +const JERRY = 'did:plc:vc7f4oafdgxsihk4cry2xpze' + +export function isJerrifiedAccount(profile: bsky.profile.AnyProfileView) { + return profile.did === JERRY +} + +export function JerrifiedBadge({width}: {width: number}) { + return +} diff --git a/src/components/verification/aprilFools/JerrifiedBadgeButton.tsx b/src/components/verification/aprilFools/JerrifiedBadgeButton.tsx new file mode 100644 index 0000000000..fab987c6d1 --- /dev/null +++ b/src/components/verification/aprilFools/JerrifiedBadgeButton.tsx @@ -0,0 +1,107 @@ +import {View} from 'react-native' +import {Trans, useLingui} from '@lingui/react/macro' + +import {UserAvatar} from '#/view/com/util/UserAvatar' +import {atoms as a, web} from '#/alf' +import {Button, ButtonText} from '#/components/Button' +import * as Dialog from '#/components/Dialog' +import {UnverifiedX} from '#/components/icons/UnverifiedX' +import {Text} from '#/components/Typography' +import {useAnalytics} from '#/analytics' +import type * as bsky from '#/types/bsky' +import {JerrifiedBadge} from './JerrifiedBadge' + +export function JerrifiedBadgeButton({ + profile, + width, +}: { + profile: bsky.profile.AnyProfileView + width: number +}) { + const {t: l} = useLingui() + const ax = useAnalytics() + const control = Dialog.useDialogControl() + + return ( + <> + + + + + + + + + + + + Jerry is unverified + + + Do not trust this user under any circumstances. + + + + + + + + ) +}