diff --git a/cspell.json b/cspell.json index 04206cb038..156b11fb70 100644 --- a/cspell.json +++ b/cspell.json @@ -245,7 +245,10 @@ "BSCT", "Moonriver", "chainid", - "Solflare" + "Solflare", + "Buttrfly", + "Soulbound", + "Fren" ], "flagWords": [], "ignorePaths": [ diff --git a/package.json b/package.json index f6d28a1ddf..6e6d04d407 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "mask.social", "type": "module", - "version": "6.7.1", + "version": "6.7.2", "private": true, "packageManager": "pnpm@8.15.8", "scripts": { diff --git a/src/app/(normal)/channel/[source]/[id]/page.tsx b/src/app/(normal)/channel/[source]/[id]/page.tsx index 3ba5412336..f2ce2f7da7 100644 --- a/src/app/(normal)/channel/[source]/[id]/page.tsx +++ b/src/app/(normal)/channel/[source]/[id]/page.tsx @@ -13,6 +13,7 @@ import { memoizeWithRedis } from '@/helpers/memoizeWithRedis.js'; import { resolveSocialMediaProvider } from '@/helpers/resolveSocialMediaProvider.js'; import { resolveSocialSource } from '@/helpers/resolveSource.js'; import { runInSafeAsync } from '@/helpers/runInSafe.js'; +import { setupLocaleForSSR } from '@/i18n/index.js'; import type { NextPageProps } from '@/types/index.js'; const createPageMetadata = memoizeWithRedis(createMetadataChannelById, { @@ -38,6 +39,9 @@ export async function generateMetadata(props: Props): Promise { export default async function Page(props: Props) { if (await isBotRequest()) return null; + + await setupLocaleForSSR(); + const params = await props.params; const source = resolveSocialSource(params.source); const provider = resolveSocialMediaProvider(source); diff --git a/src/app/(normal)/post/[source]/[id]/pages/EngagementLayout.tsx b/src/app/(normal)/post/[source]/[id]/pages/EngagementLayout.tsx index e9c0720cc7..911d41204d 100644 --- a/src/app/(normal)/post/[source]/[id]/pages/EngagementLayout.tsx +++ b/src/app/(normal)/post/[source]/[id]/pages/EngagementLayout.tsx @@ -24,7 +24,7 @@ export function EngagementLayout({ [ { value: EngagementType.Mirrors, - title: Mirrors, + title: Reposts, link: resolveEngagementUrl(id, source, EngagementType.Mirrors), }, { diff --git a/src/app/(settings)/settings/wallets/page.tsx b/src/app/(settings)/settings/wallets/page.tsx index 8d47cfc500..d61cc71c7f 100644 --- a/src/app/(settings)/settings/wallets/page.tsx +++ b/src/app/(settings)/settings/wallets/page.tsx @@ -43,7 +43,7 @@ export default function Wallets() { return (
- Associated wallets + Connected wallets {isRefetching ? : null} {!isLoading && connected.length === 0 && related.length === 0 ? ( diff --git a/src/app/api/third-party/login/route.ts b/src/app/api/third-party/login/route.ts deleted file mode 100644 index 2a777715c4..0000000000 --- a/src/app/api/third-party/login/route.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { NextRequest } from 'next/server.js'; - -import { compose } from '@/helpers/compose.js'; -import { createSuccessResponseJSON } from '@/helpers/createResponseJSON.js'; -import { withRequestErrorHandler } from '@/helpers/withRequestErrorHandler.js'; -import { withTwitterRequestErrorHandler } from '@/helpers/withTwitterRequestErrorHandler.js'; - -export const POST = compose<(request: NextRequest) => Promise>( - withRequestErrorHandler({ throwError: true }), - withTwitterRequestErrorHandler, - async (request) => { - // TODO: read third party oauth token for next-auth cookie - // TODO: invoke firefly API along with the token to get the account details - return createSuccessResponseJSON( - {}, - { - headers: { - 'Set-Cookie': `thirdPartyToken=${btoa(JSON.stringify({}))}; path=/; Max-Age=31536000; SameSite=Lax; Secure;}`, - }, - }, - ); - }, -); diff --git a/src/app/api/third-party/logout/route.ts b/src/app/api/third-party/logout/route.ts deleted file mode 100644 index 599cdb454f..0000000000 --- a/src/app/api/third-party/logout/route.ts +++ /dev/null @@ -1,19 +0,0 @@ -import type { NextRequest } from 'next/server.js'; - -import { compose } from '@/helpers/compose.js'; -import { createSuccessResponseJSON } from '@/helpers/createResponseJSON.js'; -import { withRequestErrorHandler } from '@/helpers/withRequestErrorHandler.js'; -import { withTwitterRequestErrorHandler } from '@/helpers/withTwitterRequestErrorHandler.js'; - -export const POST = compose<(request: NextRequest) => Promise>( - withRequestErrorHandler({ throwError: true }), - withTwitterRequestErrorHandler, - async (request) => { - // TODO: clean third party oauth token for next-auth cookie - return createSuccessResponseJSON(null, { - headers: { - 'Set-Cookie': `thirdPartyToken=; path=/; Max-Age=-1; SameSite=Lax; Secure;}`, - }, - }); - }, -); diff --git a/src/app/api/twitter/user/search/route.ts b/src/app/api/twitter/user/search/route.ts index bc2b2e9298..6ca58023a6 100644 --- a/src/app/api/twitter/user/search/route.ts +++ b/src/app/api/twitter/user/search/route.ts @@ -32,7 +32,7 @@ export const GET = compose<(request: NextRequest, context?: NextRequestContext) const userFields = TWITTER_USER_OPTIONS['user.fields']; const url = urlcat('users/search', { - query: queryParams.query.replace(/_/g, ''), + query: queryParams.query, 'user.fields': Array.isArray(userFields) ? userFields.join(',') : undefined, next_token: queryParams.cursor ? queryParams.cursor : undefined, max_results: queryParams.limit, diff --git a/src/assets/failed-square.svg b/src/assets/failed-square.svg new file mode 100644 index 0000000000..4bac46156f --- /dev/null +++ b/src/assets/failed-square.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/components/Actions/Mirrors.tsx b/src/components/Actions/Mirrors.tsx index d73fc0996d..e2513c9fea 100644 --- a/src/components/Actions/Mirrors.tsx +++ b/src/components/Actions/Mirrors.tsx @@ -48,7 +48,7 @@ export const Mirror = memo(function Mirror({ if (shares === 0) { switch (source) { case Source.Lens: - return t`Mirror or Quote`; + return t`Repost or Quote`; case Source.Farcaster: return t`Recast or Quote`; case Source.Twitter: @@ -62,8 +62,8 @@ export const Mirror = memo(function Mirror({ switch (source) { case Source.Lens: return plural(shares, { - one: 'Mirror or Quote', - other: 'Mirrors or Quotes', + one: 'Repost or Quote', + other: 'Reposts or Quotes', }); case Source.Farcaster: return plural(shares, { @@ -81,7 +81,7 @@ export const Mirror = memo(function Mirror({ const mirrorActionText = useMemo(() => { switch (source) { case Source.Lens: - return mirrored ? t`Mirror again` : t`Mirror`; + return mirrored ? t`Repost again` : t`Repost`; case Source.Farcaster: return mirrored ? t`Cancel Recast` : t`Recast`; case Source.Twitter: @@ -130,7 +130,7 @@ export const Mirror = memo(function Mirror({ > - Undo mirror + Undo repost ) : null} @@ -156,7 +156,7 @@ export const Mirror = memo(function Mirror({ > { event.preventDefault(); event.stopPropagation(); diff --git a/src/components/Actions/PostStatistics.tsx b/src/components/Actions/PostStatistics.tsx index 8dd22a07fa..2a86271f65 100644 --- a/src/components/Actions/PostStatistics.tsx +++ b/src/components/Actions/PostStatistics.tsx @@ -144,8 +144,8 @@ export const PostStatistics = memo(function PostStatistics({ other: 'recasts', }), [Source.Lens]: plural(post.stats.mirrors, { - one: 'mirror', - other: 'mirrors', + one: 'repost', + other: 'reposts', }), [Source.Twitter]: plural(post.stats.mirrors, { one: 'repost', diff --git a/src/components/Activity/ActivityClaimButton.tsx b/src/components/Activity/ActivityClaimButton.tsx index e876ed5d29..1182a6b244 100644 --- a/src/components/Activity/ActivityClaimButton.tsx +++ b/src/components/Activity/ActivityClaimButton.tsx @@ -4,13 +4,13 @@ import { t } from '@lingui/core/macro'; import { Trans } from '@lingui/react/macro'; import { safeUnreachable } from '@masknet/kit'; import { ChainId } from '@masknet/web3-shared-evm'; -import { type ReactNode, useContext, useState } from 'react'; +import { type ReactNode, use, useContext, useState } from 'react'; import { useAsyncFn } from 'react-use'; import { ActivityContext } from '@/components/Activity/ActivityContext.js'; import { ActivityMintSuccessDialog } from '@/components/Activity/ActivityMintSuccessDialog.js'; +import { ActivityPremiumListContext } from '@/components/Activity/ActivityPremiumListContext.js'; import { useActivityClaimCondition } from '@/components/Activity/hooks/useActivityClaimCondition.js'; -import { useActivityPremiumList } from '@/components/Activity/hooks/useActivityPremiumList.js'; import { LoadingIcon } from '@/components/LoadingIcon.js'; import type { SocialSource } from '@/constants/enum.js'; import type { Chars } from '@/helpers/chars.js'; @@ -46,7 +46,7 @@ export function ActivityClaimButton({ const { data, refetch } = useActivityClaimCondition(source); const [hash, setHash] = useState(undefined); const [chainId, setChainId] = useState(undefined); - const list = useActivityPremiumList(source); + const { list } = use(ActivityPremiumListContext); const isPremium = list.some((x) => x.verified); const disabled = status === ActivityStatus.Ended || !data?.canClaim || !address || rest.disabled; diff --git a/src/components/Activity/ActivityPremiumConditionList.tsx b/src/components/Activity/ActivityPremiumConditionList.tsx index 4e3b9e09b1..eebbd9d699 100644 --- a/src/components/Activity/ActivityPremiumConditionList.tsx +++ b/src/components/Activity/ActivityPremiumConditionList.tsx @@ -1,18 +1,14 @@ 'use client'; import type { PropsWithChildren, ReactNode } from 'react'; +import { use } from 'react'; +import { ActivityPremiumListContext } from '@/components/Activity/ActivityPremiumListContext.js'; import { ActivityVerifyText } from '@/components/Activity/ActivityVerifyText.js'; -import { useActivityPremiumList } from '@/components/Activity/hooks/useActivityPremiumList.js'; -import type { SocialSource } from '@/constants/enum.js'; import { classNames } from '@/helpers/classNames.js'; -export function ActivityPremiumConditionList({ - title, - source, - children, -}: PropsWithChildren<{ title: ReactNode; source: SocialSource }>) { - const list = useActivityPremiumList(source); +export function ActivityPremiumConditionList({ title, children }: PropsWithChildren<{ title: ReactNode }>) { + const { list } = use(ActivityPremiumListContext); return (
{list.map((item, i) => (
  • - {item.label} + + {item.label} +
  • ))} diff --git a/src/components/Activity/ActivityPremiumListContext.tsx b/src/components/Activity/ActivityPremiumListContext.tsx new file mode 100644 index 0000000000..5e7ebe2c9e --- /dev/null +++ b/src/components/Activity/ActivityPremiumListContext.tsx @@ -0,0 +1,28 @@ +'use client'; + +import { createContext, type PropsWithChildren, type ReactNode, useMemo } from 'react'; + +interface ActivityPremiumListItem { + label: ReactNode; + verified?: boolean; +} + +interface ActivityPremiumListContext { + list: ActivityPremiumListItem[]; +} + +export const ActivityPremiumListContext = createContext({ + list: [], +}); + +export function ActivityPremiumListProvider({ + children, + list, +}: PropsWithChildren>) { + const value = useMemo(() => { + return { + list, + }; + }, [list]); + return {children}; +} diff --git a/src/components/Activity/ActivityTasks/ActivityButtrflyTasks.tsx b/src/components/Activity/ActivityTasks/ActivityButtrflyTasks.tsx new file mode 100644 index 0000000000..c2f1079975 --- /dev/null +++ b/src/components/Activity/ActivityTasks/ActivityButtrflyTasks.tsx @@ -0,0 +1,127 @@ +'use client'; + +import { t } from '@lingui/core/macro'; +import { Trans } from '@lingui/react/macro'; +import { ChainId } from '@masknet/web3-shared-evm'; +import { useContext, useMemo } from 'react'; + +import { ActivityClaimButton } from '@/components/Activity/ActivityClaimButton.js'; +import { ActivityConnectCard } from '@/components/Activity/ActivityConnectCard.js'; +import { ActivityContext } from '@/components/Activity/ActivityContext.js'; +import { ActivityLoginButton } from '@/components/Activity/ActivityLoginButton.js'; +import { ActivityPremiumConditionList } from '@/components/Activity/ActivityPremiumConditionList.js'; +import { ActivityPremiumListProvider } from '@/components/Activity/ActivityPremiumListContext.js'; +import { ActivityVerifyText } from '@/components/Activity/ActivityVerifyText.js'; +import { useActivityClaimCondition } from '@/components/Activity/hooks/useActivityClaimCondition.js'; +import { useActivityShareUrl } from '@/components/Activity/hooks/useActivityShareUrl.js'; +import { Link } from '@/components/Activity/Link.js'; +import { IS_ANDROID } from '@/constants/bowser.js'; +import { Source } from '@/constants/enum.js'; +import { FIREFLY_TELEGRAM_URL } from '@/constants/index.js'; +import { FIREFLY_MENTION } from '@/constants/mentions.js'; +import type { Chars } from '@/helpers/chars.js'; +import { classNames } from '@/helpers/classNames.js'; +import { replaceObjectInStringArray } from '@/helpers/replaceObjectInStringArray.js'; +import { fireflyBridgeProvider } from '@/providers/firefly/Bridge.js'; +import type { ActivityInfoResponse } from '@/providers/types/Firefly.js'; + +export function ActivityButtrflyTasks({ + data, +}: { + data: Pick['data'], 'status' | 'name'>; +}) { + const { address } = useContext(ActivityContext); + const { data: claimCondition } = useActivityClaimCondition(Source.Lens); + const list = [ + { + label: Top 500 Buttrfly Points Leaderboard, + verified: claimCondition?.lens?.isTopUser, + }, + ]; + const shareUrl = useActivityShareUrl(data.name); + const shareContent = useMemo(() => { + const fireflyMention = 'FIREFLY_MENTION'; + return replaceObjectInStringArray( + t`Just earned $MASK by minting the Buttrfly Fren 🦋 collectible from ${fireflyMention} + +Claim here ${shareUrl}`, + { + [fireflyMention]: FIREFLY_MENTION, + }, + ); + }, [shareUrl]); + const isPremium = list.some((x) => x.verified); + + return ( + +
    +
    +
    +

    + Check Eligibility +

    + +
    +
    +
    + +

    + Posted to Lens on Buttrfly since August 1, 2024 +

    +
    +
    +

    + Connect Wallet +

    + Wallet submitted + ) : ( + Submit a wallet to receive a collectible and $MASK airdrop + ) + } + /> +
    +

    + Eligible for Premium? +

    + Unlock a premium collectible and a larger $MASK airdrop } + /> +
    +

    + + For any inquiries, please{' '} + + contact us + + . All rights reserved by Firefly. + +

    +
    +
    + +
    +
    + ); +} diff --git a/src/components/Activity/ActivityTasks/ActivityElex24Tasks.tsx b/src/components/Activity/ActivityTasks/ActivityElex24Tasks.tsx index 90a62b8c44..097cbc9194 100644 --- a/src/components/Activity/ActivityTasks/ActivityElex24Tasks.tsx +++ b/src/components/Activity/ActivityTasks/ActivityElex24Tasks.tsx @@ -10,17 +10,22 @@ import { ActivityConnectCard } from '@/components/Activity/ActivityConnectCard.j import { ActivityContext } from '@/components/Activity/ActivityContext.js'; import { ActivityElex24Context } from '@/components/Activity/ActivityElex24/ActivityElex24Context.js'; import { ActivityElex24Vote } from '@/components/Activity/ActivityElex24/ActivityElex24Vote.js'; +import { useActivityElex24Involved } from '@/components/Activity/ActivityElex24/useActivityElex24Involved.js'; import { ActivityLoginButton } from '@/components/Activity/ActivityLoginButton.js'; import { ActivityPremiumConditionList } from '@/components/Activity/ActivityPremiumConditionList.js'; +import { ActivityPremiumListProvider } from '@/components/Activity/ActivityPremiumListContext.js'; import { ActivityTaskFollowCard } from '@/components/Activity/ActivityTaskFollowCard.js'; +import { useActivityClaimCondition } from '@/components/Activity/hooks/useActivityClaimCondition.js'; import { useActivityCurrentAccountHandle } from '@/components/Activity/hooks/useActivityCurrentAccountHandle.js'; import { useIsFollowInActivity } from '@/components/Activity/hooks/useIsFollowInActivity.js'; +import { Link } from '@/components/Activity/Link.js'; import { Source } from '@/constants/enum.js'; import { SITE_URL } from '@/constants/index.js'; import { FIREFLY_MENTION, FIREFLY_TWITTER_PROFILE } from '@/constants/mentions.js'; import { type Chars } from '@/helpers/chars.js'; import { ReferralAccountPlatform, resolveActivityUrl } from '@/helpers/resolveActivityUrl.js'; import { ActivityElex24VoteOption } from '@/providers/types/Activity.js'; +import { Level } from '@/providers/types/CZ.js'; import type { ActivityInfoResponse } from '@/providers/types/Firefly.js'; export function ActivityElex24Tasks({ data }: { data: Pick['data'], 'status'> }) { @@ -56,8 +61,40 @@ export function ActivityElex24Tasks({ data }: { data: Pick ({ vote }), [vote]); + const { data: claimCondition } = useActivityClaimCondition(Source.Twitter); + const { data: isInvolvedElex24 } = useActivityElex24Involved(); + return ( - <> + Your X account holds Premium status, + verified: claimCondition?.x?.level === Level.Lv2, + }, + { + label: Your Farcaster account holds Power Badge, + verified: claimCondition?.farcaster.isPowerUser, + }, + { + label: ( + + + Get involved in the{' '} + + Presidential Election Winner 2024 + {' '} + on Polymarket + + + ), + verified: isInvolvedElex24, + }, + ]} + >
    @@ -96,7 +133,6 @@ export function ActivityElex24Tasks({ data }: { data: Pick Hold on! Meet any of the following to unlock a premium collectible:} - source={Source.Twitter} />
    @@ -110,6 +146,6 @@ export function ActivityElex24Tasks({ data }: { data: Pick
    - +
    ); } diff --git a/src/components/Activity/ActivityTasks/ActivityFrensgivingTasks.tsx b/src/components/Activity/ActivityTasks/ActivityFrensgivingTasks.tsx index 842dcbe8f7..c52175e4fc 100644 --- a/src/components/Activity/ActivityTasks/ActivityFrensgivingTasks.tsx +++ b/src/components/Activity/ActivityTasks/ActivityFrensgivingTasks.tsx @@ -7,9 +7,9 @@ import { ActivityClaimButton } from '@/components/Activity/ActivityClaimButton.j import { ActivityConnectCard } from '@/components/Activity/ActivityConnectCard.js'; import { ActivityLoginButton } from '@/components/Activity/ActivityLoginButton.js'; import { ActivityPremiumConditionList } from '@/components/Activity/ActivityPremiumConditionList.js'; +import { ActivityPremiumListProvider } from '@/components/Activity/ActivityPremiumListContext.js'; import { ActivityVerifyText } from '@/components/Activity/ActivityVerifyText.js'; import { useActivityClaimCondition } from '@/components/Activity/hooks/useActivityClaimCondition.js'; -import { useActivityPremiumList } from '@/components/Activity/hooks/useActivityPremiumList.js'; import { useActivityShareUrl } from '@/components/Activity/hooks/useActivityShareUrl.js'; import { Source } from '@/constants/enum.js'; import { FIREFLY_MENTION } from '@/constants/mentions.js'; @@ -34,11 +34,22 @@ export function ActivityFrensgivingTasks({ const verifiedBasic = claimCondition && (!!claimCondition.farcaster.hasThirdpartSigner || Number.parseInt(claimCondition.farcaster.fid, 10) <= 100_000); - const list = useActivityPremiumList(Source.Farcaster); + const list = [ + { + label: Your Farcaster account holds Power Badge, + verified: claimCondition?.farcaster.isPowerUser, + }, + { + label: You have been detected as a loyal Farcaster user, + verified: + claimCondition?.farcaster.isSupercast || + (claimCondition && parseInt(claimCondition.farcaster.fid, 10) <= 10000), + }, + ]; const isPremium = list.some((x) => x.verified); return ( - <> +
    @@ -77,7 +88,6 @@ export function ActivityFrensgivingTasks({ title={ Meet any of the following to unlock a premium collectible and get more $ANON: } - source={Source.Farcaster} />
    @@ -89,6 +99,6 @@ export function ActivityFrensgivingTasks({ claimType={isPremium ? 'premium' : 'base'} />
    - +
    ); } diff --git a/src/components/Activity/ActivityTasks/ActivityHlblTasks.tsx b/src/components/Activity/ActivityTasks/ActivityHlblTasks.tsx index 8ed45252c3..603bbe52b6 100644 --- a/src/components/Activity/ActivityTasks/ActivityHlblTasks.tsx +++ b/src/components/Activity/ActivityTasks/ActivityHlblTasks.tsx @@ -10,8 +10,9 @@ import { ActivityContext } from '@/components/Activity/ActivityContext.js'; import { ActivityFollowTargetCard } from '@/components/Activity/ActivityFollowTargetCard.js'; import { ActivityLoginButton } from '@/components/Activity/ActivityLoginButton.js'; import { ActivityPremiumConditionList } from '@/components/Activity/ActivityPremiumConditionList.js'; +import { ActivityPremiumListProvider } from '@/components/Activity/ActivityPremiumListContext.js'; import { ActivityTaskFollowCard } from '@/components/Activity/ActivityTaskFollowCard.js'; -import { useActivityPremiumList } from '@/components/Activity/hooks/useActivityPremiumList.js'; +import { useActivityClaimCondition } from '@/components/Activity/hooks/useActivityClaimCondition.js'; import { useIsFollowInActivity } from '@/components/Activity/hooks/useIsFollowInActivity.js'; import { Source } from '@/constants/enum.js'; import { @@ -21,10 +22,25 @@ import { FIREFLY_TWITTER_PROFILE, } from '@/constants/mentions.js'; import { type Chars } from '@/helpers/chars.js'; +import { Level } from '@/providers/types/CZ.js'; import type { ActivityInfoResponse } from '@/providers/types/Firefly.js'; export function ActivityHlblTasks({ data }: { data: Pick['data'], 'status'> }) { - const list = useActivityPremiumList(Source.Twitter); + const { data: claimCondition } = useActivityClaimCondition(Source.Twitter); + const list = [ + { + label: Your X account holds Premium status, + verified: claimCondition?.x?.level === Level.Lv2, + }, + { + label: Your Farcaster account holds Power Badge, + verified: claimCondition?.farcaster.isPowerUser, + }, + { + label: Your assets on Base Chain are worth over US$10,000, + verified: claimCondition?.balance?.level === Level.Lv2, + }, + ]; const isPremium = list.some((x) => x.verified); const shareContent = !isPremium ? [ @@ -55,7 +71,7 @@ export function ActivityHlblTasks({ data }: { data: Pick +
    @@ -94,7 +110,6 @@ export function ActivityHlblTasks({ data }: { data: Pick Hold on! Meet any of the following to unlock a premium collectible:} - source={Source.Twitter} />
    @@ -107,6 +122,6 @@ export function ActivityHlblTasks({ data }: { data: Pick
    - +
    ); } diff --git a/src/components/Activity/ActivityTasks/ActivityPenguTasks.tsx b/src/components/Activity/ActivityTasks/ActivityPenguTasks.tsx index 21a3d1ac47..9cd30d2515 100644 --- a/src/components/Activity/ActivityTasks/ActivityPenguTasks.tsx +++ b/src/components/Activity/ActivityTasks/ActivityPenguTasks.tsx @@ -12,18 +12,25 @@ import { ActivityLoginButton } from '@/components/Activity/ActivityLoginButton.j import { ActivityNormalSuccessDialog } from '@/components/Activity/ActivityNormalSuccessDialog.js'; import { ActivityPremiumAddressVerifyCard } from '@/components/Activity/ActivityPremiumAddressVerifyCard.js'; import { ActivityPremiumConditionList } from '@/components/Activity/ActivityPremiumConditionList.js'; +import { ActivityPremiumListProvider } from '@/components/Activity/ActivityPremiumListContext.js'; import { ActivityTaskFollowCard } from '@/components/Activity/ActivityTaskFollowCard.js'; import { ActivityVerifyText } from '@/components/Activity/ActivityVerifyText.js'; import { useActivityClaimCondition } from '@/components/Activity/hooks/useActivityClaimCondition.js'; -import { useActivityPremiumList } from '@/components/Activity/hooks/useActivityPremiumList.js'; import { useActivityShareUrl } from '@/components/Activity/hooks/useActivityShareUrl.js'; import { useIsFollowInActivity } from '@/components/Activity/hooks/useIsFollowInActivity.js'; import { Link } from '@/components/Activity/Link.js'; import { Source } from '@/constants/enum.js'; +import { + LIL_PUDGY_NFT_ADDRESS, + PENGU_PINS_NFT_ADDRESS, + PUDGY_PENGUINS_NFT_ADDRESS, + TRUE_PENGU_NFT_ADDRESS, +} from '@/constants/index.js'; import { FIREFLY_MENTION, FIREFLY_TWITTER_PROFILE, PUDGY_PENGUINS_TWITTER_PROFILE } from '@/constants/mentions.js'; import { type Chars } from '@/helpers/chars.js'; import { classNames } from '@/helpers/classNames.js'; import { replaceObjectInStringArray } from '@/helpers/replaceObjectInStringArray.js'; +import { resolveNftUrl } from '@/helpers/resolveNftUrl.js'; import { resolveProfileUrl } from '@/helpers/resolveProfileUrl.js'; import { runInSafe } from '@/helpers/runInSafe.js'; import { type ActivityInfoResponse, ActivityStatus } from '@/providers/types/Firefly.js'; @@ -35,7 +42,56 @@ export function ActivityPenguTasks({ }) { const { address, premiumAddress } = useContext(ActivityContext); const { data: claimCondition } = useActivityClaimCondition(Source.Twitter); - const list = useActivityPremiumList(Source.Twitter); + const list = [ + { + label: ( +

    + + You are holder of{' '} + + Pudgy Penguins + {' '} + or{' '} + + Lil Pudgy + {' '} + NFTs + +

    + ), + verified: claimCondition?.nft?.ownPudgy || claimCondition?.nft?.ownLil, + }, + { + label: ( +

    + + You are holder of{' '} + + truePengu + {' '} + or{' '} + + penguPins + {' '} + Soulbound NFTs + +

    + ), + verified: claimCondition?.nft?.ownPudgy || claimCondition?.nft?.ownPenguPins, + }, + ]; const isPremium = list.some((x) => x.verified); const followPenguTwitterProfile = { handle: PUDGY_PENGUINS_TWITTER_PROFILE.handle, @@ -86,7 +142,58 @@ Submit here ${shareUrl} const [isSuccessParticipate, setIsSuccessParticipate] = useState(false); return ( - <> + + + You are holder of{' '} + + Pudgy Penguins + {' '} + or{' '} + + Lil Pudgy + {' '} + NFTs + +

    + ), + verified: claimCondition?.nft?.ownPudgy || claimCondition?.nft?.ownLil, + }, + { + label: ( +

    + + You are holder of{' '} + + truePengu + {' '} + or{' '} + + penguPins + {' '} + Soulbound NFTs + +

    + ), + verified: claimCondition?.nft?.ownPudgy || claimCondition?.nft?.ownPenguPins, + }, + ]} + >
    @@ -143,7 +250,6 @@ Submit here ${shareUrl}
    Meet any of the following to unlock a premium collectible:} - source={Source.Twitter} >

    *Note: Each NFT can only be used once. @@ -175,6 +281,6 @@ Submit here ${shareUrl} onClose={() => setIsSuccessParticipate(false)} />

    - + ); } diff --git a/src/components/Activity/ActivityTasks/ActivityTrumpTasks.tsx b/src/components/Activity/ActivityTasks/ActivityTrumpTasks.tsx index 5d8140655b..8be5c69ec1 100644 --- a/src/components/Activity/ActivityTasks/ActivityTrumpTasks.tsx +++ b/src/components/Activity/ActivityTasks/ActivityTrumpTasks.tsx @@ -13,10 +13,10 @@ import { ActivityLoginButton } from '@/components/Activity/ActivityLoginButton.j import { ActivityNormalSuccessDialog } from '@/components/Activity/ActivityNormalSuccessDialog.js'; import { ActivityPremiumAddressVerifyCard } from '@/components/Activity/ActivityPremiumAddressVerifyCard.js'; import { ActivityPremiumConditionList } from '@/components/Activity/ActivityPremiumConditionList.js'; +import { ActivityPremiumListProvider } from '@/components/Activity/ActivityPremiumListContext.js'; import { ActivityTaskFollowCard } from '@/components/Activity/ActivityTaskFollowCard.js'; import { ActivityVerifyText } from '@/components/Activity/ActivityVerifyText.js'; import { useActivityClaimCondition } from '@/components/Activity/hooks/useActivityClaimCondition.js'; -import { useActivityPremiumList } from '@/components/Activity/hooks/useActivityPremiumList.js'; import { useActivityShareUrl } from '@/components/Activity/hooks/useActivityShareUrl.js'; import { useIsFollowInActivity } from '@/components/Activity/hooks/useIsFollowInActivity.js'; import { Link } from '@/components/Activity/Link.js'; @@ -29,9 +29,11 @@ import { FIREFLY_MENTION, FIREFLY_TWITTER_PROFILE, TRUMP_TWITTER_PROFILE } from import type { Chars } from '@/helpers/chars.js'; import { classNames } from '@/helpers/classNames.js'; import { replaceObjectInStringArray } from '@/helpers/replaceObjectInStringArray.js'; +import { resolveNftUrl } from '@/helpers/resolveNftUrl.js'; import { resolveProfileUrl } from '@/helpers/resolveProfileUrl.js'; import { runInSafe } from '@/helpers/runInSafe.js'; import { fireflyBridgeProvider } from '@/providers/firefly/Bridge.js'; +import { Level } from '@/providers/types/CZ.js'; import { type ActivityInfoResponse, ActivityStatus } from '@/providers/types/Firefly.js'; function DisclaimerDialog({ open, onClose }: { open: boolean; onClose: () => void }) { @@ -78,7 +80,29 @@ export function ActivityTrumpTasks({ }) { const { address, premiumAddress } = useContext(ActivityContext); const { data: claimCondition } = useActivityClaimCondition(Source.Twitter); - const list = useActivityPremiumList(Source.Twitter); + const list = [ + { + label: Your X account holds Premium status, + verified: claimCondition?.x.valid && claimCondition?.x?.level === Level.Lv2, + }, + { + label: ( +

    + + You are holder of{' '} + + Presidential Election 2024 + {' '} + NFT and voted Trump + +

    + ), + verified: claimCondition?.nft?.valid && claimCondition?.nft?.level === Level.Lv2, + }, + ]; const isPremium = list.some((x) => x.verified); const followTrumpTwitterProfile = { handle: TRUMP_TWITTER_PROFILE.handle, @@ -130,7 +154,7 @@ Check your eligibility and participate here ${shareUrl} const [openDisclaimer, setOpenDisclaimer] = useState(false); return ( - <> + setOpenDisclaimer(false)} />
    @@ -188,7 +212,6 @@ Check your eligibility and participate here ${shareUrl}
    Meet any of the following to unlock premium status and get more $Trump:} - source={Source.Twitter} />
    @@ -236,6 +259,6 @@ Check your eligibility and participate here ${shareUrl} onClose={() => setIsSuccessParticipate(false)} />
    - +
    ); } diff --git a/src/components/Activity/ActivityTasks/index.tsx b/src/components/Activity/ActivityTasks/index.tsx index 5a289d38be..b785a5c09f 100644 --- a/src/components/Activity/ActivityTasks/index.tsx +++ b/src/components/Activity/ActivityTasks/index.tsx @@ -1,6 +1,7 @@ 'use client'; import { ActivityMobileOnly } from '@/components/Activity/ActivityMobileOnly.js'; +import { ActivityButtrflyTasks } from '@/components/Activity/ActivityTasks/ActivityButtrflyTasks.js'; import { ActivityElex24Tasks } from '@/components/Activity/ActivityTasks/ActivityElex24Tasks.js'; import { ActivityFrensgivingTasks } from '@/components/Activity/ActivityTasks/ActivityFrensgivingTasks.js'; import { ActivityHlblTasks } from '@/components/Activity/ActivityTasks/ActivityHlblTasks.js'; @@ -33,6 +34,8 @@ export function ActivityTasks({ name, data }: Props) { ); + case 'buttrfly': + return ; default: return null; } diff --git a/src/components/Activity/ActivityVerifyText.tsx b/src/components/Activity/ActivityVerifyText.tsx index 234680d92a..5fef71a400 100644 --- a/src/components/Activity/ActivityVerifyText.tsx +++ b/src/components/Activity/ActivityVerifyText.tsx @@ -1,12 +1,23 @@ import type { PropsWithChildren } from 'react'; +import FailedSquareIcon from '@/assets/failed-square.svg'; import TickSquareIcon from '@/assets/tick-square.svg'; +import { useActivityConnections } from '@/components/Activity/hooks/useActivityConnections.js'; -export function ActivityVerifyText({ verified, children }: PropsWithChildren<{ verified?: boolean }>) { +export function ActivityVerifyText({ + verified, + children, + hasFailedIcon = false, +}: PropsWithChildren<{ verified?: boolean; hasFailedIcon?: boolean }>) { + const { data: activityConnections } = useActivityConnections(); return (
    {children} - {verified ? : null} + {verified ? ( + + ) : hasFailedIcon && activityConnections ? ( + + ) : null}
    ); } diff --git a/src/components/Activity/Link.tsx b/src/components/Activity/Link.tsx index 70e199379e..079221fb04 100644 --- a/src/components/Activity/Link.tsx +++ b/src/components/Activity/Link.tsx @@ -1,9 +1,14 @@ import type { LinkProps } from 'next/link.js'; -import { forwardRef, type HTMLProps, type PropsWithChildren } from 'react'; +import { forwardRef, type HTMLProps, type PropsWithChildren, useCallback } from 'react'; import urlcat from 'urlcat'; -import { Link as RawLink } from '@/components/Link.js'; import { IS_ANDROID } from '@/constants/bowser.js'; +import { Link as OriginalLink } from '@/esm/Link.js'; +import { interceptExternalUrl } from '@/helpers/interceptExternalUrl.js'; +import { isTrustedUrl } from '@/helpers/isTrustedUrl.js'; +import { openWindow } from '@/helpers/openWindow.js'; +import { useInternalLink } from '@/hooks/useInternalLink.js'; +import { ConfirmLeavingModalRef } from '@/modals/controls.js'; import { fireflyBridgeProvider } from '@/providers/firefly/Bridge.js'; import { SupportedMethod } from '@/types/bridge.js'; @@ -11,28 +16,43 @@ export const Link = forwardRef< HTMLAnchorElement, PropsWithChildren> & Pick, 'className' | 'target'> & { href: string } >(function Link({ children, ...props }, ref) { - return ( - { - if (fireflyBridgeProvider.supported) { - const url = !props.href.startsWith('https') - ? urlcat(window.location.origin, props.href) - : props.href; - if (!IS_ANDROID) { - event.preventDefault(); - fireflyBridgeProvider.request(SupportedMethod.OPEN_URL, { - url, - }); + const { href } = props; + const { data: internalLink } = useInternalLink(href); + + const onLinkClick = useCallback( + async (event: React.MouseEvent) => { + const isTrusted = isTrustedUrl(href); + if (!isTrusted && !internalLink && typeof href === 'string') { + event.preventDefault(); + const intercepted = await interceptExternalUrl(href); + if (intercepted) return; + + const confirmed = await ConfirmLeavingModalRef.openAndWaitForClose(href); + if (confirmed) { + if (fireflyBridgeProvider.supported) { + const url = !props.href.startsWith('https') + ? urlcat(window.location.origin, props.href) + : props.href; + if (!IS_ANDROID) { + event.preventDefault(); + await fireflyBridgeProvider.request(SupportedMethod.OPEN_URL, { + url, + }); + } + } else { + openWindow(props.href); } - } else { - props.onClick?.(event); } - }} - > + return; + } + props.onClick?.(event); + }, + [props, href, internalLink], + ); + + return ( + {children} - + ); }); diff --git a/src/components/Activity/hooks/useActivityCurrentAccountHandle.ts b/src/components/Activity/hooks/useActivityCurrentAccountHandle.ts index 1f2c6db5f8..87df0776ab 100644 --- a/src/components/Activity/hooks/useActivityCurrentAccountHandle.ts +++ b/src/components/Activity/hooks/useActivityCurrentAccountHandle.ts @@ -11,7 +11,7 @@ export function useActivityCurrentAccountHandle(source: SocialSource) { case Source.Twitter: return data?.rawConnections.twitter.connected[0]?.handle; case Source.Lens: - return data?.rawConnections.lens.connected[0]?.lens?.[0].fullHandle; + return data?.rawConnections.lens.connected[0]?.lens?.[0].localName; case Source.Farcaster: return data?.rawConnections.farcaster.connected[0]?.username; default: diff --git a/src/components/Activity/hooks/useActivityPremiumList.tsx b/src/components/Activity/hooks/useActivityPremiumList.tsx deleted file mode 100644 index 046bc172f8..0000000000 --- a/src/components/Activity/hooks/useActivityPremiumList.tsx +++ /dev/null @@ -1,159 +0,0 @@ -// cSpell:disable -import { Trans } from '@lingui/react/macro'; -import { ChainId } from '@masknet/web3-shared-evm'; -import { useContext } from 'react'; - -import { ActivityContext } from '@/components/Activity/ActivityContext.js'; -import { useActivityElex24Involved } from '@/components/Activity/ActivityElex24/useActivityElex24Involved.js'; -import { useActivityClaimCondition } from '@/components/Activity/hooks/useActivityClaimCondition.js'; -import { Link } from '@/components/Activity/Link.js'; -import type { SocialSource } from '@/constants/enum.js'; -import { - LIL_PUDGY_NFT_ADDRESS, - PENGU_PINS_NFT_ADDRESS, - PUDGY_PENGUINS_NFT_ADDRESS, - TRUE_PENGU_NFT_ADDRESS, -} from '@/constants/index.js'; -import { resolveNftUrl } from '@/helpers/resolveNftUrl.js'; -import { Level } from '@/providers/types/CZ.js'; - -export function useActivityPremiumList(source: SocialSource) { - const { name } = useContext(ActivityContext); - const { data } = useActivityClaimCondition(source); - const { data: isInvolvedElex24 } = useActivityElex24Involved(); - - switch (name) { - case 'elex24': - return [ - { - label: Your X account holds Premium status, - verified: data?.x?.level === Level.Lv2, - }, - { - label: Your Farcaster account holds Power Badge, - verified: data?.farcaster.isPowerUser, - }, - { - label: ( - - - Get involved in the{' '} - - Presidential Election Winner 2024 - {' '} - on Polymarket - - - ), - verified: isInvolvedElex24, - }, - ]; - case 'hlbl': - return [ - { - label: Your X account holds Premium status, - verified: data?.x?.level === Level.Lv2, - }, - { - label: Your Farcaster account holds Power Badge, - verified: data?.farcaster.isPowerUser, - }, - { - label: Your assets on Base Chain are worth over US$10,000, - verified: data?.balance?.level === Level.Lv2, - }, - ]; - case 'frensgiving': - return [ - { - label: Your Farcaster account holds Power Badge, - verified: data?.farcaster.isPowerUser, - }, - { - label: You have been detected as a loyal Farcaster user, - verified: data?.farcaster.isSupercast || (data && parseInt(data.farcaster.fid, 10) <= 10000), - }, - ]; - case 'pengu': - return [ - { - label: ( -

    - - You are holder of{' '} - - Pudgy Penguins - {' '} - or{' '} - - Lil Pudgy - {' '} - NFTs - -

    - ), - verified: data?.nft?.ownPudgy || data?.nft?.ownLil, - }, - { - label: ( -

    - - You are holder of{' '} - - truePengu - {' '} - or{' '} - - penguPins - {' '} - Soulbound NFTs - -

    - ), - verified: data?.nft?.ownPudgy || data?.nft?.ownPenguPins, - }, - ]; - case 'trump': - return [ - { - label: Your X account holds Premium status, - verified: data?.x.valid && data?.x?.level === Level.Lv2, - }, - { - label: ( -

    - - You are holder of{' '} - - Presidential Election 2024 - {' '} - NFT and voted Trump - -

    - ), - verified: data?.nft?.valid && data?.nft?.level === Level.Lv2, - }, - ]; - default: - return []; - } -} diff --git a/src/components/Activity/hooks/useActivityShareUrl.ts b/src/components/Activity/hooks/useActivityShareUrl.ts index 75beed3050..0f6014fef4 100644 --- a/src/components/Activity/hooks/useActivityShareUrl.ts +++ b/src/components/Activity/hooks/useActivityShareUrl.ts @@ -28,6 +28,7 @@ export function useActivityShareUrl(name?: string) { frensgiving: Source.Farcaster, pengu: Source.Twitter, trump: Source.Twitter, + buttrfly: Source.Lens, } as Record )[name] : undefined) ?? Source.Twitter; diff --git a/src/components/Article/ArticleCollect.tsx b/src/components/Article/ArticleCollect.tsx index fb72c479c6..9ea5d487c1 100644 --- a/src/components/Article/ArticleCollect.tsx +++ b/src/components/Article/ArticleCollect.tsx @@ -1,9 +1,10 @@ import { t } from '@lingui/core/macro'; import { Trans } from '@lingui/react/macro'; import { produce } from 'immer'; -import { useMemo, useRef, useState } from 'react'; +import { useMemo, useState } from 'react'; import { useAsyncFn } from 'react-use'; import { useAccount, useChains } from 'wagmi'; +import { sendTransaction } from 'wagmi/actions'; import CollectFillIcon from '@/assets/collect-fill.svg'; import LinkIcon from '@/assets/link-square.svg'; @@ -11,19 +12,21 @@ import { Avatar } from '@/components/Avatar.js'; import { ChainGuardButton } from '@/components/ChainGuardButton.js'; import { LoadingIcon } from '@/components/LoadingIcon.js'; import { queryClient } from '@/configs/queryClient.js'; +import { config } from '@/configs/wagmiClient.js'; import { MintStatus } from '@/constants/enum.js'; import { classNames } from '@/helpers/classNames.js'; import { enqueueMessageFromError, enqueueSuccessMessage, enqueueWarningMessage } from '@/helpers/enqueueMessage.js'; import { formatEthereumAddress } from '@/helpers/formatAddress.js'; import { nFormatter } from '@/helpers/formatCommentCounts.js'; +import { isZero } from '@/helpers/number.js'; import { openWindow } from '@/helpers/openWindow.js'; import { resolveArticleCollectProvider } from '@/helpers/resolveArticleCollectProvider.js'; import { resolveExplorerLink } from '@/helpers/resolveExplorerLink.js'; -import { useArticleCollectable, useArticleCollectStatus } from '@/hooks/useArticleCollectable.js'; +import { useArticleCollectStatus } from '@/hooks/useArticleCollectable.js'; import { MintParamsPanel } from '@/modals/FreeMintModal/MintParamsPanel.js'; import { FireflyEndpointProvider } from '@/providers/firefly/Endpoint.js'; import { captureCollectArticleEvent } from '@/providers/telemetry/captureMintEvent.js'; -import { type Article, ArticlePlatform } from '@/providers/types/Article.js'; +import { type Article } from '@/providers/types/Article.js'; export interface ArticleCollectProps { article: Article; @@ -35,14 +38,9 @@ export function ArticleCollect({ article }: ArticleCollectProps) { const platform = article.platform; - const queryKey = ['article', platform, article.id, article.origin, account.address]; - const queryKeyRef = useRef(queryKey); - queryKeyRef.current = queryKey; + const { data, isLoading: paramsLoading, isRefetching } = useArticleCollectStatus(article); + const { data: collectParams, insufficientBalance } = data ?? {}; - const { data: result, isLoading: queryDetailLoading } = useArticleCollectable(article, queryKey); - const { data: collectParams, isLoading: paramsLoading, isRefetching } = useArticleCollectStatus(article); - - const { data, insufficientBalance } = result ?? {}; const canCollect = [MintStatus.Mintable, MintStatus.MintAgain].includes( collectParams?.mintStatus || MintStatus.NotSupported, ); @@ -52,7 +50,7 @@ export function ArticleCollect({ article }: ArticleCollectProps) { const [modalSessionCollected, setModalSessionCollected] = useState(false); const [txUrl, setTxUrl] = useState(); const [{ loading: collectLoading }, handleCollect] = useAsyncFn(async () => { - if (!data || !platform) return; + if (!collectParams || !platform) return; const provider = resolveArticleCollectProvider(platform); if (!provider) return; @@ -85,46 +83,57 @@ export function ArticleCollect({ article }: ArticleCollectProps) { } } if (!isFree || !hasBalance) { - const confirmation = await provider.collect(data); + const confirmation = await sendTransaction(config, { + to: collectParams.txData.to as `0x${string}`, + value: BigInt(collectParams.txData.value), + data: collectParams.txData.inputData as `0x${string}`, + }); + if (!confirmation) return; - hash = confirmation.transactionHash; + hash = confirmation; captureCollectArticleEvent({ ...eventOptions, free_mint: false }); } - const url = resolveExplorerLink(data.chainId, hash, 'tx'); + const url = resolveExplorerLink(collectParams.chainId, hash, 'tx'); if (url) { setTxUrl(url); openWindow(url); } - queryClient.setQueryData(queryKeyRef.current, (data) => { - if (!data) return data; + queryClient.setQueryData(['article-collect-status', article.platform, article.id], (data) => { + if (!data) return; return produce(data, (draft) => { - draft.data.isCollected = true; - draft.data.soldCount += 1; + draft.data.mintCount += 1; + draft.data.mintStatus = MintStatus.Minted; }); }); + queryClient.refetchQueries({ + queryKey: ['article-collect-status', article.platform, article.id], + }); + enqueueSuccessMessage(t`Article collected successfully!`); } catch (error) { setModalSessionCollected(false); enqueueMessageFromError(error, t`Failed to collect article.`); throw error; } - }, [account.address, data, platform, isFree, article.id]); + }, [collectParams, platform, account.address, article.id, article.platform, isFree]); - const chain = chains.find((x) => x.id === data?.chainId); + const chain = chains.find((x) => x.id === collectParams?.chainId); const nativeSymbol = chain?.nativeCurrency.symbol.toUpperCase() || ''; - const isSoldOut = !!data?.quantity && data.soldCount >= data.quantity; + const isSoldOut = collectParams?.mintStatus === MintStatus.SoldOut; + const isCollected = + collectParams?.mintStatus === MintStatus.Minted || collectParams?.mintStatus === MintStatus.MintAgain; const buttonText = useMemo(() => { if (isSoldOut) return t`Sold Out`; - if ((data?.isCollected && platform !== ArticlePlatform.Paragraph) || modalSessionCollected) return t`Collected`; + if (isCollected) return t`Collected`; if (isFree) return t`Collect`; - if (insufficientBalance) return t`Insufficient Balance`; - if (!data?.price) return t`Collect`; - return t`Collect for ${data.price} ${nativeSymbol}`; - }, [data, nativeSymbol, isSoldOut, insufficientBalance, platform, modalSessionCollected, isFree]); + if (insufficientBalance && !isFree) return t`Insufficient Balance`; + if (!collectParams?.mintPrice || isZero(collectParams.mintPrice)) return t`Collect`; + return t`Collect for ${collectParams.mintPrice} ${nativeSymbol}`; + }, [nativeSymbol, collectParams?.mintPrice, insufficientBalance, isFree, isSoldOut, isCollected]); - if (!queryDetailLoading && !data) { + if (!paramsLoading && !collectParams) { return (
    @@ -134,7 +143,7 @@ export function ArticleCollect({ article }: ArticleCollectProps) { ); } - if (queryDetailLoading) { + if (paramsLoading) { return (
    @@ -142,10 +151,9 @@ export function ArticleCollect({ article }: ArticleCollectProps) { ); } - const loading = collectLoading || queryDetailLoading || paramsLoading || isRefetching; + const loading = collectLoading || paramsLoading || isRefetching; const disabled = isSoldOut || (account.isConnected && insufficientBalance && !isFree) || modalSessionCollected || loading; - const panelData = canCollect ? collectParams : result?.mintMetadata; return (
    @@ -157,9 +165,7 @@ export function ArticleCollect({ article }: ArticleCollectProps) { {article.author.handle ?? formatEthereumAddress(article.author.id, 4)} - {data?.isCollected ? ( - - ) : null} + {isCollected ? : null}
    ) : null}
    @@ -167,10 +173,7 @@ export function ArticleCollect({ article }: ArticleCollectProps) { Collected - - {nFormatter(data?.soldCount || 0)} - {data?.quantity ? `/${nFormatter(data.quantity)}` : null} - + {nFormatter(collectParams?.mintCount || 0)}
    @@ -181,19 +184,19 @@ export function ArticleCollect({ article }: ArticleCollectProps) {
    - {panelData ? ( + {collectParams ? ( Collect Price} /> ) : null} Address Owned {totalQuantity ? ( - - %Of supply owned + + %Owned ) : null} diff --git a/src/components/Image.tsx b/src/components/Image.tsx index 7b5d3ff877..c788f6f4dd 100644 --- a/src/components/Image.tsx +++ b/src/components/Image.tsx @@ -56,7 +56,7 @@ export const Image = forwardRef(function Image( // eslint-disable-next-line @next/next/no-img-element { - return typeof host === 'string' ? host === parsed.host : host.test(parsed.host); - }) - : true; -} - export const Link: LinkComponent = forwardRef(function Link({ href, onClick, ...rest }, ref) { - const { data: internalLink } = useQuery({ - queryKey: ['link-transform', href], - enabled: typeof href === 'string' && href.startsWith('http'), - staleTime: Infinity, - queryFn: async () => { - try { - if (typeof href !== 'string' || !href.startsWith('http')) return ''; - return formatExternalLink(href); - } catch { - return ''; - } - }, - }); + const { data: internalLink } = useInternalLink(href); const onLinkClick = useCallback( async (event: React.MouseEvent) => { diff --git a/src/components/LinkCloud.tsx b/src/components/LinkCloud.tsx index d62cad24ee..42f34f00e1 100644 --- a/src/components/LinkCloud.tsx +++ b/src/components/LinkCloud.tsx @@ -34,7 +34,7 @@ export function LinkCloud() { return (
    {isEmpty || isClaimed || isExpired ? ( { RedPacketModalRef.open({ initialPath: urlcat('/detail', { diff --git a/src/helpers/isTrustedUrl.ts b/src/helpers/isTrustedUrl.ts new file mode 100644 index 0000000000..0eee3e42d6 --- /dev/null +++ b/src/helpers/isTrustedUrl.ts @@ -0,0 +1,25 @@ +import type { LinkProps } from 'next/link.js'; + +import { parseUrl } from '@/helpers/parseUrl.js'; + +const trustedHosts = [ + 'mask.io', + 'mask.notion.site', + 'localhost', + /^([a-zA-Z0-9-]+\.)*firefly\.land$/, + /^([a-zA-Z0-9-]+\.)*firefly\.social$/, + /^([a-zA-Z0-9-]+\.)*mask\.social$/, +]; + +export function isTrustedUrl(href: LinkProps['href']) { + if (typeof href !== 'string' || !href.startsWith('http')) { + return true; + } + + const parsed = parseUrl(href); + return parsed + ? trustedHosts.some((host) => { + return typeof host === 'string' ? host === parsed.host : host.test(parsed.host); + }) + : true; +} diff --git a/src/hooks/useArticleCollectable.ts b/src/hooks/useArticleCollectable.ts index 3faf0a3943..53a9ccf870 100644 --- a/src/hooks/useArticleCollectable.ts +++ b/src/hooks/useArticleCollectable.ts @@ -3,110 +3,51 @@ import { useAccount } from 'wagmi'; import { estimateFeesPerGas, getBalance } from 'wagmi/actions'; import { config } from '@/configs/wagmiClient.js'; -import { MintStatus } from '@/constants/enum.js'; -import { getArticleDigest } from '@/helpers/getArticleDigest.js'; -import { multipliedBy, rightShift, ZERO } from '@/helpers/number.js'; -import { resolveArticleCollectProvider } from '@/helpers/resolveArticleCollectProvider.js'; +import { isGreaterThan, multipliedBy, plus, ZERO } from '@/helpers/number.js'; import { EVMChainResolver } from '@/mask/index.js'; import { FireflyEndpointProvider } from '@/providers/firefly/Endpoint.js'; import { type Article } from '@/providers/types/Article.js'; -import type { MintMetadata } from '@/providers/types/Firefly.js'; -function createDefaultMintData(mintPrice: string, platformFee: string, chainId: number): MintMetadata { - return { - mintStatus: MintStatus.MintAgain, - mintPrice, - platformFee, - txData: { - gasLimit: '', - inputData: '', - to: '', - value: '', - }, - mintCount: 1, - perLimitCount: 1, - chainId, - gasStatus: false, - tokenPrice: '', - nativePrice: 0, - }; -} - -export function useArticleCollectable(article: Article, queryKey: Array) { +export function useArticleCollectStatus(article: Article) { const account = useAccount(); return useQuery({ - queryKey, + queryKey: ['article-collect-status', article.platform, article.id], queryFn: async () => { - const digest = getArticleDigest(article); - if (!digest) return null; - const provider = resolveArticleCollectProvider(article.platform); - if (!provider) return null; - - const data = await provider.getArticleCollectableByDigest(digest); + try { + if (!account.address) return; + const data = await FireflyEndpointProvider.getArticleCollectStatus( + article.id, + account.address, + article.platform, + ); - if (!account.address) - return { - data, - insufficientBalance: true, - }; + const balance = await getBalance(config, { + address: account.address, + chainId: data.chainId, + }); - try { const isEIP1559 = EVMChainResolver.isFeatureSupported(data.chainId, 'EIP1559'); const { gasPrice, maxFeePerGas } = await estimateFeesPerGas(config, { chainId: data.chainId, type: isEIP1559 ? 'eip1559' : 'legacy', }); - const gasLimit = await provider.estimateCollectGas(data); - - const balance = await getBalance(config, { - address: account.address, - chainId: data.chainId, - }); + const gasFeePrice = isEIP1559 ? maxFeePerGas : gasPrice; + const gasFee = multipliedBy((gasFeePrice ?? ZERO).toString(), data.txData.gasLimit); - const gasFee = isEIP1559 - ? !maxFeePerGas - ? ZERO - : multipliedBy(maxFeePerGas.toString(), gasLimit.toString()) - : !gasPrice - ? ZERO - : multipliedBy(gasPrice.toString(), gasLimit.toString()); - const price = data.price ? BigInt(rightShift(data.price, 18).toString()) : 0n; + const price = data.mintPrice ? data.mintPrice : ZERO; - const cost = price + data.fee + BigInt(gasFee.toString()); + const cost = plus(price, gasFee); return { data, - isFree: true, + isFree: data.gasStatus, gasFee: gasFee.toString(), totalCost: cost.toString(), - mintMetadata: createDefaultMintData(price.toString(), data.fee.toString() || '0', data.chainId), - insufficientBalance: cost > balance.value, - }; - } catch { - return { - data, - isFree: true, - gasFee: '', - totalCost: '', - mintMetadata: createDefaultMintData('', '', data.chainId), - insufficientBalance: true, + mintMetadata: data, + insufficientBalance: isGreaterThan(cost, balance.value.toString()), }; - } - }, - }); -} - -export function useArticleCollectStatus(article: Article) { - const account = useAccount(); - - return useQuery({ - queryKey: ['article-collect-status', article.platform, article.id], - queryFn: async () => { - try { - if (!account.address) return; - return FireflyEndpointProvider.getArticleCollectStatus(article.id, account.address, article.platform); } catch { return; } diff --git a/src/hooks/useInternalLink.ts b/src/hooks/useInternalLink.ts new file mode 100644 index 0000000000..9df5201725 --- /dev/null +++ b/src/hooks/useInternalLink.ts @@ -0,0 +1,20 @@ +import { useQuery } from '@tanstack/react-query'; +import type { UrlObject } from 'url'; + +import { formatExternalLink } from '@/helpers/formatExternalLink.js'; + +export function useInternalLink(href: string | UrlObject) { + return useQuery({ + queryKey: ['link-transform', href], + enabled: typeof href === 'string' && href.startsWith('http'), + staleTime: Infinity, + queryFn: async () => { + try { + if (typeof href !== 'string' || !href.startsWith('http')) return ''; + return formatExternalLink(href); + } catch { + return ''; + } + }, + }); +} diff --git a/src/hooks/useMirror.ts b/src/hooks/useMirror.ts index 9d5d43793a..4fcfc26781 100644 --- a/src/hooks/useMirror.ts +++ b/src/hooks/useMirror.ts @@ -33,7 +33,7 @@ export function useMirror(post: Post) { const result = await (unmirror ? LensSocialMediaProvider.unmirrorPost(post.publicationId) : LensSocialMediaProvider.mirrorPost(postId)); - enqueueSuccessMessage(unmirror ? t`Cancel mirror successfully` : t`Mirrored`); + enqueueSuccessMessage(unmirror ? t`Cancel repost successfully` : t`Reposted`); return result; } case Source.Twitter: @@ -58,7 +58,7 @@ export function useMirror(post: Post) { enqueueMessageFromError(error, t`Failed to recast.`); break; case Source.Lens: - enqueueMessageFromError(error, t`Failed to mirror.`); + enqueueMessageFromError(error, t`Failed to repost.`); break; case Source.Twitter: enqueueMessageFromError(error, t`Failed to repost.`); diff --git a/src/locales/en/messages.po b/src/locales/en/messages.po index acf6fcbae4..05c19507b4 100644 --- a/src/locales/en/messages.po +++ b/src/locales/en/messages.po @@ -56,9 +56,6 @@ msgstr "Disconnect" msgid "No frame found." msgstr "No frame found." -msgid "Undo mirror" -msgstr "Undo mirror" - msgid "FAILED THREAD POST" msgstr "FAILED THREAD POST" @@ -74,6 +71,10 @@ msgstr "New connect with Warpcast" msgid "You have been detected as a loyal Farcaster user" msgstr "You have been detected as a loyal Farcaster user" +#. placeholder {0}: notification.quote.quoteOn.type +msgid "<0/> quoted your <1>{0, select, Post {post} Comment {comment} Quote {quote} Mirror {repost} other {post}}" +msgstr "<0/> quoted your <1>{0, select, Post {post} Comment {comment} Quote {quote} Mirror {repost} other {post}}" + msgid "Edit Image" msgstr "Edit Image" @@ -144,6 +145,9 @@ msgstr "Communities" msgid "Discover" msgstr "Discover" +msgid "{shares, plural, one {Repost or Quote} other {Reposts or Quotes}}" +msgstr "{shares, plural, one {Repost or Quote} other {Reposts or Quotes}}" + msgid "Ask a question" msgstr "Ask a question" @@ -442,11 +446,6 @@ msgstr "Profile Switched" msgid "Adding..." msgstr "Adding..." -#. placeholder {0}: notification.reactors.length -#. placeholder {1}: notification.post.type -msgid "{0, plural, offset:1 =1 {<0/>} =2 {<1/> and <2/>} other {<3/>}} <4>liked your <5>{1, select, Post {post} Comment {comment} Quote {quote} Mirror {mirror} other {post}}" -msgstr "{0, plural, offset:1 =1 {<0/>} =2 {<1/> and <2/>} other {<3/>}} <4>liked your <5>{1, select, Post {post} Comment {comment} Quote {quote} Mirror {mirror} other {post}}" - msgid "Donald Trump" msgstr "Donald Trump" @@ -477,6 +476,10 @@ msgstr "Profile not found" msgid "NFT Standard" msgstr "NFT Standard" +#. placeholder {0}: first(post.mirrors)?.displayName +msgid "<0>{0} reposted" +msgstr "<0>{0} reposted" + #. placeholder {0}: formatSnapshotChoice(selectedChoices, type, choices) #. placeholder {1}: snapshot.title msgid "🙌  Just voted “{0}” on “{1}”" @@ -551,18 +554,15 @@ msgstr "Show less" msgid "Follow <0>@{handle} on {0}" msgstr "Follow <0>@{handle} on {0}" +msgid "Undo repost" +msgstr "Undo repost" + msgid "Proxy contract." msgstr "Proxy contract." msgid "Verification unsuccessful" msgstr "Verification unsuccessful" -#. placeholder {0}: mirrors.length -#. placeholder {1}: notification.source -#. placeholder {2}: notification.post.type -msgid "{0, plural, offset:1 =1 {<0/>} =2 {<1/> and <2/>} other {<3/>}} {1, select, Lens {mirrored your} Farcaster {recasted your} other {mirrored your}} <4>{2, select, Post {post} Comment {comment} Quote {quote} Mirror {mirror} other {post}}" -msgstr "{0, plural, offset:1 =1 {<0/>} =2 {<1/> and <2/>} other {<3/>}} {1, select, Lens {mirrored your} Farcaster {recasted your} other {mirrored your}} <4>{2, select, Post {post} Comment {comment} Quote {quote} Mirror {mirror} other {post}}" - msgid "Total" msgstr "Total" @@ -575,10 +575,6 @@ msgstr "Trading cooldown function." msgid "Event Ended!" msgstr "Event Ended!" -#. placeholder {0}: post.reporter.displayName -msgid "<0>{0}<1>mirrored" -msgstr "<0>{0}<1>mirrored" - msgid "True Token" msgstr "True Token" @@ -704,10 +700,6 @@ msgstr "Liked" msgid "Token ID" msgstr "Token ID" -#. placeholder {0}: post.stats.mirrors -msgid "{0, plural, one {mirror} other {mirrors}}" -msgstr "{0, plural, one {mirror} other {mirrors}}" - msgid "Type something here..." msgstr "Type something here..." @@ -857,9 +849,6 @@ msgstr "POST" msgid "Failed to unlike the post." msgstr "Failed to unlike the post." -msgid "Mirror again" -msgstr "Mirror again" - msgid "There are images or videos that were not uploaded successfully." msgstr "There are images or videos that were not uploaded successfully." @@ -1077,6 +1066,9 @@ msgstr "Failed to avatar." msgid "Frame Validator" msgstr "Frame Validator" +msgid "Repost again" +msgstr "Repost again" + msgid "Priority Access: Holders get early access to future projects, beta tests, and airdrops. And they will also have a first look at the latest features and content." msgstr "Priority Access: Holders get early access to future projects, beta tests, and airdrops. And they will also have a first look at the latest features and content." @@ -1102,9 +1094,6 @@ msgstr "There is no data available to display" msgid "Follow System" msgstr "Follow System" -msgid "Failed to mirror." -msgstr "Failed to mirror." - msgid "The contract owner has restrictions on buying." msgstr "The contract owner has restrictions on buying." @@ -1158,6 +1147,14 @@ msgstr "Darkweb transactions." msgid "Anti_whale(Limited number of transactions)" msgstr "Anti_whale(Limited number of transactions)" +#. placeholder {0}: notification.reactors.length +#. placeholder {1}: notification.post.type +msgid "{0, plural, offset:1 =1 {<0/>} =2 {<1/> and <2/>} other {<3/>}} <4>liked your <5>{1, select, Post {post} Comment {comment} Quote {quote} Mirror {repost} other {post}}" +msgstr "{0, plural, offset:1 =1 {<0/>} =2 {<1/> and <2/>} other {<3/>}} <4>liked your <5>{1, select, Post {post} Comment {comment} Quote {quote} Mirror {repost} other {post}}" + +msgid "reposted" +msgstr "reposted" + #. placeholder {0}: handle || recipient.displayName msgid "Send a tip to {0}" msgstr "Send a tip to {0}" @@ -1295,10 +1292,6 @@ msgstr "<0>Acquired<1/><2>from<3><4>{0}" msgid "Submit a wallet to receive NFT and $ANON" msgstr "Submit a wallet to receive NFT and $ANON" -#. placeholder {0}: notification.post.type -msgid "<0/> mentioned you in a <1>{0, select, Post {post} Comment {comment} Quote {quote} Mirror {mirror} other {post}}" -msgstr "<0/> mentioned you in a <1>{0, select, Post {post} Comment {comment} Quote {quote} Mirror {mirror} other {post}}" - msgid "<0>Bought<1/>" msgstr "<0>Bought<1/>" @@ -1336,9 +1329,6 @@ msgstr "Lucky Drop" msgid "Reply" msgstr "Reply" -msgid "Mirror or Quote" -msgstr "Mirror or Quote" - msgid "Add an existing account" msgstr "Add an existing account" @@ -1412,9 +1402,6 @@ msgstr "View detail" msgid "Try again" msgstr "Try again" -msgid "<0>You mirrored" -msgstr "<0>You mirrored" - msgid "Failed to create image payload." msgstr "Failed to create image payload." @@ -1674,6 +1661,15 @@ msgstr "Muted wallets" msgid "All wallets and accounts are muted." msgstr "All wallets and accounts are muted." +msgid "" +"Just earned $MASK by minting the Buttrfly Fren 🦋 collectible from {fireflyMention} \n" +"\n" +"Claim here {shareUrl}" +msgstr "" +"Just earned $MASK by minting the Buttrfly Fren 🦋 collectible from {fireflyMention} \n" +"\n" +"Claim here {shareUrl}" + msgid "Disconnected from your social graph" msgstr "Disconnected from your social graph" @@ -1818,6 +1814,10 @@ msgstr "Confirm you want to mute @{0}?" msgid "Compose" msgstr "Compose" +#. placeholder {0}: notification.post.type +msgid "<0/> mentioned you in a <1>{0, select, Post {post} Comment {comment} Quote {quote} Mirror {repost} other {post}}" +msgstr "<0/> mentioned you in a <1>{0, select, Post {post} Comment {comment} Quote {quote} Mirror {repost} other {post}}" + #. placeholder {0}: first(post.reactions)?.displayName msgid "<0>{0} liked" msgstr "<0>{0} liked" @@ -1883,6 +1883,11 @@ msgstr "Clear All" msgid "There are videos that were not uploaded successfully." msgstr "There are videos that were not uploaded successfully." +#. placeholder {0}: notification.actions.length +#. placeholder {1}: notification.post.type +msgid "{0, plural, offset:1 =1 {<0/>} =2 {<1/> and <2/>} other {<3/>}} <4>collected your <5>{1, select, Post {post} Comment {comment} Quote {quote} Mirror {repost} other {post}}" +msgstr "{0, plural, offset:1 =1 {<0/>} =2 {<1/> and <2/>} other {<3/>}} <4>collected your <5>{1, select, Post {post} Comment {comment} Quote {quote} Mirror {repost} other {post}}" + msgid "NFT contract cant restrict the approval, resulting in NFT can not be traded on the NFT DEX." msgstr "NFT contract cant restrict the approval, resulting in NFT can not be traded on the NFT DEX." @@ -1950,6 +1955,10 @@ msgstr "Tag {0} in a post to let them know you’ve sent an onchain tip to their msgid "{0}<0> Items" msgstr "{0}<0> Items" +#. placeholder {0}: notification.comment.commentOn.type +msgid "<0/> commented on your <1>{0, select, Post {post} Comment {comment} Quote {quote} Mirror {repost} other {post}}" +msgstr "<0/> commented on your <1>{0, select, Post {post} Comment {comment} Quote {quote} Mirror {repost} other {post}}" + msgid "liked" msgstr "liked" @@ -1962,8 +1971,8 @@ msgstr "Describe a bug or suggest an improvement" msgid "Cryptocurrency mixer." msgstr "Cryptocurrency mixer." -msgid "{shares, plural, one {Mirror or Quote} other {Mirrors or Quotes}}" -msgstr "{shares, plural, one {Mirror or Quote} other {Mirrors or Quotes}}" +msgid "Submit a wallet to receive a collectible and $MASK airdrop" +msgstr "Submit a wallet to receive a collectible and $MASK airdrop" msgid "Standard" msgstr "Standard" @@ -2248,6 +2257,9 @@ msgstr "This can’t be undone and you’ll lose your draft." msgid "Article removed from your Bookmarks" msgstr "Article removed from your Bookmarks" +msgid "Posted to Lens on Buttrfly since August 1, 2024" +msgstr "Posted to Lens on Buttrfly since August 1, 2024" + msgid "Powered by Tenderly and GoPlus" msgstr "Powered by Tenderly and GoPlus" @@ -2348,9 +2360,6 @@ msgstr "GIFs" msgid "Loading..." msgstr "Loading..." -msgid "%Of supply owned" -msgstr "%Of supply owned" - msgid "Approve" msgstr "Approve" @@ -2417,6 +2426,9 @@ msgstr "Random Split" msgid "Remove Poll" msgstr "Remove Poll" +msgid "Top 500 Buttrfly Points Leaderboard" +msgstr "Top 500 Buttrfly Points Leaderboard" + msgid "Minutes" msgstr "Minutes" @@ -2644,9 +2656,6 @@ msgstr "Failed to repost." msgid "Sorry, today's free collect quota has been reached." msgstr "Sorry, today's free collect quota has been reached." -msgid "Mirrored" -msgstr "Mirrored" - msgid "Muted contents" msgstr "Muted contents" @@ -2696,11 +2705,6 @@ msgstr "The user rejected the request." msgid "{0}{1}<0> Floor" msgstr "{0}{1}<0> Floor" -#. placeholder {0}: notification.actions.length -#. placeholder {1}: notification.post.type -msgid "{0, plural, offset:1 =1 {<0/>} =2 {<1/> and <2/>} other {<3/>}} <4>collected your <5>{1, select, Post {post} Comment {comment} Quote {quote} Mirror {mirror} other {post}}" -msgstr "{0, plural, offset:1 =1 {<0/>} =2 {<1/> and <2/>} other {<3/>}} <4>collected your <5>{1, select, Post {post} Comment {comment} Quote {quote} Mirror {mirror} other {post}}" - msgid "Claimed lucky drop successfully" msgstr "Claimed lucky drop successfully" @@ -2800,10 +2804,6 @@ msgstr "Powered by" msgid "So sorry, we are not able to mint this NFT at the moment." msgstr "So sorry, we are not able to mint this NFT at the moment." -#. placeholder {0}: first(post.mirrors)?.displayName -msgid "<0>{0} mirrored" -msgstr "<0>{0} mirrored" - msgid "All notifications" msgstr "All notifications" @@ -2984,6 +2984,12 @@ msgstr "Estimated network fee" msgid "Sorry, we are not able to find this collection" msgstr "Sorry, we are not able to find this collection" +#. placeholder {0}: mirrors.length +#. placeholder {1}: notification.source +#. placeholder {2}: notification.post.type +msgid "{0, plural, offset:1 =1 {<0/>} =2 {<1/> and <2/>} other {<3/>}} {1, select, Lens {reposted your} Farcaster {recasted your} other {reposted your}} <4>{2, select, Post {post} Comment {comment} Quote {quote} Mirror {repost} other {post}}" +msgstr "{0, plural, offset:1 =1 {<0/>} =2 {<1/> and <2/>} other {<3/>}} {1, select, Lens {reposted your} Farcaster {recasted your} other {reposted your}} <4>{2, select, Post {post} Comment {comment} Quote {quote} Mirror {repost} other {post}}" + msgid "View transaction on explorer" msgstr "View transaction on explorer" @@ -3239,7 +3245,7 @@ msgstr "Mint Again" msgid "Repost" msgstr "Repost" -#. placeholder {0}: data.price +#. placeholder {0}: collectParams.mintPrice msgid "Collect for {0} {nativeSymbol}" msgstr "Collect for {0} {nativeSymbol}" @@ -3294,6 +3300,9 @@ msgstr "Passed" msgid "1y" msgstr "1y" +msgid "Unlock a premium collectible and a larger $MASK airdrop " +msgstr "Unlock a premium collectible and a larger $MASK airdrop " + msgid "Something went wrong" msgstr "Something went wrong" @@ -3341,7 +3350,7 @@ msgstr "Article added to your Bookmarks" msgid "Create a Post" msgstr "Create a Post" -#. placeholder {0}: source === Source.Lens ? t`Mirrors` : t`Recasts` +#. placeholder {0}: source === Source.Lens ? t`Reposts` : t`Recasts` msgid "{type, select, comment {Comments} mirror {{0}} reaction {Likes} act {Collects} other {Other}}" msgstr "{type, select, comment {Comments} mirror {{0}} reaction {Likes} act {Collects} other {Other}}" @@ -3389,10 +3398,6 @@ msgstr "All chains" msgid "Display Name should not exceed {maxDisplayNameSize} characters" msgstr "Display Name should not exceed {maxDisplayNameSize} characters" -#. placeholder {0}: notification.quote.quoteOn.type -msgid "<0/> quoted your <1>{0, select, Post {post} Comment {comment} Quote {quote} Mirror {mirror} other {post}}" -msgstr "<0/> quoted your <1>{0, select, Post {post} Comment {comment} Quote {quote} Mirror {mirror} other {post}}" - msgid "Failed to send tip." msgstr "Failed to send tip." @@ -3452,6 +3457,9 @@ msgstr "Proposal" msgid "News" msgstr "News" +msgid "Repost or Quote" +msgstr "Repost or Quote" + msgid "NFT ID" msgstr "NFT ID" @@ -3476,6 +3484,9 @@ msgstr "Failed to upload. Video length exceeds {minDuration}s ~ {maxDuration}s" msgid "Post collected successfully!" msgstr "Post collected successfully!" +msgid "Reposts" +msgstr "Reposts" + #. placeholder {0}: resolveSourceName(x) msgid "Your post have published successfully on {0}." msgstr "Your post have published successfully on {0}." @@ -3498,9 +3509,6 @@ msgstr "Preview" msgid "You are holder of <0>Presidential Election 2024 NFT and voted Trump" msgstr "You are holder of <0>Presidential Election 2024 NFT and voted Trump" -msgid "Cancel mirror successfully" -msgstr "Cancel mirror successfully" - msgid "Cannot continue due to wallet mismatch." msgstr "Cannot continue due to wallet mismatch." @@ -3628,9 +3636,8 @@ msgstr "Events" msgid "{0} Users" msgstr "{0} Users" -#. placeholder {0}: notification.comment.commentOn.type -msgid "<0/> commented on your <1>{0, select, Post {post} Comment {comment} Quote {quote} Mirror {mirror} other {post}}" -msgstr "<0/> commented on your <1>{0, select, Post {post} Comment {comment} Quote {quote} Mirror {mirror} other {post}}" +msgid "%Owned" +msgstr "%Owned" msgid "Final results" msgstr "Final results" @@ -3706,9 +3713,6 @@ msgstr "Swap" msgid "Collect" msgstr "Collect" -msgid "Mirrors" -msgstr "Mirrors" - msgid "Video" msgstr "Video" @@ -3920,9 +3924,6 @@ msgstr "Post" msgid "Creator:" msgstr "Creator:" -msgid "mirrored" -msgstr "mirrored" - msgid "Following" msgstr "Following" @@ -3932,6 +3933,9 @@ msgstr "Your X account holds Premium status" msgid "Create a post to tell everyone about your participation. Votes can be changed while the proposal is active." msgstr "Create a post to tell everyone about your participation. Votes can be changed while the proposal is active." +msgid "For any inquiries, please <0>contact us. All rights reserved by Firefly." +msgstr "For any inquiries, please <0>contact us. All rights reserved by Firefly." + msgid "Hours" msgstr "Hours" diff --git a/src/locales/ja/messages.po b/src/locales/ja/messages.po index c56bcf647d..f1a5a80172 100644 --- a/src/locales/ja/messages.po +++ b/src/locales/ja/messages.po @@ -61,9 +61,6 @@ msgstr "" msgid "No frame found." msgstr "" -msgid "Undo mirror" -msgstr "" - msgid "FAILED THREAD POST" msgstr "" @@ -79,6 +76,10 @@ msgstr "" msgid "You have been detected as a loyal Farcaster user" msgstr "" +#. placeholder {0}: notification.quote.quoteOn.type +msgid "<0/> quoted your <1>{0, select, Post {post} Comment {comment} Quote {quote} Mirror {repost} other {post}}" +msgstr "" + msgid "Edit Image" msgstr "" @@ -149,6 +150,9 @@ msgstr "" msgid "Discover" msgstr "" +msgid "{shares, plural, one {Repost or Quote} other {Reposts or Quotes}}" +msgstr "" + msgid "Ask a question" msgstr "" @@ -447,11 +451,6 @@ msgstr "" msgid "Adding..." msgstr "" -#. placeholder {0}: notification.reactors.length -#. placeholder {1}: notification.post.type -msgid "{0, plural, offset:1 =1 {<0/>} =2 {<1/> and <2/>} other {<3/>}} <4>liked your <5>{1, select, Post {post} Comment {comment} Quote {quote} Mirror {mirror} other {post}}" -msgstr "" - msgid "Donald Trump" msgstr "" @@ -482,6 +481,10 @@ msgstr "" msgid "NFT Standard" msgstr "" +#. placeholder {0}: first(post.mirrors)?.displayName +msgid "<0>{0} reposted" +msgstr "" + #. placeholder {0}: formatSnapshotChoice(selectedChoices, type, choices) #. placeholder {1}: snapshot.title msgid "🙌  Just voted “{0}” on “{1}”" @@ -556,16 +559,13 @@ msgstr "" msgid "Follow <0>@{handle} on {0}" msgstr "" -msgid "Proxy contract." +msgid "Undo repost" msgstr "" -msgid "Verification unsuccessful" +msgid "Proxy contract." msgstr "" -#. placeholder {0}: mirrors.length -#. placeholder {1}: notification.source -#. placeholder {2}: notification.post.type -msgid "{0, plural, offset:1 =1 {<0/>} =2 {<1/> and <2/>} other {<3/>}} {1, select, Lens {mirrored your} Farcaster {recasted your} other {mirrored your}} <4>{2, select, Post {post} Comment {comment} Quote {quote} Mirror {mirror} other {post}}" +msgid "Verification unsuccessful" msgstr "" msgid "Total" @@ -580,10 +580,6 @@ msgstr "" msgid "Event Ended!" msgstr "" -#. placeholder {0}: post.reporter.displayName -msgid "<0>{0}<1>mirrored" -msgstr "" - msgid "True Token" msgstr "" @@ -709,10 +705,6 @@ msgstr "" msgid "Token ID" msgstr "" -#. placeholder {0}: post.stats.mirrors -msgid "{0, plural, one {mirror} other {mirrors}}" -msgstr "" - msgid "Type something here..." msgstr "" @@ -862,9 +854,6 @@ msgstr "" msgid "Failed to unlike the post." msgstr "" -msgid "Mirror again" -msgstr "" - msgid "There are images or videos that were not uploaded successfully." msgstr "" @@ -1082,6 +1071,9 @@ msgstr "" msgid "Frame Validator" msgstr "" +msgid "Repost again" +msgstr "" + msgid "Priority Access: Holders get early access to future projects, beta tests, and airdrops. And they will also have a first look at the latest features and content." msgstr "" @@ -1107,9 +1099,6 @@ msgstr "" msgid "Follow System" msgstr "" -msgid "Failed to mirror." -msgstr "" - msgid "The contract owner has restrictions on buying." msgstr "" @@ -1163,6 +1152,14 @@ msgstr "" msgid "Anti_whale(Limited number of transactions)" msgstr "" +#. placeholder {0}: notification.reactors.length +#. placeholder {1}: notification.post.type +msgid "{0, plural, offset:1 =1 {<0/>} =2 {<1/> and <2/>} other {<3/>}} <4>liked your <5>{1, select, Post {post} Comment {comment} Quote {quote} Mirror {repost} other {post}}" +msgstr "" + +msgid "reposted" +msgstr "" + #. placeholder {0}: handle || recipient.displayName msgid "Send a tip to {0}" msgstr "" @@ -1300,10 +1297,6 @@ msgstr "" msgid "Submit a wallet to receive NFT and $ANON" msgstr "" -#. placeholder {0}: notification.post.type -msgid "<0/> mentioned you in a <1>{0, select, Post {post} Comment {comment} Quote {quote} Mirror {mirror} other {post}}" -msgstr "" - msgid "<0>Bought<1/>" msgstr "" @@ -1341,9 +1334,6 @@ msgstr "" msgid "Reply" msgstr "" -msgid "Mirror or Quote" -msgstr "" - msgid "Add an existing account" msgstr "" @@ -1417,9 +1407,6 @@ msgstr "" msgid "Try again" msgstr "" -msgid "<0>You mirrored" -msgstr "" - msgid "Failed to create image payload." msgstr "" @@ -1679,6 +1666,12 @@ msgstr "" msgid "All wallets and accounts are muted." msgstr "" +msgid "" +"Just earned $MASK by minting the Buttrfly Fren 🦋 collectible from {fireflyMention} \n" +"\n" +"Claim here {shareUrl}" +msgstr "" + msgid "Disconnected from your social graph" msgstr "" @@ -1818,6 +1811,10 @@ msgstr "" msgid "Compose" msgstr "" +#. placeholder {0}: notification.post.type +msgid "<0/> mentioned you in a <1>{0, select, Post {post} Comment {comment} Quote {quote} Mirror {repost} other {post}}" +msgstr "" + #. placeholder {0}: first(post.reactions)?.displayName msgid "<0>{0} liked" msgstr "" @@ -1883,6 +1880,11 @@ msgstr "" msgid "There are videos that were not uploaded successfully." msgstr "" +#. placeholder {0}: notification.actions.length +#. placeholder {1}: notification.post.type +msgid "{0, plural, offset:1 =1 {<0/>} =2 {<1/> and <2/>} other {<3/>}} <4>collected your <5>{1, select, Post {post} Comment {comment} Quote {quote} Mirror {repost} other {post}}" +msgstr "" + msgid "NFT contract cant restrict the approval, resulting in NFT can not be traded on the NFT DEX." msgstr "" @@ -1950,6 +1952,10 @@ msgstr "" msgid "{0}<0> Items" msgstr "" +#. placeholder {0}: notification.comment.commentOn.type +msgid "<0/> commented on your <1>{0, select, Post {post} Comment {comment} Quote {quote} Mirror {repost} other {post}}" +msgstr "" + msgid "liked" msgstr "" @@ -1962,7 +1968,7 @@ msgstr "" msgid "Cryptocurrency mixer." msgstr "" -msgid "{shares, plural, one {Mirror or Quote} other {Mirrors or Quotes}}" +msgid "Submit a wallet to receive a collectible and $MASK airdrop" msgstr "" msgid "Standard" @@ -2243,6 +2249,9 @@ msgstr "" msgid "Article removed from your Bookmarks" msgstr "" +msgid "Posted to Lens on Buttrfly since August 1, 2024" +msgstr "" + msgid "Powered by Tenderly and GoPlus" msgstr "" @@ -2343,9 +2352,6 @@ msgstr "" msgid "Loading..." msgstr "" -msgid "%Of supply owned" -msgstr "" - msgid "Approve" msgstr "" @@ -2412,6 +2418,9 @@ msgstr "" msgid "Remove Poll" msgstr "" +msgid "Top 500 Buttrfly Points Leaderboard" +msgstr "" + msgid "Minutes" msgstr "" @@ -2639,9 +2648,6 @@ msgstr "" msgid "Sorry, today's free collect quota has been reached." msgstr "" -msgid "Mirrored" -msgstr "" - msgid "Muted contents" msgstr "" @@ -2691,11 +2697,6 @@ msgstr "" msgid "{0}{1}<0> Floor" msgstr "" -#. placeholder {0}: notification.actions.length -#. placeholder {1}: notification.post.type -msgid "{0, plural, offset:1 =1 {<0/>} =2 {<1/> and <2/>} other {<3/>}} <4>collected your <5>{1, select, Post {post} Comment {comment} Quote {quote} Mirror {mirror} other {post}}" -msgstr "" - msgid "Claimed lucky drop successfully" msgstr "" @@ -2795,10 +2796,6 @@ msgstr "" msgid "So sorry, we are not able to mint this NFT at the moment." msgstr "" -#. placeholder {0}: first(post.mirrors)?.displayName -msgid "<0>{0} mirrored" -msgstr "" - msgid "All notifications" msgstr "" @@ -2979,6 +2976,12 @@ msgstr "" msgid "Sorry, we are not able to find this collection" msgstr "" +#. placeholder {0}: mirrors.length +#. placeholder {1}: notification.source +#. placeholder {2}: notification.post.type +msgid "{0, plural, offset:1 =1 {<0/>} =2 {<1/> and <2/>} other {<3/>}} {1, select, Lens {reposted your} Farcaster {recasted your} other {reposted your}} <4>{2, select, Post {post} Comment {comment} Quote {quote} Mirror {repost} other {post}}" +msgstr "" + msgid "View transaction on explorer" msgstr "" @@ -3234,7 +3237,7 @@ msgstr "" msgid "Repost" msgstr "" -#. placeholder {0}: data.price +#. placeholder {0}: collectParams.mintPrice msgid "Collect for {0} {nativeSymbol}" msgstr "" @@ -3289,6 +3292,9 @@ msgstr "" msgid "1y" msgstr "" +msgid "Unlock a premium collectible and a larger $MASK airdrop " +msgstr "" + msgid "Something went wrong" msgstr "" @@ -3336,7 +3342,7 @@ msgstr "" msgid "Create a Post" msgstr "" -#. placeholder {0}: source === Source.Lens ? t`Mirrors` : t`Recasts` +#. placeholder {0}: source === Source.Lens ? t`Reposts` : t`Recasts` msgid "{type, select, comment {Comments} mirror {{0}} reaction {Likes} act {Collects} other {Other}}" msgstr "" @@ -3384,10 +3390,6 @@ msgstr "" msgid "Display Name should not exceed {maxDisplayNameSize} characters" msgstr "" -#. placeholder {0}: notification.quote.quoteOn.type -msgid "<0/> quoted your <1>{0, select, Post {post} Comment {comment} Quote {quote} Mirror {mirror} other {post}}" -msgstr "" - msgid "Failed to send tip." msgstr "" @@ -3447,6 +3449,9 @@ msgstr "" msgid "News" msgstr "" +msgid "Repost or Quote" +msgstr "" + msgid "NFT ID" msgstr "" @@ -3471,6 +3476,9 @@ msgstr "" msgid "Post collected successfully!" msgstr "" +msgid "Reposts" +msgstr "" + #. placeholder {0}: resolveSourceName(x) msgid "Your post have published successfully on {0}." msgstr "" @@ -3493,9 +3501,6 @@ msgstr "" msgid "You are holder of <0>Presidential Election 2024 NFT and voted Trump" msgstr "" -msgid "Cancel mirror successfully" -msgstr "" - msgid "Cannot continue due to wallet mismatch." msgstr "" @@ -3623,8 +3628,7 @@ msgstr "" msgid "{0} Users" msgstr "" -#. placeholder {0}: notification.comment.commentOn.type -msgid "<0/> commented on your <1>{0, select, Post {post} Comment {comment} Quote {quote} Mirror {mirror} other {post}}" +msgid "%Owned" msgstr "" msgid "Final results" @@ -3701,9 +3705,6 @@ msgstr "" msgid "Collect" msgstr "" -msgid "Mirrors" -msgstr "" - msgid "Video" msgstr "" @@ -3915,9 +3916,6 @@ msgstr "" msgid "Creator:" msgstr "" -msgid "mirrored" -msgstr "" - msgid "Following" msgstr "" @@ -3927,6 +3925,9 @@ msgstr "" msgid "Create a post to tell everyone about your participation. Votes can be changed while the proposal is active." msgstr "" +msgid "For any inquiries, please <0>contact us. All rights reserved by Firefly." +msgstr "" + msgid "Hours" msgstr "" diff --git a/src/locales/ko/messages.po b/src/locales/ko/messages.po index 71ffe853b1..84fc020e41 100644 --- a/src/locales/ko/messages.po +++ b/src/locales/ko/messages.po @@ -61,9 +61,6 @@ msgstr "" msgid "No frame found." msgstr "" -msgid "Undo mirror" -msgstr "" - msgid "FAILED THREAD POST" msgstr "" @@ -79,6 +76,10 @@ msgstr "" msgid "You have been detected as a loyal Farcaster user" msgstr "" +#. placeholder {0}: notification.quote.quoteOn.type +msgid "<0/> quoted your <1>{0, select, Post {post} Comment {comment} Quote {quote} Mirror {repost} other {post}}" +msgstr "" + msgid "Edit Image" msgstr "" @@ -149,6 +150,9 @@ msgstr "" msgid "Discover" msgstr "" +msgid "{shares, plural, one {Repost or Quote} other {Reposts or Quotes}}" +msgstr "" + msgid "Ask a question" msgstr "" @@ -447,11 +451,6 @@ msgstr "" msgid "Adding..." msgstr "" -#. placeholder {0}: notification.reactors.length -#. placeholder {1}: notification.post.type -msgid "{0, plural, offset:1 =1 {<0/>} =2 {<1/> and <2/>} other {<3/>}} <4>liked your <5>{1, select, Post {post} Comment {comment} Quote {quote} Mirror {mirror} other {post}}" -msgstr "" - msgid "Donald Trump" msgstr "" @@ -482,6 +481,10 @@ msgstr "" msgid "NFT Standard" msgstr "" +#. placeholder {0}: first(post.mirrors)?.displayName +msgid "<0>{0} reposted" +msgstr "" + #. placeholder {0}: formatSnapshotChoice(selectedChoices, type, choices) #. placeholder {1}: snapshot.title msgid "🙌  Just voted “{0}” on “{1}”" @@ -556,16 +559,13 @@ msgstr "" msgid "Follow <0>@{handle} on {0}" msgstr "" -msgid "Proxy contract." +msgid "Undo repost" msgstr "" -msgid "Verification unsuccessful" +msgid "Proxy contract." msgstr "" -#. placeholder {0}: mirrors.length -#. placeholder {1}: notification.source -#. placeholder {2}: notification.post.type -msgid "{0, plural, offset:1 =1 {<0/>} =2 {<1/> and <2/>} other {<3/>}} {1, select, Lens {mirrored your} Farcaster {recasted your} other {mirrored your}} <4>{2, select, Post {post} Comment {comment} Quote {quote} Mirror {mirror} other {post}}" +msgid "Verification unsuccessful" msgstr "" msgid "Total" @@ -580,10 +580,6 @@ msgstr "" msgid "Event Ended!" msgstr "" -#. placeholder {0}: post.reporter.displayName -msgid "<0>{0}<1>mirrored" -msgstr "" - msgid "True Token" msgstr "" @@ -709,10 +705,6 @@ msgstr "" msgid "Token ID" msgstr "" -#. placeholder {0}: post.stats.mirrors -msgid "{0, plural, one {mirror} other {mirrors}}" -msgstr "" - msgid "Type something here..." msgstr "" @@ -862,9 +854,6 @@ msgstr "" msgid "Failed to unlike the post." msgstr "" -msgid "Mirror again" -msgstr "" - msgid "There are images or videos that were not uploaded successfully." msgstr "" @@ -1082,6 +1071,9 @@ msgstr "" msgid "Frame Validator" msgstr "" +msgid "Repost again" +msgstr "" + msgid "Priority Access: Holders get early access to future projects, beta tests, and airdrops. And they will also have a first look at the latest features and content." msgstr "" @@ -1107,9 +1099,6 @@ msgstr "" msgid "Follow System" msgstr "" -msgid "Failed to mirror." -msgstr "" - msgid "The contract owner has restrictions on buying." msgstr "" @@ -1163,6 +1152,14 @@ msgstr "" msgid "Anti_whale(Limited number of transactions)" msgstr "" +#. placeholder {0}: notification.reactors.length +#. placeholder {1}: notification.post.type +msgid "{0, plural, offset:1 =1 {<0/>} =2 {<1/> and <2/>} other {<3/>}} <4>liked your <5>{1, select, Post {post} Comment {comment} Quote {quote} Mirror {repost} other {post}}" +msgstr "" + +msgid "reposted" +msgstr "" + #. placeholder {0}: handle || recipient.displayName msgid "Send a tip to {0}" msgstr "" @@ -1300,10 +1297,6 @@ msgstr "" msgid "Submit a wallet to receive NFT and $ANON" msgstr "" -#. placeholder {0}: notification.post.type -msgid "<0/> mentioned you in a <1>{0, select, Post {post} Comment {comment} Quote {quote} Mirror {mirror} other {post}}" -msgstr "" - msgid "<0>Bought<1/>" msgstr "" @@ -1341,9 +1334,6 @@ msgstr "" msgid "Reply" msgstr "" -msgid "Mirror or Quote" -msgstr "" - msgid "Add an existing account" msgstr "" @@ -1417,9 +1407,6 @@ msgstr "" msgid "Try again" msgstr "" -msgid "<0>You mirrored" -msgstr "" - msgid "Failed to create image payload." msgstr "" @@ -1679,6 +1666,12 @@ msgstr "" msgid "All wallets and accounts are muted." msgstr "" +msgid "" +"Just earned $MASK by minting the Buttrfly Fren 🦋 collectible from {fireflyMention} \n" +"\n" +"Claim here {shareUrl}" +msgstr "" + msgid "Disconnected from your social graph" msgstr "" @@ -1818,6 +1811,10 @@ msgstr "" msgid "Compose" msgstr "" +#. placeholder {0}: notification.post.type +msgid "<0/> mentioned you in a <1>{0, select, Post {post} Comment {comment} Quote {quote} Mirror {repost} other {post}}" +msgstr "" + #. placeholder {0}: first(post.reactions)?.displayName msgid "<0>{0} liked" msgstr "" @@ -1883,6 +1880,11 @@ msgstr "" msgid "There are videos that were not uploaded successfully." msgstr "" +#. placeholder {0}: notification.actions.length +#. placeholder {1}: notification.post.type +msgid "{0, plural, offset:1 =1 {<0/>} =2 {<1/> and <2/>} other {<3/>}} <4>collected your <5>{1, select, Post {post} Comment {comment} Quote {quote} Mirror {repost} other {post}}" +msgstr "" + msgid "NFT contract cant restrict the approval, resulting in NFT can not be traded on the NFT DEX." msgstr "" @@ -1950,6 +1952,10 @@ msgstr "" msgid "{0}<0> Items" msgstr "" +#. placeholder {0}: notification.comment.commentOn.type +msgid "<0/> commented on your <1>{0, select, Post {post} Comment {comment} Quote {quote} Mirror {repost} other {post}}" +msgstr "" + msgid "liked" msgstr "" @@ -1962,7 +1968,7 @@ msgstr "" msgid "Cryptocurrency mixer." msgstr "" -msgid "{shares, plural, one {Mirror or Quote} other {Mirrors or Quotes}}" +msgid "Submit a wallet to receive a collectible and $MASK airdrop" msgstr "" msgid "Standard" @@ -2243,6 +2249,9 @@ msgstr "" msgid "Article removed from your Bookmarks" msgstr "" +msgid "Posted to Lens on Buttrfly since August 1, 2024" +msgstr "" + msgid "Powered by Tenderly and GoPlus" msgstr "" @@ -2343,9 +2352,6 @@ msgstr "" msgid "Loading..." msgstr "" -msgid "%Of supply owned" -msgstr "" - msgid "Approve" msgstr "" @@ -2412,6 +2418,9 @@ msgstr "" msgid "Remove Poll" msgstr "" +msgid "Top 500 Buttrfly Points Leaderboard" +msgstr "" + msgid "Minutes" msgstr "" @@ -2639,9 +2648,6 @@ msgstr "" msgid "Sorry, today's free collect quota has been reached." msgstr "" -msgid "Mirrored" -msgstr "" - msgid "Muted contents" msgstr "" @@ -2691,11 +2697,6 @@ msgstr "" msgid "{0}{1}<0> Floor" msgstr "" -#. placeholder {0}: notification.actions.length -#. placeholder {1}: notification.post.type -msgid "{0, plural, offset:1 =1 {<0/>} =2 {<1/> and <2/>} other {<3/>}} <4>collected your <5>{1, select, Post {post} Comment {comment} Quote {quote} Mirror {mirror} other {post}}" -msgstr "" - msgid "Claimed lucky drop successfully" msgstr "" @@ -2795,10 +2796,6 @@ msgstr "" msgid "So sorry, we are not able to mint this NFT at the moment." msgstr "" -#. placeholder {0}: first(post.mirrors)?.displayName -msgid "<0>{0} mirrored" -msgstr "" - msgid "All notifications" msgstr "" @@ -2979,6 +2976,12 @@ msgstr "" msgid "Sorry, we are not able to find this collection" msgstr "" +#. placeholder {0}: mirrors.length +#. placeholder {1}: notification.source +#. placeholder {2}: notification.post.type +msgid "{0, plural, offset:1 =1 {<0/>} =2 {<1/> and <2/>} other {<3/>}} {1, select, Lens {reposted your} Farcaster {recasted your} other {reposted your}} <4>{2, select, Post {post} Comment {comment} Quote {quote} Mirror {repost} other {post}}" +msgstr "" + msgid "View transaction on explorer" msgstr "" @@ -3234,7 +3237,7 @@ msgstr "" msgid "Repost" msgstr "" -#. placeholder {0}: data.price +#. placeholder {0}: collectParams.mintPrice msgid "Collect for {0} {nativeSymbol}" msgstr "" @@ -3289,6 +3292,9 @@ msgstr "" msgid "1y" msgstr "" +msgid "Unlock a premium collectible and a larger $MASK airdrop " +msgstr "" + msgid "Something went wrong" msgstr "" @@ -3336,7 +3342,7 @@ msgstr "" msgid "Create a Post" msgstr "" -#. placeholder {0}: source === Source.Lens ? t`Mirrors` : t`Recasts` +#. placeholder {0}: source === Source.Lens ? t`Reposts` : t`Recasts` msgid "{type, select, comment {Comments} mirror {{0}} reaction {Likes} act {Collects} other {Other}}" msgstr "" @@ -3384,10 +3390,6 @@ msgstr "" msgid "Display Name should not exceed {maxDisplayNameSize} characters" msgstr "" -#. placeholder {0}: notification.quote.quoteOn.type -msgid "<0/> quoted your <1>{0, select, Post {post} Comment {comment} Quote {quote} Mirror {mirror} other {post}}" -msgstr "" - msgid "Failed to send tip." msgstr "" @@ -3447,6 +3449,9 @@ msgstr "" msgid "News" msgstr "" +msgid "Repost or Quote" +msgstr "" + msgid "NFT ID" msgstr "" @@ -3471,6 +3476,9 @@ msgstr "" msgid "Post collected successfully!" msgstr "" +msgid "Reposts" +msgstr "" + #. placeholder {0}: resolveSourceName(x) msgid "Your post have published successfully on {0}." msgstr "" @@ -3493,9 +3501,6 @@ msgstr "" msgid "You are holder of <0>Presidential Election 2024 NFT and voted Trump" msgstr "" -msgid "Cancel mirror successfully" -msgstr "" - msgid "Cannot continue due to wallet mismatch." msgstr "" @@ -3623,8 +3628,7 @@ msgstr "" msgid "{0} Users" msgstr "" -#. placeholder {0}: notification.comment.commentOn.type -msgid "<0/> commented on your <1>{0, select, Post {post} Comment {comment} Quote {quote} Mirror {mirror} other {post}}" +msgid "%Owned" msgstr "" msgid "Final results" @@ -3701,9 +3705,6 @@ msgstr "" msgid "Collect" msgstr "" -msgid "Mirrors" -msgstr "" - msgid "Video" msgstr "" @@ -3915,9 +3916,6 @@ msgstr "" msgid "Creator:" msgstr "" -msgid "mirrored" -msgstr "" - msgid "Following" msgstr "" @@ -3927,6 +3925,9 @@ msgstr "" msgid "Create a post to tell everyone about your participation. Votes can be changed while the proposal is active." msgstr "" +msgid "For any inquiries, please <0>contact us. All rights reserved by Firefly." +msgstr "" + msgid "Hours" msgstr "" diff --git a/src/locales/pseudo/messages.po b/src/locales/pseudo/messages.po index 4825176264..abd5575f06 100644 --- a/src/locales/pseudo/messages.po +++ b/src/locales/pseudo/messages.po @@ -56,9 +56,6 @@ msgstr "" msgid "No frame found." msgstr "" -msgid "Undo mirror" -msgstr "" - msgid "FAILED THREAD POST" msgstr "" @@ -74,6 +71,10 @@ msgstr "" msgid "You have been detected as a loyal Farcaster user" msgstr "" +#. placeholder {0}: notification.quote.quoteOn.type +msgid "<0/> quoted your <1>{0, select, Post {post} Comment {comment} Quote {quote} Mirror {repost} other {post}}" +msgstr "" + msgid "Edit Image" msgstr "" @@ -144,6 +145,9 @@ msgstr "" msgid "Discover" msgstr "" +msgid "{shares, plural, one {Repost or Quote} other {Reposts or Quotes}}" +msgstr "" + msgid "Ask a question" msgstr "" @@ -442,11 +446,6 @@ msgstr "" msgid "Adding..." msgstr "" -#. placeholder {0}: notification.reactors.length -#. placeholder {1}: notification.post.type -msgid "{0, plural, offset:1 =1 {<0/>} =2 {<1/> and <2/>} other {<3/>}} <4>liked your <5>{1, select, Post {post} Comment {comment} Quote {quote} Mirror {mirror} other {post}}" -msgstr "" - msgid "Donald Trump" msgstr "" @@ -477,6 +476,10 @@ msgstr "" msgid "NFT Standard" msgstr "" +#. placeholder {0}: first(post.mirrors)?.displayName +msgid "<0>{0} reposted" +msgstr "" + #. placeholder {0}: formatSnapshotChoice(selectedChoices, type, choices) #. placeholder {1}: snapshot.title msgid "🙌  Just voted “{0}” on “{1}”" @@ -551,16 +554,13 @@ msgstr "" msgid "Follow <0>@{handle} on {0}" msgstr "" -msgid "Proxy contract." +msgid "Undo repost" msgstr "" -msgid "Verification unsuccessful" +msgid "Proxy contract." msgstr "" -#. placeholder {0}: mirrors.length -#. placeholder {1}: notification.source -#. placeholder {2}: notification.post.type -msgid "{0, plural, offset:1 =1 {<0/>} =2 {<1/> and <2/>} other {<3/>}} {1, select, Lens {mirrored your} Farcaster {recasted your} other {mirrored your}} <4>{2, select, Post {post} Comment {comment} Quote {quote} Mirror {mirror} other {post}}" +msgid "Verification unsuccessful" msgstr "" msgid "Total" @@ -575,10 +575,6 @@ msgstr "" msgid "Event Ended!" msgstr "" -#. placeholder {0}: post.reporter.displayName -msgid "<0>{0}<1>mirrored" -msgstr "" - msgid "True Token" msgstr "" @@ -704,10 +700,6 @@ msgstr "" msgid "Token ID" msgstr "" -#. placeholder {0}: post.stats.mirrors -msgid "{0, plural, one {mirror} other {mirrors}}" -msgstr "" - msgid "Type something here..." msgstr "" @@ -857,9 +849,6 @@ msgstr "" msgid "Failed to unlike the post." msgstr "" -msgid "Mirror again" -msgstr "" - msgid "There are images or videos that were not uploaded successfully." msgstr "" @@ -1077,6 +1066,9 @@ msgstr "" msgid "Frame Validator" msgstr "" +msgid "Repost again" +msgstr "" + msgid "Priority Access: Holders get early access to future projects, beta tests, and airdrops. And they will also have a first look at the latest features and content." msgstr "" @@ -1102,9 +1094,6 @@ msgstr "" msgid "Follow System" msgstr "" -msgid "Failed to mirror." -msgstr "" - msgid "The contract owner has restrictions on buying." msgstr "" @@ -1158,6 +1147,14 @@ msgstr "" msgid "Anti_whale(Limited number of transactions)" msgstr "" +#. placeholder {0}: notification.reactors.length +#. placeholder {1}: notification.post.type +msgid "{0, plural, offset:1 =1 {<0/>} =2 {<1/> and <2/>} other {<3/>}} <4>liked your <5>{1, select, Post {post} Comment {comment} Quote {quote} Mirror {repost} other {post}}" +msgstr "" + +msgid "reposted" +msgstr "" + #. placeholder {0}: handle || recipient.displayName msgid "Send a tip to {0}" msgstr "" @@ -1295,10 +1292,6 @@ msgstr "" msgid "Submit a wallet to receive NFT and $ANON" msgstr "" -#. placeholder {0}: notification.post.type -msgid "<0/> mentioned you in a <1>{0, select, Post {post} Comment {comment} Quote {quote} Mirror {mirror} other {post}}" -msgstr "" - msgid "<0>Bought<1/>" msgstr "" @@ -1336,9 +1329,6 @@ msgstr "" msgid "Reply" msgstr "" -msgid "Mirror or Quote" -msgstr "" - msgid "Add an existing account" msgstr "" @@ -1412,9 +1402,6 @@ msgstr "" msgid "Try again" msgstr "" -msgid "<0>You mirrored" -msgstr "" - msgid "Failed to create image payload." msgstr "" @@ -1674,6 +1661,12 @@ msgstr "" msgid "All wallets and accounts are muted." msgstr "" +msgid "" +"Just earned $MASK by minting the Buttrfly Fren 🦋 collectible from {fireflyMention} \n" +"\n" +"Claim here {shareUrl}" +msgstr "" + msgid "Disconnected from your social graph" msgstr "" @@ -1813,6 +1806,10 @@ msgstr "" msgid "Compose" msgstr "" +#. placeholder {0}: notification.post.type +msgid "<0/> mentioned you in a <1>{0, select, Post {post} Comment {comment} Quote {quote} Mirror {repost} other {post}}" +msgstr "" + #. placeholder {0}: first(post.reactions)?.displayName msgid "<0>{0} liked" msgstr "" @@ -1878,6 +1875,11 @@ msgstr "" msgid "There are videos that were not uploaded successfully." msgstr "" +#. placeholder {0}: notification.actions.length +#. placeholder {1}: notification.post.type +msgid "{0, plural, offset:1 =1 {<0/>} =2 {<1/> and <2/>} other {<3/>}} <4>collected your <5>{1, select, Post {post} Comment {comment} Quote {quote} Mirror {repost} other {post}}" +msgstr "" + msgid "NFT contract cant restrict the approval, resulting in NFT can not be traded on the NFT DEX." msgstr "" @@ -1945,6 +1947,10 @@ msgstr "" msgid "{0}<0> Items" msgstr "" +#. placeholder {0}: notification.comment.commentOn.type +msgid "<0/> commented on your <1>{0, select, Post {post} Comment {comment} Quote {quote} Mirror {repost} other {post}}" +msgstr "" + msgid "liked" msgstr "" @@ -1957,7 +1963,7 @@ msgstr "" msgid "Cryptocurrency mixer." msgstr "" -msgid "{shares, plural, one {Mirror or Quote} other {Mirrors or Quotes}}" +msgid "Submit a wallet to receive a collectible and $MASK airdrop" msgstr "" msgid "Standard" @@ -2238,6 +2244,9 @@ msgstr "" msgid "Article removed from your Bookmarks" msgstr "" +msgid "Posted to Lens on Buttrfly since August 1, 2024" +msgstr "" + msgid "Powered by Tenderly and GoPlus" msgstr "" @@ -2338,9 +2347,6 @@ msgstr "" msgid "Loading..." msgstr "" -msgid "%Of supply owned" -msgstr "" - msgid "Approve" msgstr "" @@ -2407,6 +2413,9 @@ msgstr "" msgid "Remove Poll" msgstr "" +msgid "Top 500 Buttrfly Points Leaderboard" +msgstr "" + msgid "Minutes" msgstr "" @@ -2634,9 +2643,6 @@ msgstr "" msgid "Sorry, today's free collect quota has been reached." msgstr "" -msgid "Mirrored" -msgstr "" - msgid "Muted contents" msgstr "" @@ -2686,11 +2692,6 @@ msgstr "" msgid "{0}{1}<0> Floor" msgstr "" -#. placeholder {0}: notification.actions.length -#. placeholder {1}: notification.post.type -msgid "{0, plural, offset:1 =1 {<0/>} =2 {<1/> and <2/>} other {<3/>}} <4>collected your <5>{1, select, Post {post} Comment {comment} Quote {quote} Mirror {mirror} other {post}}" -msgstr "" - msgid "Claimed lucky drop successfully" msgstr "" @@ -2790,10 +2791,6 @@ msgstr "" msgid "So sorry, we are not able to mint this NFT at the moment." msgstr "" -#. placeholder {0}: first(post.mirrors)?.displayName -msgid "<0>{0} mirrored" -msgstr "" - msgid "All notifications" msgstr "" @@ -2974,6 +2971,12 @@ msgstr "" msgid "Sorry, we are not able to find this collection" msgstr "" +#. placeholder {0}: mirrors.length +#. placeholder {1}: notification.source +#. placeholder {2}: notification.post.type +msgid "{0, plural, offset:1 =1 {<0/>} =2 {<1/> and <2/>} other {<3/>}} {1, select, Lens {reposted your} Farcaster {recasted your} other {reposted your}} <4>{2, select, Post {post} Comment {comment} Quote {quote} Mirror {repost} other {post}}" +msgstr "" + msgid "View transaction on explorer" msgstr "" @@ -3229,7 +3232,7 @@ msgstr "" msgid "Repost" msgstr "" -#. placeholder {0}: data.price +#. placeholder {0}: collectParams.mintPrice msgid "Collect for {0} {nativeSymbol}" msgstr "" @@ -3284,6 +3287,9 @@ msgstr "" msgid "1y" msgstr "" +msgid "Unlock a premium collectible and a larger $MASK airdrop " +msgstr "" + msgid "Something went wrong" msgstr "" @@ -3331,7 +3337,7 @@ msgstr "" msgid "Create a Post" msgstr "" -#. placeholder {0}: source === Source.Lens ? t`Mirrors` : t`Recasts` +#. placeholder {0}: source === Source.Lens ? t`Reposts` : t`Recasts` msgid "{type, select, comment {Comments} mirror {{0}} reaction {Likes} act {Collects} other {Other}}" msgstr "" @@ -3379,10 +3385,6 @@ msgstr "" msgid "Display Name should not exceed {maxDisplayNameSize} characters" msgstr "" -#. placeholder {0}: notification.quote.quoteOn.type -msgid "<0/> quoted your <1>{0, select, Post {post} Comment {comment} Quote {quote} Mirror {mirror} other {post}}" -msgstr "" - msgid "Failed to send tip." msgstr "" @@ -3442,6 +3444,9 @@ msgstr "" msgid "News" msgstr "" +msgid "Repost or Quote" +msgstr "" + msgid "NFT ID" msgstr "" @@ -3466,6 +3471,9 @@ msgstr "" msgid "Post collected successfully!" msgstr "" +msgid "Reposts" +msgstr "" + #. placeholder {0}: resolveSourceName(x) msgid "Your post have published successfully on {0}." msgstr "" @@ -3488,9 +3496,6 @@ msgstr "" msgid "You are holder of <0>Presidential Election 2024 NFT and voted Trump" msgstr "" -msgid "Cancel mirror successfully" -msgstr "" - msgid "Cannot continue due to wallet mismatch." msgstr "" @@ -3618,8 +3623,7 @@ msgstr "" msgid "{0} Users" msgstr "" -#. placeholder {0}: notification.comment.commentOn.type -msgid "<0/> commented on your <1>{0, select, Post {post} Comment {comment} Quote {quote} Mirror {mirror} other {post}}" +msgid "%Owned" msgstr "" msgid "Final results" @@ -3696,9 +3700,6 @@ msgstr "" msgid "Collect" msgstr "" -msgid "Mirrors" -msgstr "" - msgid "Video" msgstr "" @@ -3910,9 +3911,6 @@ msgstr "" msgid "Creator:" msgstr "" -msgid "mirrored" -msgstr "" - msgid "Following" msgstr "" @@ -3922,6 +3920,9 @@ msgstr "" msgid "Create a post to tell everyone about your participation. Votes can be changed while the proposal is active." msgstr "" +msgid "For any inquiries, please <0>contact us. All rights reserved by Firefly." +msgstr "" + msgid "Hours" msgstr "" diff --git a/src/locales/zh-Hans/messages.po b/src/locales/zh-Hans/messages.po index 52ed8a59f9..bc19642164 100644 --- a/src/locales/zh-Hans/messages.po +++ b/src/locales/zh-Hans/messages.po @@ -61,9 +61,6 @@ msgstr "断开" msgid "No frame found." msgstr "为找到 frame。" -msgid "Undo mirror" -msgstr "取消转帖" - msgid "FAILED THREAD POST" msgstr "发送 thread 失败" @@ -79,6 +76,10 @@ msgstr "使用 Warpcast 连接" msgid "You have been detected as a loyal Farcaster user" msgstr "您被检测到为 Farcaster 忠实用户" +#. placeholder {0}: notification.quote.quoteOn.type +msgid "<0/> quoted your <1>{0, select, Post {post} Comment {comment} Quote {quote} Mirror {repost} other {post}}" +msgstr "" + msgid "Edit Image" msgstr "编辑图片" @@ -149,6 +150,9 @@ msgstr "社区" msgid "Discover" msgstr "发现" +msgid "{shares, plural, one {Repost or Quote} other {Reposts or Quotes}}" +msgstr "" + msgid "Ask a question" msgstr "询问" @@ -447,11 +451,6 @@ msgstr "已切换个人资料" msgid "Adding..." msgstr "添加中..." -#. placeholder {0}: notification.reactors.length -#. placeholder {1}: notification.post.type -msgid "{0, plural, offset:1 =1 {<0/>} =2 {<1/> and <2/>} other {<3/>}} <4>liked your <5>{1, select, Post {post} Comment {comment} Quote {quote} Mirror {mirror} other {post}}" -msgstr "{0, plural, offset:1 =1 {<0/>} =2 {<1/> and <2/>} other {<3/>}} <4>点赞了你的 <5>{1, select, Post {帖子} Comment {评论} Quote {引用} Mirror {转帖} other {帖子}}" - msgid "Donald Trump" msgstr "唐纳德·特朗普" @@ -482,6 +481,10 @@ msgstr "未找到个人信息" msgid "NFT Standard" msgstr "NFT 标准" +#. placeholder {0}: first(post.mirrors)?.displayName +msgid "<0>{0} reposted" +msgstr "" + #. placeholder {0}: formatSnapshotChoice(selectedChoices, type, choices) #. placeholder {1}: snapshot.title msgid "🙌  Just voted “{0}” on “{1}”" @@ -556,18 +559,15 @@ msgstr "收起" msgid "Follow <0>@{handle} on {0}" msgstr "在 {0} 上关注 <0>@{handle}" +msgid "Undo repost" +msgstr "" + msgid "Proxy contract." msgstr "代理合约。" msgid "Verification unsuccessful" msgstr "验证不成功" -#. placeholder {0}: mirrors.length -#. placeholder {1}: notification.source -#. placeholder {2}: notification.post.type -msgid "{0, plural, offset:1 =1 {<0/>} =2 {<1/> and <2/>} other {<3/>}} {1, select, Lens {mirrored your} Farcaster {recasted your} other {mirrored your}} <4>{2, select, Post {post} Comment {comment} Quote {quote} Mirror {mirror} other {post}}" -msgstr "{0, plural, offset:1 =1 {<0/>} =2 {<1/> and <2/>} other {<3/>}} {1, select, Lens {转帖了你的} Farcaster {转帖了你的} other {转帖了你的}} <4>{2, select, Post {帖子} Comment {评论} Quote {引用} Mirror {转帖} other {帖子}}" - msgid "Total" msgstr "总额" @@ -580,10 +580,6 @@ msgstr "交易冷却功能。" msgid "Event Ended!" msgstr "活动已结束!" -#. placeholder {0}: post.reporter.displayName -msgid "<0>{0}<1>mirrored" -msgstr "<0>{0}<1>转帖" - msgid "True Token" msgstr "真实的通证" @@ -709,10 +705,6 @@ msgstr "已点赞" msgid "Token ID" msgstr "通证 ID" -#. placeholder {0}: post.stats.mirrors -msgid "{0, plural, one {mirror} other {mirrors}}" -msgstr "{0, plural, one {转帖} other {转帖}}" - msgid "Type something here..." msgstr "从这里开始..." @@ -862,9 +854,6 @@ msgstr "发帖" msgid "Failed to unlike the post." msgstr "取消点赞失败。" -msgid "Mirror again" -msgstr "转帖" - msgid "There are images or videos that were not uploaded successfully." msgstr "图片或者视频上传失败。" @@ -1082,6 +1071,9 @@ msgstr "上传头像失败。" msgid "Frame Validator" msgstr "Frame 验证器" +msgid "Repost again" +msgstr "" + msgid "Priority Access: Holders get early access to future projects, beta tests, and airdrops. And they will also have a first look at the latest features and content." msgstr "优先访问:持有者将获得对未来项目、测试版和空投的提前访问权。同时,他们还将优先体验最新功能和内容。" @@ -1107,9 +1099,6 @@ msgstr "没有可显示的数据" msgid "Follow System" msgstr "跟随系统" -msgid "Failed to mirror." -msgstr "转帖失败。" - msgid "The contract owner has restrictions on buying." msgstr "合约所有者对购买有限制。" @@ -1163,6 +1152,14 @@ msgstr "暗网交易。" msgid "Anti_whale(Limited number of transactions)" msgstr "反鲸鱼(有限的交易次数)" +#. placeholder {0}: notification.reactors.length +#. placeholder {1}: notification.post.type +msgid "{0, plural, offset:1 =1 {<0/>} =2 {<1/> and <2/>} other {<3/>}} <4>liked your <5>{1, select, Post {post} Comment {comment} Quote {quote} Mirror {repost} other {post}}" +msgstr "" + +msgid "reposted" +msgstr "" + #. placeholder {0}: handle || recipient.displayName msgid "Send a tip to {0}" msgstr "发送打赏给 {0}" @@ -1300,10 +1297,6 @@ msgstr "<0>获取<1/><2>从<3><4>{0}" msgid "Submit a wallet to receive NFT and $ANON" msgstr "提交您的钱包以领取您的 NFT 和 $ANON" -#. placeholder {0}: notification.post.type -msgid "<0/> mentioned you in a <1>{0, select, Post {post} Comment {comment} Quote {quote} Mirror {mirror} other {post}}" -msgstr "<0/>提到了你的 <1>{0, select, Post {帖子} Comment {评论} Quote {引用} Mirror {引用} other {帖子}}" - msgid "<0>Bought<1/>" msgstr "<0>购买<1/>" @@ -1341,9 +1334,6 @@ msgstr "红包" msgid "Reply" msgstr "回复" -msgid "Mirror or Quote" -msgstr "转帖或者引用" - msgid "Add an existing account" msgstr "添加一个已有的账号" @@ -1417,9 +1407,6 @@ msgstr "查看详情" msgid "Try again" msgstr "请重试" -msgid "<0>You mirrored" -msgstr "<0>你 已转发" - msgid "Failed to create image payload." msgstr "创建图片内容失败" @@ -1679,6 +1666,12 @@ msgstr "已隐藏的钱包" msgid "All wallets and accounts are muted." msgstr "已隐藏所有的钱包和账户。" +msgid "" +"Just earned $MASK by minting the Buttrfly Fren 🦋 collectible from {fireflyMention} \n" +"\n" +"Claim here {shareUrl}" +msgstr "" + msgid "Disconnected from your social graph" msgstr "从您的社交图谱中断开" @@ -1823,6 +1816,10 @@ msgstr "您确定要隐藏 @{0} 吗?" msgid "Compose" msgstr "发帖" +#. placeholder {0}: notification.post.type +msgid "<0/> mentioned you in a <1>{0, select, Post {post} Comment {comment} Quote {quote} Mirror {repost} other {post}}" +msgstr "" + #. placeholder {0}: first(post.reactions)?.displayName msgid "<0>{0} liked" msgstr "<0>{0} 点赞" @@ -1888,6 +1885,11 @@ msgstr "全部清除" msgid "There are videos that were not uploaded successfully." msgstr "视频上传失败。" +#. placeholder {0}: notification.actions.length +#. placeholder {1}: notification.post.type +msgid "{0, plural, offset:1 =1 {<0/>} =2 {<1/> and <2/>} other {<3/>}} <4>collected your <5>{1, select, Post {post} Comment {comment} Quote {quote} Mirror {repost} other {post}}" +msgstr "" + msgid "NFT contract cant restrict the approval, resulting in NFT can not be traded on the NFT DEX." msgstr "NFT 合约无法限制授权,导致NFT无法在NFT去中心化交易所(DEX)上交易。" @@ -1955,6 +1957,10 @@ msgstr "在帖子中标记 {0},让他们知道你已经向他们的钱包发 msgid "{0}<0> Items" msgstr "{0}<0> 项目" +#. placeholder {0}: notification.comment.commentOn.type +msgid "<0/> commented on your <1>{0, select, Post {post} Comment {comment} Quote {quote} Mirror {repost} other {post}}" +msgstr "" + msgid "liked" msgstr "点赞" @@ -1967,8 +1973,8 @@ msgstr "描述问题或者提出建议" msgid "Cryptocurrency mixer." msgstr "加密货币混合器。" -msgid "{shares, plural, one {Mirror or Quote} other {Mirrors or Quotes}}" -msgstr "{shares, plural, one {转帖或引用} other {转帖或引用}}" +msgid "Submit a wallet to receive a collectible and $MASK airdrop" +msgstr "" msgid "Standard" msgstr "标准" @@ -2253,6 +2259,9 @@ msgstr "此操作无法撤销,您将丢失您的草稿。" msgid "Article removed from your Bookmarks" msgstr "文章已经从您的收藏中移除" +msgid "Posted to Lens on Buttrfly since August 1, 2024" +msgstr "" + msgid "Powered by Tenderly and GoPlus" msgstr "Powered by Tenderly and GoPlus" @@ -2353,9 +2362,6 @@ msgstr "动图" msgid "Loading..." msgstr "加载中..." -msgid "%Of supply owned" -msgstr "% 总的拥有人" - msgid "Approve" msgstr "授权" @@ -2422,6 +2428,9 @@ msgstr "随机金额" msgid "Remove Poll" msgstr "删除投票" +msgid "Top 500 Buttrfly Points Leaderboard" +msgstr "" + msgid "Minutes" msgstr "分钟" @@ -2649,9 +2658,6 @@ msgstr "转帖失败。" msgid "Sorry, today's free collect quota has been reached." msgstr "抱歉,今天的免费收藏额度已用完。" -msgid "Mirrored" -msgstr "已转发" - msgid "Muted contents" msgstr "已隐藏的内容" @@ -2701,11 +2707,6 @@ msgstr "用户取消了请求。" msgid "{0}{1}<0> Floor" msgstr "{0}{1}<0> 地板" -#. placeholder {0}: notification.actions.length -#. placeholder {1}: notification.post.type -msgid "{0, plural, offset:1 =1 {<0/>} =2 {<1/> and <2/>} other {<3/>}} <4>collected your <5>{1, select, Post {post} Comment {comment} Quote {quote} Mirror {mirror} other {post}}" -msgstr "{0, plural, offset:1 =1 {<0/>} =2 {<1/> and <2/>} other {<3/>}} <4>收集了你的 <5>{1, select, Post {发帖} Comment {评论} Quote {引用} Mirror {转帖} other {帖子}}" - msgid "Claimed lucky drop successfully" msgstr "成功领取红包" @@ -2805,10 +2806,6 @@ msgstr "技术支持来自" msgid "So sorry, we are not able to mint this NFT at the moment." msgstr "很抱歉,我们目前无法铸造此 NFT。" -#. placeholder {0}: first(post.mirrors)?.displayName -msgid "<0>{0} mirrored" -msgstr "<0>{0} 已转发" - msgid "All notifications" msgstr "通知" @@ -2989,6 +2986,12 @@ msgstr "预估网络费用" msgid "Sorry, we are not able to find this collection" msgstr "对不起,我们未找到此 NFT 系列" +#. placeholder {0}: mirrors.length +#. placeholder {1}: notification.source +#. placeholder {2}: notification.post.type +msgid "{0, plural, offset:1 =1 {<0/>} =2 {<1/> and <2/>} other {<3/>}} {1, select, Lens {reposted your} Farcaster {recasted your} other {reposted your}} <4>{2, select, Post {post} Comment {comment} Quote {quote} Mirror {repost} other {post}}" +msgstr "" + msgid "View transaction on explorer" msgstr "查看交易详情" @@ -3244,7 +3247,7 @@ msgstr "再次铸造" msgid "Repost" msgstr "转帖" -#. placeholder {0}: data.price +#. placeholder {0}: collectParams.mintPrice msgid "Collect for {0} {nativeSymbol}" msgstr "收藏 {0} {nativeSymbol}" @@ -3299,6 +3302,9 @@ msgstr "已拒绝" msgid "1y" msgstr "1年" +msgid "Unlock a premium collectible and a larger $MASK airdrop " +msgstr "" + msgid "Something went wrong" msgstr "发生未知错误。" @@ -3346,7 +3352,7 @@ msgstr "文章已经添加到您的收藏中" msgid "Create a Post" msgstr "创建帖子" -#. placeholder {0}: source === Source.Lens ? t`Mirrors` : t`Recasts` +#. placeholder {0}: source === Source.Lens ? t`Reposts` : t`Recasts` msgid "{type, select, comment {Comments} mirror {{0}} reaction {Likes} act {Collects} other {Other}}" msgstr "{type, select, comment {评论} mirror {{0}} reaction {点赞} act {收藏} other {其他}}" @@ -3394,10 +3400,6 @@ msgstr "所有链" msgid "Display Name should not exceed {maxDisplayNameSize} characters" msgstr "显示名称不可以超过 {maxDisplayNameSize} 个字" -#. placeholder {0}: notification.quote.quoteOn.type -msgid "<0/> quoted your <1>{0, select, Post {post} Comment {comment} Quote {quote} Mirror {mirror} other {post}}" -msgstr "<0/> 引用了你的 <1>{0, select, Post {帖子} Comment {评论} Quote {引用} Mirror {引用} other {帖子}}" - msgid "Failed to send tip." msgstr "发送打赏失败。" @@ -3457,6 +3459,9 @@ msgstr "提案" msgid "News" msgstr "新闻" +msgid "Repost or Quote" +msgstr "" + msgid "NFT ID" msgstr "NFT ID" @@ -3481,6 +3486,9 @@ msgstr "上传失败。视频时间超过限制 {minDuration}秒 ~ {maxDuration} msgid "Post collected successfully!" msgstr "成功收集文章!" +msgid "Reposts" +msgstr "" + #. placeholder {0}: resolveSourceName(x) msgid "Your post have published successfully on {0}." msgstr "您已在 {0} 发布成功。" @@ -3503,9 +3511,6 @@ msgstr "预览" msgid "You are holder of <0>Presidential Election 2024 NFT and voted Trump" msgstr "你持有<0>2024年总统选举 NFT 并投票给特朗普。" -msgid "Cancel mirror successfully" -msgstr "取消转发成功" - msgid "Cannot continue due to wallet mismatch." msgstr "钱包不匹配无法继续。" @@ -3633,9 +3638,8 @@ msgstr "活动" msgid "{0} Users" msgstr "{0} 用户" -#. placeholder {0}: notification.comment.commentOn.type -msgid "<0/> commented on your <1>{0, select, Post {post} Comment {comment} Quote {quote} Mirror {mirror} other {post}}" -msgstr "<0/> 评论了你的 <1>{0, select, Post {帖子} Comment {评论} Quote {引用} Mirror {转帖} other {帖子}}" +msgid "%Owned" +msgstr "" msgid "Final results" msgstr "最终结果" @@ -3711,9 +3715,6 @@ msgstr "兑换" msgid "Collect" msgstr "收藏" -msgid "Mirrors" -msgstr "转帖" - msgid "Video" msgstr "视频" @@ -3925,9 +3926,6 @@ msgstr "发帖" msgid "Creator:" msgstr "创建者:" -msgid "mirrored" -msgstr "已转发" - msgid "Following" msgstr "正在关注" @@ -3937,6 +3935,9 @@ msgstr "您的 X 账号属于 Premium 账号" msgid "Create a post to tell everyone about your participation. Votes can be changed while the proposal is active." msgstr "发布一个帖子,告诉大家你已参与其中。在提案有效期内,投票可以更改。" +msgid "For any inquiries, please <0>contact us. All rights reserved by Firefly." +msgstr "" + msgid "Hours" msgstr "小时" diff --git a/src/locales/zh-Hant/messages.po b/src/locales/zh-Hant/messages.po index 8110202fc1..0634deb248 100644 --- a/src/locales/zh-Hant/messages.po +++ b/src/locales/zh-Hant/messages.po @@ -61,9 +61,6 @@ msgstr "斷開連接" msgid "No frame found." msgstr "" -msgid "Undo mirror" -msgstr "" - msgid "FAILED THREAD POST" msgstr "" @@ -79,6 +76,10 @@ msgstr "通過 Warpcast 的新連接" msgid "You have been detected as a loyal Farcaster user" msgstr "您被檢測到為 Farcaster 忠實用戶" +#. placeholder {0}: notification.quote.quoteOn.type +msgid "<0/> quoted your <1>{0, select, Post {post} Comment {comment} Quote {quote} Mirror {repost} other {post}}" +msgstr "" + msgid "Edit Image" msgstr "編輯圖片" @@ -149,6 +150,9 @@ msgstr "社群" msgid "Discover" msgstr "發現" +msgid "{shares, plural, one {Repost or Quote} other {Reposts or Quotes}}" +msgstr "" + msgid "Ask a question" msgstr "提問" @@ -447,11 +451,6 @@ msgstr "" msgid "Adding..." msgstr "正在添加" -#. placeholder {0}: notification.reactors.length -#. placeholder {1}: notification.post.type -msgid "{0, plural, offset:1 =1 {<0/>} =2 {<1/> and <2/>} other {<3/>}} <4>liked your <5>{1, select, Post {post} Comment {comment} Quote {quote} Mirror {mirror} other {post}}" -msgstr "" - msgid "Donald Trump" msgstr "" @@ -482,6 +481,10 @@ msgstr "找不到帳戶" msgid "NFT Standard" msgstr "NFT 標準" +#. placeholder {0}: first(post.mirrors)?.displayName +msgid "<0>{0} reposted" +msgstr "" + #. placeholder {0}: formatSnapshotChoice(selectedChoices, type, choices) #. placeholder {1}: snapshot.title msgid "🙌  Just voted “{0}” on “{1}”" @@ -556,16 +559,13 @@ msgstr "顯示更少" msgid "Follow <0>@{handle} on {0}" msgstr "" -msgid "Proxy contract." +msgid "Undo repost" msgstr "" -msgid "Verification unsuccessful" +msgid "Proxy contract." msgstr "" -#. placeholder {0}: mirrors.length -#. placeholder {1}: notification.source -#. placeholder {2}: notification.post.type -msgid "{0, plural, offset:1 =1 {<0/>} =2 {<1/> and <2/>} other {<3/>}} {1, select, Lens {mirrored your} Farcaster {recasted your} other {mirrored your}} <4>{2, select, Post {post} Comment {comment} Quote {quote} Mirror {mirror} other {post}}" +msgid "Verification unsuccessful" msgstr "" msgid "Total" @@ -580,10 +580,6 @@ msgstr "" msgid "Event Ended!" msgstr "" -#. placeholder {0}: post.reporter.displayName -msgid "<0>{0}<1>mirrored" -msgstr "" - msgid "True Token" msgstr "" @@ -709,10 +705,6 @@ msgstr "已喜歡" msgid "Token ID" msgstr "" -#. placeholder {0}: post.stats.mirrors -msgid "{0, plural, one {mirror} other {mirrors}}" -msgstr "" - msgid "Type something here..." msgstr "在這裡輸入" @@ -862,9 +854,6 @@ msgstr "貼文" msgid "Failed to unlike the post." msgstr "點讚評論失敗" -msgid "Mirror again" -msgstr "重新鏡像" - msgid "There are images or videos that were not uploaded successfully." msgstr "" @@ -1082,6 +1071,9 @@ msgstr "" msgid "Frame Validator" msgstr "Frame 驗證器" +msgid "Repost again" +msgstr "" + msgid "Priority Access: Holders get early access to future projects, beta tests, and airdrops. And they will also have a first look at the latest features and content." msgstr "" @@ -1107,9 +1099,6 @@ msgstr "" msgid "Follow System" msgstr "預設" -msgid "Failed to mirror." -msgstr "鏡像失敗" - msgid "The contract owner has restrictions on buying." msgstr "" @@ -1163,6 +1152,14 @@ msgstr "" msgid "Anti_whale(Limited number of transactions)" msgstr "" +#. placeholder {0}: notification.reactors.length +#. placeholder {1}: notification.post.type +msgid "{0, plural, offset:1 =1 {<0/>} =2 {<1/> and <2/>} other {<3/>}} <4>liked your <5>{1, select, Post {post} Comment {comment} Quote {quote} Mirror {repost} other {post}}" +msgstr "" + +msgid "reposted" +msgstr "" + #. placeholder {0}: handle || recipient.displayName msgid "Send a tip to {0}" msgstr "向 {0} 發送小費" @@ -1300,10 +1297,6 @@ msgstr "" msgid "Submit a wallet to receive NFT and $ANON" msgstr "提交您的錢包以領取您的 NFT 和 $ANON" -#. placeholder {0}: notification.post.type -msgid "<0/> mentioned you in a <1>{0, select, Post {post} Comment {comment} Quote {quote} Mirror {mirror} other {post}}" -msgstr "<0/> 在 <1> {0, select, Post {貼文} Comment {評論} Quote {引用} Mirror {鏡像} other {貼文}} 中提到了你" - msgid "<0>Bought<1/>" msgstr "" @@ -1341,9 +1334,6 @@ msgstr "" msgid "Reply" msgstr "回覆" -msgid "Mirror or Quote" -msgstr "" - msgid "Add an existing account" msgstr "" @@ -1417,9 +1407,6 @@ msgstr "" msgid "Try again" msgstr "" -msgid "<0>You mirrored" -msgstr "" - msgid "Failed to create image payload." msgstr "" @@ -1679,6 +1666,12 @@ msgstr "" msgid "All wallets and accounts are muted." msgstr "所有錢包和帳戶都已靜音" +msgid "" +"Just earned $MASK by minting the Buttrfly Fren 🦋 collectible from {fireflyMention} \n" +"\n" +"Claim here {shareUrl}" +msgstr "" + msgid "Disconnected from your social graph" msgstr "從你的社交圖譜中取消連結" @@ -1818,6 +1811,10 @@ msgstr "確認對 @{0} 的靜音?" msgid "Compose" msgstr "創作" +#. placeholder {0}: notification.post.type +msgid "<0/> mentioned you in a <1>{0, select, Post {post} Comment {comment} Quote {quote} Mirror {repost} other {post}}" +msgstr "" + #. placeholder {0}: first(post.reactions)?.displayName msgid "<0>{0} liked" msgstr "<0>{0} 喜歡了" @@ -1883,6 +1880,11 @@ msgstr "清除所有" msgid "There are videos that were not uploaded successfully." msgstr "" +#. placeholder {0}: notification.actions.length +#. placeholder {1}: notification.post.type +msgid "{0, plural, offset:1 =1 {<0/>} =2 {<1/> and <2/>} other {<3/>}} <4>collected your <5>{1, select, Post {post} Comment {comment} Quote {quote} Mirror {repost} other {post}}" +msgstr "" + msgid "NFT contract cant restrict the approval, resulting in NFT can not be traded on the NFT DEX." msgstr "" @@ -1950,6 +1952,10 @@ msgstr "" msgid "{0}<0> Items" msgstr "" +#. placeholder {0}: notification.comment.commentOn.type +msgid "<0/> commented on your <1>{0, select, Post {post} Comment {comment} Quote {quote} Mirror {repost} other {post}}" +msgstr "" + msgid "liked" msgstr "已喜歡" @@ -1962,7 +1968,7 @@ msgstr "描述錯誤或提供改進建議" msgid "Cryptocurrency mixer." msgstr "" -msgid "{shares, plural, one {Mirror or Quote} other {Mirrors or Quotes}}" +msgid "Submit a wallet to receive a collectible and $MASK airdrop" msgstr "" msgid "Standard" @@ -2243,6 +2249,9 @@ msgstr "該行為無法撤銷,您會失去這份草稿" msgid "Article removed from your Bookmarks" msgstr "文章已從你的書籤中移除" +msgid "Posted to Lens on Buttrfly since August 1, 2024" +msgstr "" + msgid "Powered by Tenderly and GoPlus" msgstr "" @@ -2343,9 +2352,6 @@ msgstr "GIF" msgid "Loading..." msgstr "" -msgid "%Of supply owned" -msgstr "" - msgid "Approve" msgstr "" @@ -2412,6 +2418,9 @@ msgstr "" msgid "Remove Poll" msgstr "移除投票" +msgid "Top 500 Buttrfly Points Leaderboard" +msgstr "" + msgid "Minutes" msgstr "分鐘" @@ -2639,9 +2648,6 @@ msgstr "" msgid "Sorry, today's free collect quota has been reached." msgstr "" -msgid "Mirrored" -msgstr "已鏡像" - msgid "Muted contents" msgstr "已靜音的內容" @@ -2691,11 +2697,6 @@ msgstr "用戶拒絕了請求" msgid "{0}{1}<0> Floor" msgstr "" -#. placeholder {0}: notification.actions.length -#. placeholder {1}: notification.post.type -msgid "{0, plural, offset:1 =1 {<0/>} =2 {<1/> and <2/>} other {<3/>}} <4>collected your <5>{1, select, Post {post} Comment {comment} Quote {quote} Mirror {mirror} other {post}}" -msgstr "" - msgid "Claimed lucky drop successfully" msgstr "" @@ -2795,10 +2796,6 @@ msgstr "提供者為" msgid "So sorry, we are not able to mint this NFT at the moment." msgstr "" -#. placeholder {0}: first(post.mirrors)?.displayName -msgid "<0>{0} mirrored" -msgstr "<0>{0} 鏡像了" - msgid "All notifications" msgstr "全部通知" @@ -2979,6 +2976,12 @@ msgstr "" msgid "Sorry, we are not able to find this collection" msgstr "" +#. placeholder {0}: mirrors.length +#. placeholder {1}: notification.source +#. placeholder {2}: notification.post.type +msgid "{0, plural, offset:1 =1 {<0/>} =2 {<1/> and <2/>} other {<3/>}} {1, select, Lens {reposted your} Farcaster {recasted your} other {reposted your}} <4>{2, select, Post {post} Comment {comment} Quote {quote} Mirror {repost} other {post}}" +msgstr "" + msgid "View transaction on explorer" msgstr "" @@ -3234,7 +3237,7 @@ msgstr "" msgid "Repost" msgstr "" -#. placeholder {0}: data.price +#. placeholder {0}: collectParams.mintPrice msgid "Collect for {0} {nativeSymbol}" msgstr "" @@ -3289,6 +3292,9 @@ msgstr "" msgid "1y" msgstr "" +msgid "Unlock a premium collectible and a larger $MASK airdrop " +msgstr "" + msgid "Something went wrong" msgstr "" @@ -3336,7 +3342,7 @@ msgstr "文章已加入你的書籤" msgid "Create a Post" msgstr "" -#. placeholder {0}: source === Source.Lens ? t`Mirrors` : t`Recasts` +#. placeholder {0}: source === Source.Lens ? t`Reposts` : t`Recasts` msgid "{type, select, comment {Comments} mirror {{0}} reaction {Likes} act {Collects} other {Other}}" msgstr "" @@ -3384,10 +3390,6 @@ msgstr "" msgid "Display Name should not exceed {maxDisplayNameSize} characters" msgstr "" -#. placeholder {0}: notification.quote.quoteOn.type -msgid "<0/> quoted your <1>{0, select, Post {post} Comment {comment} Quote {quote} Mirror {mirror} other {post}}" -msgstr "" - msgid "Failed to send tip." msgstr "" @@ -3447,6 +3449,9 @@ msgstr "" msgid "News" msgstr "资讯" +msgid "Repost or Quote" +msgstr "" + msgid "NFT ID" msgstr "NFT ID" @@ -3471,6 +3476,9 @@ msgstr "" msgid "Post collected successfully!" msgstr "" +msgid "Reposts" +msgstr "" + #. placeholder {0}: resolveSourceName(x) msgid "Your post have published successfully on {0}." msgstr "你的貼文已成功發布在 {0} 上。" @@ -3493,9 +3501,6 @@ msgstr "" msgid "You are holder of <0>Presidential Election 2024 NFT and voted Trump" msgstr "" -msgid "Cancel mirror successfully" -msgstr "" - msgid "Cannot continue due to wallet mismatch." msgstr "" @@ -3623,8 +3628,7 @@ msgstr "" msgid "{0} Users" msgstr "" -#. placeholder {0}: notification.comment.commentOn.type -msgid "<0/> commented on your <1>{0, select, Post {post} Comment {comment} Quote {quote} Mirror {mirror} other {post}}" +msgid "%Owned" msgstr "" msgid "Final results" @@ -3701,9 +3705,6 @@ msgstr "" msgid "Collect" msgstr "收集" -msgid "Mirrors" -msgstr "" - msgid "Video" msgstr "影片" @@ -3915,9 +3916,6 @@ msgstr "" msgid "Creator:" msgstr "" -msgid "mirrored" -msgstr "" - msgid "Following" msgstr "追蹤中" @@ -3927,6 +3925,9 @@ msgstr "" msgid "Create a post to tell everyone about your participation. Votes can be changed while the proposal is active." msgstr "" +msgid "For any inquiries, please <0>contact us. All rights reserved by Firefly." +msgstr "" + msgid "Hours" msgstr "小時" diff --git a/src/modals/AddCustomERC20Modal.tsx b/src/modals/AddCustomERC20Modal.tsx index 55dca6157c..4c78108d50 100644 --- a/src/modals/AddCustomERC20Modal.tsx +++ b/src/modals/AddCustomERC20Modal.tsx @@ -4,6 +4,7 @@ import { DialogTitle } from '@headlessui/react'; import { t } from '@lingui/core/macro'; import { Trans } from '@lingui/react/macro'; import { delay } from '@masknet/kit'; +import { isSameAddress } from '@masknet/web3-shared-base'; import { isValidAddress } from '@masknet/web3-shared-evm'; import { forwardRef, useCallback, useState } from 'react'; import { useAsyncFn } from 'react-use'; @@ -52,13 +53,13 @@ function AddCustomERC20ModalContent({ onClose, initialChainId }: { onClose: () = const [contractAddress, setContractAddress] = useState(''); const [selectedChain, setSelectedChain] = useState(initialChainId); - const { tokens, isLoading } = useTipsTokens(); + const { tokens, isLoading } = useTipsTokens(account.address); const addCustomToken = useCustomTokenStore((state) => state.addToken); const [{ loading }, onAdd] = useAsyncFn(async () => { try { if (!account.address) return; const address = contractAddress as Address; - if (tokens.some((x) => x.id === address)) { + if (tokens.some((x) => isSameAddress(x.id, address))) { onClose?.(); return; } diff --git a/src/providers/firefly/Activity.ts b/src/providers/firefly/Activity.ts index 5e004b5224..c60dbcd817 100644 --- a/src/providers/firefly/Activity.ts +++ b/src/providers/firefly/Activity.ts @@ -42,9 +42,24 @@ class FireflyActivity implements Provider { premiumAddress?: string; }, ) { - const params = ['trump', 'pengu'].includes(name) - ? { name, solAddress: address || '0x', evmAddress: options?.premiumAddress || '0x' } - : { name, address, ...options }; + const params: Partial<{ + solAddress: string; + evmAddress: string; + address: string; + }> & { + name: string; + } = { + name, + ...options, + }; + if (['trump', 'pengu'].includes(name)) { + params.solAddress = address || '0x'; + params.evmAddress = options?.premiumAddress || '0x'; + } else if (['buttrfly'].includes(name)) { + params.evmAddress = address || '0x'; + } else { + params.address = address || '0x'; + } const url = urlcat(settings.FIREFLY_ROOT_URL, `/v1/activity/check/:name`, params); const response = await fireflySessionHolder.fetchWithSession(url); return resolveFireflyResponseData(response); diff --git a/src/providers/third-party/Auth.ts b/src/providers/third-party/Auth.ts deleted file mode 100644 index 47b2cb4d38..0000000000 --- a/src/providers/third-party/Auth.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { NotImplementedError } from '@/constants/error.js'; -import { fetchJSON } from '@/helpers/fetchJSON.js'; -import type { ThirdPartySession } from '@/providers/third-party/Session.js'; -import type { Provider } from '@/providers/types/Auth.js'; -import type { Profile } from '@/providers/types/SocialMedia.js'; -import type { ResponseJSON } from '@/types/index.js'; - -class ThirdPartyAuth implements Provider { - async login(): Promise { - const response = await fetchJSON>('/api/third-party/login', { - method: 'POST', - }); - if (!response.success) return null; - return response.data; - } - - async logout(): Promise { - await fetchJSON('/api/third-party/logout', { - method: 'POST', - }); - } - - async me(): Promise { - throw new NotImplementedError(); - } -} - -export const ThirdPartyAuthProvider = new ThirdPartyAuth(); diff --git a/src/providers/third-party/SessionHolder.ts b/src/providers/third-party/SessionHolder.ts index 88fd8a8741..906ce16a55 100644 --- a/src/providers/third-party/SessionHolder.ts +++ b/src/providers/third-party/SessionHolder.ts @@ -1,8 +1,5 @@ -import { isServer } from '@tanstack/react-query'; - import { NotAllowedError } from '@/constants/error.js'; import { SessionHolder } from '@/providers/base/SessionHolder.js'; -import { ThirdPartyAuthProvider } from '@/providers/third-party/Auth.js'; import type { ThirdPartySession } from '@/providers/third-party/Session.js'; class ThirdPartySessionHolder extends SessionHolder { @@ -21,7 +18,6 @@ class ThirdPartySessionHolder extends SessionHolder { override removeSession(): void { this.session?.destroy(); super.removeSession(); - if (!isServer) ThirdPartyAuthProvider.logout(); } } diff --git a/src/providers/types/Activity.ts b/src/providers/types/Activity.ts index db0d67814f..867237ff09 100644 --- a/src/providers/types/Activity.ts +++ b/src/providers/types/Activity.ts @@ -81,6 +81,16 @@ export interface NFT { participationBlocked: boolean; } +export interface Lens { + valid: boolean; + level: Level; + alreadyClaimed: boolean; + lensId: string; + handle: string; + isActiveUser: boolean; + isTopUser: boolean; +} + export type CheckResponse = Response<{ alreadyClaimed: boolean; canClaim: boolean; @@ -88,6 +98,7 @@ export type CheckResponse = Response<{ nft?: NFT; participationBlocked?: boolean; farcaster: Farcaster; + lens?: Lens; assets: Assets; balance: Balance; firefly: Firefly; diff --git a/src/store/useProfileStore.ts b/src/store/useProfileStore.ts index c2f2fba8cd..a06b4bef3c 100644 --- a/src/store/useProfileStore.ts +++ b/src/store/useProfileStore.ts @@ -286,6 +286,14 @@ const useTwitterStateBase = createState( state.upgrade(); try { + const authSession = (await getSession()) as unknown as ThirdPartySessionType; + // avoid invalid requests + if ( + authSession.type === SessionType.Twitter && + authSession.user?.id === state.currentProfile?.profileId + ) + return; + const session = state.currentProfileSession as TwitterSession | null; // clean the local store if the consumer secret is not hidden diff --git a/tailwind.config.cjs b/tailwind.config.cjs index 36c7c6bd0c..c7f371a098 100644 --- a/tailwind.config.cjs +++ b/tailwind.config.cjs @@ -48,6 +48,7 @@ module.exports = { commonDanger: 'var(--m-common-danger)', commonWarn: 'rgb(var(--m-common-warn) / )', lightSecond: '#767F8D', + deactivate: '#9ea1b0', lightLineSecond: '#E6E7E8', foreground: 'rgb(var(--foreground-rgb) / )', placeholder: 'var(--plyr-range-fill-background)',