From 02b1629ded9f9c80cb021c78ebbe4aa1ecaa2556 Mon Sep 17 00:00:00 2001 From: Dylan Jeffers Date: Thu, 9 Apr 2026 14:56:06 -0700 Subject: [PATCH] Renam artist-coin to fan-club --- packages/common/src/adapters/user.ts | 4 +- ...tCoinsBatcher.ts => getFanClubsBatcher.ts} | 2 +- .../common/src/api/tan-query/coins/index.ts | 16 +-- .../src/api/tan-query/coins/tokenUtils.ts | 10 +- ...atedCoin.ts => useArtistCreatedFanClub.ts} | 13 ++- .../coins/{useArtistCoin.ts => useFanClub.ts} | 18 +-- ...tCoinByTicker.ts => useFanClubByTicker.ts} | 42 ++++--- ...dersCount.ts => useFanClubHoldersCount.ts} | 15 +-- ...istCoinMembers.ts => useFanClubMembers.ts} | 18 +-- ...bersCount.ts => useFanClubMembersCount.ts} | 8 +- .../{useArtistCoins.ts => useFanClubs.ts} | 26 ++--- .../src/api/tan-query/coins/useRedeemCoin.ts | 8 +- .../api/tan-query/coins/useRedeemCoinCode.ts | 8 +- .../api/tan-query/coins/useTradeableCoins.ts | 31 +++--- ...pdateArtistCoin.ts => useUpdateFanClub.ts} | 23 ++-- .../src/api/tan-query/jupiter/executors.ts | 12 +- .../src/api/tan-query/jupiter/useSwapCoins.ts | 10 +- .../common/src/api/tan-query/jupiter/utils.ts | 16 +-- .../common/src/api/tan-query/queryKeys.ts | 10 +- .../api/tan-query/wallets/useCoinBalance.ts | 2 +- .../tan-query/wallets/useUserTotalBalance.ts | 4 +- .../src/hooks/chats/useAudienceUsers.ts | 8 +- .../chats/useChatBlastAudienceContent.ts | 8 +- .../chats/useFirstAvailableBlastAudience.ts | 8 +- packages/common/src/hooks/index.ts | 2 +- .../hooks/useAccessAndRemixSettings.test.ts | 4 +- .../src/hooks/useAccessAndRemixSettings.ts | 4 +- ...geHeader.ts => useFanClubMessageHeader.ts} | 6 +- .../src/hooks/useFormattedAudioBalance.ts | 7 +- .../src/hooks/useFormattedCoinBalance.ts | 4 +- packages/common/src/hooks/useGatedContent.ts | 4 +- packages/common/src/hooks/useIsCoinMember.ts | 14 +-- packages/common/src/messages/buySell.ts | 2 +- .../src/messages/coinDetailsMessages.ts | 2 +- .../common/src/messages/launchpadMessages.ts | 26 ++--- packages/common/src/messages/settings.ts | 2 +- .../common/src/messages/walletMessages.ts | 4 +- packages/common/src/models/Analytics.ts | 24 ++-- packages/common/src/models/ErrorReporting.ts | 2 +- packages/common/src/models/User.ts | 2 +- .../store/ui/buy-sell/hooks/useCoinData.ts | 2 +- .../src/store/ui/buy-sell/useBuySellSwap.ts | 26 ++--- .../src/store/ui/buy-sell/useCoinSwapForm.ts | 4 +- .../store/ui/buy-sell/utils/tokenLimits.ts | 8 +- packages/common/src/store/ui/index.ts | 2 +- .../modals/artist-coin-details-modal/index.ts | 17 --- .../ui/modals/fan-club-details-modal/index.ts | 17 +++ packages/common/src/store/ui/modals/index.ts | 2 +- .../common/src/store/ui/modals/parentSlice.ts | 2 +- .../common/src/store/ui/modals/reducers.ts | 4 +- packages/common/src/store/ui/modals/types.ts | 6 +- .../src/store/ui/shared/tokenConstants.ts | 2 +- packages/common/src/store/wallet/utils.ts | 2 +- packages/common/src/utils/route.ts | 16 +-- packages/common/src/utils/videoUtils.ts | 4 +- .../icons/{ArtistCoin.svg => FanClub.svg} | 0 .../harmony/src/foundations/color/semantic.ts | 6 +- packages/harmony/src/icons/icons.tsx | 2 +- .../src/icons/individual/IconArtistCoin.ts | 5 - .../src/icons/individual/IconFanClub.ts | 5 + packages/harmony/src/icons/utilityIcons.ts | 4 +- packages/mobile/src/app/Drawers.tsx | 4 +- .../src/components/comments/CommentBadge.tsx | 4 +- .../src/components/core/AccessTypeLabel.tsx | 4 +- .../src/components/core/BalanceSection.tsx | 9 +- .../mobile/src/components/core/DogEar.tsx | 4 +- .../details-tile/DetailsTileGatedAccess.tsx | 4 +- .../details-tile/DetailsTileHasAccess.tsx | 10 +- .../details-tile/DetailsTileNoAccess.tsx | 4 +- .../PriceAndAudienceField.tsx | 4 +- .../TokenGatedRadioField.tsx | 4 +- .../FanClubDetailsDrawer.tsx} | 100 ++++++++--------- .../LockedTextPostDrawer.tsx | 4 +- .../NavigationContainer.tsx | 4 +- .../ReceiveTokensDrawer.tsx | 2 +- .../components/SendTokensConfirmation.tsx | 9 +- .../components/SendTokensFailure.tsx | 9 +- .../components/SendTokensInput.tsx | 8 +- .../components/SendTokensSuccess.tsx | 9 +- .../track-details-tile/TrackDetailsTile.tsx | 4 +- .../src/components/user-badges/UserBadges.tsx | 22 ++-- .../src/components/user-link/UserLink.tsx | 6 +- .../harmony-native/foundations/color/color.ts | 20 ++-- packages/mobile/src/harmony-native/icons.tsx | 2 +- .../left-nav-drawer/ArtistCoinsNavItem.tsx | 19 ---- .../left-nav-drawer/FanClubsNavItem.tsx | 19 ++++ .../left-nav-drawer/LeftNavDrawer.tsx | 4 +- .../left-nav-drawer/nav-items/index.ts | 2 +- .../src/screens/app-screen/AppTabScreen.tsx | 15 +-- .../buy-sell-screen/components/BuyScreen.tsx | 19 ++-- .../components/ConvertScreen.tsx | 21 ++-- .../buy-sell-screen/components/SellScreen.tsx | 4 +- .../buy-sell-screen/useBuySellFlow.tsx | 6 +- .../chat-screen/ChatMessageListItem.tsx | 10 +- ...ArtistCoinHeader.tsx => FanClubHeader.tsx} | 12 +- .../coin-details-screen/CoinDetailsScreen.tsx | 4 +- .../EditCoinDetailsScreen.tsx | 8 +- .../components/BalanceCard.tsx | 4 +- .../components/CoinInfoCard.tsx | 6 +- .../components/CoinInsightsCard.tsx | 4 +- .../components/CoinInsightsOverflowMenu.tsx | 60 +++++----- .../components/CoinLeaderboardCard.tsx | 8 +- .../components/CoinTab.tsx | 4 +- .../components/FanClubTab.tsx | 10 +- .../components/PostUpdateCard.tsx | 4 +- .../components/TextPostCard.tsx | 4 +- .../coin-redeem-screen/CoinRedeemScreen.tsx | 4 +- .../ChatBlastSelectAudienceFields.tsx | 8 +- .../edit-profile-screen/EditProfileScreen.tsx | 38 +++---- ...rSelector.tsx => FanClubFlairSelector.tsx} | 16 +-- .../src/screens/edit-profile-screen/types.ts | 4 +- .../ExternalWalletsScreen.tsx | 2 +- .../FanClubSortScreen.tsx} | 22 ++-- .../FanClubExploreCard.tsx} | 16 +-- .../FanClubsExploreScreen.tsx} | 16 +-- .../FanClubTextPostNotification.tsx | 12 +- .../oauth-screen/PaymentFlowScreen.tsx | 8 +- ...istCoinButton.tsx => BuyFanClubButton.tsx} | 14 +-- .../ProfileHeader/ArtistProfilePicture.tsx | 12 +- .../ProfileHeader/ProfileHeader.tsx | 12 +- .../track-screen/TrackScreenDetailsTile.tsx | 8 +- .../CoinLeaderboardScreen.tsx | 6 +- .../wallet-screen/components/CoinCard.tsx | 4 +- .../wallet-screen/components/YourCoins.tsx | 26 ++--- packages/web/examples/README.md | 2 +- packages/web/examples/coin-gated/README.md | 2 +- packages/web/examples/coin-gated/src/App.tsx | 2 +- ...icy.pdf => FanClubAcceptableUsePolicy.pdf} | Bin .../{ArtistCoinTerms.pdf => FanClubTerms.pdf} | Bin packages/web/public/llms.txt | 2 +- packages/web/src/app/web-player/WebPlayer.tsx | 28 +++-- .../web/src/common/store/profile/sagas.js | 2 +- .../web/src/components/CoinSuccessModal.tsx | 2 +- .../access-type-label/AccessTypeLabel.tsx | 4 +- ...nchBanner.tsx => FanClubsLaunchBanner.tsx} | 9 +- .../components/buy-sell-modal/BuySellFlow.tsx | 6 +- .../src/components/buy-sell-modal/BuyTab.tsx | 23 ++-- .../components/buy-sell-modal/ConvertTab.tsx | 21 ++-- .../src/components/buy-sell-modal/SellTab.tsx | 7 +- .../components/StaticTokenDisplay.tsx | 2 +- .../src/components/comments/CommentBadge.tsx | 4 +- .../web/src/components/dog-ear/DogEar.tsx | 4 +- .../PriceAndAudienceField.tsx | 4 +- .../token-gated/TokenGatedRadioField.tsx | 8 +- ...CoinHoverCard.tsx => FanClubHoverCard.tsx} | 40 +++---- packages/web/src/components/link/UserLink.tsx | 6 +- .../src/components/nav/desktop/LeftNav.tsx | 4 +- ...stCoinsNavItem.tsx => FanClubsNavItem.tsx} | 6 +- .../components/nav/desktop/nav-items/index.ts | 2 +- .../nav/mobile/NavBarActionDrawer.tsx | 15 +-- .../FanClubTextPostNotification.tsx | 12 +- .../profile-picture/ProfilePicture.jsx | 8 +- .../ReceiveTokensModal.tsx | 11 +- .../SendTokensConfirmation.tsx | 9 +- .../send-tokens-modal/SendTokensFailure.tsx | 8 +- .../send-tokens-modal/SendTokensInput.tsx | 8 +- .../send-tokens-modal/SendTokensSuccess.tsx | 8 +- .../src/components/stat-banner/StatBanner.tsx | 4 +- .../web/src/components/track/CardTitle.tsx | 4 +- .../components/track/GatedContentSection.tsx | 18 +-- .../src/components/user-badges/UserBadges.tsx | 42 +++---- .../lists/CoinLeaderboardUserList.tsx | 4 +- packages/web/src/hooks/useClaimFees.ts | 10 +- packages/web/src/hooks/useClaimVestedCoins.ts | 12 +- .../src/hooks/useConnectExternalWallets.ts | 4 +- .../web/src/hooks/useExternalWalletSwap.ts | 77 +++++++------ packages/web/src/hooks/useLaunchCoin.ts | 14 +-- packages/web/src/hooks/useLaunchpadConfig.ts | 2 +- .../chat-page/components/ChatBlastModal.tsx | 8 +- .../components/ChatMessageListItem.tsx | 7 +- ...ArtistCoinHeader.tsx => FanClubHeader.tsx} | 12 +- .../pages/coin-redeem-page/CoinRedeemPage.tsx | 4 +- packages/web/src/pages/dev-tools/DevTools.tsx | 4 +- .../components/UserBankAddressDeriver.tsx | 4 +- .../EditCoinDetailsPage.tsx | 10 +- .../FanClubDetailPage.test.tsx | 62 +++++------ .../FanClubDetailPage.tsx | 4 +- .../MobileFanClubDetailContent.tsx | 4 +- .../components/ArtistFanClubDetailsModal.tsx | 105 ++++++++---------- .../components/BalanceSection.tsx | 4 +- .../components/ClaimVestedCoinsModal.tsx | 4 +- .../components/FanClubInfoSection.tsx | 18 +-- .../components/FanClubInsights.tsx | 4 +- .../FanClubInsightsOverflowMenu.tsx | 40 +++---- .../components/FanClubLeaderboardCard.tsx | 8 +- .../components/LockedTextPostModal.tsx | 8 +- .../components/PostUpdateCard.tsx | 4 +- .../components/TextPostCard.tsx | 4 +- .../mobile/ArtistFanClubDetailsPage.tsx | 36 +++--- .../FanClubsExplorePage.tsx} | 51 +++++---- .../MobileFanClubsExplorePage.module.css} | 0 .../MobileFanClubsExplorePage.tsx} | 26 +++-- .../LaunchpadPage.tsx | 36 +++--- .../components/AgreeToTerms.tsx | 12 +- .../components/CoinFormFields.tsx | 0 .../components/ConnectedWalletHeader.tsx | 0 .../components/FanClubCoinCard.tsx | 2 +- .../components/FanClubsSubmitRow.tsx} | 6 +- .../components/FanClubsTable.module.css} | 0 .../components/FanClubsTable.tsx} | 24 ++-- .../components/ImageUploadArea.tsx | 0 .../components/LaunchpadBuyModal.tsx | 0 .../components/LaunchpadModals.tsx | 7 +- .../components/SetupConfirmation.tsx | 0 .../components/StepHeader.tsx | 0 .../components/TokenInfoRow.tsx | 0 .../components/WalletSetupCard.tsx | 4 +- .../components/WhyCreateCard.tsx | 0 .../components/index.ts | 4 +- .../components/types.ts | 0 .../constants.ts | 2 +- .../index.ts | 0 .../pages/BuyCoinPage.tsx | 4 +- .../pages/ReviewPage.tsx | 8 +- .../pages/SetupPage.tsx | 6 +- .../pages/SplashPage.tsx | 0 .../pages/index.ts | 0 .../utils.ts | 0 .../validation.ts | 4 +- .../MobileFanClubsSortPage.tsx} | 16 +-- .../web/src/pages/oauth-pay-page/hooks.ts | 8 +- .../pages/profile-page/ProfilePage.test.tsx | 4 +- ...inFlairInput.tsx => FanClubFlairInput.tsx} | 16 +-- ...yArtistCoinCard.tsx => BuyFanClubCard.tsx} | 25 ++--- .../components/desktop/ProfileLeftNav.tsx | 34 +++--- .../components/desktop/ProfilePage.tsx | 8 +- ...istCoinButton.tsx => BuyFanClubButton.tsx} | 16 +-- .../components/mobile/ProfileHeader.tsx | 16 +-- .../src/pages/profile-page/useProfilePage.ts | 64 +++++------ .../desktop/FanClubsExploreSection.tsx | 6 +- .../components/desktop/SettingsPage.tsx | 6 +- .../components/mobile/TrackHeader.tsx | 4 +- .../components/WalletCoinsList.tsx | 32 +++--- packages/web/src/public-site/PublicSite.tsx | 19 ++-- .../FanClubAcceptableUsePage.module.css} | 0 .../FanClubAcceptableUsePage.tsx} | 22 ++-- .../FanClubTermsPage.module.css} | 0 .../FanClubTermsPage.tsx} | 20 ++-- packages/web/src/ssr/metaTags.ts | 6 +- .../fixtures/{artistCoins.ts => fanClubs.ts} | 20 ++-- packages/web/src/test/msw/mswMocks.ts | 14 +-- 241 files changed, 1289 insertions(+), 1367 deletions(-) rename packages/common/src/api/tan-query/batchers/{getArtistCoinsBatcher.ts => getFanClubsBatcher.ts} (95%) rename packages/common/src/api/tan-query/coins/{useArtistCreatedCoin.ts => useArtistCreatedFanClub.ts} (76%) rename packages/common/src/api/tan-query/coins/{useArtistCoin.ts => useFanClub.ts} (75%) rename packages/common/src/api/tan-query/coins/{useArtistCoinByTicker.ts => useFanClubByTicker.ts} (67%) rename packages/common/src/api/tan-query/coins/{useArtistCoinHoldersCount.ts => useFanClubHoldersCount.ts} (74%) rename packages/common/src/api/tan-query/coins/{useArtistCoinMembers.ts => useFanClubMembers.ts} (85%) rename packages/common/src/api/tan-query/coins/{useArtistCoinMembersCount.ts => useFanClubMembersCount.ts} (74%) rename packages/common/src/api/tan-query/coins/{useArtistCoins.ts => useFanClubs.ts} (82%) rename packages/common/src/api/tan-query/coins/{useUpdateArtistCoin.ts => useUpdateFanClub.ts} (84%) rename packages/common/src/hooks/{useArtistCoinMessageHeader.ts => useFanClubMessageHeader.ts} (63%) delete mode 100644 packages/common/src/store/ui/modals/artist-coin-details-modal/index.ts create mode 100644 packages/common/src/store/ui/modals/fan-club-details-modal/index.ts rename packages/harmony/src/assets/icons/{ArtistCoin.svg => FanClub.svg} (100%) delete mode 100644 packages/harmony/src/icons/individual/IconArtistCoin.ts create mode 100644 packages/harmony/src/icons/individual/IconFanClub.ts rename packages/mobile/src/components/{artist-coin-details-drawer/ArtistCoinDetailsDrawer.tsx => fan-club-details-drawer/FanClubDetailsDrawer.tsx} (77%) delete mode 100644 packages/mobile/src/screens/app-drawer-screen/left-nav-drawer/ArtistCoinsNavItem.tsx create mode 100644 packages/mobile/src/screens/app-drawer-screen/left-nav-drawer/FanClubsNavItem.tsx rename packages/mobile/src/screens/chat-screen/{ArtistCoinHeader.tsx => FanClubHeader.tsx} (79%) rename packages/mobile/src/screens/edit-profile-screen/{ArtistCoinFlairSelector.tsx => FanClubFlairSelector.tsx} (92%) rename packages/mobile/src/screens/{artist-coin-sort-screen/ArtistCoinSortScreen.tsx => fan-club-sort-screen/FanClubSortScreen.tsx} (84%) rename packages/mobile/src/screens/{artist-coins-explore-screen/ArtistCoinExploreCard.tsx => fan-clubs-explore-screen/FanClubExploreCard.tsx} (95%) rename packages/mobile/src/screens/{artist-coins-explore-screen/ArtistCoinsExploreScreen.tsx => fan-clubs-explore-screen/FanClubsExploreScreen.tsx} (97%) rename packages/mobile/src/screens/profile-screen/{BuyArtistCoinButton.tsx => BuyFanClubButton.tsx} (66%) rename packages/web/public/documents/{ArtistCoinAcceptableUsePolicy.pdf => FanClubAcceptableUsePolicy.pdf} (100%) rename packages/web/public/documents/{ArtistCoinTerms.pdf => FanClubTerms.pdf} (100%) rename packages/web/src/components/banner/{ArtistCoinsLaunchBanner.tsx => FanClubsLaunchBanner.tsx} (82%) rename packages/web/src/components/hover-card/{ArtistCoinHoverCard.tsx => FanClubHoverCard.tsx} (80%) rename packages/web/src/components/nav/desktop/nav-items/{ArtistCoinsNavItem.tsx => FanClubsNavItem.tsx} (74%) rename packages/web/src/pages/chat-page/components/{ArtistCoinHeader.tsx => FanClubHeader.tsx} (74%) rename packages/web/src/pages/{artist-coins-explore-page/ArtistCoinsExplorePage.tsx => fan-clubs-explore-page/FanClubsExplorePage.tsx} (88%) rename packages/web/src/pages/{artist-coins-explore-page/MobileArtistCoinsExplorePage.module.css => fan-clubs-explore-page/MobileFanClubsExplorePage.module.css} (100%) rename packages/web/src/pages/{artist-coins-explore-page/MobileArtistCoinsExplorePage.tsx => fan-clubs-explore-page/MobileFanClubsExplorePage.tsx} (91%) rename packages/web/src/pages/{artist-coins-launchpad-page => fan-clubs-launchpad-page}/LaunchpadPage.tsx (96%) rename packages/web/src/pages/{artist-coins-launchpad-page => fan-clubs-launchpad-page}/components/AgreeToTerms.tsx (79%) rename packages/web/src/pages/{artist-coins-launchpad-page => fan-clubs-launchpad-page}/components/CoinFormFields.tsx (100%) rename packages/web/src/pages/{artist-coins-launchpad-page => fan-clubs-launchpad-page}/components/ConnectedWalletHeader.tsx (100%) rename packages/web/src/pages/{artist-coins-launchpad-page => fan-clubs-launchpad-page}/components/FanClubCoinCard.tsx (99%) rename packages/web/src/pages/{artist-coins-launchpad-page/components/ArtistCoinsSubmitRow.tsx => fan-clubs-launchpad-page/components/FanClubsSubmitRow.tsx} (96%) rename packages/web/src/pages/{artist-coins-launchpad-page/components/ArtistCoinsTable.module.css => fan-clubs-launchpad-page/components/FanClubsTable.module.css} (100%) rename packages/web/src/pages/{artist-coins-launchpad-page/components/ArtistCoinsTable.tsx => fan-clubs-launchpad-page/components/FanClubsTable.tsx} (96%) rename packages/web/src/pages/{artist-coins-launchpad-page => fan-clubs-launchpad-page}/components/ImageUploadArea.tsx (100%) rename packages/web/src/pages/{artist-coins-launchpad-page => fan-clubs-launchpad-page}/components/LaunchpadBuyModal.tsx (100%) rename packages/web/src/pages/{artist-coins-launchpad-page => fan-clubs-launchpad-page}/components/LaunchpadModals.tsx (97%) rename packages/web/src/pages/{artist-coins-launchpad-page => fan-clubs-launchpad-page}/components/SetupConfirmation.tsx (100%) rename packages/web/src/pages/{artist-coins-launchpad-page => fan-clubs-launchpad-page}/components/StepHeader.tsx (100%) rename packages/web/src/pages/{artist-coins-launchpad-page => fan-clubs-launchpad-page}/components/TokenInfoRow.tsx (100%) rename packages/web/src/pages/{artist-coins-launchpad-page => fan-clubs-launchpad-page}/components/WalletSetupCard.tsx (94%) rename packages/web/src/pages/{artist-coins-launchpad-page => fan-clubs-launchpad-page}/components/WhyCreateCard.tsx (100%) rename packages/web/src/pages/{artist-coins-launchpad-page => fan-clubs-launchpad-page}/components/index.ts (75%) rename packages/web/src/pages/{artist-coins-launchpad-page => fan-clubs-launchpad-page}/components/types.ts (100%) rename packages/web/src/pages/{artist-coins-launchpad-page => fan-clubs-launchpad-page}/constants.ts (75%) rename packages/web/src/pages/{artist-coins-launchpad-page => fan-clubs-launchpad-page}/index.ts (100%) rename packages/web/src/pages/{artist-coins-launchpad-page => fan-clubs-launchpad-page}/pages/BuyCoinPage.tsx (99%) rename packages/web/src/pages/{artist-coins-launchpad-page => fan-clubs-launchpad-page}/pages/ReviewPage.tsx (98%) rename packages/web/src/pages/{artist-coins-launchpad-page => fan-clubs-launchpad-page}/pages/SetupPage.tsx (97%) rename packages/web/src/pages/{artist-coins-launchpad-page => fan-clubs-launchpad-page}/pages/SplashPage.tsx (100%) rename packages/web/src/pages/{artist-coins-launchpad-page => fan-clubs-launchpad-page}/pages/index.ts (100%) rename packages/web/src/pages/{artist-coins-launchpad-page => fan-clubs-launchpad-page}/utils.ts (100%) rename packages/web/src/pages/{artist-coins-launchpad-page => fan-clubs-launchpad-page}/validation.ts (98%) rename packages/web/src/pages/{artist-coins-sort-page/MobileArtistCoinsSortPage.tsx => fan-clubs-sort-page/MobileFanClubsSortPage.tsx} (90%) rename packages/web/src/pages/profile-page/components/{ArtistCoinFlairInput.tsx => FanClubFlairInput.tsx} (94%) rename packages/web/src/pages/profile-page/components/desktop/{BuyArtistCoinCard.tsx => BuyFanClubCard.tsx} (64%) rename packages/web/src/pages/profile-page/components/mobile/{BuyArtistCoinButton.tsx => BuyFanClubButton.tsx} (56%) rename packages/web/src/public-site/pages/{artist-coin-acceptable-use-page/ArtistCoinAcceptableUsePage.module.css => fan-club-acceptable-use-page/FanClubAcceptableUsePage.module.css} (100%) rename packages/web/src/public-site/pages/{artist-coin-acceptable-use-page/ArtistCoinAcceptableUsePage.tsx => fan-club-acceptable-use-page/FanClubAcceptableUsePage.tsx} (65%) rename packages/web/src/public-site/pages/{artist-coin-terms-page/ArtistCoinTermsPage.module.css => fan-club-terms-page/FanClubTermsPage.module.css} (100%) rename packages/web/src/public-site/pages/{artist-coin-terms-page/ArtistCoinTermsPage.tsx => fan-club-terms-page/FanClubTermsPage.tsx} (68%) rename packages/web/src/test/mocks/fixtures/{artistCoins.ts => fanClubs.ts} (93%) diff --git a/packages/common/src/adapters/user.ts b/packages/common/src/adapters/user.ts index 2a18a49464a..8f4b0da754d 100644 --- a/packages/common/src/adapters/user.ts +++ b/packages/common/src/adapters/user.ts @@ -103,8 +103,8 @@ export const userMetadataFromSDK = (input: User): UserMetadata | undefined => { location: input.location ?? null, profile_picture_sizes: input.profilePictureSizes ?? null, - // Explicit handling for artist_coin_badge to convert nested logoUri to logo_uri - artist_coin_badge: input.artistCoinBadge + // Explicit handling for fan_club_badge to convert nested logoUri to logo_uri + fan_club_badge: input.artistCoinBadge ? { mint: input.artistCoinBadge.mint ?? '', logo_uri: input.artistCoinBadge.logoUri ?? '', diff --git a/packages/common/src/api/tan-query/batchers/getArtistCoinsBatcher.ts b/packages/common/src/api/tan-query/batchers/getFanClubsBatcher.ts similarity index 95% rename from packages/common/src/api/tan-query/batchers/getArtistCoinsBatcher.ts rename to packages/common/src/api/tan-query/batchers/getFanClubsBatcher.ts index b69b236954d..aed1f87bd40 100644 --- a/packages/common/src/api/tan-query/batchers/getArtistCoinsBatcher.ts +++ b/packages/common/src/api/tan-query/batchers/getFanClubsBatcher.ts @@ -7,7 +7,7 @@ import { QUERY_KEYS } from '../queryKeys' import { contextCacheResolver } from './contextCacheResolver' import { BatchContext } from './types' -export const getArtistCoinsBatcher = memoize( +export const getFanClubsBatcher = memoize( (context: BatchContext) => create({ fetcher: async (mints: string[]): Promise => { diff --git a/packages/common/src/api/tan-query/coins/index.ts b/packages/common/src/api/tan-query/coins/index.ts index dfb4600e396..d7099ae4ab6 100644 --- a/packages/common/src/api/tan-query/coins/index.ts +++ b/packages/common/src/api/tan-query/coins/index.ts @@ -1,11 +1,11 @@ // Coins -export * from './useArtistCoin' -export * from './useArtistCoinByTicker' -export * from './useArtistCoinMembers' -export * from './useArtistCoinHoldersCount' -export * from './useArtistCoinMembersCount' -export * from './useArtistCoins' -export * from './useArtistCreatedCoin' +export * from './useFanClub' +export * from './useFanClubByTicker' +export * from './useFanClubMembers' +export * from './useFanClubHoldersCount' +export * from './useFanClubMembersCount' +export * from './useFanClubs' +export * from './useArtistCreatedFanClub' export * from './useCoinGeckoCoin' export * from './useCoinPair' export * from './useCoinRedeemAmount' @@ -14,7 +14,7 @@ export * from './useRedeemCoin' export * from './useRedeemCoinCode' export * from './useFirstBuyQuote' export * from './useTradeableCoins' -export * from './useUpdateArtistCoin' +export * from './useUpdateFanClub' export * from './useUserCoin' export * from './useUserCoins' export * from './useWalletCoins' diff --git a/packages/common/src/api/tan-query/coins/tokenUtils.ts b/packages/common/src/api/tan-query/coins/tokenUtils.ts index aa53bc229fd..7ecf76ccd8c 100644 --- a/packages/common/src/api/tan-query/coins/tokenUtils.ts +++ b/packages/common/src/api/tan-query/coins/tokenUtils.ts @@ -14,17 +14,17 @@ const coinMetadataToTokenInfo = (coin: CoinMetadata): CoinInfo => ({ isStablecoin: false // API tokens are never stablecoins, only USDC is (which is frontend-only) }) -export const transformArtistCoinToTokenInfo = (artistCoin: Coin): CoinInfo => { - const coinMetadata = coinMetadataFromCoin(artistCoin) +export const transformFanClubToTokenInfo = (fanClub: Coin): CoinInfo => { + const coinMetadata = coinMetadataFromCoin(fanClub) return coinMetadataToTokenInfo(coinMetadata) } -export const transformArtistCoinsToTokenInfoMap = ( - artistCoins: Coin[] +export const transformFanClubsToTokenInfoMap = ( + fanClubs: Coin[] ): Record => { const tokenMap: Record = {} - artistCoins.forEach((coin) => { + fanClubs.forEach((coin) => { const coinMetadata = coinMetadataFromCoin(coin) const ticker = coinMetadata.ticker || '' if (ticker) { diff --git a/packages/common/src/api/tan-query/coins/useArtistCreatedCoin.ts b/packages/common/src/api/tan-query/coins/useArtistCreatedFanClub.ts similarity index 76% rename from packages/common/src/api/tan-query/coins/useArtistCreatedCoin.ts rename to packages/common/src/api/tan-query/coins/useArtistCreatedFanClub.ts index a5e137d2192..4848b8b9441 100644 --- a/packages/common/src/api/tan-query/coins/useArtistCreatedCoin.ts +++ b/packages/common/src/api/tan-query/coins/useArtistCreatedFanClub.ts @@ -8,12 +8,13 @@ import { QUERY_KEYS } from '../queryKeys' import { QueryKey, SelectableQueryOptions } from '../types' import { useQueryContext } from '../utils/QueryContext' -import { getArtistCoinQueryKey } from './useArtistCoin' +import { getFanClubQueryKey } from './useFanClub' -export const getArtistCreatedCoinQueryKey = (ownerId: ID | null | undefined) => - [QUERY_KEYS.coins, 'created', ownerId] as unknown as QueryKey +export const getArtistCreatedFanClubQueryKey = ( + ownerId: ID | null | undefined +) => [QUERY_KEYS.coins, 'created', ownerId] as unknown as QueryKey -export const useArtistCreatedCoin = ( +export const useArtistCreatedFanClub = ( ownerId: ID | null | undefined, options?: SelectableQueryOptions ) => { @@ -21,7 +22,7 @@ export const useArtistCreatedCoin = ( const queryClient = useQueryClient() return useQuery({ - queryKey: getArtistCreatedCoinQueryKey(ownerId), + queryKey: getArtistCreatedFanClubQueryKey(ownerId), queryFn: async () => { if (!ownerId) { return null @@ -43,7 +44,7 @@ export const useArtistCreatedCoin = ( if (parsedCoins && parsedCoins.length > 0) { const coin = parsedCoins[0] // Get the first (and only) coin if (coin.mint) { - queryClient.setQueryData(getArtistCoinQueryKey(coin.mint), coin) + queryClient.setQueryData(getFanClubQueryKey(coin.mint), coin) } return coin } diff --git a/packages/common/src/api/tan-query/coins/useArtistCoin.ts b/packages/common/src/api/tan-query/coins/useFanClub.ts similarity index 75% rename from packages/common/src/api/tan-query/coins/useArtistCoin.ts rename to packages/common/src/api/tan-query/coins/useFanClub.ts index cd186d8c040..636f36ceffb 100644 --- a/packages/common/src/api/tan-query/coins/useArtistCoin.ts +++ b/packages/common/src/api/tan-query/coins/useFanClub.ts @@ -4,25 +4,25 @@ import { AnyAction, Dispatch } from 'redux' import { coinFromSdk, Coin } from '~/adapters/coin' -import { getArtistCoinsBatcher } from '../batchers/getArtistCoinsBatcher' +import { getFanClubsBatcher } from '../batchers/getFanClubsBatcher' import { QUERY_KEYS } from '../queryKeys' import { QueryKey, SelectableQueryOptions } from '../types' import { useQueryContext } from '../utils' import { entityCacheOptions } from '../utils/entityCacheOptions' -export const getArtistCoinQueryKey = (mint: string | null | undefined) => +export const getFanClubQueryKey = (mint: string | null | undefined) => [QUERY_KEYS.coin, mint] as unknown as QueryKey -export const getArtistCoinByTickerQueryKey = (ticker: string) => +export const getFanClubByTickerQueryKey = (ticker: string) => [QUERY_KEYS.coinByTicker, ticker] as unknown as QueryKey -export const getArtistCoinQueryFn = async ( +export const getFanClubQueryFn = async ( mint: string, queryClient: QueryClient, sdk: any, dispatch: Dispatch ) => { - const batchGetCoins = getArtistCoinsBatcher({ + const batchGetCoins = getFanClubsBatcher({ sdk, currentUserId: null, queryClient, @@ -32,7 +32,7 @@ export const getArtistCoinQueryFn = async ( return coins } -export const useArtistCoin = ( +export const useFanClub = ( mint: string | null | undefined, options?: SelectableQueryOptions ) => { @@ -41,9 +41,9 @@ export const useArtistCoin = ( const queryClient = useQueryClient() return useQuery({ - queryKey: getArtistCoinQueryKey(mint), + queryKey: getFanClubQueryKey(mint), queryFn: async () => { - const coin = await getArtistCoinQueryFn( + const coin = await getFanClubQueryFn( mint!, queryClient, await audiusSdk(), @@ -55,7 +55,7 @@ export const useArtistCoin = ( // Prime the ticker query key if we have coin data with ticker if (parsedCoin?.ticker) { queryClient.setQueryData( - getArtistCoinByTickerQueryKey(parsedCoin.ticker), + getFanClubByTickerQueryKey(parsedCoin.ticker), parsedCoin.mint ) } diff --git a/packages/common/src/api/tan-query/coins/useArtistCoinByTicker.ts b/packages/common/src/api/tan-query/coins/useFanClubByTicker.ts similarity index 67% rename from packages/common/src/api/tan-query/coins/useArtistCoinByTicker.ts rename to packages/common/src/api/tan-query/coins/useFanClubByTicker.ts index 2b84906916e..780c55c82d9 100644 --- a/packages/common/src/api/tan-query/coins/useArtistCoinByTicker.ts +++ b/packages/common/src/api/tan-query/coins/useFanClubByTicker.ts @@ -15,7 +15,7 @@ import { formatTicker } from '~/utils' import { QUERY_KEYS } from '../queryKeys' import { combineQueryStatuses } from '../utils' -import { useArtistCoin, getArtistCoinQueryKey } from './useArtistCoin' +import { useFanClub, getFanClubQueryKey } from './useFanClub' /** * Function to check if a coin ticker is available for use. @@ -46,24 +46,22 @@ export const fetchCoinTickerAvailability = async ( } } -export interface UseArtistCoinByTickerParams { +export interface UseFanClubByTickerParams { ticker: string } -const getArtistCoinByTickerQueryKey = (ticker: string) => +const getFanClubByTickerQueryKey = (ticker: string) => [QUERY_KEYS.coinByTicker, ticker] as const -type FetchArtistCoinByTickerContext = Pick & { +type FetchFanClubByTickerContext = Pick & { queryClient: any } -const getArtistCoinByTickerQueryFn = - (context: FetchArtistCoinByTickerContext) => +const getFanClubByTickerQueryFn = + (context: FetchFanClubByTickerContext) => async ({ queryKey - }: QueryFunctionContext< - ReturnType - >) => { + }: QueryFunctionContext>) => { const [_ignored, ticker] = queryKey const { audiusSdk } = context const sdk = await audiusSdk() @@ -73,45 +71,45 @@ const getArtistCoinByTickerQueryFn = }) const coin = coinFromSdk(response.data) - // Prime the artist coin query key if we have the mint + // Prime the fan club query key if we have the mint if (coin?.mint) { - context.queryClient.setQueryData(getArtistCoinQueryKey(coin.mint), coin) + context.queryClient.setQueryData(getFanClubQueryKey(coin.mint), coin) } return coin?.mint } /** - * Helper function to get the query options for fetching an artist coin by ticker. + * Helper function to get the query options for fetching an fan club by ticker. * Useful for getting the query key tagged with the data type stored in the cache. */ -export const getArtistCoinByTickerOptions = ( - context: FetchArtistCoinByTickerContext, - { ticker }: UseArtistCoinByTickerParams +export const getFanClubByTickerOptions = ( + context: FetchFanClubByTickerContext, + { ticker }: UseFanClubByTickerParams ) => { return queryOptions({ - queryKey: getArtistCoinByTickerQueryKey(formatTicker(ticker)), - queryFn: getArtistCoinByTickerQueryFn(context), + queryKey: getFanClubByTickerQueryKey(formatTicker(ticker)), + queryFn: getFanClubByTickerQueryFn(context), enabled: !!ticker }) } -export const useArtistCoinByTicker = ( - params: UseArtistCoinByTickerParams, - options?: Partial> +export const useFanClubByTicker = ( + params: UseFanClubByTickerParams, + options?: Partial> ) => { const context = useQueryContext() const queryClient = useQueryClient() const mintQuery = useQuery({ ...options, - ...getArtistCoinByTickerOptions( + ...getFanClubByTickerOptions( { ...context, queryClient }, { ...params, ticker: formatTicker(params.ticker) } ) }) - const coinQuery = useArtistCoin(mintQuery.data!) + const coinQuery = useFanClub(mintQuery.data!) // Return the coin query result, but surface errors from the mint lookup return { diff --git a/packages/common/src/api/tan-query/coins/useArtistCoinHoldersCount.ts b/packages/common/src/api/tan-query/coins/useFanClubHoldersCount.ts similarity index 74% rename from packages/common/src/api/tan-query/coins/useArtistCoinHoldersCount.ts rename to packages/common/src/api/tan-query/coins/useFanClubHoldersCount.ts index 12abb6b2078..0b0eeee5131 100644 --- a/packages/common/src/api/tan-query/coins/useArtistCoinHoldersCount.ts +++ b/packages/common/src/api/tan-query/coins/useFanClubHoldersCount.ts @@ -6,20 +6,15 @@ import { QueryKey, QueryOptions } from '../types' import { useCurrentUserId } from '../users/account/useCurrentUserId' import { useQueryContext } from '../utils/QueryContext' -export const getArtistCoinHoldersCountQueryKey = ( - currentUserId?: number | null -) => - [ - QUERY_KEYS.artistCoinHoldersCount, - currentUserId - ] as unknown as QueryKey - -export const useArtistCoinHoldersCount = (options?: QueryOptions) => { +export const getFanClubHoldersCountQueryKey = (currentUserId?: number | null) => + [QUERY_KEYS.fanClubHoldersCount, currentUserId] as unknown as QueryKey + +export const useFanClubHoldersCount = (options?: QueryOptions) => { const { audiusSdk } = useQueryContext() const { data: currentUserId } = useCurrentUserId() return useQuery({ - queryKey: getArtistCoinHoldersCountQueryKey(currentUserId), + queryKey: getFanClubHoldersCountQueryKey(currentUserId), queryFn: async () => { const sdk = await audiusSdk() if (!currentUserId) return 0 diff --git a/packages/common/src/api/tan-query/coins/useArtistCoinMembers.ts b/packages/common/src/api/tan-query/coins/useFanClubMembers.ts similarity index 85% rename from packages/common/src/api/tan-query/coins/useArtistCoinMembers.ts rename to packages/common/src/api/tan-query/coins/useFanClubMembers.ts index 794f3f6bfc2..81d2fbe4182 100644 --- a/packages/common/src/api/tan-query/coins/useArtistCoinMembers.ts +++ b/packages/common/src/api/tan-query/coins/useFanClubMembers.ts @@ -13,7 +13,7 @@ import { formatNumberCommas } from '~/utils' import { QUERY_KEYS } from '../queryKeys' import { QueryKey } from '../types' -import { useArtistCoin } from './useArtistCoin' +import { useFanClub } from './useFanClub' const DEFAULT_PAGE_SIZE = 20 @@ -23,7 +23,7 @@ export interface CoinMember { balanceLocaleString: string } -export interface UseArtistCoinMembersArgs { +export interface UseFanClubMembersArgs { mint: string | null pageSize?: number minBalance?: number @@ -37,20 +37,20 @@ export const getCoinLeaderboardQueryKey = ( sortDirection?: 'asc' | 'desc' ) => [ - QUERY_KEYS.artistCoinMembers, + QUERY_KEYS.fanClubMembers, mint, pageSize, minBalance, sortDirection ] as unknown as QueryKey> -export const useArtistCoinMembers = ( +export const useFanClubMembers = ( { mint, pageSize = DEFAULT_PAGE_SIZE, minBalance, sortDirection = 'desc' - }: UseArtistCoinMembersArgs, + }: UseFanClubMembersArgs, options?: Pick< UseInfiniteQueryOptions, 'select' | 'enabled' @@ -58,7 +58,7 @@ export const useArtistCoinMembers = ( ) => { const { audiusSdk } = useQueryContext() - const { data: artistCoin } = useArtistCoin(mint) + const { data: fanClub } = useFanClub(mint) return useInfiniteQuery({ queryKey: getCoinLeaderboardQueryKey( @@ -74,7 +74,7 @@ export const useArtistCoinMembers = ( }, queryFn: async ({ pageParam }) => { if (!mint) return [] - if (!artistCoin) return [] + if (!fanClub) return [] const sdk = await audiusSdk() @@ -88,7 +88,7 @@ export const useArtistCoinMembers = ( const response = await sdk.coins.getCoinMembers(params) const members = (response.data ?? []).map((member) => { - const decimals = artistCoin.decimals + const decimals = fanClub.decimals const balanceFD = new FixedDecimal( BigInt(member.balance.toString()), decimals @@ -110,6 +110,6 @@ export const useArtistCoinMembers = ( return members }, select: options?.select ?? ((data) => data.pages.flat() as TResult), - enabled: options?.enabled !== false && !!mint && !!artistCoin + enabled: options?.enabled !== false && !!mint && !!fanClub }) } diff --git a/packages/common/src/api/tan-query/coins/useArtistCoinMembersCount.ts b/packages/common/src/api/tan-query/coins/useFanClubMembersCount.ts similarity index 74% rename from packages/common/src/api/tan-query/coins/useArtistCoinMembersCount.ts rename to packages/common/src/api/tan-query/coins/useFanClubMembersCount.ts index a53f3e279f7..d8b6d4fd63a 100644 --- a/packages/common/src/api/tan-query/coins/useArtistCoinMembersCount.ts +++ b/packages/common/src/api/tan-query/coins/useFanClubMembersCount.ts @@ -4,18 +4,18 @@ import { QUERY_KEYS } from '../queryKeys' import { QueryKey, QueryOptions } from '../types' import { useQueryContext } from '../utils/QueryContext' -export const getArtistCoinMembersCountQueryKey = ( +export const getFanClubMembersCountQueryKey = ( mint: string | null | undefined -) => [QUERY_KEYS.artistCoinMembersCount, mint] as unknown as QueryKey +) => [QUERY_KEYS.fanClubMembersCount, mint] as unknown as QueryKey -export const useArtistCoinMembersCount = ( +export const useFanClubMembersCount = ( { mint }: { mint: string | null | undefined }, options?: QueryOptions ) => { const { audiusSdk } = useQueryContext() return useQuery({ - queryKey: getArtistCoinMembersCountQueryKey(mint), + queryKey: getFanClubMembersCountQueryKey(mint), queryFn: async () => { const sdk = await audiusSdk() if (!mint) return 0 diff --git a/packages/common/src/api/tan-query/coins/useArtistCoins.ts b/packages/common/src/api/tan-query/coins/useFanClubs.ts similarity index 82% rename from packages/common/src/api/tan-query/coins/useArtistCoins.ts rename to packages/common/src/api/tan-query/coins/useFanClubs.ts index b177792f34d..6bf50544c7b 100644 --- a/packages/common/src/api/tan-query/coins/useArtistCoins.ts +++ b/packages/common/src/api/tan-query/coins/useFanClubs.ts @@ -13,9 +13,9 @@ import { QUERY_KEYS } from '../queryKeys' import { QueryKey, SelectableQueryOptions } from '../types' import { useQueryContext } from '../utils/QueryContext' -import { getArtistCoinQueryKey } from './useArtistCoin' +import { getFanClubQueryKey } from './useFanClub' -export type UseArtistCoinsListParams = { +export type UseFanClubsListParams = { limit?: number offset?: number sortMethod?: GetCoinsSortMethodEnum @@ -25,18 +25,18 @@ export type UseArtistCoinsListParams = { const DEFAULT_PAGE_SIZE = 25 -export const getArtistCoinsListQueryKey = (params?: UseArtistCoinsListParams) => +export const getFanClubsListQueryKey = (params?: UseFanClubsListParams) => [QUERY_KEYS.coins, 'list', params] as unknown as QueryKey -export const useArtistCoinsList = ( - params: UseArtistCoinsListParams = {}, +export const useFanClubsList = ( + params: UseFanClubsListParams = {}, options?: SelectableQueryOptions ) => { const { audiusSdk } = useQueryContext() const queryClient = useQueryClient() return useQuery({ - queryKey: getArtistCoinsListQueryKey(params), + queryKey: getFanClubsListQueryKey(params), queryFn: async () => { const sdk = await audiusSdk() @@ -55,7 +55,7 @@ export const useArtistCoinsList = ( if (parsedCoins) { parsedCoins.forEach((coin) => { if (coin.mint) { - queryClient.setQueryData(getArtistCoinQueryKey(coin.mint), coin) + queryClient.setQueryData(getFanClubQueryKey(coin.mint), coin) } }) } @@ -67,20 +67,20 @@ export const useArtistCoinsList = ( }) } -export type UseArtistCoinsParams = { +export type UseFanClubsParams = { pageSize?: number sortMethod?: GetCoinsSortMethodEnum sortDirection?: GetCoinsSortDirectionEnum query?: string } -export const getArtistCoinsQueryKey = (params?: UseArtistCoinsParams) => +export const getFanClubsQueryKey = (params?: UseFanClubsParams) => [QUERY_KEYS.coins, params] as unknown as QueryKey< InfiniteData > -export const useArtistCoins = ( - params: UseArtistCoinsParams = {}, +export const useFanClubs = ( + params: UseFanClubsParams = {}, options?: Omit< UseInfiniteQueryOptions< Coin[], @@ -98,7 +98,7 @@ export const useArtistCoins = ( const pageSize = params.pageSize ?? DEFAULT_PAGE_SIZE return useInfiniteQuery({ - queryKey: getArtistCoinsQueryKey(params), + queryKey: getFanClubsQueryKey(params), queryFn: async ({ pageParam = 0 }) => { const sdk = await audiusSdk() @@ -117,7 +117,7 @@ export const useArtistCoins = ( if (parsedCoins) { parsedCoins.forEach((coin) => { if (coin.mint) { - queryClient.setQueryData(getArtistCoinQueryKey(coin.mint), coin) + queryClient.setQueryData(getFanClubQueryKey(coin.mint), coin) } }) } diff --git a/packages/common/src/api/tan-query/coins/useRedeemCoin.ts b/packages/common/src/api/tan-query/coins/useRedeemCoin.ts index 10dbcdbf519..49ce0e9aab9 100644 --- a/packages/common/src/api/tan-query/coins/useRedeemCoin.ts +++ b/packages/common/src/api/tan-query/coins/useRedeemCoin.ts @@ -8,7 +8,7 @@ import { QUERY_KEYS } from '../queryKeys' import { useCurrentUserId } from '../users/account/useCurrentUserId' import { useQueryContext } from '../utils/QueryContext' -import { getArtistCoinQueryKey } from './useArtistCoin' +import { getFanClubQueryKey } from './useFanClub' type RedeemCoinParams = { mint: string @@ -41,10 +41,10 @@ export const useRedeemCoin = () => { queryKey: [QUERY_KEYS.userCoins] }) queryClient.invalidateQueries({ - queryKey: [QUERY_KEYS.artistCoinMembers, mint] + queryKey: [QUERY_KEYS.fanClubMembers, mint] }) queryClient.invalidateQueries({ - queryKey: getArtistCoinQueryKey(mint) + queryKey: getFanClubQueryKey(mint) }) }, onError: (error: Error, args, _context) => { @@ -52,7 +52,7 @@ export const useRedeemCoin = () => { error, additionalInfo: args, name: 'RedeemCoin', - feature: Feature.ArtistCoins + feature: Feature.FanClubs }) // Toast generic error message diff --git a/packages/common/src/api/tan-query/coins/useRedeemCoinCode.ts b/packages/common/src/api/tan-query/coins/useRedeemCoinCode.ts index 0c6910e54ec..e3c68c6b191 100644 --- a/packages/common/src/api/tan-query/coins/useRedeemCoinCode.ts +++ b/packages/common/src/api/tan-query/coins/useRedeemCoinCode.ts @@ -8,7 +8,7 @@ import { QUERY_KEYS } from '../queryKeys' import { useCurrentUserId } from '../users/account/useCurrentUserId' import { useQueryContext } from '../utils/QueryContext' -import { getArtistCoinQueryKey } from './useArtistCoin' +import { getFanClubQueryKey } from './useFanClub' type RedeemCoinCodeParams = { mint: string @@ -43,10 +43,10 @@ export const useRedeemCoinCode = () => { queryKey: [QUERY_KEYS.userCoins] }) queryClient.invalidateQueries({ - queryKey: [QUERY_KEYS.artistCoinMembers, mint] + queryKey: [QUERY_KEYS.fanClubMembers, mint] }) queryClient.invalidateQueries({ - queryKey: getArtistCoinQueryKey(mint) + queryKey: getFanClubQueryKey(mint) }) }, onError: (error: Error, args, _context) => { @@ -54,7 +54,7 @@ export const useRedeemCoinCode = () => { error, additionalInfo: args, name: 'RedeemCoinCode', - feature: Feature.ArtistCoins + feature: Feature.FanClubs }) // TODO: Should 'Please try again' be added to the end of the message? diff --git a/packages/common/src/api/tan-query/coins/useTradeableCoins.ts b/packages/common/src/api/tan-query/coins/useTradeableCoins.ts index c1b009a8f13..095fcc3f1cd 100644 --- a/packages/common/src/api/tan-query/coins/useTradeableCoins.ts +++ b/packages/common/src/api/tan-query/coins/useTradeableCoins.ts @@ -2,14 +2,14 @@ import { useMemo } from 'react' import type { InfiniteData } from '@tanstack/react-query' -import { transformArtistCoinsToTokenInfoMap, useQueryContext } from '~/api' +import { transformFanClubsToTokenInfoMap, useQueryContext } from '~/api' import { CoinInfo, TOKEN_LISTING_MAP } from '~/store' import type { Coin } from '../../../adapters/coin' -import { useArtistCoins } from './useArtistCoins' +import { useFanClubs } from './useFanClubs' -export const TEMP_ARTIST_COINS_PAGE_SIZE = 100 +export const TEMP_FAN_CLUBS_PAGE_SIZE = 100 export type TradeableCoinsContext = 'pay' | 'receive' | 'all' @@ -41,18 +41,18 @@ export const useTradeableCoins = ( const { env } = useQueryContext() const { - data: artistCoins = [], + data: fanClubs = [], isPending, error - } = useArtistCoins( - { pageSize: TEMP_ARTIST_COINS_PAGE_SIZE }, + } = useFanClubs( + { pageSize: TEMP_FAN_CLUBS_PAGE_SIZE }, { select: (data: InfiniteData) => { // First flatten the pages const coins = data.pages.flat() // Transform to CoinInfo map - const coinsMap = transformArtistCoinsToTokenInfoMap(coins) + const coinsMap = transformFanClubsToTokenInfoMap(coins) // Add USDC manually since it's frontend-only and not from API coinsMap.USDC = { @@ -91,7 +91,7 @@ export const useTradeableCoins = ( } if (context === 'pay') { - // For pay context, filter out USDC (users pay with artist coins) + // For pay context, filter out USDC (users pay with fan clubs) coinsArray = coinsArray.filter((coin) => coin.symbol !== 'USDC') } return coinsArray @@ -100,19 +100,16 @@ export const useTradeableCoins = ( ) return useMemo(() => { - const coinsMap = artistCoins.reduce>( - (acc, coin) => { - acc[coin.symbol] = coin - return acc - }, - {} - ) + const coinsMap = fanClubs.reduce>((acc, coin) => { + acc[coin.symbol] = coin + return acc + }, {}) return { coins: coinsMap, - coinsArray: artistCoins, + coinsArray: fanClubs, isLoading: isPending, error: error ?? null } - }, [artistCoins, isPending, error]) + }, [fanClubs, isPending, error]) } diff --git a/packages/common/src/api/tan-query/coins/useUpdateArtistCoin.ts b/packages/common/src/api/tan-query/coins/useUpdateFanClub.ts similarity index 84% rename from packages/common/src/api/tan-query/coins/useUpdateArtistCoin.ts rename to packages/common/src/api/tan-query/coins/useUpdateFanClub.ts index 72648c71b86..1ef94179f80 100644 --- a/packages/common/src/api/tan-query/coins/useUpdateArtistCoin.ts +++ b/packages/common/src/api/tan-query/coins/useUpdateFanClub.ts @@ -7,7 +7,7 @@ import { useQueryContext } from '~/api/tan-query/utils' import { QUERY_KEYS } from '../queryKeys' -import { getArtistCoinQueryKey } from './useArtistCoin' +import { getFanClubQueryKey } from './useFanClub' type UpdateCoinRequest = { description?: string @@ -16,7 +16,7 @@ type UpdateCoinRequest = { removeBanner?: boolean } -type UpdateArtistCoinParams = { +type UpdateFanClubParams = { mint: string updateCoinRequest: UpdateCoinRequest } @@ -25,13 +25,13 @@ type MutationContext = { previousCoin: Coin | undefined } -export const useUpdateArtistCoin = () => { +export const useUpdateFanClub = () => { const { audiusSdk } = useQueryContext() const queryClient = useQueryClient() const { data: currentUserId } = useCurrentUserId() return useMutation({ - mutationFn: async ({ mint, updateCoinRequest }: UpdateArtistCoinParams) => { + mutationFn: async ({ mint, updateCoinRequest }: UpdateFanClubParams) => { const sdk = await audiusSdk() if (!currentUserId) { @@ -86,14 +86,14 @@ export const useUpdateArtistCoin = () => { onMutate: async ({ mint, updateCoinRequest - }: UpdateArtistCoinParams): Promise => { + }: UpdateFanClubParams): Promise => { // Cancel any outgoing refetches await queryClient.cancelQueries({ - queryKey: getArtistCoinQueryKey(mint) + queryKey: getFanClubQueryKey(mint) }) // Snapshot the previous coin - const previousCoin = queryClient.getQueryData(getArtistCoinQueryKey(mint)) + const previousCoin = queryClient.getQueryData(getFanClubQueryKey(mint)) // Optimistically update the coin if (previousCoin) { @@ -107,7 +107,7 @@ export const useUpdateArtistCoin = () => { link4: updateCoinRequest.links?.[3] ?? undefined } - queryClient.setQueryData(getArtistCoinQueryKey(mint), optimisticCoin) + queryClient.setQueryData(getFanClubQueryKey(mint), optimisticCoin) } return { previousCoin } @@ -115,15 +115,12 @@ export const useUpdateArtistCoin = () => { onError: (_err, { mint }, context?: MutationContext) => { // If the mutation fails, roll back coin data if (context?.previousCoin) { - queryClient.setQueryData( - getArtistCoinQueryKey(mint), - context.previousCoin - ) + queryClient.setQueryData(getFanClubQueryKey(mint), context.previousCoin) } }, onSettled: (_, __, { mint }) => { // Always refetch after error or success to ensure cache is in sync with server - queryClient.invalidateQueries({ queryKey: getArtistCoinQueryKey(mint) }) + queryClient.invalidateQueries({ queryKey: getFanClubQueryKey(mint) }) queryClient.invalidateQueries({ queryKey: [QUERY_KEYS.coinByTicker] }) } }) diff --git a/packages/common/src/api/tan-query/jupiter/executors.ts b/packages/common/src/api/tan-query/jupiter/executors.ts index d93d51b7554..17b8df143b4 100644 --- a/packages/common/src/api/tan-query/jupiter/executors.ts +++ b/packages/common/src/api/tan-query/jupiter/executors.ts @@ -97,14 +97,14 @@ async function executeMeteoraSwap( ) } - // Which token are we swapping to? Artist coin for buys, audio for sells + // Which token are we swapping to? Fan club for buys, audio for sells const inputTokenInfo = swapDirection === 'audioToCoin' ? tokenConfigsResult.outputTokenConfig // audio - : tokenConfigsResult.inputTokenConfig // artist coin + : tokenConfigsResult.inputTokenConfig // fan club const outputTokenInfo = swapDirection === 'audioToCoin' - ? tokenConfigsResult.inputTokenConfig // artist coin + ? tokenConfigsResult.inputTokenConfig // fan club : tokenConfigsResult.outputTokenConfig // audio const inputTokenDecimals = swapDirection === 'audioToCoin' ? AUDIO_DECIMALS : TOKEN_DECIMALS @@ -121,7 +121,7 @@ async function executeMeteoraSwap( const { transaction, outputAmount, includedFeeInputAmount } = swapResult - // Transfer tokens from user bank to ATA (AUDIO for buys, artist coin for sells) + // Transfer tokens from user bank to ATA (AUDIO for buys, fan club for sells) // Use exact consumed amount from quote to avoid leftovers const transferAmount = includedFeeInputAmount ? BigInt(includedFeeInputAmount) @@ -137,7 +137,7 @@ async function executeMeteoraSwap( instructions }) - // Ensure user bank is prepared for receiving the tokens we're about to move (AUDIO for buys, artist coin for sells) + // Ensure user bank is prepared for receiving the tokens we're about to move (AUDIO for buys, fan club for sells) const userBankResult = await sdk.services.claimableTokensClient.getOrCreateUserBank({ ethWallet: ethAddress, @@ -152,7 +152,7 @@ async function executeMeteoraSwap( true ) - // Create the temporary token account for our artist coin + // Create the temporary token account for our fan club instructions.push( createAssociatedTokenAccountIdempotentInstruction( feePayer, diff --git a/packages/common/src/api/tan-query/jupiter/useSwapCoins.ts b/packages/common/src/api/tan-query/jupiter/useSwapCoins.ts index 857007ea29a..34cfa2e2b5d 100644 --- a/packages/common/src/api/tan-query/jupiter/useSwapCoins.ts +++ b/packages/common/src/api/tan-query/jupiter/useSwapCoins.ts @@ -3,7 +3,7 @@ import { useMutation, useQueryClient } from '@tanstack/react-query' import { getUserCoinQueryKey, getUserQueryKey, - getArtistCoinQueryKey, + getFanClubQueryKey, updateAudioBalanceOptimistically, useCurrentAccountUser, useQueryContext, @@ -114,7 +114,7 @@ export const optimisticallyUpdateSwapBalances = ( const isInputAudio = inputMint === env.WAUDIO_MINT_ADDRESS const isOutputAudio = outputMint === env.WAUDIO_MINT_ADDRESS - // Handle artist coin optimistic updates (not AUDIO) + // Handle fan club optimistic updates (not AUDIO) if (inputMint && !isInputAudio) { queryClient.setQueryData( getUserCoinQueryKey(inputMint, user?.user_id), @@ -179,15 +179,15 @@ export const optimisticallyUpdateSwapBalances = ( }) } - // Invalidate artist coin queries to refresh fee claiming and graduation progress + // Invalidate fan club queries to refresh fee claiming and graduation progress if (inputMint && !isInputAudio) { queryClient.invalidateQueries({ - queryKey: getArtistCoinQueryKey(inputMint) + queryKey: getFanClubQueryKey(inputMint) }) } if (outputMint && !isOutputAudio) { queryClient.invalidateQueries({ - queryKey: getArtistCoinQueryKey(outputMint) + queryKey: getFanClubQueryKey(outputMint) }) } diff --git a/packages/common/src/api/tan-query/jupiter/utils.ts b/packages/common/src/api/tan-query/jupiter/utils.ts index c09637194df..e8f4f45441d 100644 --- a/packages/common/src/api/tan-query/jupiter/utils.ts +++ b/packages/common/src/api/tan-query/jupiter/utils.ts @@ -29,10 +29,10 @@ import { import { CoinInfo } from '~/store/ui/buy-sell/types' import { AUDIO_MINT, - NON_ARTIST_COIN_MINTS + NON_FAN_CLUB_MINTS } from '~/store/ui/shared/tokenConstants' -import { getArtistCoinQueryKey } from '../coins' +import { getFanClubQueryKey } from '../coins' import { QUERY_KEYS } from '../queryKeys' import { @@ -483,14 +483,14 @@ export const getIsDirectSwappable = ( inputMint: string, outputMint: string ): boolean => { - // Check for direct swaps for non-artist coins + // Check for direct swaps for non-fan clubs if ( - NON_ARTIST_COIN_MINTS.includes(inputMint) && - NON_ARTIST_COIN_MINTS.includes(outputMint) + NON_FAN_CLUB_MINTS.includes(inputMint) && + NON_FAN_CLUB_MINTS.includes(outputMint) ) { return true } - // At this point we know one of our mints is an artist coin - so to be a direct swap, the other mint must be AUDIO + // At this point we know one of our mints is an fan club - so to be a direct swap, the other mint must be AUDIO return inputMint === AUDIO_MINT || outputMint === AUDIO_MINT } @@ -504,14 +504,14 @@ export const getCoinPoolState = ( mint: string, queryClient: QueryClient ): { isDBC: boolean; isDAMM: boolean; hasPool: boolean } => { - if (NON_ARTIST_COIN_MINTS.includes(mint)) { + if (NON_FAN_CLUB_MINTS.includes(mint)) { return { isDBC: false, isDAMM: false, hasPool: false } } - const coinInfo = queryClient.getQueryData(getArtistCoinQueryKey(mint)) + const coinInfo = queryClient.getQueryData(getFanClubQueryKey(mint)) const isDBC = coinInfo?.dynamicBondingCurve?.isMigrated === false const isDAMM = coinInfo?.dynamicBondingCurve?.isMigrated === true return { diff --git a/packages/common/src/api/tan-query/queryKeys.ts b/packages/common/src/api/tan-query/queryKeys.ts index f778a39a2c4..b3bfedbe4b6 100644 --- a/packages/common/src/api/tan-query/queryKeys.ts +++ b/packages/common/src/api/tan-query/queryKeys.ts @@ -101,7 +101,7 @@ export const QUERY_KEYS = { feelingLuckyTracks: 'feelingLuckyTracks', recentlyPlayedTracks: 'recentlyPlayedTracks', recentlyCommentedTracks: 'recentlyCommentedTracks', - artistCoinMembers: 'artistCoinMembers', + fanClubMembers: 'fanClubMembers', coins: 'coins', userCreatedCoins: 'userCreatedCoins', userCoins: 'userCoins', @@ -109,11 +109,11 @@ export const QUERY_KEYS = { coin: 'coin', discordCode: 'discordCode', coinInsights: 'coinInsights', - artistCoin: 'artistCoin', - artistCoinByMint: 'artistCoinByMint', + fanClub: 'fanClub', + fanClubByMint: 'fanClubByMint', userCoin: 'userCoin', - artistCoinHoldersCount: 'artistCoinHoldersCount', - artistCoinMembersCount: 'artistCoinMembersCount', + fanClubHoldersCount: 'fanClubHoldersCount', + fanClubMembersCount: 'fanClubMembersCount', coinByTicker: 'coinByTicker', userbank: 'userbank', tokenExchangeRate: 'tokenExchangeRate', diff --git a/packages/common/src/api/tan-query/wallets/useCoinBalance.ts b/packages/common/src/api/tan-query/wallets/useCoinBalance.ts index 674a2650a81..b255ee00215 100644 --- a/packages/common/src/api/tan-query/wallets/useCoinBalance.ts +++ b/packages/common/src/api/tan-query/wallets/useCoinBalance.ts @@ -67,7 +67,7 @@ export const useCoinBalance = ({ } ) - // Artist coins query + // Fan clubs query const userCoinQuery = useUserCoin( { mint, userId }, { diff --git a/packages/common/src/api/tan-query/wallets/useUserTotalBalance.ts b/packages/common/src/api/tan-query/wallets/useUserTotalBalance.ts index f2d6c223422..d1e218adaaf 100644 --- a/packages/common/src/api/tan-query/wallets/useUserTotalBalance.ts +++ b/packages/common/src/api/tan-query/wallets/useUserTotalBalance.ts @@ -16,7 +16,7 @@ type UseUserTotalBalanceResult = { /** * Hook to get the total USD balance for the current user including all coins and USDC. * Combines balances from: - * - Artist coins (via useUserCoins) + * - Fan clubs (via useUserCoins) * - AUDIO (via useUserCoins) * - USDC (via useUSDCBalance) * @@ -40,7 +40,7 @@ export const useUserTotalBalance = (): UseUserTotalBalanceResult => { const totalBalance = useMemo(() => { let total = 0 - // Add all artist coins + AUDIO + // Add all fan clubs + AUDIO if (userCoins) { total += userCoins.reduce((sum, coin) => sum + (coin.balanceUsd ?? 0), 0) } diff --git a/packages/common/src/hooks/chats/useAudienceUsers.ts b/packages/common/src/hooks/chats/useAudienceUsers.ts index 0eef43bb0ff..3365ddb7807 100644 --- a/packages/common/src/hooks/chats/useAudienceUsers.ts +++ b/packages/common/src/hooks/chats/useAudienceUsers.ts @@ -1,8 +1,8 @@ import { ChatBlast, ChatBlastAudience, OptionalHashId } from '@audius/sdk' import { - useArtistCoinMembers, - useArtistCreatedCoin, + useFanClubMembers, + useArtistCreatedFanClub, useCurrentUserId, useFollowers, usePurchasers, @@ -38,12 +38,12 @@ export const useAudienceUsers = (chat: ChatBlast, limit?: number) => { { enabled: chat.audience === ChatBlastAudience.REMIXERS } ) - const { data: coin } = useArtistCreatedCoin(currentUserId, { + const { data: coin } = useArtistCreatedFanClub(currentUserId, { enabled: chat.audience === ChatBlastAudience.COIN_HOLDERS }) const mint = coin?.mint - const { data: coinMembers } = useArtistCoinMembers( + const { data: coinMembers } = useFanClubMembers( { mint: mint ?? null, pageSize: limit diff --git a/packages/common/src/hooks/chats/useChatBlastAudienceContent.ts b/packages/common/src/hooks/chats/useChatBlastAudienceContent.ts index 8593ab71b07..3f934b3fa21 100644 --- a/packages/common/src/hooks/chats/useChatBlastAudienceContent.ts +++ b/packages/common/src/hooks/chats/useChatBlastAudienceContent.ts @@ -8,8 +8,8 @@ import { usePurchasersCount, useRemixersCount, useTrack, - useArtistCreatedCoin, - useArtistCoinMembersCount + useArtistCreatedFanClub, + useFanClubMembersCount } from '~/api' import { getChatBlastAudienceDescription, @@ -54,10 +54,10 @@ export const useChatBlastAudienceContent = ({ chat }: { chat: ChatBlast }) => { { enabled: audience === ChatBlastAudience.REMIXERS } ) - const { data: coin } = useArtistCreatedCoin(user?.user_id) + const { data: coin } = useArtistCreatedFanClub(user?.user_id) const coinSymbol = coin?.ticker ?? '' const mint = coin?.mint - const { data: coinMembersCount } = useArtistCoinMembersCount( + const { data: coinMembersCount } = useFanClubMembersCount( { mint }, { enabled: audience === ChatBlastAudience.COIN_HOLDERS diff --git a/packages/common/src/hooks/chats/useFirstAvailableBlastAudience.ts b/packages/common/src/hooks/chats/useFirstAvailableBlastAudience.ts index b88d4b8e833..8ab9c294c28 100644 --- a/packages/common/src/hooks/chats/useFirstAvailableBlastAudience.ts +++ b/packages/common/src/hooks/chats/useFirstAvailableBlastAudience.ts @@ -3,8 +3,8 @@ import { useMemo } from 'react' import { ChatBlastAudience } from '@audius/sdk' import { - useArtistCoinMembersCount, - useArtistCreatedCoin, + useFanClubMembersCount, + useArtistCreatedFanClub, useCurrentAccountUser, usePurchasersCount, useRemixersCount @@ -15,8 +15,8 @@ export const useFirstAvailableBlastAudience = () => { const { data: purchasersCount } = usePurchasersCount() const { data: remixersCount } = useRemixersCount() - const { data: userCoin } = useArtistCreatedCoin(user?.user_id) - const { data: coinMembersCount } = useArtistCoinMembersCount({ + const { data: userCoin } = useArtistCreatedFanClub(user?.user_id) + const { data: coinMembersCount } = useFanClubMembersCount({ mint: userCoin?.mint }) diff --git a/packages/common/src/hooks/index.ts b/packages/common/src/hooks/index.ts index 49e637ecc08..b7a60f1410c 100644 --- a/packages/common/src/hooks/index.ts +++ b/packages/common/src/hooks/index.ts @@ -56,4 +56,4 @@ export * from './useAnalytics' export * from './useBuySellAnalytics' export * from './useBuySellInitialTab' export * from './useShareAction' -export * from './useArtistCoinMessageHeader' +export * from './useFanClubMessageHeader' diff --git a/packages/common/src/hooks/useAccessAndRemixSettings.test.ts b/packages/common/src/hooks/useAccessAndRemixSettings.test.ts index 20e0937cb89..1586519bca1 100644 --- a/packages/common/src/hooks/useAccessAndRemixSettings.test.ts +++ b/packages/common/src/hooks/useAccessAndRemixSettings.test.ts @@ -15,7 +15,7 @@ vi.mock('react-redux', () => { vi.mock('~/api/', () => ({ useCurrentUserId: () => ({ data: 123 }), useHasNoTokens: () => ({ data: false }), - useArtistCreatedCoin: () => ({ + useArtistCreatedFanClub: () => ({ data: [ { name: 'dank coin', @@ -31,7 +31,7 @@ vi.mock('~/api/', () => ({ ], isLoading: false }), - useArtistCoins: () => ({ + useFanClubs: () => ({ data: [ { name: 'dank coin', diff --git a/packages/common/src/hooks/useAccessAndRemixSettings.ts b/packages/common/src/hooks/useAccessAndRemixSettings.ts index ba67e963f36..40dda7c56bc 100644 --- a/packages/common/src/hooks/useAccessAndRemixSettings.ts +++ b/packages/common/src/hooks/useAccessAndRemixSettings.ts @@ -1,4 +1,4 @@ -import { useArtistCreatedCoin, useCurrentUserId } from '~/api/' +import { useArtistCreatedFanClub, useCurrentUserId } from '~/api/' type UseAccessAndRemixSettingsProps = { isUpload: boolean @@ -11,7 +11,7 @@ type UseAccessAndRemixSettingsProps = { export const useHasNoTokens = () => { const { data: userId } = useCurrentUserId() - const { data: coin, isLoading } = useArtistCreatedCoin(userId) + const { data: coin, isLoading } = useArtistCreatedFanClub(userId) return !isLoading && !coin } diff --git a/packages/common/src/hooks/useArtistCoinMessageHeader.ts b/packages/common/src/hooks/useFanClubMessageHeader.ts similarity index 63% rename from packages/common/src/hooks/useArtistCoinMessageHeader.ts rename to packages/common/src/hooks/useFanClubMessageHeader.ts index 7f720db905a..4ecc2f25be0 100644 --- a/packages/common/src/hooks/useArtistCoinMessageHeader.ts +++ b/packages/common/src/hooks/useFanClubMessageHeader.ts @@ -1,16 +1,16 @@ import { ChatBlastAudience } from '@audius/sdk' -import { useArtistCreatedCoin } from '~/api/tan-query/coins/useArtistCreatedCoin' +import { useArtistCreatedFanClub } from '~/api/tan-query/coins/useArtistCreatedFanClub' import { ID } from '~/models' -export const useArtistCoinMessageHeader = ({ +export const useFanClubMessageHeader = ({ userId, audience }: { userId: ID audience?: ChatBlastAudience }) => { - const { data: coin } = useArtistCreatedCoin(userId) + const { data: coin } = useArtistCreatedFanClub(userId) if (!audience || audience !== ChatBlastAudience.COIN_HOLDERS) { return null diff --git a/packages/common/src/hooks/useFormattedAudioBalance.ts b/packages/common/src/hooks/useFormattedAudioBalance.ts index c3409c44023..45b09a47180 100644 --- a/packages/common/src/hooks/useFormattedAudioBalance.ts +++ b/packages/common/src/hooks/useFormattedAudioBalance.ts @@ -2,7 +2,7 @@ import { useMemo } from 'react' import { AUDIO, FixedDecimal } from '@audius/fixed-decimal' -import { useArtistCoin, useAudioBalance, useQueryContext } from '~/api' +import { useFanClub, useAudioBalance, useQueryContext } from '~/api' import { formatAudioBalance, formatCount, @@ -31,8 +31,9 @@ export const useFormattedAudioBalance = ({ includeStaked }) - const { data: audioPriceData, isPending: isAudioPriceLoading } = - useArtistCoin(env.WAUDIO_MINT_ADDRESS) + const { data: audioPriceData, isPending: isAudioPriceLoading } = useFanClub( + env.WAUDIO_MINT_ADDRESS + ) const audioPrice = audioPriceData?.price?.toString() ?? null const hasFetchedAudioBalance = !isNullOrUndefined(totalBalance) const audioBalance = hasFetchedAudioBalance ? totalBalance : null diff --git a/packages/common/src/hooks/useFormattedCoinBalance.ts b/packages/common/src/hooks/useFormattedCoinBalance.ts index a7790b9f2a5..be62db1232d 100644 --- a/packages/common/src/hooks/useFormattedCoinBalance.ts +++ b/packages/common/src/hooks/useFormattedCoinBalance.ts @@ -3,7 +3,7 @@ import { useMemo } from 'react' import { FixedDecimal } from '@audius/fixed-decimal' import { useCoinBalance } from '../api' -import { useArtistCoin } from '../api/tan-query/coins/useArtistCoin' +import { useFanClub } from '../api/tan-query/coins/useFanClub' import { getTokenDecimalPlaces, formatCurrencyWithSubscript, @@ -51,7 +51,7 @@ export const useFormattedCoinBalance = ( } ) - const { data, isPending: isCoinPriceLoading } = useArtistCoin(mint) + const { data, isPending: isCoinPriceLoading } = useFanClub(mint) const balance = coinBalance?.balance diff --git a/packages/common/src/hooks/useGatedContent.ts b/packages/common/src/hooks/useGatedContent.ts index bb85d159018..ccb408727af 100644 --- a/packages/common/src/hooks/useGatedContent.ts +++ b/packages/common/src/hooks/useGatedContent.ts @@ -3,7 +3,7 @@ import { useMemo } from 'react' import { useSelector } from 'react-redux' import { - useArtistCoin, + useFanClub, useCollection, useCurrentAccount, useTrack, @@ -141,7 +141,7 @@ export const useStreamConditionsEntity = ( const { byId: usersById } = useUsers([followUserId].filter(removeNullable)) const followee = followUserId ? usersById[followUserId] : null - const { data: token } = useArtistCoin(tokenMint) + const { data: token } = useFanClub(tokenMint) return { followee, diff --git a/packages/common/src/hooks/useIsCoinMember.ts b/packages/common/src/hooks/useIsCoinMember.ts index 9ebbc8effc1..e145e584534 100644 --- a/packages/common/src/hooks/useIsCoinMember.ts +++ b/packages/common/src/hooks/useIsCoinMember.ts @@ -1,6 +1,6 @@ import { useMemo } from 'react' -import { useUserCoins, useArtistCreatedCoin } from '~/api' +import { useUserCoins, useArtistCreatedFanClub } from '~/api' import { ID } from '~/models' /** @@ -13,14 +13,14 @@ export const useIsCoinMember = ( userId: ID | null | undefined, artistId: ID | null | undefined ) => { - const { data: artistCoin } = useArtistCreatedCoin(artistId) + const { data: fanClub } = useArtistCreatedFanClub(artistId) const { data: userCoins } = useUserCoins( { userId }, - { enabled: !!userId && !!artistCoin } + { enabled: !!userId && !!fanClub } ) const isCoinHolder = useMemo(() => { - if (!artistCoin || !artistId || !userId) { + if (!fanClub || !artistId || !userId) { return false } @@ -32,12 +32,12 @@ export const useIsCoinMember = ( // Check if the user owns this specific artist's coin with positive balance return ( userCoins?.some( - (userCoin) => userCoin.mint === artistCoin.mint && userCoin.balance > 0 + (userCoin) => userCoin.mint === fanClub.mint && userCoin.balance > 0 ) ?? false ) - }, [userCoins, artistCoin, artistId, userId]) + }, [userCoins, fanClub, artistId, userId]) - const isLoading = !artistCoin || (userId !== artistId && !userCoins) + const isLoading = !fanClub || (userId !== artistId && !userCoins) return { isCoinHolder, diff --git a/packages/common/src/messages/buySell.ts b/packages/common/src/messages/buySell.ts index 1eac53b1d92..ddda97ca6d0 100644 --- a/packages/common/src/messages/buySell.ts +++ b/packages/common/src/messages/buySell.ts @@ -59,7 +59,7 @@ export const buySellMessages = { // For very small amounts (like SOL), show up to 6 decimal places and remove trailing zeros formattedMin = min.toFixed(6).replace(/\.?0+$/, '') } else if (min >= 1) { - // For whole numbers (like artist coins), show as integer + // For whole numbers (like fan clubs), show as integer formattedMin = min % 1 === 0 ? min.toString() : min.toFixed(2) } else { // For amounts between 0.01 and 1, show 2 decimal places diff --git a/packages/common/src/messages/coinDetailsMessages.ts b/packages/common/src/messages/coinDetailsMessages.ts index 335b629d994..0510c0a1cc4 100644 --- a/packages/common/src/messages/coinDetailsMessages.ts +++ b/packages/common/src/messages/coinDetailsMessages.ts @@ -117,7 +117,7 @@ export const coinDetailsMessages = { 'The amount of unlocked coins you can claim right now. This increases daily over the 5-year vesting period.' } }, - artistCoinDetails: { + fanClubDetails: { title: 'Fan Club Details', details: 'Details', coinAddress: 'Coin Address', diff --git a/packages/common/src/messages/launchpadMessages.ts b/packages/common/src/messages/launchpadMessages.ts index 31a3c86265e..1fb5522ddf7 100644 --- a/packages/common/src/messages/launchpadMessages.ts +++ b/packages/common/src/messages/launchpadMessages.ts @@ -5,7 +5,7 @@ export const launchpadMessages = { modal: { congratsTitle: '🎉 CONGRATS!', congratsDescription: - 'Your Fan Club on Audius is now live, powered by your new artist coin. Time to share the good news with your fans.', + 'Your Fan Club on Audius is now live, powered by your new fan club. Time to share the good news with your fans.', purchaseSummaryTitle: 'PURCHASE SUMMARY', addressTitle: 'COIN ADDRESS', shareToX: 'Share to X', @@ -19,7 +19,7 @@ export const launchpadMessages = { splash: { whyTitle: 'Why Create a Fan Club?', whyDescription: - 'Create new ways to earn, reward your fans, and grow your community – all powered by your artist coin.', + 'Create new ways to earn, reward your fans, and grow your community – all powered by your fan club.', getPaidTitle: 'Get Paid', getPaidDescription: 'Earn fees whenever fans buy or sell your coin.', rewardFansTitle: 'Reward Fans', @@ -28,7 +28,7 @@ export const launchpadMessages = { growCommunityDescription: 'Strengthen bonds with your biggest supporters.', readyTitle: 'Ready to launch?', readyDescription: - 'Connect your wallet to launch a Fan Club powered by your artist coin.', + 'Connect your wallet to launch a Fan Club powered by your fan club.', readyDescription2: 'It only takes a few steps to set things up and share it with your fans.', getStarted: 'Get Started!', @@ -76,17 +76,17 @@ export const launchpadMessages = { "Remember! This is your one and only coin and its details can't be changed later.", tooltips: { totalSupply: - 'The total number of your artist coins that will ever exist. This amount is fixed and never changes.', + 'The total number of your fan clubs that will ever exist. This amount is fixed and never changes.', initialMarketCap: - 'The starting value of your artist coin at launch, based on the initial price and supply. These values are the same for all artist coins.', + 'The starting value of your fan club at launch, based on the initial price and supply. These values are the same for all fan clubs.', graduationMarketCap: - 'The market cap your artist coin will reach when it graduates into the open market.', + 'The market cap your fan club will reach when it graduates into the open market.', allocation: - "The percentage of your total artist coin supply reserved for you as the creator. You'll receive this gradually through unlocking.", + "The percentage of your total fan club supply reserved for you as the creator. You'll receive this gradually through unlocking.", vesting: - "Once your artist coin graduates into the open market, your reserved coins are unlocked daily over a 5-year period. You can claim your unlocked coins every day, or let them accumulate as long as you'd like.", + "Once your fan club graduates into the open market, your reserved coins are unlocked daily over a 5-year period. You can claim your unlocked coins every day, or let them accumulate as long as you'd like.", tradingFees: - 'You earn half of all trading fees for all trades of your artist coin. Trading fees are 1%.' + 'You earn half of all trading fees for all trades of your fan club. Trading fees are 1%.' } }, buy: { @@ -94,7 +94,7 @@ export const launchpadMessages = { title: 'Claim Your Share First', optional: 'optional', description: - 'Before your artist coin goes live, do you want to buy some at the lowest price?', + 'Before your fan club goes live, do you want to buy some at the lowest price?', youPay: 'You Pay', youReceive: 'You Receive', valueInUSDC: 'Value', @@ -114,7 +114,7 @@ export const launchpadMessages = { audioInputLabel: 'AUDIO', radios: { no: 'No, thanks.', - yes: 'Yes, I want to buy my artist coin.' + yes: 'Yes, I want to buy my fan club.' } }, submitModal: { @@ -127,9 +127,9 @@ export const launchpadMessages = { insufficientBalanceDescription: "You'll need to add funds to your wallet before you can continue.", solAmount: '0.03 SOL', - solDescription: ' — required to create your artist coin', + solDescription: ' — required to create your fan club', audioDescription: - '• Extra $AUDIO if you want to make an initial buy of your artist coin (optional).', + '• Extra $AUDIO if you want to make an initial buy of your fan club (optional).', hintText: 'Add SOL to your connected wallet, or send $AUDIO from your Audius wallet', learnHowToFund: 'Learn how to fund your wallet', diff --git a/packages/common/src/messages/settings.ts b/packages/common/src/messages/settings.ts index eeccd0a6929..fc4d0cc9a5b 100644 --- a/packages/common/src/messages/settings.ts +++ b/packages/common/src/messages/settings.ts @@ -6,7 +6,7 @@ export const settingsMessages = { copyright: `Copyright © ${currentYear} Audius`, terms: 'Terms of Service', privacy: 'Privacy Policy', - artistCoinTerms: 'Fan Club Terms', + fanClubTerms: 'Fan Club Terms', apiTerms: 'API Terms', emailSent: 'Email Sent!', emailNotSent: 'Something broke! Please try again!', diff --git a/packages/common/src/messages/walletMessages.ts b/packages/common/src/messages/walletMessages.ts index bb91ec7f769..6ff8c723024 100644 --- a/packages/common/src/messages/walletMessages.ts +++ b/packages/common/src/messages/walletMessages.ts @@ -138,8 +138,8 @@ export const walletMessages = { } }, - // Fan clubs (artist coin tokens) - artistCoins: { + // Fan clubs (fan club tokens) + fanClubs: { title: 'Discover Fan Clubs', searchPlaceholder: 'Search fan clubs', noCoins: 'No results found', diff --git a/packages/common/src/models/Analytics.ts b/packages/common/src/models/Analytics.ts index 0417d3d168e..9ada253528f 100644 --- a/packages/common/src/models/Analytics.ts +++ b/packages/common/src/models/Analytics.ts @@ -572,14 +572,14 @@ export enum Name { ANDROID_APP_RESTART_STALE = 'Android App: Restart Due to Stale Time', ANDROID_APP_RESTART_FORCE_QUIT = 'Android App: Restart Due to Force Quit', - // Artist Coins - BANNER_ARTIST_COINS_LAUNCH_CLICKED = 'Banner Artist Coins Launch Clicked', + // Fan Clubs + BANNER_FAN_CLUBS_LAUNCH_CLICKED = 'Banner Fan Clubs Launch Clicked', BANNER_TRADING_VOLUME_LAUNCH_CLICKED = 'Banner Trading Volume Launch Clicked', BANNER_YAK_COIN_LAUNCH_CLICKED = 'Banner Yak Coin Launch Clicked', - // Artist Coin Launchpad + // Fan Club Launchpad LAUNCHPAD_SPLASH_GET_STARTED = 'Launchpad: Get Started Clicked', - LAUNCHPAD_HAS_EXISTING_ARTIST_COIN = 'Launchpad: Has Existing Artist Coin', + LAUNCHPAD_HAS_EXISTING_FAN_CLUB = 'Launchpad: Has Existing Fan Club', LAUNCHPAD_SPLASH_LEARN_MORE_CLICKED = 'Launchpad: Learn More Clicked', LAUNCHPAD_WALLET_CONNECT_SUCCESS = 'Launchpad: Wallet Connect Success', LAUNCHPAD_WALLET_CONNECT_ERROR = 'Launchpad: Wallet Connect Error', @@ -1564,7 +1564,7 @@ type SearchResultSelect = { // Explore export type ExploreSectionName = | 'Recommended Tracks' - | 'Artist Coin Tracks' + | 'Fan Club Tracks' | 'Recently Played' | 'Quick Search' | 'Featured Playlists' @@ -2275,8 +2275,8 @@ type BannerTOSClicked = { eventName: Name.BANNER_TOS_CLICKED } -type BannerArtistCoinsLaunchClicked = { - eventName: Name.BANNER_ARTIST_COINS_LAUNCH_CLICKED +type BannerFanClubsLaunchClicked = { + eventName: Name.BANNER_FAN_CLUBS_LAUNCH_CLICKED } type BannerTradingVolumeLaunchClicked = { @@ -2801,13 +2801,13 @@ export type AndroidAppRestartForceQuit = { eventName: Name.ANDROID_APP_RESTART_FORCE_QUIT } -// Artist Coin Launchpad +// Fan Club Launchpad export type LaunchpadSplashGetStarted = { eventName: Name.LAUNCHPAD_SPLASH_GET_STARTED } -export type LaunchpadHasExistingArtistCoin = { - eventName: Name.LAUNCHPAD_HAS_EXISTING_ARTIST_COIN +export type LaunchpadHasExistingFanClub = { + eventName: Name.LAUNCHPAD_HAS_EXISTING_FAN_CLUB } export type LaunchpadSplashLearnMoreClicked = { @@ -3311,7 +3311,7 @@ export type AllTrackingEvents = | PurchaseContentTOSClicked | PurchaseContentUSDCUserBankCopied | BannerTOSClicked - | BannerArtistCoinsLaunchClicked + | BannerFanClubsLaunchClicked | BannerTradingVolumeLaunchClicked | RateCtaDisplayed | RateCtaResponseNo @@ -3419,7 +3419,7 @@ export type AllTrackingEvents = | AndroidAppRestartStale | AndroidAppRestartForceQuit | LaunchpadSplashGetStarted - | LaunchpadHasExistingArtistCoin + | LaunchpadHasExistingFanClub | LaunchpadSplashLearnMoreClicked | LaunchpadWalletConnectSuccess | LaunchpadWalletInsufficientBalance diff --git a/packages/common/src/models/ErrorReporting.ts b/packages/common/src/models/ErrorReporting.ts index d8ec40b15b1..cc619255850 100644 --- a/packages/common/src/models/ErrorReporting.ts +++ b/packages/common/src/models/ErrorReporting.ts @@ -48,7 +48,7 @@ export enum Feature { Remixes = 'remixes', TanQuery = 'tan-query', SendTokens = 'send-tokens', - ArtistCoins = 'artist-coins' + FanClubs = 'fan-clubs' } export type ReportToSentryArgs = { diff --git a/packages/common/src/models/User.ts b/packages/common/src/models/User.ts index e1496aa1805..afaa718a09a 100644 --- a/packages/common/src/models/User.ts +++ b/packages/common/src/models/User.ts @@ -19,7 +19,7 @@ export type SocialPlatform = 'x' | 'instagram' | 'tiktok' export type UserMetadata = { album_count: number - artist_coin_badge?: Nullable<{ + fan_club_badge?: Nullable<{ mint: string logo_uri: string ticker: string diff --git a/packages/common/src/store/ui/buy-sell/hooks/useCoinData.ts b/packages/common/src/store/ui/buy-sell/hooks/useCoinData.ts index c0e282d653a..8d6568d5acc 100644 --- a/packages/common/src/store/ui/buy-sell/hooks/useCoinData.ts +++ b/packages/common/src/store/ui/buy-sell/hooks/useCoinData.ts @@ -68,7 +68,7 @@ export const useCoinData = ({ : isInternalWalletBalanceLoading // Get token price for calculations (currently unused but may be needed for future features) - // const { data: tokenPriceData } = useArtistCoin({ mint: inputCoin.address }) + // const { data: tokenPriceData } = useFanClub({ mint: inputCoin.address }) // Calculate safe amount for exchange rate API const safeExchangeRateAmount = useMemo(() => { diff --git a/packages/common/src/store/ui/buy-sell/useBuySellSwap.ts b/packages/common/src/store/ui/buy-sell/useBuySellSwap.ts index 169867717b8..10c76234247 100644 --- a/packages/common/src/store/ui/buy-sell/useBuySellSwap.ts +++ b/packages/common/src/store/ui/buy-sell/useBuySellSwap.ts @@ -4,9 +4,9 @@ import { MutationStatus, useQueryClient } from '@tanstack/react-query' import { SLIPPAGE_BPS, - useArtistCoin, + useFanClub, useCurrentAccountUser, - getArtistCoinQueryKey, + getFanClubQueryKey, getFanClubFeedQueryKey } from '~/api' import { SwapStatus, SwapTokensResult } from '~/api/tan-query/jupiter/types' @@ -61,10 +61,8 @@ export const useBuySellSwap = (props: UseBuySellSwapProps) => { const { data: user } = useCurrentAccountUser() const [swapResult, setSwapResult] = useState(null) - const { data: baseCoin } = useArtistCoin(selectedPair.baseToken.address ?? '') - const { data: quoteCoin } = useArtistCoin( - selectedPair.quoteToken.address ?? '' - ) + const { data: baseCoin } = useFanClub(selectedPair.baseToken.address ?? '') + const { data: quoteCoin } = useFanClub(selectedPair.quoteToken.address ?? '') const { status: swapStatus, error: swapError, data: swapData } = swapHookData @@ -101,7 +99,7 @@ export const useBuySellSwap = (props: UseBuySellSwapProps) => { queryClient.invalidateQueries({ queryKey: [QUERY_KEYS.usdcBalance, user.wallet] }) - // Invalidate individual user coin queries (for artist coins and $AUDIO) + // Invalidate individual user coin queries (for fan clubs and $AUDIO) queryClient.invalidateQueries({ queryKey: [QUERY_KEYS.userCoin] }) @@ -109,27 +107,27 @@ export const useBuySellSwap = (props: UseBuySellSwapProps) => { queryClient.invalidateQueries({ queryKey: [QUERY_KEYS.userCoins] }) - // Invalidate artist coin members queries (leaderboard) + // Invalidate fan club members queries (leaderboard) if (baseCoin?.mint) { queryClient.invalidateQueries({ - queryKey: [QUERY_KEYS.artistCoinMembers, baseCoin?.mint] + queryKey: [QUERY_KEYS.fanClubMembers, baseCoin?.mint] }) } if (quoteCoin?.mint) { queryClient.invalidateQueries({ - queryKey: [QUERY_KEYS.artistCoinMembers, quoteCoin?.mint] + queryKey: [QUERY_KEYS.fanClubMembers, quoteCoin?.mint] }) } - // Invalidate artist coin queries to refresh fee claiming and graduation progress + // Invalidate fan club queries to refresh fee claiming and graduation progress if (baseCoin?.mint) { queryClient.invalidateQueries({ - queryKey: getArtistCoinQueryKey(baseCoin.mint) + queryKey: getFanClubQueryKey(baseCoin.mint) }) } if (quoteCoin?.mint) { queryClient.invalidateQueries({ - queryKey: getArtistCoinQueryKey(quoteCoin.mint) + queryKey: getFanClubQueryKey(quoteCoin.mint) }) } @@ -149,7 +147,7 @@ export const useBuySellSwap = (props: UseBuySellSwapProps) => { queryKey: [QUERY_KEYS.comment] }) - // Invalidate track queries to provide track access if the user has traded the artist coin + // Invalidate track queries to provide track access if the user has traded the fan club const baseOwnerId = baseCoin?.ownerId ?? null const quoteOwnerId = quoteCoin?.ownerId ?? null diff --git a/packages/common/src/store/ui/buy-sell/useCoinSwapForm.ts b/packages/common/src/store/ui/buy-sell/useCoinSwapForm.ts index d0940779c08..28907d31c24 100644 --- a/packages/common/src/store/ui/buy-sell/useCoinSwapForm.ts +++ b/packages/common/src/store/ui/buy-sell/useCoinSwapForm.ts @@ -3,7 +3,7 @@ import { useCallback, useEffect, useMemo, useRef } from 'react' import { useFormik } from 'formik' import { toFormikValidationSchema } from 'zod-formik-adapter' -import { useArtistCoin } from '~/api' +import { useFanClub } from '~/api' import { useCoinData } from './hooks/useCoinData' import { useSwapCalculations } from './hooks/useSwapCalculations' @@ -81,7 +81,7 @@ export const useCoinSwapForm = ({ externalWalletAddress }: CoinSwapFormProps) => { // Get token price for USD-based limit calculations - const { data: tokenPriceData } = useArtistCoin(inputCoin.address) + const { data: tokenPriceData } = useFanClub(inputCoin.address) const tokenPrice = tokenPriceData?.price ? Number(tokenPriceData.price) : null // Calculate min/max based on USD limits and current price diff --git a/packages/common/src/store/ui/buy-sell/utils/tokenLimits.ts b/packages/common/src/store/ui/buy-sell/utils/tokenLimits.ts index 5e418faffba..dd35df60f79 100644 --- a/packages/common/src/store/ui/buy-sell/utils/tokenLimits.ts +++ b/packages/common/src/store/ui/buy-sell/utils/tokenLimits.ts @@ -10,7 +10,7 @@ import type { TokenLimits, TokenLimitInput } from '../types/swap.types' * Calculates min/max token amounts based on USD limits and current token price * For stablecoins, assumes 1:1 parity with USD * For SOL, uses very small minimum (0.000001) since it's expensive - * For artist coins, uses minimum of 1 since they're very cheap + * For fan clubs, uses minimum of 1 since they're very cheap * For other tokens, converts USD limits using current price */ export const calculateTokenLimits = ( @@ -34,13 +34,13 @@ export const calculateTokenLimits = ( if (isSOL) { // SOL is expensive, use very small minimum return { - min: 0.000001, // Same as artist coins launchpad + min: 0.000001, // Same as fan clubs launchpad max: 1000000 } } else { - // Artist coins are cheap, use minimum of 1 + // Fan clubs are cheap, use minimum of 1 return { - min: 1, // Artist coins are very cheap + min: 1, // Fan clubs are very cheap max: 1000000 } } diff --git a/packages/common/src/store/ui/index.ts b/packages/common/src/store/ui/index.ts index 1ea98ea4512..53cc0f63b28 100644 --- a/packages/common/src/store/ui/index.ts +++ b/packages/common/src/store/ui/index.ts @@ -97,7 +97,7 @@ export { default as searchUsersModalSagas } from './search-users-modal/sagas' export * from './buy-sell' export { TOKEN_LISTING_MAP, - NON_ARTIST_COIN_MINTS, + NON_FAN_CLUB_MINTS, AUDIO_MINT, SOL_MINT, USDC_MINT diff --git a/packages/common/src/store/ui/modals/artist-coin-details-modal/index.ts b/packages/common/src/store/ui/modals/artist-coin-details-modal/index.ts deleted file mode 100644 index 21441cbf1c1..00000000000 --- a/packages/common/src/store/ui/modals/artist-coin-details-modal/index.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { createModal } from '../createModal' -import { ArtistCoinDetailsModalState } from '../types' - -const artistCoinDetailsModal = createModal({ - reducerPath: 'ArtistCoinDetailsModal', - initialState: { - isOpen: false, - mint: undefined - }, - sliceSelector: (state) => state.ui.modals -}) - -export const { - hook: useArtistCoinDetailsModal, - actions: artistCoinDetailsModalActions, - reducer: artistCoinDetailsModalReducer -} = artistCoinDetailsModal diff --git a/packages/common/src/store/ui/modals/fan-club-details-modal/index.ts b/packages/common/src/store/ui/modals/fan-club-details-modal/index.ts new file mode 100644 index 00000000000..6438d8fba74 --- /dev/null +++ b/packages/common/src/store/ui/modals/fan-club-details-modal/index.ts @@ -0,0 +1,17 @@ +import { createModal } from '../createModal' +import { FanClubDetailsModalState } from '../types' + +const fanClubDetailsModal = createModal({ + reducerPath: 'FanClubDetailsModal', + initialState: { + isOpen: false, + mint: undefined + }, + sliceSelector: (state) => state.ui.modals +}) + +export const { + hook: useFanClubDetailsModal, + actions: fanClubDetailsModalActions, + reducer: fanClubDetailsModalReducer +} = fanClubDetailsModal diff --git a/packages/common/src/store/ui/modals/index.ts b/packages/common/src/store/ui/modals/index.ts index 586f9e73eb5..0c79117f184 100644 --- a/packages/common/src/store/ui/modals/index.ts +++ b/packages/common/src/store/ui/modals/index.ts @@ -40,4 +40,4 @@ export * from './finalize-winners-confirmation-modal' export * from './receive-tokens-modal' export * from './send-tokens-modal' export * from './coin-success-modal' -export * from './artist-coin-details-modal' +export * from './fan-club-details-modal' diff --git a/packages/common/src/store/ui/modals/parentSlice.ts b/packages/common/src/store/ui/modals/parentSlice.ts index cef3c2b71ad..922c6239a7d 100644 --- a/packages/common/src/store/ui/modals/parentSlice.ts +++ b/packages/common/src/store/ui/modals/parentSlice.ts @@ -84,7 +84,7 @@ export const initialState: BasicModalsState = { ReceiveTokensModal: { isOpen: false }, SendTokensModal: { isOpen: false }, CoinSuccessModal: { isOpen: false }, - ArtistCoinDetailsModal: { isOpen: false }, + FanClubDetailsModal: { isOpen: false }, VerificationSuccess: { isOpen: false }, VerificationError: { isOpen: false } } diff --git a/packages/common/src/store/ui/modals/reducers.ts b/packages/common/src/store/ui/modals/reducers.ts index fa0a0558811..d8a50ee311f 100644 --- a/packages/common/src/store/ui/modals/reducers.ts +++ b/packages/common/src/store/ui/modals/reducers.ts @@ -3,7 +3,6 @@ import { Action, combineReducers, Reducer } from '@reduxjs/toolkit' import { addCashModalReducer } from './add-cash-modal' import { albumTrackRemoveConfirmationModalReducer } from './album-track-remove-confirmation-modal' import { announcementModalReducer } from './announcement-modal' -import { artistCoinDetailsModalReducer } from './artist-coin-details-modal' import { artistPickModalReducer } from './artist-pick-modal' import { buySellModalReducer } from './buy-sell-modal' import { claimVestedCoinsModalReducer } from './claim-vested-coins-modal' @@ -18,6 +17,7 @@ import { downloadTrackArchiveModalReducer } from './download-track-archive-modal import { earlyReleaseConfirmationModalReducer } from './early-release-confirmation-modal' import { editAccessConfirmationModalReducer } from './edit-access-confirmation-modal' import { externalWalletSignUpModalReducer } from './external-wallet-sign-up-modal' +import { fanClubDetailsModalReducer } from './fan-club-details-modal' import { finalizeWinnersConfirmationModalReducer } from './finalize-winners-confirmation-modal' import { hideContentConfirmationModalReducer } from './hide-confirmation-modal' import { hostRemixContestModalReducer } from './host-remix-contest-modal' @@ -92,7 +92,7 @@ const combinedReducers = combineReducers({ ReceiveTokensModal: receiveTokensModalReducer, SendTokensModal: sendTokensModalReducer, CoinSuccessModal: coinSuccessModalReducer, - ArtistCoinDetailsModal: artistCoinDetailsModalReducer + FanClubDetailsModal: fanClubDetailsModalReducer }) /** diff --git a/packages/common/src/store/ui/modals/types.ts b/packages/common/src/store/ui/modals/types.ts index 1d35839783f..8b5d1571698 100644 --- a/packages/common/src/store/ui/modals/types.ts +++ b/packages/common/src/store/ui/modals/types.ts @@ -117,7 +117,7 @@ export type Modals = | 'HostRemixContest' | 'ReceiveTokensModal' | 'SendTokensModal' - | 'ArtistCoinDetailsModal' + | 'FanClubDetailsModal' | 'FinalizeWinnersConfirmation' | 'CoinSuccessModal' | 'VerificationSuccess' @@ -161,7 +161,7 @@ export type StatefulModalsState = { ReceiveTokensModal: ReceiveTokensModalState SendTokensModal: SendTokensModalState CoinSuccessModal: CoinSuccessModalState - ArtistCoinDetailsModal: ArtistCoinDetailsModalState + FanClubDetailsModal: FanClubDetailsModalState } export type ReceiveTokensModalState = BaseModalState & { @@ -173,7 +173,7 @@ export type SendTokensModalState = BaseModalState & { user?: User } -export type ArtistCoinDetailsModalState = BaseModalState & { +export type FanClubDetailsModalState = BaseModalState & { mint?: string } diff --git a/packages/common/src/store/ui/shared/tokenConstants.ts b/packages/common/src/store/ui/shared/tokenConstants.ts index 719f4ff0919..d206f3aaa5a 100644 --- a/packages/common/src/store/ui/shared/tokenConstants.ts +++ b/packages/common/src/store/ui/shared/tokenConstants.ts @@ -46,7 +46,7 @@ export const AUDIO_MINT = '9LzCMqDgTKYz9Drzqnpgee3SGa89up3a247ypMj2xrqM' export const SOL_MINT = 'So11111111111111111111111111111111111111112' export const USDC_MINT = 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v' -export const NON_ARTIST_COIN_MINTS = [AUDIO_MINT, SOL_MINT, USDC_MINT] +export const NON_FAN_CLUB_MINTS = [AUDIO_MINT, SOL_MINT, USDC_MINT] /** * Legacy token listing map with hardcoded addresses for backward compatibility diff --git a/packages/common/src/store/wallet/utils.ts b/packages/common/src/store/wallet/utils.ts index 38ebaa0b34f..b04fd1c3d56 100644 --- a/packages/common/src/store/wallet/utils.ts +++ b/packages/common/src/store/wallet/utils.ts @@ -92,7 +92,7 @@ export const getTierForUser = (totalBalance: Nullable) => { return getTierAndNumberForBalance(balance).tier } -// The other fns here use wei formatting, new artist coin data doesnt use wei +// The other fns here use wei formatting, new fan club data doesnt use wei export const getTierForUserNonWei = (totalBalance: Nullable) => { const balance = totalBalance ?? ('0' as StringWei) return getTierAndNumberForBalance(balance, false).tier diff --git a/packages/common/src/utils/route.ts b/packages/common/src/utils/route.ts index 7cf6d07a3f2..0403747448d 100644 --- a/packages/common/src/utils/route.ts +++ b/packages/common/src/utils/route.ts @@ -8,8 +8,8 @@ import { convertGenreLabelToValue, type GenreLabel } from './genres' // External Routes export const PRIVACY_POLICY = '/legal/privacy-policy' export const TERMS_OF_SERVICE = '/legal/terms-of-use' -export const ARTIST_COIN_TERMS = '/legal/artist-coin-terms' -export const ARTIST_COIN_ACCEPTABLE_USE = '/legal/artist-coin-acceptable-use' +export const FAN_CLUB_TERMS = '/legal/fan-club-terms' +export const FAN_CLUB_ACCEPTABLE_USE = '/legal/fan-club-acceptable-use' export const API_TERMS = '/legal/api-terms' export const DOWNLOAD_START_LINK = '/download?start_download=true' export const DOWNLOAD_LINK = '/download' @@ -219,8 +219,8 @@ export const AUDIUS_DEV_STAKER_LINK = 'https://audius.org/protocol' export const AUDIUS_HOT_AND_NEW = '/audius/playlist/hot-new-on-audius-%F0%9F%94%A5-4281' export const AUDIUS_HELP_LINK = 'https://help.audius.co/' -export const AUDIUS_ARTIST_COIN_HELP_LINK = - 'https://help.audius.co/product/artist-coins' +export const AUDIUS_FAN_CLUB_HELP_LINK = + 'https://help.audius.co/product/fan-clubs' export const AUDIUS_CAREERS_LINK = 'https://www.tikilabs.com/careers' export const AUDIUS_PODCAST_LINK = @@ -228,8 +228,8 @@ export const AUDIUS_PODCAST_LINK = export const AUDIUS_CYPHER_LINK = 'https://discord.gg/audius' export const AUDIUS_API_LINK = 'https://audius.org/api' -export const AUDIUS_ARTIST_COINS_HELP_LINK = - 'https://help.audius.co/product/artist-coins' +export const AUDIUS_FAN_CLUBS_HELP_LINK = + 'https://help.audius.co/product/fan-clubs' // Birdeye Links export const BIRDEYE_BASE_URL = 'https://birdeye.so' @@ -271,8 +271,8 @@ export const publicSiteRoutes = [ TERMS_OF_SERVICE, PRIVACY_POLICY, API_TERMS, - ARTIST_COIN_TERMS, - ARTIST_COIN_ACCEPTABLE_USE, + FAN_CLUB_TERMS, + FAN_CLUB_ACCEPTABLE_USE, DOWNLOAD_LINK, AUTH_REDIRECT ] diff --git a/packages/common/src/utils/videoUtils.ts b/packages/common/src/utils/videoUtils.ts index f6c34c43ca8..92f160f4ace 100644 --- a/packages/common/src/utils/videoUtils.ts +++ b/packages/common/src/utils/videoUtils.ts @@ -32,9 +32,7 @@ export const parseVideoUrl = (url: string): ParsedVideo | null => { * Get the thumbnail URL for a video. Only YouTube provides static thumbnail URLs. * Vimeo requires an API call, so returns null. */ -export const getVideoThumbnailUrl = ( - parsed: ParsedVideo -): string | null => { +export const getVideoThumbnailUrl = (parsed: ParsedVideo): string | null => { if (parsed.platform === 'youtube') { return `https://img.youtube.com/vi/${parsed.videoId}/hqdefault.jpg` } diff --git a/packages/harmony/src/assets/icons/ArtistCoin.svg b/packages/harmony/src/assets/icons/FanClub.svg similarity index 100% rename from packages/harmony/src/assets/icons/ArtistCoin.svg rename to packages/harmony/src/assets/icons/FanClub.svg diff --git a/packages/harmony/src/foundations/color/semantic.ts b/packages/harmony/src/foundations/color/semantic.ts index 55b816bd555..05f1a85be5e 100644 --- a/packages/harmony/src/foundations/color/semantic.ts +++ b/packages/harmony/src/foundations/color/semantic.ts @@ -20,7 +20,7 @@ const createSemanticTheme = (primitives: PrimitiveColors) => ({ success: primitives.special.green, premium: primitives.special.lightGreen, special: primitives.special.blue, - artistCoin: primitives.special.coinGradient + fanClub: primitives.special.coinGradient }, icon: { default: primitives.neutral.n800, @@ -40,7 +40,7 @@ const createSemanticTheme = (primitives: PrimitiveColors) => ({ success: primitives.special.green, premium: primitives.special.lightGreen, special: primitives.special.blue, - artistCoin: primitives.special.coinGradient + fanClub: primitives.special.coinGradient }, link: { default: primitives.neutral.n800, @@ -55,7 +55,7 @@ const createSemanticTheme = (primitives: PrimitiveColors) => ({ white: primitives.special.white, primary: primitives.primary.p300, gradient: primitives.special.gradient, - artistCoin: primitives.special.coinGradient, + fanClub: primitives.special.coinGradient, // Legacy compatibility accent: primitives.secondary.s300 diff --git a/packages/harmony/src/icons/icons.tsx b/packages/harmony/src/icons/icons.tsx index 3f8f9afdde6..1104bc4daea 100644 --- a/packages/harmony/src/icons/icons.tsx +++ b/packages/harmony/src/icons/icons.tsx @@ -152,7 +152,7 @@ export { IconPlaybackPause } from './individual/IconPlaybackPause' export { IconPlaybackPlay } from './individual/IconPlaybackPlay' export { IconQrCode } from './individual/IconQrCode' export { IconJupiterLogo } from './individual/IconJupiterLogo' -export { IconArtistCoin } from './individual/IconArtistCoin' +export { IconFanClub } from './individual/IconFanClub' export { IconCoinGatedLabel } from './individual/IconCoinGatedLabel' export { IconAudiusLogo } from './individual/IconAudiusLogo' export { IconAudiusLogoColor } from './individual/IconAudiusLogoColor' diff --git a/packages/harmony/src/icons/individual/IconArtistCoin.ts b/packages/harmony/src/icons/individual/IconArtistCoin.ts deleted file mode 100644 index 056d08b6b69..00000000000 --- a/packages/harmony/src/icons/individual/IconArtistCoin.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { IconComponent } from '~harmony/components' - -import IconSVG from '../../assets/icons/ArtistCoin.svg' - -export const IconArtistCoin = IconSVG as IconComponent diff --git a/packages/harmony/src/icons/individual/IconFanClub.ts b/packages/harmony/src/icons/individual/IconFanClub.ts new file mode 100644 index 00000000000..41603a3d1fe --- /dev/null +++ b/packages/harmony/src/icons/individual/IconFanClub.ts @@ -0,0 +1,5 @@ +import { IconComponent } from '~harmony/components' + +import IconSVG from '../../assets/icons/FanClub.svg' + +export const IconFanClub = IconSVG as IconComponent diff --git a/packages/harmony/src/icons/utilityIcons.ts b/packages/harmony/src/icons/utilityIcons.ts index 19f659bb740..f4cb7cc5411 100644 --- a/packages/harmony/src/icons/utilityIcons.ts +++ b/packages/harmony/src/icons/utilityIcons.ts @@ -7,7 +7,6 @@ import IconArrowLeftSVG from '../assets/icons/ArrowLeft.svg' import IconArrowRightSVG from '../assets/icons/ArrowRight.svg' import IconArrowRotateSVG from '../assets/icons/ArrowRotate.svg' import IconArrowUpToLineSVG from '../assets/icons/ArrowUpToLine.svg' -import IconArtistCoinSVG from '../assets/icons/ArtistCoin.svg' import IconBlogSVG from '../assets/icons/Blog.svg' import IconBoxHeartSVG from '../assets/icons/BoxHeart.svg' import IconCalendarDaySVG from '../assets/icons/CalendarDay.svg' @@ -46,6 +45,7 @@ import IconEmbedSVG from '../assets/icons/Embed.svg' import IconErrorSVG from '../assets/icons/Error.svg' import IconExploreSVG from '../assets/icons/Explore.svg' import IconExternalLinkSVG from '../assets/icons/ExternalLink.svg' +import IconFanClubSVG from '../assets/icons/FanClub.svg' import IconFeedSVG from '../assets/icons/Feed.svg' import IconFilterSVG from '../assets/icons/Filter.svg' import IconFolderSVG from '../assets/icons/Folder.svg' @@ -309,5 +309,5 @@ export const IconPlaybackPause = IconPlaybackPauseSVG as IconComponent export const IconPlaybackPlay = IconPlaybackPlaySVG as IconComponent export const IconQrCode = IconQrCodeSVG as IconComponent export const IconJupiterLogo = IconJupiterLogoSVG as IconComponent -export const IconArtistCoin = IconArtistCoinSVG as IconComponent +export const IconFanClub = IconFanClubSVG as IconComponent export const IconCoinGatedLabel = IconCoinGatedLabelSVG as IconComponent diff --git a/packages/mobile/src/app/Drawers.tsx b/packages/mobile/src/app/Drawers.tsx index b36a6f738ae..3eb06778c98 100644 --- a/packages/mobile/src/app/Drawers.tsx +++ b/packages/mobile/src/app/Drawers.tsx @@ -6,7 +6,6 @@ import type { Modals } from '@audius/common/store' import { AddCashDrawer } from 'app/components/add-funds-drawer/AddCashDrawer' import { AddToCollectionDrawer } from 'app/components/add-to-collection-drawer' import { ApiRewardsDrawer } from 'app/components/api-rewards-drawer/ApiRewardsDrawer' -import { ArtistCoinDetailsDrawer } from 'app/components/artist-coin-details-drawer/ArtistCoinDetailsDrawer' import { AudioBreakdownDrawer } from 'app/components/audio-breakdown-drawer' import { TiersExplainerDrawer } from 'app/components/audio-rewards' import { BlockMessagesDrawer } from 'app/components/block-messages-drawer' @@ -24,6 +23,7 @@ import { ArtistPickConfirmationDrawer } from 'app/components/drawers/ArtistPickC import { MuteCommentsConfirmationDrawer } from 'app/components/drawers/MuteCommentsConfirmationDrawer' import { DuplicateAddConfirmationDrawer } from 'app/components/duplicate-add-confirmation-drawer' import { EnablePushNotificationsDrawer } from 'app/components/enable-push-notifications-drawer' +import { FanClubDetailsDrawer } from 'app/components/fan-club-details-drawer/FanClubDetailsDrawer' import { FeedFilterDrawer } from 'app/components/feed-filter-drawer' import { ForgotPasswordDrawer } from 'app/components/forgot-password-drawer' import { HostRemixContestDrawer } from 'app/components/host-remix-contest-drawer/HostRemixContestDrawer' @@ -146,7 +146,7 @@ const commonDrawersMap: { [Modal in Modals]?: ComponentType } = { WithdrawUSDCModal: WithdrawUSDCDrawer, ReceiveTokensModal: ReceiveTokensDrawer, SendTokensModal: SendTokensDrawer, - ArtistCoinDetailsModal: ArtistCoinDetailsDrawer, + FanClubDetailsModal: FanClubDetailsDrawer, VerificationSuccess: VerificationSuccessDrawer, VerificationError: VerificationErrorDrawer } diff --git a/packages/mobile/src/components/comments/CommentBadge.tsx b/packages/mobile/src/components/comments/CommentBadge.tsx index 4f2fc0c4d9a..17d2acb76a1 100644 --- a/packages/mobile/src/components/comments/CommentBadge.tsx +++ b/packages/mobile/src/components/comments/CommentBadge.tsx @@ -3,13 +3,13 @@ import { useIsCoinMember } from '@audius/common/hooks' import type { ID } from '@audius/common/models' import type { IconComponent } from '@audius/harmony-native' -import { Flex, IconArtistCoin, IconStar, Text } from '@audius/harmony-native' +import { Flex, IconFanClub, IconStar, Text } from '@audius/harmony-native' type BadgeType = 'artist' | 'coinMember' const iconMap: Record = { artist: IconStar, - coinMember: IconArtistCoin + coinMember: IconFanClub } const messages: Record = { artist: 'Artist', diff --git a/packages/mobile/src/components/core/AccessTypeLabel.tsx b/packages/mobile/src/components/core/AccessTypeLabel.tsx index ee05de41b4a..d4605db9853 100644 --- a/packages/mobile/src/components/core/AccessTypeLabel.tsx +++ b/packages/mobile/src/components/core/AccessTypeLabel.tsx @@ -10,7 +10,7 @@ import { IconCart, IconReceive, IconSparkles, - IconArtistCoin + IconFanClub } from '@audius/harmony-native' type AccessTypeLabelProps = { @@ -56,7 +56,7 @@ const ACCESS_TYPE_CONFIG: Record = { color: 'special' }, [AccessType.TOKEN_GATED]: { - icon: IconArtistCoin, + icon: IconFanClub, label: 'Fan Club', color: 'subdued' }, diff --git a/packages/mobile/src/components/core/BalanceSection.tsx b/packages/mobile/src/components/core/BalanceSection.tsx index fd8dea019e3..44d212d2c04 100644 --- a/packages/mobile/src/components/core/BalanceSection.tsx +++ b/packages/mobile/src/components/core/BalanceSection.tsx @@ -1,7 +1,4 @@ -import { - transformArtistCoinToTokenInfo, - useArtistCoin -} from '@audius/common/api' +import { transformFanClubToTokenInfo, useFanClub } from '@audius/common/api' import { useFormattedCoinBalance } from '@audius/common/hooks' import { Flex, Text } from '@audius/harmony-native' @@ -36,8 +33,8 @@ export const BalanceSection = ({ !internalWalletOnly // includeStaked ) - const { data: coin, isPending: isCoinLoading } = useArtistCoin(mint) - const tokenInfo = coin ? transformArtistCoinToTokenInfo(coin) : undefined + const { data: coin, isPending: isCoinLoading } = useFanClub(mint) + const tokenInfo = coin ? transformFanClubToTokenInfo(coin) : undefined const isLoading = isCoinBalanceLoading || isCoinPriceLoading || (!!mint && isCoinLoading) diff --git a/packages/mobile/src/components/core/DogEar.tsx b/packages/mobile/src/components/core/DogEar.tsx index e28838bc04e..d38ce8366da 100644 --- a/packages/mobile/src/components/core/DogEar.tsx +++ b/packages/mobile/src/components/core/DogEar.tsx @@ -3,7 +3,7 @@ import type { ViewStyle } from 'react-native' import { View } from 'react-native' import { - IconArtistCoin, + IconFanClub, IconCart, IconReceive, IconSparkles @@ -71,7 +71,7 @@ export const DogEar = (props: DogEarProps) => { colors: [accentBlue, accentBlue] }, [DogEarType.TOKEN_GATED]: { - icon: IconArtistCoin + icon: IconFanClub }, [DogEarType.USDC_PURCHASE]: { icon: IconCart, diff --git a/packages/mobile/src/components/details-tile/DetailsTileGatedAccess.tsx b/packages/mobile/src/components/details-tile/DetailsTileGatedAccess.tsx index 34bd1418910..153429822a5 100644 --- a/packages/mobile/src/components/details-tile/DetailsTileGatedAccess.tsx +++ b/packages/mobile/src/components/details-tile/DetailsTileGatedAccess.tsx @@ -1,4 +1,4 @@ -import { useArtistCoin } from '@audius/common/api' +import { useFanClub } from '@audius/common/api' import type { ID, AccessConditions, @@ -34,7 +34,7 @@ export const DetailsTileGatedAccess = ({ contentType }: DetailsTileGatedAccessProps) => { const isTokenGated = isContentTokenGated(streamConditions) - const { data: token } = useArtistCoin( + const { data: token } = useFanClub( (streamConditions as TokenGatedConditions)?.token_gate?.token_mint, { enabled: isTokenGated } ) diff --git a/packages/mobile/src/components/details-tile/DetailsTileHasAccess.tsx b/packages/mobile/src/components/details-tile/DetailsTileHasAccess.tsx index 6fb7a1f6e04..7ec47bb5f57 100644 --- a/packages/mobile/src/components/details-tile/DetailsTileHasAccess.tsx +++ b/packages/mobile/src/components/details-tile/DetailsTileHasAccess.tsx @@ -17,7 +17,7 @@ import { Flex, Text as HarmonyText, HexagonalIcon, - IconArtistCoin, + IconFanClub, IconCart, IconSparkles } from '@audius/harmony-native' @@ -32,11 +32,11 @@ const messages = { specialAccess: 'SPECIAL ACCESS', payToUnlock: 'Pay to Unlock', coinGated: 'COIN GATED', - artistCoin: "This artist's coin", + fanClub: "This artist's coin", unlockedTokenGatedSuffix: (contentType: PurchaseableContentType) => ` was found in a linked wallet. This ${contentType} is now available.`, ownerTokenGated: - 'Fans can unlock access by linking a wallet containing your artist coin', + 'Fans can unlock access by linking a wallet containing your fan club', unlockedFollowGatedPrefix: 'Thank you for following ', unlockedFollowGatedSuffix: (contentType: PurchaseableContentType) => `! This ${contentType} is now available.`, @@ -130,7 +130,7 @@ const DetailsTileOwnerSection = ({ borderRadius='m' > - + {messages.coinGated} @@ -269,7 +269,7 @@ export const DetailsTileHasAccess = ({ style={[styles.description, styles.name]} onPress={handleTokenPress} > - {token?.ticker ? `$${token.ticker}` : messages.artistCoin} + {token?.ticker ? `$${token.ticker}` : messages.fanClub} {messages.unlockedTokenGatedSuffix(contentType)} diff --git a/packages/mobile/src/components/details-tile/DetailsTileNoAccess.tsx b/packages/mobile/src/components/details-tile/DetailsTileNoAccess.tsx index 495a7c5351f..d1d291a4d87 100644 --- a/packages/mobile/src/components/details-tile/DetailsTileNoAccess.tsx +++ b/packages/mobile/src/components/details-tile/DetailsTileNoAccess.tsx @@ -47,7 +47,7 @@ const messages = { unlockingFollowGatedSuffix: '!', lockedTokenGatedPrefix: 'You must hold at least ', lockedTokenGatedSuffix: ' in a connected wallet.', - buyArtistCoin: 'Buy Coins', + buyFanClub: 'Buy Coins', lockedUSDCPurchase: 'Unlock access with a one-time purchase!' } @@ -298,7 +298,7 @@ export const DetailsTileNoAccess = (props: DetailsTileNoAccessProps) => { onPress={handleBuyTokenPress} gradient={color.special.coinGradient} > - {messages.buyArtistCoin} + {messages.buyFanClub} ) diff --git a/packages/mobile/src/components/edit/PriceAndAudienceField/PriceAndAudienceField.tsx b/packages/mobile/src/components/edit/PriceAndAudienceField/PriceAndAudienceField.tsx index 7ef38187f2b..5691ae22d0e 100644 --- a/packages/mobile/src/components/edit/PriceAndAudienceField/PriceAndAudienceField.tsx +++ b/packages/mobile/src/components/edit/PriceAndAudienceField/PriceAndAudienceField.tsx @@ -1,6 +1,6 @@ import { useMemo } from 'react' -import { useArtistCoin } from '@audius/common/api' +import { useFanClub } from '@audius/common/api' import { priceAndAudienceMessages as messages } from '@audius/common/messages' import type { AccessConditions } from '@audius/common/models' import { @@ -26,7 +26,7 @@ export const PriceAndAudienceField = (props: PriceAndAudienceFieldProps) => { const [{ value: streamConditions }] = useField>('stream_conditions') - const { data: token } = useArtistCoin( + const { data: token } = useFanClub( isContentTokenGated(streamConditions) ? streamConditions.token_gate.token_mint : '' diff --git a/packages/mobile/src/components/edit/PriceAndAudienceField/TokenGatedRadioField.tsx b/packages/mobile/src/components/edit/PriceAndAudienceField/TokenGatedRadioField.tsx index 19ed92fcc44..23e26b62d42 100644 --- a/packages/mobile/src/components/edit/PriceAndAudienceField/TokenGatedRadioField.tsx +++ b/packages/mobile/src/components/edit/PriceAndAudienceField/TokenGatedRadioField.tsx @@ -1,6 +1,6 @@ import { useContext, useEffect, useState } from 'react' -import { useArtistCreatedCoin, useCurrentUserId } from '@audius/common/api' +import { useArtistCreatedFanClub, useCurrentUserId } from '@audius/common/api' import { priceAndAudienceMessages } from '@audius/common/messages' import { isContentTokenGated, @@ -30,7 +30,7 @@ export const TokenGatedRadioField = (props: TokenGatedRadioFieldProps) => { const { spacing } = useTheme() const { data: userId } = useCurrentUserId() - const { data: coin } = useArtistCreatedCoin(userId, { + const { data: coin } = useArtistCreatedFanClub(userId, { enabled: !!userId }) diff --git a/packages/mobile/src/components/artist-coin-details-drawer/ArtistCoinDetailsDrawer.tsx b/packages/mobile/src/components/fan-club-details-drawer/FanClubDetailsDrawer.tsx similarity index 77% rename from packages/mobile/src/components/artist-coin-details-drawer/ArtistCoinDetailsDrawer.tsx rename to packages/mobile/src/components/fan-club-details-drawer/FanClubDetailsDrawer.tsx index f44a31d82d5..beac7b0e623 100644 --- a/packages/mobile/src/components/artist-coin-details-drawer/ArtistCoinDetailsDrawer.tsx +++ b/packages/mobile/src/components/fan-club-details-drawer/FanClubDetailsDrawer.tsx @@ -1,8 +1,8 @@ import { useCallback, type ReactNode } from 'react' -import { useArtistCoin, useCoinGeckoCoin, useUser } from '@audius/common/api' +import { useFanClub, useCoinGeckoCoin, useUser } from '@audius/common/api' import { coinDetailsMessages } from '@audius/common/messages' -import { useArtistCoinDetailsModal } from '@audius/common/store' +import { useFanClubDetailsModal } from '@audius/common/store' import { formatCurrencyWithSubscript, getTokenDecimalPlaces @@ -28,10 +28,10 @@ import { env } from 'app/services/env' import { DrawerHeader } from '../drawer/DrawerHeader' -const { artistCoinDetails, overflowMenu } = coinDetailsMessages +const { fanClubDetails, overflowMenu } = coinDetailsMessages const LAUNCHPAD_COIN_DESCRIPTION = (handle: string, ticker: string) => - `{${ticker}} is an artist coin created by {${handle}} on Audius. Learn more at https://audius.co/coin/{${ticker}}` + `{${ticker}} is an fan club created by {${handle}} on Audius. Learn more at https://audius.co/coin/{${ticker}}` const formatTokenAmount = (balance: number, coinDecimals: number) => { const decimals = getTokenDecimalPlaces(balance) @@ -102,13 +102,13 @@ const CopyableAddress = ({ ) -export const ArtistCoinDetailsDrawer = () => { +export const FanClubDetailsDrawer = () => { const { spacing } = useTheme() const { toast } = useToast() - const { isOpen, onClose, data: modalData } = useArtistCoinDetailsModal() + const { isOpen, onClose, data: modalData } = useFanClubDetailsModal() const mint = modalData?.mint - const { data: artistCoin } = useArtistCoin(mint) - const { data: artist } = useUser(artistCoin?.ownerId) + const { data: fanClub } = useFanClub(mint) + const { data: artist } = useUser(fanClub?.ownerId) const isAudio = mint === env.WAUDIO_MINT_ADDRESS const { data: coingeckoResponse } = useCoinGeckoCoin( { coinId: 'audius' }, @@ -116,57 +116,57 @@ export const ArtistCoinDetailsDrawer = () => { ) const handleCopyAddress = useCallback(() => { - if (artistCoin?.mint) { - Clipboard.setString(artistCoin.mint) - toast({ content: artistCoinDetails.copied, type: 'info' }) + if (fanClub?.mint) { + Clipboard.setString(fanClub.mint) + toast({ content: fanClubDetails.copied, type: 'info' }) } - }, [artistCoin?.mint, toast]) + }, [fanClub?.mint, toast]) const handleCopyRewardsPoolAddress = useCallback(() => { - if (artistCoin?.rewardPool?.address) { - Clipboard.setString(artistCoin.rewardPool.address) - toast({ content: artistCoinDetails.copied, type: 'info' }) + if (fanClub?.rewardPool?.address) { + Clipboard.setString(fanClub.rewardPool.address) + toast({ content: fanClubDetails.copied, type: 'info' }) } - }, [artistCoin?.rewardPool?.address, toast]) + }, [fanClub?.rewardPool?.address, toast]) - if (!artistCoin?.mint) { + if (!fanClub?.mint) { return null } - const decimals = artistCoin.decimals ?? 9 - const hasGraduated = artistCoin.dynamicBondingCurve?.isMigrated ?? false - const locker = artistCoin.artistLocker + const decimals = fanClub.decimals ?? 9 + const hasGraduated = fanClub.dynamicBondingCurve?.isMigrated ?? false + const locker = fanClub.artistLocker const showLockerStats = !isAudio && hasGraduated && !!locker - const ticker = artistCoin.ticker ? `$${artistCoin.ticker}` : '' + const ticker = fanClub.ticker ? `$${fanClub.ticker}` : '' // Market data const totalSupply = isAudio ? coingeckoResponse?.market_data?.total_supply - : artistCoin.totalSupply + : fanClub.totalSupply const marketCap = isAudio ? coingeckoResponse?.market_data?.market_cap?.usd - : artistCoin.displayMarketCap + : fanClub.displayMarketCap const price = isAudio ? coingeckoResponse?.market_data?.current_price?.usd - : artistCoin.displayPrice + : fanClub.displayPrice const liquidity = isAudio ? coingeckoResponse?.market_data?.total_volume?.usd - : artistCoin.liquidity + : fanClub.liquidity - const formattedArtistEarnings = artistCoin.artistFees?.totalFees - ? formatFeeNumber(Math.trunc(artistCoin.artistFees.totalFees)) + const formattedArtistEarnings = fanClub.artistFees?.totalFees + ? formatFeeNumber(Math.trunc(fanClub.artistFees.totalFees)) : null const rewardsPoolBalance = - artistCoin.rewardPool?.balance != null - ? formatTokenAmount(artistCoin.rewardPool.balance, decimals) + fanClub.rewardPool?.balance != null + ? formatTokenAmount(fanClub.rewardPool.balance, decimals) : null const renderHeader = () => ( @@ -190,10 +190,10 @@ export const ArtistCoinDetailsDrawer = () => { {/* Token Info with avatar */} - + - {artistCoin.name} + {fanClub.name} {ticker} @@ -205,11 +205,11 @@ export const ArtistCoinDetailsDrawer = () => { {/* Coin Address */} @@ -217,13 +217,13 @@ export const ArtistCoinDetailsDrawer = () => { {/* On-Chain Description */} {!isAudio && artist?.handle ? ( {LAUNCHPAD_COIN_DESCRIPTION( artist.handle, - artistCoin.ticker ?? '' + fanClub.ticker ?? '' )} @@ -237,8 +237,8 @@ export const ArtistCoinDetailsDrawer = () => { left={ totalSupply != null ? ( {totalSupply.toLocaleString()} @@ -249,8 +249,8 @@ export const ArtistCoinDetailsDrawer = () => { right={ marketCap != null ? ( ${marketCap.toLocaleString()} @@ -263,8 +263,8 @@ export const ArtistCoinDetailsDrawer = () => { left={ price != null ? ( {formatCurrencyWithSubscript(price)} @@ -275,8 +275,8 @@ export const ArtistCoinDetailsDrawer = () => { right={ liquidity != null ? ( ${liquidity.toLocaleString()} @@ -351,13 +351,13 @@ export const ArtistCoinDetailsDrawer = () => { ) : null} {/* Rewards Pool Address */} - {artistCoin.rewardPool?.address ? ( + {fanClub.rewardPool?.address ? ( @@ -369,7 +369,7 @@ export const ArtistCoinDetailsDrawer = () => { {/* Close Button */} diff --git a/packages/mobile/src/components/locked-text-post-drawer/LockedTextPostDrawer.tsx b/packages/mobile/src/components/locked-text-post-drawer/LockedTextPostDrawer.tsx index bd6ff5e7d9d..895397f5d34 100644 --- a/packages/mobile/src/components/locked-text-post-drawer/LockedTextPostDrawer.tsx +++ b/packages/mobile/src/components/locked-text-post-drawer/LockedTextPostDrawer.tsx @@ -1,6 +1,6 @@ import { useCallback } from 'react' -import { useArtistCoin } from '@audius/common/api' +import { useFanClub } from '@audius/common/api' import { View } from 'react-native' import { Button, Flex, IconLock, Text } from '@audius/harmony-native' @@ -42,7 +42,7 @@ export const LockedTextPostDrawer = () => { const navigation = useNavigation() const { data, onClose } = useDrawer('LockedTextPost') const mint = (data as { mint: string } | undefined)?.mint - const { data: coin } = useArtistCoin(mint) + const { data: coin } = useFanClub(mint) const handleBuyCoins = useCallback(() => { if (coin?.ticker) { diff --git a/packages/mobile/src/components/navigation-container/NavigationContainer.tsx b/packages/mobile/src/components/navigation-container/NavigationContainer.tsx index d66cc7d8066..4ee07ee3f01 100644 --- a/packages/mobile/src/components/navigation-container/NavigationContainer.tsx +++ b/packages/mobile/src/components/navigation-container/NavigationContainer.tsx @@ -184,7 +184,7 @@ const NavigationContainer = (props: NavigationContainerProps) => { CashScreen: { path: 'cash' }, - ArtistCoinsExplore: { + FanClubsExplore: { path: 'coins' }, CoinDetailsScreen: { @@ -397,7 +397,7 @@ const NavigationContainer = (props: NavigationContainerProps) => { } return createTrendingStackState({ - name: 'ArtistCoinsExplore' + name: 'FanClubsExplore' }) } diff --git a/packages/mobile/src/components/receive-tokens-drawer/ReceiveTokensDrawer.tsx b/packages/mobile/src/components/receive-tokens-drawer/ReceiveTokensDrawer.tsx index 18421367c92..1cc9520a57f 100644 --- a/packages/mobile/src/components/receive-tokens-drawer/ReceiveTokensDrawer.tsx +++ b/packages/mobile/src/components/receive-tokens-drawer/ReceiveTokensDrawer.tsx @@ -121,7 +121,7 @@ export const ReceiveTokensDrawer = () => { + {walletMessages.receiveTokensLearnMore} diff --git a/packages/mobile/src/components/send-tokens-drawer/components/SendTokensConfirmation.tsx b/packages/mobile/src/components/send-tokens-drawer/components/SendTokensConfirmation.tsx index d718c9922be..4eec5254671 100644 --- a/packages/mobile/src/components/send-tokens-drawer/components/SendTokensConfirmation.tsx +++ b/packages/mobile/src/components/send-tokens-drawer/components/SendTokensConfirmation.tsx @@ -1,7 +1,4 @@ -import { - useArtistCoin, - transformArtistCoinToTokenInfo -} from '@audius/common/api' +import { useFanClub, transformFanClubToTokenInfo } from '@audius/common/api' import type { User } from '@audius/common/models' import { SquareSizes } from '@audius/common/models' import { FixedDecimal } from '@audius/fixed-decimal' @@ -49,8 +46,8 @@ export const SendTokensConfirmation = ({ onBack }: SendTokensConfirmationProps) => { // Get token data - const { data: coin } = useArtistCoin(mint) - const tokenInfo = coin ? transformArtistCoinToTokenInfo(coin) : undefined + const { data: coin } = useFanClub(mint) + const tokenInfo = coin ? transformFanClubToTokenInfo(coin) : undefined const profilePicture = useProfilePicture({ userId: selectedUser?.user_id, diff --git a/packages/mobile/src/components/send-tokens-drawer/components/SendTokensFailure.tsx b/packages/mobile/src/components/send-tokens-drawer/components/SendTokensFailure.tsx index 759288e119c..1298955e88e 100644 --- a/packages/mobile/src/components/send-tokens-drawer/components/SendTokensFailure.tsx +++ b/packages/mobile/src/components/send-tokens-drawer/components/SendTokensFailure.tsx @@ -1,7 +1,4 @@ -import { - useArtistCoin, - transformArtistCoinToTokenInfo -} from '@audius/common/api' +import { useFanClub, transformFanClubToTokenInfo } from '@audius/common/api' import type { User } from '@audius/common/models' import { SquareSizes } from '@audius/common/models' import { FixedDecimal } from '@audius/fixed-decimal' @@ -50,8 +47,8 @@ export const SendTokensFailure = ({ onClose }: SendTokensFailureProps) => { // Get token data - const { data: coin } = useArtistCoin(mint) - const tokenInfo = coin ? transformArtistCoinToTokenInfo(coin) : undefined + const { data: coin } = useFanClub(mint) + const tokenInfo = coin ? transformFanClubToTokenInfo(coin) : undefined const profilePicture = useProfilePicture({ userId: selectedUser?.user_id, diff --git a/packages/mobile/src/components/send-tokens-drawer/components/SendTokensInput.tsx b/packages/mobile/src/components/send-tokens-drawer/components/SendTokensInput.tsx index e2802304b6b..5662b653fa3 100644 --- a/packages/mobile/src/components/send-tokens-drawer/components/SendTokensInput.tsx +++ b/packages/mobile/src/components/send-tokens-drawer/components/SendTokensInput.tsx @@ -1,9 +1,9 @@ import { useCallback, useMemo, useState, useEffect } from 'react' import { - useArtistCoin, + useFanClub, useCoinBalance, - transformArtistCoinToTokenInfo, + transformFanClubToTokenInfo, useCurrentUserId, useTradeableCoins } from '@audius/common/api' @@ -124,13 +124,13 @@ export const SendTokensInput = ({ useOwnedCoins(availableCoins) // Get the coin data and balance for selected token - const { data: coin } = useArtistCoin(selectedMint) + const { data: coin } = useFanClub(selectedMint) const { data: tokenBalance } = useCoinBalance({ mint: selectedMint, includeExternalWallets: false, includeStaked: false }) - const tokenInfo = coin ? transformArtistCoinToTokenInfo(coin) : undefined + const tokenInfo = coin ? transformFanClubToTokenInfo(coin) : undefined // Calculate USD value for display const usdValueInfo = useMemo(() => { diff --git a/packages/mobile/src/components/send-tokens-drawer/components/SendTokensSuccess.tsx b/packages/mobile/src/components/send-tokens-drawer/components/SendTokensSuccess.tsx index 423306c25f8..91fac976b36 100644 --- a/packages/mobile/src/components/send-tokens-drawer/components/SendTokensSuccess.tsx +++ b/packages/mobile/src/components/send-tokens-drawer/components/SendTokensSuccess.tsx @@ -1,7 +1,4 @@ -import { - useArtistCoin, - transformArtistCoinToTokenInfo -} from '@audius/common/api' +import { useFanClub, transformFanClubToTokenInfo } from '@audius/common/api' import type { User } from '@audius/common/models' import { SquareSizes } from '@audius/common/models' import { makeSolanaTransactionLink } from '@audius/common/utils' @@ -45,8 +42,8 @@ export const SendTokensSuccess = ({ signature, onDone }: SendTokensSuccessProps) => { - const { data: coin } = useArtistCoin(mint) - const tokenInfo = coin ? transformArtistCoinToTokenInfo(coin) : undefined + const { data: coin } = useFanClub(mint) + const tokenInfo = coin ? transformFanClubToTokenInfo(coin) : undefined const profilePicture = useProfilePicture({ userId: selectedUser?.user_id, diff --git a/packages/mobile/src/components/track-details-tile/TrackDetailsTile.tsx b/packages/mobile/src/components/track-details-tile/TrackDetailsTile.tsx index f3569c9fe4c..6854137c0a6 100644 --- a/packages/mobile/src/components/track-details-tile/TrackDetailsTile.tsx +++ b/packages/mobile/src/components/track-details-tile/TrackDetailsTile.tsx @@ -15,7 +15,7 @@ import type { SvgProps } from 'react-native-svg' import { Flex, - IconArtistCoin, + IconFanClub, IconCart, IconSparkles } from '@audius/harmony-native' @@ -112,7 +112,7 @@ export const TrackDetailsTile = ({ }, [GatedContentType.TOKEN_GATED]: { message: messages.coinGated, - icon: IconArtistCoin, + icon: IconFanClub, color: accentBlue }, [GatedContentType.USDC_PURCHASE]: { diff --git a/packages/mobile/src/components/user-badges/UserBadges.tsx b/packages/mobile/src/components/user-badges/UserBadges.tsx index 64c7427e19d..b96db8aa81a 100644 --- a/packages/mobile/src/components/user-badges/UserBadges.tsx +++ b/packages/mobile/src/components/user-badges/UserBadges.tsx @@ -14,40 +14,40 @@ type UserBadgesProps = { userId: ID badgeSize?: IconSize mint?: string - hideArtistCoinBadge?: boolean + hideFanClubBadge?: boolean } export const UserBadges = (props: UserBadgesProps) => { - const { userId, badgeSize = 's', mint, hideArtistCoinBadge } = props + const { userId, badgeSize = 's', mint, hideFanClubBadge } = props const { data: userData } = useUser(userId, { select: (user) => ({ isVerified: user?.is_verified, - artistCoinBadge: user?.artist_coin_badge + fanClubBadge: user?.fan_club_badge }) }) - const { isVerified: userIsVerified, artistCoinBadge: userArtistCoinBadge } = + const { isVerified: userIsVerified, fanClubBadge: userFanClubBadge } = userData ?? {} const { tier } = useTierAndVerifiedForUser(userId) const displayMint = useMemo(() => { - // Priority: explicit mint prop > user's artist_coin_badge > null + // Priority: explicit mint prop > user's fan_club_badge > null if (mint) return mint - if (userArtistCoinBadge?.mint) return userArtistCoinBadge.mint + if (userFanClubBadge?.mint) return userFanClubBadge.mint return null - }, [mint, userArtistCoinBadge?.mint]) + }, [mint, userFanClubBadge?.mint]) - const shouldShowArtistCoinBadge = + const shouldShowFanClubBadge = !!displayMint && displayMint !== env.WAUDIO_MINT_ADDRESS && - !hideArtistCoinBadge + !hideFanClubBadge return ( {userIsVerified ? : null} - {shouldShowArtistCoinBadge ? ( - + {shouldShowFanClubBadge ? ( + ) : null} ) diff --git a/packages/mobile/src/components/user-link/UserLink.tsx b/packages/mobile/src/components/user-link/UserLink.tsx index 044a5a22e26..6288b881960 100644 --- a/packages/mobile/src/components/user-link/UserLink.tsx +++ b/packages/mobile/src/components/user-link/UserLink.tsx @@ -25,7 +25,7 @@ type UserLinkProps = Omit, 'to' | 'children'> & { badgeSize?: IconSize textLinkStyle?: StyleProp disabled?: boolean - hideArtistCoinBadge?: boolean + hideFanClubBadge?: boolean mint?: string } @@ -36,7 +36,7 @@ export const UserLink = (props: UserLinkProps) => { style, textLinkStyle, disabled, - hideArtistCoinBadge, + hideFanClubBadge, mint, ...other } = props @@ -93,7 +93,7 @@ export const UserLink = (props: UserLinkProps) => { userId={userId} badgeSize={badgeSize} mint={mint} - hideArtistCoinBadge={hideArtistCoinBadge} + hideFanClubBadge={hideFanClubBadge} /> diff --git a/packages/mobile/src/harmony-native/foundations/color/color.ts b/packages/mobile/src/harmony-native/foundations/color/color.ts index 017cc0aebf4..60b6f08afbf 100644 --- a/packages/mobile/src/harmony-native/foundations/color/color.ts +++ b/packages/mobile/src/harmony-native/foundations/color/color.ts @@ -110,51 +110,51 @@ const semanticOverrides = { defaultLight: { text: { heading: primitiveOverrides.defaultLight.special.gradient, - artistCoin: primitiveOverrides.defaultLight.special.coinGradient + fanClub: primitiveOverrides.defaultLight.special.coinGradient }, icon: { heading: primitiveOverrides.defaultLight.special.gradient, - artistCoin: primitiveOverrides.defaultLight.special.coinGradient + fanClub: primitiveOverrides.defaultLight.special.coinGradient } }, defaultDark: { text: { heading: primitiveOverrides.defaultDark.special.gradient, - artistCoin: primitiveOverrides.defaultDark.special.coinGradient + fanClub: primitiveOverrides.defaultDark.special.coinGradient }, icon: { heading: primitiveOverrides.defaultDark.special.gradient, - artistCoin: primitiveOverrides.defaultDark.special.coinGradient + fanClub: primitiveOverrides.defaultDark.special.coinGradient } }, day: { text: { heading: primitiveOverrides.day.special.gradient, - artistCoin: primitiveOverrides.day.special.coinGradient + fanClub: primitiveOverrides.day.special.coinGradient }, icon: { heading: primitiveOverrides.day.special.gradient, - artistCoin: primitiveOverrides.day.special.coinGradient + fanClub: primitiveOverrides.day.special.coinGradient } }, dark: { text: { heading: primitiveOverrides.dark.special.gradient, - artistCoin: primitiveOverrides.dark.special.coinGradient + fanClub: primitiveOverrides.dark.special.coinGradient }, icon: { heading: primitiveOverrides.dark.special.gradient, - artistCoin: primitiveOverrides.dark.special.coinGradient + fanClub: primitiveOverrides.dark.special.coinGradient } }, matrix: { text: { heading: primitiveOverrides.matrix.special.gradient, - artistCoin: primitiveOverrides.matrix.special.coinGradient + fanClub: primitiveOverrides.matrix.special.coinGradient }, icon: { heading: primitiveOverrides.matrix.special.gradient, - artistCoin: primitiveOverrides.matrix.special.coinGradient + fanClub: primitiveOverrides.matrix.special.coinGradient } } } diff --git a/packages/mobile/src/harmony-native/icons.tsx b/packages/mobile/src/harmony-native/icons.tsx index 35bd7b9fea4..bac05097386 100644 --- a/packages/mobile/src/harmony-native/icons.tsx +++ b/packages/mobile/src/harmony-native/icons.tsx @@ -161,7 +161,7 @@ export { default as IconPin } from '@audius/harmony/src/assets/icons/Pin.svg' export { default as IconPaperAirplane } from '@audius/harmony/src/assets/icons/PaperAirplane.svg' export { default as IconArrowUpToLine } from '@audius/harmony/src/assets/icons/ArrowUpToLine.svg' export { default as IconJupiterLogo } from '@audius/harmony/src/assets/icons/JupiterLogo.svg' -export { default as IconArtistCoin } from '@audius/harmony/src/assets/icons/ArtistCoin.svg' +export { default as IconFanClub } from '@audius/harmony/src/assets/icons/FanClub.svg' export { default as IconCoinGatedLabel } from '@audius/harmony/src/assets/icons/CoinGatedLabel.svg' // Two Tone / Special Styling diff --git a/packages/mobile/src/screens/app-drawer-screen/left-nav-drawer/ArtistCoinsNavItem.tsx b/packages/mobile/src/screens/app-drawer-screen/left-nav-drawer/ArtistCoinsNavItem.tsx deleted file mode 100644 index 249f961cd74..00000000000 --- a/packages/mobile/src/screens/app-drawer-screen/left-nav-drawer/ArtistCoinsNavItem.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import React from 'react' - -import { IconArtistCoin } from '@audius/harmony-native' - -import { LeftNavLink } from './LeftNavLink' - -const messages = { - artistCoins: 'Fan Clubs' -} - -export const ArtistCoinsNavItem = () => { - return ( - - ) -} diff --git a/packages/mobile/src/screens/app-drawer-screen/left-nav-drawer/FanClubsNavItem.tsx b/packages/mobile/src/screens/app-drawer-screen/left-nav-drawer/FanClubsNavItem.tsx new file mode 100644 index 00000000000..a9da174d361 --- /dev/null +++ b/packages/mobile/src/screens/app-drawer-screen/left-nav-drawer/FanClubsNavItem.tsx @@ -0,0 +1,19 @@ +import React from 'react' + +import { IconFanClub } from '@audius/harmony-native' + +import { LeftNavLink } from './LeftNavLink' + +const messages = { + fanClubs: 'Fan Clubs' +} + +export const FanClubsNavItem = () => { + return ( + + ) +} diff --git a/packages/mobile/src/screens/app-drawer-screen/left-nav-drawer/LeftNavDrawer.tsx b/packages/mobile/src/screens/app-drawer-screen/left-nav-drawer/LeftNavDrawer.tsx index 3ff90407955..37aec81ee4d 100644 --- a/packages/mobile/src/screens/app-drawer-screen/left-nav-drawer/LeftNavDrawer.tsx +++ b/packages/mobile/src/screens/app-drawer-screen/left-nav-drawer/LeftNavDrawer.tsx @@ -15,7 +15,7 @@ import { ProfileNavItem, MessagesNavItem, WalletNavItem, - ArtistCoinsNavItem, + FanClubsNavItem, RewardsNavItem, UploadNavItem, SettingsNavItem, @@ -50,7 +50,7 @@ const WrappedLeftNavDrawer = () => { - + diff --git a/packages/mobile/src/screens/app-drawer-screen/left-nav-drawer/nav-items/index.ts b/packages/mobile/src/screens/app-drawer-screen/left-nav-drawer/nav-items/index.ts index 497a21ba6ed..9c325ebb069 100644 --- a/packages/mobile/src/screens/app-drawer-screen/left-nav-drawer/nav-items/index.ts +++ b/packages/mobile/src/screens/app-drawer-screen/left-nav-drawer/nav-items/index.ts @@ -1,7 +1,7 @@ export { ProfileNavItem } from '../ProfileNavItem' export { MessagesNavItem } from '../MessagesNavItem' export { WalletNavItem } from '../WalletNavItem' -export { ArtistCoinsNavItem } from '../ArtistCoinsNavItem' +export { FanClubsNavItem } from '../FanClubsNavItem' export { RewardsNavItem } from '../RewardsNavItem' export { UploadNavItem } from '../UploadNavItem' export { SettingsNavItem } from '../SettingsNavItem' diff --git a/packages/mobile/src/screens/app-screen/AppTabScreen.tsx b/packages/mobile/src/screens/app-screen/AppTabScreen.tsx index 870c7c3e88a..561780b348c 100644 --- a/packages/mobile/src/screens/app-screen/AppTabScreen.tsx +++ b/packages/mobile/src/screens/app-screen/AppTabScreen.tsx @@ -64,8 +64,8 @@ import { } from 'app/screens/user-list-screen' import { WalletScreen } from 'app/screens/wallet-screen' -import { ArtistCoinSortScreen } from '../artist-coin-sort-screen/ArtistCoinSortScreen' -import { ArtistCoinsExploreScreen } from '../artist-coins-explore-screen/ArtistCoinsExploreScreen' +import { FanClubSortScreen } from '../fan-club-sort-screen/FanClubSortScreen' +import { FanClubsExploreScreen } from '../fan-clubs-explore-screen/FanClubsExploreScreen' import { useAppScreenOptions } from './useAppScreenOptions' @@ -112,8 +112,8 @@ export type AppTabScreenParamList = { AudioScreen: undefined RewardsScreen: undefined - ArtistCoinsExplore: undefined - ArtistCoinSort: { + FanClubsExplore: undefined + FanClubSort: { initialSortMethod?: GetCoinsSortMethodEnum initialSortDirection?: GetCoinsSortDirectionEnum } @@ -244,11 +244,8 @@ export const AppTabScreen = ({ baseScreen, Stack }: AppTabScreenProps) => { name='EditCoinDetailsScreen' component={EditCoinDetailsScreen} /> - - + + diff --git a/packages/mobile/src/screens/buy-sell-screen/components/BuyScreen.tsx b/packages/mobile/src/screens/buy-sell-screen/components/BuyScreen.tsx index b2e4026bf9b..ca69dc1cec8 100644 --- a/packages/mobile/src/screens/buy-sell-screen/components/BuyScreen.tsx +++ b/packages/mobile/src/screens/buy-sell-screen/components/BuyScreen.tsx @@ -1,9 +1,9 @@ import React, { useMemo, useRef } from 'react' import { - transformArtistCoinsToTokenInfoMap, - useArtistCoin, - useArtistCoins + transformFanClubsToTokenInfoMap, + useFanClub, + useFanClubs } from '@audius/common/api' import { buySellMessages } from '@audius/common/messages' import type { CoinInfo, CoinPair } from '@audius/common/store' @@ -79,8 +79,9 @@ export const BuyScreen = ({ availableOutputTokens, onOutputTokenChange }: BuyScreenProps) => { - const { data: tokenPriceData, isPending: isTokenPriceLoading } = - useArtistCoin(tokenPair?.baseToken?.address) + const { data: tokenPriceData, isPending: isTokenPriceLoading } = useFanClub( + tokenPair?.baseToken?.address + ) const decimalPlaces = useMemo(() => { if (!tokenPriceData?.price) return 2 @@ -105,9 +106,9 @@ export const BuyScreen = ({ onInputValueChange }) - const { data: coins } = useArtistCoins() - const artistCoins: CoinInfo[] = useMemo(() => { - return Object.values(transformArtistCoinsToTokenInfoMap(coins ?? [])) + const { data: coins } = useFanClubs() + const fanClubs: CoinInfo[] = useMemo(() => { + return Object.values(transformFanClubsToTokenInfoMap(coins ?? [])) }, [coins]) // Track if an exchange rate has ever been successfully fetched @@ -151,7 +152,7 @@ export const BuyScreen = ({ tokenPrice={tokenPriceData?.price?.toString() ?? null} isTokenPriceLoading={isTokenPriceLoading} tokenPriceDecimalPlaces={decimalPlaces} - availableTokens={availableOutputTokens ?? artistCoins} + availableTokens={availableOutputTokens ?? fanClubs} onTokenChange={onOutputTokenChange} /> diff --git a/packages/mobile/src/screens/buy-sell-screen/components/ConvertScreen.tsx b/packages/mobile/src/screens/buy-sell-screen/components/ConvertScreen.tsx index 4dbd2f3d4f7..b6eba400949 100644 --- a/packages/mobile/src/screens/buy-sell-screen/components/ConvertScreen.tsx +++ b/packages/mobile/src/screens/buy-sell-screen/components/ConvertScreen.tsx @@ -1,9 +1,9 @@ import React, { useCallback, useMemo, useRef } from 'react' import { - transformArtistCoinsToTokenInfoMap, - useArtistCoin, - useArtistCoins + transformFanClubsToTokenInfoMap, + useFanClub, + useFanClubs } from '@audius/common/api' import { buySellMessages } from '@audius/common/messages' import type { CoinInfo, CoinPair } from '@audius/common/store' @@ -98,8 +98,9 @@ export const ConvertScreen = ({ const selectedInputToken = baseToken const selectedOutputToken = quoteToken - const { data: tokenPriceData, isPending: isTokenPriceLoading } = - useArtistCoin(selectedOutputToken?.address ?? '') + const { data: tokenPriceData, isPending: isTokenPriceLoading } = useFanClub( + selectedOutputToken?.address ?? '' + ) const decimalPlaces = useMemo(() => { if (!tokenPriceData?.price) return 2 @@ -124,17 +125,17 @@ export const ConvertScreen = ({ onInputValueChange }) - const { data: coins } = useArtistCoins() - const artistCoins: CoinInfo[] = useMemo(() => { - return Object.values(transformArtistCoinsToTokenInfoMap(coins ?? [])) + const { data: coins } = useFanClubs() + const fanClubs: CoinInfo[] = useMemo(() => { + return Object.values(transformFanClubsToTokenInfoMap(coins ?? [])) }, [coins]) const totalAvailableTokens = useMemo(() => { - return [...(availableOutputTokens ?? []), ...artistCoins].filter( + return [...(availableOutputTokens ?? []), ...fanClubs].filter( (token, index, arr) => arr.findIndex((t) => t.symbol === token.symbol) === index ) // Remove duplicates - }, [availableOutputTokens, artistCoins]) + }, [availableOutputTokens, fanClubs]) // Filter out the currently selected input token from available output tokens const filteredAvailableOutputTokens = useMemo(() => { diff --git a/packages/mobile/src/screens/buy-sell-screen/components/SellScreen.tsx b/packages/mobile/src/screens/buy-sell-screen/components/SellScreen.tsx index 8ca567ec8b4..359f8b5ec5c 100644 --- a/packages/mobile/src/screens/buy-sell-screen/components/SellScreen.tsx +++ b/packages/mobile/src/screens/buy-sell-screen/components/SellScreen.tsx @@ -1,6 +1,6 @@ import React, { useRef } from 'react' -import { useArtistCoin } from '@audius/common/api' +import { useFanClub } from '@audius/common/api' import type { CoinInfo, CoinPair } from '@audius/common/store' import { useCoinSwapForm } from '@audius/common/store' @@ -77,7 +77,7 @@ export const SellScreen = ({ onInputTokenChange, availableInputTokens }: SellScreenProps) => { - const { data: tokenPriceData } = useArtistCoin(tokenPair?.baseToken?.address) + const { data: tokenPriceData } = useFanClub(tokenPair?.baseToken?.address) const tokenPrice = tokenPriceData?.price?.toString() ?? null diff --git a/packages/mobile/src/screens/buy-sell-screen/useBuySellFlow.tsx b/packages/mobile/src/screens/buy-sell-screen/useBuySellFlow.tsx index 8d79a311a32..e5995cd8171 100644 --- a/packages/mobile/src/screens/buy-sell-screen/useBuySellFlow.tsx +++ b/packages/mobile/src/screens/buy-sell-screen/useBuySellFlow.tsx @@ -1,7 +1,7 @@ import React, { useCallback, useEffect, useMemo, useState } from 'react' import { - useArtistCoin, + useFanClub, useCoinPair, useSwapCoins, useTradeableCoins @@ -236,9 +236,7 @@ export const useBuySellFlow = ({ selectedPair: safeSelectedPair }) - const { data: outputCoin } = useArtistCoin( - swapTokens.outputTokenInfo?.address - ) + const { data: outputCoin } = useFanClub(swapTokens.outputTokenInfo?.address) const pricePerBaseToken = useMemo(() => { return outputCoin?.price !== undefined && outputCoin.price !== 0 ? outputCoin.price diff --git a/packages/mobile/src/screens/chat-screen/ChatMessageListItem.tsx b/packages/mobile/src/screens/chat-screen/ChatMessageListItem.tsx index e4e54adc076..6a188de97d3 100644 --- a/packages/mobile/src/screens/chat-screen/ChatMessageListItem.tsx +++ b/packages/mobile/src/screens/chat-screen/ChatMessageListItem.tsx @@ -1,7 +1,7 @@ import { memo, useCallback, useState } from 'react' import { useCurrentUserId } from '@audius/common/api' -import { useArtistCoinMessageHeader } from '@audius/common/hooks' +import { useFanClubMessageHeader } from '@audius/common/hooks' import { Status } from '@audius/common/models' import { chatSelectors } from '@audius/common/store' import { @@ -26,9 +26,9 @@ import { zIndex } from 'app/utils/zIndex' import { reactionMap } from '../notifications-screen/Reaction' -import { ArtistCoinHeader } from './ArtistCoinHeader' import { ChatMessagePlaylist } from './ChatMessagePlaylist' import { ChatMessageTrack } from './ChatMessageTrack' +import { FanClubHeader } from './FanClubHeader' import { LinkPreview } from './LinkPreview' import { ResendMessageButton } from './ResendMessageButton' import { REACTION_LONGPRESS_DELAY } from './constants' @@ -215,12 +215,12 @@ export const ChatMessageListItem = memo(function ChatMessageListItem( borderBottomWidth } - const artistCoinSymbol = useArtistCoinMessageHeader({ + const fanClubSymbol = useFanClubMessageHeader({ userId: senderUserId ?? 0, audience: message?.audience }) - const hasHeader = artistCoinSymbol || isCollection || isTrack || link + const hasHeader = fanClubSymbol || isCollection || isTrack || link return message ? ( <> @@ -264,7 +264,7 @@ export const ChatMessageListItem = memo(function ChatMessageListItem( } > {senderUserId ? ( - diff --git a/packages/mobile/src/screens/chat-screen/ArtistCoinHeader.tsx b/packages/mobile/src/screens/chat-screen/FanClubHeader.tsx similarity index 79% rename from packages/mobile/src/screens/chat-screen/ArtistCoinHeader.tsx rename to packages/mobile/src/screens/chat-screen/FanClubHeader.tsx index 3c1c4cf1f7d..8627dd02d9d 100644 --- a/packages/mobile/src/screens/chat-screen/ArtistCoinHeader.tsx +++ b/packages/mobile/src/screens/chat-screen/FanClubHeader.tsx @@ -1,5 +1,5 @@ import { useTradeableCoins } from '@audius/common/api' -import { useArtistCoinMessageHeader } from '@audius/common/hooks' +import { useFanClubMessageHeader } from '@audius/common/hooks' import type { ID } from '@audius/common/models' import type { ChatBlastAudience } from '@audius/sdk' import { Platform } from 'react-native' @@ -11,20 +11,20 @@ const messages = { membersOnly: 'Members Only' } -export const ArtistCoinHeader = ({ +export const FanClubHeader = ({ userId, audience }: { userId: ID audience?: ChatBlastAudience }) => { - const artistCoinSymbol = useArtistCoinMessageHeader({ + const fanClubSymbol = useFanClubMessageHeader({ userId, audience }) const { coins } = useTradeableCoins() - if (!artistCoinSymbol) return null + if (!fanClubSymbol) return null return ( - + {/* Alignment bug for label text variant on iOS */} - {artistCoinSymbol} + {fanClubSymbol} diff --git a/packages/mobile/src/screens/coin-details-screen/CoinDetailsScreen.tsx b/packages/mobile/src/screens/coin-details-screen/CoinDetailsScreen.tsx index c10b16b9232..250387c2e6a 100644 --- a/packages/mobile/src/screens/coin-details-screen/CoinDetailsScreen.tsx +++ b/packages/mobile/src/screens/coin-details-screen/CoinDetailsScreen.tsx @@ -1,6 +1,6 @@ import { useState, useCallback, useMemo } from 'react' -import { useArtistCoinByTicker } from '@audius/common/api' +import { useFanClubByTicker } from '@audius/common/api' import { route } from '@audius/common/utils' import { useRoute } from '@react-navigation/native' import { useWindowDimensions } from 'react-native' @@ -55,7 +55,7 @@ const tabRoutes: TabRoute[] = [ export const CoinDetailsScreen = () => { const { ticker } = useRoute().params as { ticker: string } - const { data: coin } = useArtistCoinByTicker({ ticker }) + const { data: coin } = useFanClubByTicker({ ticker }) const { onOpen } = useDrawer('CoinInsightsOverflowMenu') const mint = coin?.mint ?? '' const layout = useWindowDimensions() diff --git a/packages/mobile/src/screens/coin-details-screen/EditCoinDetailsScreen.tsx b/packages/mobile/src/screens/coin-details-screen/EditCoinDetailsScreen.tsx index 55614d30ea4..6875298f9db 100644 --- a/packages/mobile/src/screens/coin-details-screen/EditCoinDetailsScreen.tsx +++ b/packages/mobile/src/screens/coin-details-screen/EditCoinDetailsScreen.tsx @@ -1,8 +1,8 @@ import { useCallback, useEffect, useState } from 'react' import { - useArtistCoinByTicker, - useUpdateArtistCoin, + useFanClubByTicker, + useUpdateFanClub, useCurrentUserId, useCurrentAccountUser } from '@audius/common/api' @@ -255,7 +255,7 @@ export const EditCoinDetailsScreen = () => { isPending, isSuccess, isError - } = useArtistCoinByTicker({ ticker }) + } = useFanClubByTicker({ ticker }) const { source: defaultBannerImageSource } = useCoverPhoto({ userId: currentUser?.user_id, @@ -268,7 +268,7 @@ export const EditCoinDetailsScreen = () => { ? defaultBannerImageSource.uri : null - const updateCoinMutation = useUpdateArtistCoin() + const updateCoinMutation = useUpdateFanClub() const [bannerImageFile, setBannerImageFile] = useState(null) const [bannerPreviewUrl, setBannerPreviewUrl] = useState(null) diff --git a/packages/mobile/src/screens/coin-details-screen/components/BalanceCard.tsx b/packages/mobile/src/screens/coin-details-screen/components/BalanceCard.tsx index bef6494c79a..a9e38768d98 100644 --- a/packages/mobile/src/screens/coin-details-screen/components/BalanceCard.tsx +++ b/packages/mobile/src/screens/coin-details-screen/components/BalanceCard.tsx @@ -2,7 +2,7 @@ import { useCallback } from 'react' import { useCoinBalance, - useArtistCoin, + useFanClub, useCoinBalanceBreakdown } from '@audius/common/api' import { @@ -286,7 +286,7 @@ const HasBalanceState = ({ export const BalanceCard = ({ mint }: { mint: string }) => { const dispatch = useDispatch() const navigation = useNavigation() - const { data: coin, isPending: coinsLoading } = useArtistCoin(mint) + const { data: coin, isPending: coinsLoading } = useFanClub(mint) const { data: tokenBalance } = useCoinBalance({ mint }) const initialTab = useBuySellInitialTab() const isAudio = mint === env.WAUDIO_MINT_ADDRESS diff --git a/packages/mobile/src/screens/coin-details-screen/components/CoinInfoCard.tsx b/packages/mobile/src/screens/coin-details-screen/components/CoinInfoCard.tsx index ec4181795e2..23c1aa84e46 100644 --- a/packages/mobile/src/screens/coin-details-screen/components/CoinInfoCard.tsx +++ b/packages/mobile/src/screens/coin-details-screen/components/CoinInfoCard.tsx @@ -1,7 +1,7 @@ import { useCallback, useMemo } from 'react' import type { Coin } from '@audius/common/adapters' -import { useArtistCoin } from '@audius/common/api' +import { useFanClub } from '@audius/common/api' import { coinDetailsMessages } from '@audius/common/messages' import { WidthSizes } from '@audius/common/models' import { shortenSPLAddress } from '@audius/common/utils' @@ -69,7 +69,7 @@ const getPlatformIcon = (platform: string) => { } export const BannerSection = ({ mint }: { mint: string }) => { - const { data: coin, isLoading } = useArtistCoin(mint) + const { data: coin, isLoading } = useFanClub(mint) const { ownerId } = coin ?? {} const { source: coverPhotoSource } = useCoverPhoto({ @@ -225,7 +225,7 @@ const SocialLinksSection = ({ coin }: { coin: Coin }) => { } export const CoinInfoCard = ({ mint }: { mint: string }) => { - const { data: coin, isLoading } = useArtistCoin(mint) + const { data: coin, isLoading } = useFanClub(mint) const navigation = useNavigation() const { toast } = useToast() diff --git a/packages/mobile/src/screens/coin-details-screen/components/CoinInsightsCard.tsx b/packages/mobile/src/screens/coin-details-screen/components/CoinInsightsCard.tsx index f65491db62a..e79e5f73e38 100644 --- a/packages/mobile/src/screens/coin-details-screen/components/CoinInsightsCard.tsx +++ b/packages/mobile/src/screens/coin-details-screen/components/CoinInsightsCard.tsx @@ -1,7 +1,7 @@ import { useCallback } from 'react' import type { Coin } from '@audius/common/adapters' -import { useArtistCoin, useCoinGeckoCoin } from '@audius/common/api' +import { useFanClub, useCoinGeckoCoin } from '@audius/common/api' import { coinDetailsMessages } from '@audius/common/messages' import { createAudioCoinMetrics, @@ -194,7 +194,7 @@ export const CoinInsightsCard = ({ mint }: { mint: string }) => { data: coin, isPending: isCoinPending, isError: isCoinError - } = useArtistCoin(mint) + } = useFanClub(mint) const { data: coingeckoResponse, isPending: isCoingeckoPending, diff --git a/packages/mobile/src/screens/coin-details-screen/components/CoinInsightsOverflowMenu.tsx b/packages/mobile/src/screens/coin-details-screen/components/CoinInsightsOverflowMenu.tsx index 27e24c1c8f7..9649ac0ec3a 100644 --- a/packages/mobile/src/screens/coin-details-screen/components/CoinInsightsOverflowMenu.tsx +++ b/packages/mobile/src/screens/coin-details-screen/components/CoinInsightsOverflowMenu.tsx @@ -1,8 +1,8 @@ import { useCallback } from 'react' -import { useArtistCoin, useCurrentUserId, useUser } from '@audius/common/api' +import { useFanClub, useCurrentUserId, useUser } from '@audius/common/api' import { coinDetailsMessages } from '@audius/common/messages' -import { useArtistCoinDetailsModal } from '@audius/common/store' +import { useFanClubDetailsModal } from '@audius/common/store' import { route, makeXShareUrl } from '@audius/common/utils' import Clipboard from '@react-native-clipboard/clipboard' import { useNavigation } from '@react-navigation/native' @@ -20,54 +20,50 @@ export const CoinInsightsOverflowMenu = () => { const { data: drawerData } = useDrawer('CoinInsightsOverflowMenu') const mint = drawerData?.mint const navigation = useNavigation() - const { data: artistCoin } = useArtistCoin(mint) + const { data: fanClub } = useFanClub(mint) const { data: currentUserId } = useCurrentUserId() - const { data: artist } = useUser(artistCoin?.ownerId) + const { data: artist } = useUser(fanClub?.ownerId) const { toast } = useToast() - const { onOpen: openArtistCoinDetailsModal } = useArtistCoinDetailsModal() - const isOwner = currentUserId === artistCoin?.ownerId + const { onOpen: openFanClubDetailsModal } = useFanClubDetailsModal() + const isOwner = currentUserId === fanClub?.ownerId const handleCopyCoinAddress = useCallback(() => { - if (artistCoin?.mint) { - Clipboard.setString(artistCoin.mint) + if (fanClub?.mint) { + Clipboard.setString(fanClub.mint) toast({ content: messages.copiedToClipboard, type: 'info' }) } - }, [artistCoin?.mint, toast]) + }, [fanClub?.mint, toast]) const handleCopyLink = useCallback(() => { - if (artistCoin?.ticker) { + if (fanClub?.ticker) { // TODO: Should figure out a way to make this use the correct domain - const coinUrl = `https://audius.co${route.coinPage(artistCoin.ticker)}` + const coinUrl = `https://audius.co${route.coinPage(fanClub.ticker)}` Clipboard.setString(coinUrl) toast({ content: messages.copiedLinkToClipboard, type: 'info' }) } - }, [artistCoin?.ticker, toast]) + }, [fanClub?.ticker, toast]) const handleOpenBirdeye = useCallback(() => { - if (artistCoin?.mint) { - Linking.openURL(`https://birdeye.so/solana/${artistCoin.mint}`) + if (fanClub?.mint) { + Linking.openURL(`https://birdeye.so/solana/${fanClub.mint}`) } - }, [artistCoin?.mint]) + }, [fanClub?.mint]) const handleOpenDetails = useCallback(() => { if (mint) { - openArtistCoinDetailsModal({ mint, isOpen: true }) + openFanClubDetailsModal({ mint, isOpen: true }) } - }, [mint, openArtistCoinDetailsModal]) + }, [mint, openFanClubDetailsModal]) const handleShareToX = useCallback(async () => { - if (!artistCoin?.ticker || !artistCoin?.mint || !artist?.handle) return + if (!fanClub?.ticker || !fanClub?.mint || !artist?.handle) return - const isArtistOwner = currentUserId === artistCoin.ownerId - const coinUrl = `https://audius.co${route.coinPage(artistCoin.ticker)}` + const isArtistOwner = currentUserId === fanClub.ownerId + const coinUrl = `https://audius.co${route.coinPage(fanClub.ticker)}` const shareText = isArtistOwner - ? messages.shareToXArtistCopy(artistCoin.ticker, artistCoin.mint) - : messages.shareToXUserCopy( - artistCoin.ticker, - artist.handle, - artistCoin.mint - ) + ? messages.shareToXArtistCopy(fanClub.ticker, fanClub.mint) + : messages.shareToXUserCopy(fanClub.ticker, artist.handle, fanClub.mint) const xShareUrl = makeXShareUrl(coinUrl, shareText) @@ -77,14 +73,14 @@ export const CoinInsightsOverflowMenu = () => { } else { console.error(`Can't open: ${xShareUrl}`) } - }, [artistCoin, currentUserId, artist]) + }, [fanClub, currentUserId, artist]) const handleEditCoin = useCallback(() => { - if (artistCoin?.ticker) { + if (fanClub?.ticker) { const nav = (navigation as any).navigate - nav('EditCoinDetailsScreen', { ticker: artistCoin.ticker }) + nav('EditCoinDetailsScreen', { ticker: fanClub.ticker }) } - }, [artistCoin, navigation]) + }, [fanClub, navigation]) const rows: ActionDrawerRow[] = [ ...(isOwner ? [{ text: messages.editCoin, callback: handleEditCoin }] : []), @@ -110,8 +106,8 @@ export const CoinInsightsOverflowMenu = () => { } ] - // Don't render if no artist coin data - if (!artistCoin?.mint) { + // Don't render if no fan club data + if (!fanClub?.mint) { return null } diff --git a/packages/mobile/src/screens/coin-details-screen/components/CoinLeaderboardCard.tsx b/packages/mobile/src/screens/coin-details-screen/components/CoinLeaderboardCard.tsx index bdcef34c58e..2de7dd67c45 100644 --- a/packages/mobile/src/screens/coin-details-screen/components/CoinLeaderboardCard.tsx +++ b/packages/mobile/src/screens/coin-details-screen/components/CoinLeaderboardCard.tsx @@ -1,8 +1,8 @@ import { useCallback } from 'react' import { - useArtistCoinMembers, - useArtistCoinMembersCount, + useFanClubMembers, + useFanClubMembersCount, useUsers } from '@audius/common/api' import { coinDetailsMessages } from '@audius/common/messages' @@ -25,12 +25,12 @@ const messages = coinDetailsMessages.coinLeaderboard export const CoinLeaderboardCard = ({ mint }: { mint: string }) => { const navigation = useNavigation() const { data: leaderboardUsers, isPending: isLeaderboardPending } = - useArtistCoinMembers({ mint }) + useFanClubMembers({ mint }) const { data: users, isPending: isUsersPending } = useUsers( leaderboardUsers?.map((user) => user.userId) ) const isPending = isLeaderboardPending || isUsersPending - const { data: membersCount = 0 } = useArtistCoinMembersCount({ mint }) + const { data: membersCount = 0 } = useFanClubMembersCount({ mint }) const handleViewLeaderboard = useCallback(() => { navigation.navigate('CoinLeaderboard', { diff --git a/packages/mobile/src/screens/coin-details-screen/components/CoinTab.tsx b/packages/mobile/src/screens/coin-details-screen/components/CoinTab.tsx index 46f3942538e..e879594b141 100644 --- a/packages/mobile/src/screens/coin-details-screen/components/CoinTab.tsx +++ b/packages/mobile/src/screens/coin-details-screen/components/CoinTab.tsx @@ -1,7 +1,7 @@ import type { ReactNode } from 'react' import type { Coin } from '@audius/common/adapters' -import { useArtistCoin, useCurrentUserId } from '@audius/common/api' +import { useFanClub, useCurrentUserId } from '@audius/common/api' import { coinDetailsMessages } from '@audius/common/messages' import { getTokenDecimalPlaces, @@ -161,7 +161,7 @@ const CoinDetailsSection = ({ coin }: { coin: Coin }) => { } export const CoinTab = ({ mint }: CoinTabProps) => { - const { data: coin } = useArtistCoin(mint) + const { data: coin } = useFanClub(mint) const { data: currentUserId } = useCurrentUserId() const isOwner = currentUserId === coin?.ownerId diff --git a/packages/mobile/src/screens/coin-details-screen/components/FanClubTab.tsx b/packages/mobile/src/screens/coin-details-screen/components/FanClubTab.tsx index d437960c8bc..7ea34918f73 100644 --- a/packages/mobile/src/screens/coin-details-screen/components/FanClubTab.tsx +++ b/packages/mobile/src/screens/coin-details-screen/components/FanClubTab.tsx @@ -1,7 +1,7 @@ import { useCallback, useMemo } from 'react' import { - useArtistCoin, + useFanClub, useCoinBalance, useCurrentUserId, useExclusiveTracks, @@ -134,7 +134,7 @@ const FanClubHeroTile = ({ onUploadExclusive }: FanClubHeroTileProps) => { const { borderDefault } = useThemeColors() - const { data: coin, isLoading } = useArtistCoin(mint) + const { data: coin, isLoading } = useFanClub(mint) const ownerId = coin?.ownerId const { source: coverPhotoSource } = useCoverPhoto({ @@ -153,7 +153,7 @@ const FanClubHeroTile = ({ return null } - const fanClubLabel = walletMessages.artistCoins.fanClubLabel + const fanClubLabel = walletMessages.fanClubs.fanClubLabel return ( { - const { data: coin } = useArtistCoin(mint) + const { data: coin } = useFanClub(mint) const ownerId = coin?.ownerId const { data, lineup, pageSize, isFetching, loadNextPage, isPending } = @@ -323,7 +323,7 @@ const FanClubFeed = ({ mint }: { mint: string }) => { } export const FanClubTab = ({ mint, onSwitchToCoinTab }: FanClubTabProps) => { - const { data: coin } = useArtistCoin(mint) + const { data: coin } = useFanClub(mint) const { data: currentUserId, isPending: isCurrentUserPending } = useCurrentUserId() const { data: tokenBalance, isPending: isBalancePending } = useCoinBalance({ diff --git a/packages/mobile/src/screens/coin-details-screen/components/PostUpdateCard.tsx b/packages/mobile/src/screens/coin-details-screen/components/PostUpdateCard.tsx index 0553159ef43..5d8b7f05f58 100644 --- a/packages/mobile/src/screens/coin-details-screen/components/PostUpdateCard.tsx +++ b/packages/mobile/src/screens/coin-details-screen/components/PostUpdateCard.tsx @@ -1,7 +1,7 @@ import { useCallback, useLayoutEffect, useRef, useState } from 'react' import { - useArtistCoin, + useFanClub, useCurrentUserId, usePostTextUpdate } from '@audius/common/api' @@ -93,7 +93,7 @@ export const PostUpdateCard = ({ mint }: PostUpdateCardProps) => { const [showAttachModal, setShowAttachModal] = useState(false) const [attachUrl, setAttachUrl] = useState('') const { data: currentUserId } = useCurrentUserId() - const { data: coin } = useArtistCoin(mint) + const { data: coin } = useFanClub(mint) const { mutate: postTextUpdate } = usePostTextUpdate() const { isEnabled: isTextPostPostingEnabled } = useFeatureFlag( FeatureFlags.FAN_CLUB_TEXT_POST_POSTING diff --git a/packages/mobile/src/screens/coin-details-screen/components/TextPostCard.tsx b/packages/mobile/src/screens/coin-details-screen/components/TextPostCard.tsx index 6f4ed7e35d4..a579b3fa314 100644 --- a/packages/mobile/src/screens/coin-details-screen/components/TextPostCard.tsx +++ b/packages/mobile/src/screens/coin-details-screen/components/TextPostCard.tsx @@ -4,7 +4,7 @@ import { useComment, useCurrentUserId, useReactToComment, - useArtistCoin + useFanClub } from '@audius/common/api' import type { ID } from '@audius/common/models' import { @@ -41,7 +41,7 @@ type TextPostCardProps = { export const TextPostCard = ({ commentId, mint }: TextPostCardProps) => { const { data: comment, isPending } = useComment(commentId) const { data: currentUserId } = useCurrentUserId() - const { data: coin } = useArtistCoin(mint) + const { data: coin } = useFanClub(mint) const { mutate: reactToComment } = useReactToComment() const { onOpen: openLockedTextPostDrawer } = useDrawer('LockedTextPost') diff --git a/packages/mobile/src/screens/coin-redeem-screen/CoinRedeemScreen.tsx b/packages/mobile/src/screens/coin-redeem-screen/CoinRedeemScreen.tsx index d8b2f96d0de..378d0811dc2 100644 --- a/packages/mobile/src/screens/coin-redeem-screen/CoinRedeemScreen.tsx +++ b/packages/mobile/src/screens/coin-redeem-screen/CoinRedeemScreen.tsx @@ -1,7 +1,7 @@ import { useCallback, useMemo } from 'react' import { - useArtistCoinByTicker, + useFanClubByTicker, useCoinRedeemAmount, useCoinRedeemCodeAmount, useRedeemCoin, @@ -57,7 +57,7 @@ export const CoinRedeemScreen = () => { ticker: string code?: string } - const { data: coin } = useArtistCoinByTicker({ ticker }) + const { data: coin } = useFanClubByTicker({ ticker }) const mint = coin?.mint ?? '' const { data: coinRedeemAmount, isPending: coinRedeemAmountPending } = diff --git a/packages/mobile/src/screens/create-chat-blast-screen/ChatBlastSelectAudienceFields.tsx b/packages/mobile/src/screens/create-chat-blast-screen/ChatBlastSelectAudienceFields.tsx index 504897b9975..43755ea7094 100644 --- a/packages/mobile/src/screens/create-chat-blast-screen/ChatBlastSelectAudienceFields.tsx +++ b/packages/mobile/src/screens/create-chat-blast-screen/ChatBlastSelectAudienceFields.tsx @@ -1,8 +1,8 @@ import { useCallback } from 'react' import { - useArtistCoinMembersCount, - useArtistCreatedCoin, + useFanClubMembersCount, + useArtistCreatedFanClub, useCurrentAccountUser, useCurrentUserId } from '@audius/common/api' @@ -223,8 +223,8 @@ const CoinHoldersMessageField = () => { const [{ value: targetAudience }] = useField(TARGET_AUDIENCE_FIELD) const isSelected = targetAudience === ChatBlastAudience.COIN_HOLDERS const { data: currentUserId } = useCurrentUserId() - const { data: coin } = useArtistCreatedCoin(currentUserId) - const { data: coinMembersCount } = useArtistCoinMembersCount({ + const { data: coin } = useArtistCreatedFanClub(currentUserId) + const { data: coinMembersCount } = useFanClubMembersCount({ mint: coin?.mint }) const coinSymbol = coin?.ticker ?? '' diff --git a/packages/mobile/src/screens/edit-profile-screen/EditProfileScreen.tsx b/packages/mobile/src/screens/edit-profile-screen/EditProfileScreen.tsx index 5e96049a4c7..f687417d629 100644 --- a/packages/mobile/src/screens/edit-profile-screen/EditProfileScreen.tsx +++ b/packages/mobile/src/screens/edit-profile-screen/EditProfileScreen.tsx @@ -25,11 +25,11 @@ import { makeStyles } from 'app/styles' import type { Image } from 'app/types/image' import { isImageUriSource } from 'app/utils/image' -import { ArtistCoinFlairSelector } from './ArtistCoinFlairSelector' +import { FanClubFlairSelector } from './FanClubFlairSelector' import { FormScreen } from './FormScreen' import { ProfileHeader } from './ProfileHeader' import { ProfileInputCard } from './ProfileInputCard' -import type { ArtistCoinBadge, ProfileValues, UpdatedProfile } from './types' +import type { FanClubBadge, ProfileValues, UpdatedProfile } from './types' const { updateProfile } = profilePageActions @@ -60,9 +60,9 @@ const EditProfileForm = (props: EditProfileFormProps) => { } = props const styles = useStyles() - const handleArtistCoinBadgeChange = useCallback( - (badge: ArtistCoinBadge | null) => { - setFieldValue('artist_coin_badge', badge) + const handleFanClubBadgeChange = useCallback( + (badge: FanClubBadge | null) => { + setFieldValue('fan_club_badge', badge) }, [setFieldValue] ) @@ -94,11 +94,11 @@ const EditProfileForm = (props: EditProfileFormProps) => { - {/* Artist Coin Flair Section */} + {/* Fan Club Flair Section */} - @@ -166,7 +166,7 @@ export const EditProfileScreen = () => { 'instagram_handle', 'tiktok_handle', 'website', - 'artist_coin_badge' + 'fan_club_badge' ]) }) @@ -185,7 +185,7 @@ export const EditProfileScreen = () => { const handleSubmit = useCallback( (values: ProfileValues) => { if (!profile) return - const { cover_photo, profile_picture, artist_coin_badge, ...restValues } = + const { cover_photo, profile_picture, fan_club_badge, ...restValues } = values // @ts-ignore typing is hard here, will come back @@ -201,17 +201,17 @@ export const EditProfileScreen = () => { newProfile.updatedProfilePicture = profile_picture } - // Handle artist coin badge - if (artist_coin_badge) { + // Handle fan club badge + if (fan_club_badge) { if ( - artist_coin_badge.mint === '__default__' || - artist_coin_badge.mint === '__none__' + fan_club_badge.mint === '__default__' || + fan_club_badge.mint === '__none__' ) { // Set to null for default/none - newProfile.artist_coin_badge = null + newProfile.fan_club_badge = null } else { // Set the actual badge - newProfile.artist_coin_badge = artist_coin_badge + newProfile.fan_club_badge = fan_club_badge } } @@ -234,7 +234,7 @@ export const EditProfileScreen = () => { instagram_handle = null, tiktok_handle = null, website = null, - artist_coin_badge = null + fan_club_badge = null } = profile const initialValues: ProfileValues = { @@ -245,7 +245,7 @@ export const EditProfileScreen = () => { instagram_handle, tiktok_handle, website, - artist_coin_badge, + fan_club_badge, cover_photo: { url: coverPhotoSource && isImageUriSource(coverPhotoSource) diff --git a/packages/mobile/src/screens/edit-profile-screen/ArtistCoinFlairSelector.tsx b/packages/mobile/src/screens/edit-profile-screen/FanClubFlairSelector.tsx similarity index 92% rename from packages/mobile/src/screens/edit-profile-screen/ArtistCoinFlairSelector.tsx rename to packages/mobile/src/screens/edit-profile-screen/FanClubFlairSelector.tsx index 20f1b866efc..02c6277dff0 100644 --- a/packages/mobile/src/screens/edit-profile-screen/ArtistCoinFlairSelector.tsx +++ b/packages/mobile/src/screens/edit-profile-screen/FanClubFlairSelector.tsx @@ -8,25 +8,25 @@ import type { Nullable } from '@audius/common/utils' import { Flex, Text } from '@audius/harmony-native' import { TokenSelectButton } from 'app/components/buy-sell/TokenSelectButton' -type ArtistCoinBadge = { +type FanClubBadge = { mint: string logo_uri: string ticker: string } -type ArtistCoinFlairSelectorProps = { - selectedBadge?: Nullable - onChange: (badge: ArtistCoinBadge | null) => void +type FanClubFlairSelectorProps = { + selectedBadge?: Nullable + onChange: (badge: FanClubBadge | null) => void } // Special option values for Default and None const DEFAULT_OPTION_VALUE = '__default__' const NONE_OPTION_VALUE = '__none__' -export const ArtistCoinFlairSelector = ({ +export const FanClubFlairSelector = ({ selectedBadge, onChange -}: ArtistCoinFlairSelectorProps) => { +}: FanClubFlairSelectorProps) => { // Fetch all tradeable coins, excluding USDC and AUDIO const { coinsArray: allCoins, isLoading } = useTradeableCoins({ excludeSymbols: ['USDC', 'AUDIO'] @@ -140,8 +140,8 @@ export const ArtistCoinFlairSelector = ({ return } - // Convert CoinInfo to ArtistCoinBadge - const badge: ArtistCoinBadge = { + // Convert CoinInfo to FanClubBadge + const badge: FanClubBadge = { mint: coin.address, logo_uri: coin.logoURI || '', ticker: coin.symbol diff --git a/packages/mobile/src/screens/edit-profile-screen/types.ts b/packages/mobile/src/screens/edit-profile-screen/types.ts index 91119c2e037..034de1207c0 100644 --- a/packages/mobile/src/screens/edit-profile-screen/types.ts +++ b/packages/mobile/src/screens/edit-profile-screen/types.ts @@ -2,7 +2,7 @@ import type { Nullable } from '@audius/common/utils' import type { Image } from 'app/types/image' -export type ArtistCoinBadge = { +export type FanClubBadge = { mint: string logo_uri: string ticker: string @@ -16,7 +16,7 @@ export type ProfileValues = { instagram_handle: Nullable tiktok_handle: Nullable website: Nullable - artist_coin_badge: Nullable + fan_club_badge: Nullable cover_photo: Image profile_picture: Image } diff --git a/packages/mobile/src/screens/external-wallets/ExternalWalletsScreen.tsx b/packages/mobile/src/screens/external-wallets/ExternalWalletsScreen.tsx index 15a76b2e252..31ba2844480 100644 --- a/packages/mobile/src/screens/external-wallets/ExternalWalletsScreen.tsx +++ b/packages/mobile/src/screens/external-wallets/ExternalWalletsScreen.tsx @@ -21,7 +21,7 @@ const { fetchAssociatedWallets } = tokenDashboardPageActions const messages = { title: 'Manage Wallets', subtitle: 'Connect Additional Wallets With Your Account', - text: 'Show off your artist coins and flaunt your $AUDIO with a VIP badge on your profile.', + text: 'Show off your fan clubs and flaunt your $AUDIO with a VIP badge on your profile.', linkedWallets: 'Linked Wallets', audio: '$AUDIO' } diff --git a/packages/mobile/src/screens/artist-coin-sort-screen/ArtistCoinSortScreen.tsx b/packages/mobile/src/screens/fan-club-sort-screen/FanClubSortScreen.tsx similarity index 84% rename from packages/mobile/src/screens/artist-coin-sort-screen/ArtistCoinSortScreen.tsx rename to packages/mobile/src/screens/fan-club-sort-screen/FanClubSortScreen.tsx index f010afe7191..7a5325d537d 100644 --- a/packages/mobile/src/screens/artist-coin-sort-screen/ArtistCoinSortScreen.tsx +++ b/packages/mobile/src/screens/fan-club-sort-screen/FanClubSortScreen.tsx @@ -18,23 +18,23 @@ const { getHasTrack } = playerSelectors const sortOptions = [ { value: GetCoinsSortMethodEnum.Price, - label: walletMessages.artistCoins.sortPrice + label: walletMessages.fanClubs.sortPrice }, { value: GetCoinsSortMethodEnum.Volume, - label: walletMessages.artistCoins.sortVolume + label: walletMessages.fanClubs.sortVolume }, { value: GetCoinsSortMethodEnum.MarketCap, - label: walletMessages.artistCoins.sortMarketCap + label: walletMessages.fanClubs.sortMarketCap }, { value: GetCoinsSortMethodEnum.CreatedAt, - label: walletMessages.artistCoins.sortLaunchDate + label: walletMessages.fanClubs.sortLaunchDate }, { value: GetCoinsSortMethodEnum.Holder, - label: walletMessages.artistCoins.sortHolders + label: walletMessages.fanClubs.sortHolders } ] @@ -45,19 +45,19 @@ const directionOptions: Array<{ }> = [ { key: GetCoinsSortDirectionEnum.Asc, - text: walletMessages.artistCoins.sortAscending, + text: walletMessages.fanClubs.sortAscending, leftIcon: IconSortUp }, { key: GetCoinsSortDirectionEnum.Desc, - text: walletMessages.artistCoins.sortDescending, + text: walletMessages.fanClubs.sortDescending, leftIcon: IconSortDown } ] -export const ArtistCoinSortScreen = () => { +export const FanClubSortScreen = () => { const navigation = useNavigation() - const { params } = useRoute<'ArtistCoinSort'>() + const { params } = useRoute<'FanClubSort'>() const hasTrack = useSelector(getHasTrack) const { initialSortMethod, initialSortDirection } = params @@ -72,7 +72,7 @@ export const ArtistCoinSortScreen = () => { const handleBackPress = useCallback(() => { // Navigate back to parent screen with sort params - navigation.navigate('ArtistCoinsExplore', { + navigation.navigate('FanClubsExplore', { sortMethod: selectedOption, sortDirection: selectedDirection }) @@ -93,7 +93,7 @@ export const ArtistCoinSortScreen = () => { ) return ( - + void } @@ -82,7 +82,7 @@ const sourceTrackKey = ( * Isolated per `mint` via parent `key` so FlashList recycling does not mix * cover hooks between rows. Shimmers until the banner or owner cover loads. */ -const ArtistCoinExploreCardCover = ({ +const FanClubExploreCardCover = ({ bannerImageUrl, ownerId }: { @@ -163,15 +163,15 @@ const ArtistCoinExploreCardCover = ({ ) } -export const ArtistCoinExploreCard = ({ +export const FanClubExploreCard = ({ coin, onPress -}: ArtistCoinExploreCardProps) => { +}: FanClubExploreCardProps) => { const ownerId = coin.ownerId - const fanClubLabel = walletMessages.artistCoins.fanClubLabel - const membersLabel = walletMessages.artistCoins.members - const marketCapLabel = walletMessages.artistCoins.marketCap + const fanClubLabel = walletMessages.fanClubs.fanClubLabel + const membersLabel = walletMessages.fanClubs.members + const marketCapLabel = walletMessages.fanClubs.marketCap const membersDisplay = coin.holder != null && !Number.isNaN(coin.holder) @@ -190,7 +190,7 @@ export const ArtistCoinExploreCard = ({ border='default' style={{ overflow: 'hidden' }} > - { userId={ownerId} size='xs' badgeSize='2xs' - hideArtistCoinBadge + hideFanClubBadge mint={coin.mint} /> @@ -169,7 +169,7 @@ const tabRoutes: TabRoute[] = [ { key: 'leaderboard', title: COIN_ROW_MESSAGES.leaderboardView } ] -export const ArtistCoinsExploreScreen = () => { +export const FanClubsExploreScreen = () => { const { typography } = useTheme() const route = useRoute() const navigation = useNavigation() @@ -204,7 +204,7 @@ export const ArtistCoinsExploreScreen = () => { fetchNextPage, hasNextPage, isFetchingNextPage - } = useArtistCoins({ + } = useFanClubs({ pageSize: EXPLORE_PAGE_SIZE, sortMethod, sortDirection, @@ -226,7 +226,7 @@ export const ArtistCoinsExploreScreen = () => { ) const handleSortPress = useCallback(() => { - navigation.navigate('ArtistCoinSort', { + navigation.navigate('FanClubSort', { initialSortMethod: sortMethod, initialSortDirection: sortDirection }) @@ -263,7 +263,7 @@ export const ArtistCoinsExploreScreen = () => { const renderCoinCard: ListRenderItem = useCallback( ({ item }) => ( - handleCoinPress(item.ticker)} /> diff --git a/packages/mobile/src/screens/notifications-screen/Notifications/FanClubTextPostNotification.tsx b/packages/mobile/src/screens/notifications-screen/Notifications/FanClubTextPostNotification.tsx index 56b4d4676bc..6a8411bb45a 100644 --- a/packages/mobile/src/screens/notifications-screen/Notifications/FanClubTextPostNotification.tsx +++ b/packages/mobile/src/screens/notifications-screen/Notifications/FanClubTextPostNotification.tsx @@ -3,7 +3,7 @@ import { useCallback } from 'react' import { useUser } from '@audius/common/api' import type { FanClubTextPostNotification as FanClubTextPostNotificationType } from '@audius/common/store' -import { Flex, IconArtistCoin } from '@audius/harmony-native' +import { Flex, IconFanClub } from '@audius/harmony-native' import { TokenIcon } from 'app/components/core' import { useNavigation } from 'app/hooks/useNavigation' @@ -33,9 +33,9 @@ export const FanClubTextPostNotification = ( const { data: user } = useUser(entityUserId) const handlePress = useCallback(() => { - if (user?.artist_coin_badge?.ticker) { + if (user?.fan_club_badge?.ticker) { navigation.push('CoinDetailsScreen', { - ticker: user.artist_coin_badge.ticker + ticker: user.fan_club_badge.ticker }) } }, [user, navigation]) @@ -44,14 +44,14 @@ export const FanClubTextPostNotification = ( return ( - + - {user.artist_coin_badge?.logo_uri ? ( - + {user.fan_club_badge?.logo_uri ? ( + ) : null} diff --git a/packages/mobile/src/screens/oauth-screen/PaymentFlowScreen.tsx b/packages/mobile/src/screens/oauth-screen/PaymentFlowScreen.tsx index 0139beaf24f..10a8f3454ce 100644 --- a/packages/mobile/src/screens/oauth-screen/PaymentFlowScreen.tsx +++ b/packages/mobile/src/screens/oauth-screen/PaymentFlowScreen.tsx @@ -2,9 +2,9 @@ import { useCallback, useEffect, useMemo, useState } from 'react' import { useCurrentAccountUser, - useArtistCoin, + useFanClub, useCoinBalance, - transformArtistCoinToTokenInfo, + transformFanClubToTokenInfo, useSendCoins } from '@audius/common/api' import { useUserbank } from '@audius/common/hooks' @@ -51,9 +51,9 @@ export const PaymentFlowScreen = ({ params }: Props) => { data: coin, isPending: coinLoading, isError: coinError - } = useArtistCoin(mint ?? '') + } = useFanClub(mint ?? '') const tokenInfo = useMemo( - () => (coin ? transformArtistCoinToTokenInfo(coin) : undefined), + () => (coin ? transformFanClubToTokenInfo(coin) : undefined), [coin] ) const { diff --git a/packages/mobile/src/screens/profile-screen/BuyArtistCoinButton.tsx b/packages/mobile/src/screens/profile-screen/BuyFanClubButton.tsx similarity index 66% rename from packages/mobile/src/screens/profile-screen/BuyArtistCoinButton.tsx rename to packages/mobile/src/screens/profile-screen/BuyFanClubButton.tsx index 43856fc8516..42b396eb431 100644 --- a/packages/mobile/src/screens/profile-screen/BuyArtistCoinButton.tsx +++ b/packages/mobile/src/screens/profile-screen/BuyFanClubButton.tsx @@ -1,6 +1,6 @@ import { useCallback } from 'react' -import { useArtistCreatedCoin } from '@audius/common/api' +import { useArtistCreatedFanClub } from '@audius/common/api' import { Button, useTheme } from '@audius/harmony-native' import { useNavigation } from 'app/hooks/useNavigation' @@ -9,22 +9,22 @@ const messages = { viewFanClub: 'View Fan Club' } -export const BuyArtistCoinButton = ({ userId }: { userId: number }) => { +export const BuyFanClubButton = ({ userId }: { userId: number }) => { const { color } = useTheme() const navigation = useNavigation() - const { data: artistCoin } = useArtistCreatedCoin(userId) + const { data: fanClub } = useArtistCreatedFanClub(userId) const handlePress = useCallback(() => { - if (artistCoin?.ticker) { + if (fanClub?.ticker) { navigation.navigate('CoinDetailsScreen', { - ticker: artistCoin.ticker + ticker: fanClub.ticker }) } - }, [navigation, artistCoin?.ticker]) + }, [navigation, fanClub?.ticker]) // Don't render if user doesn't own a coin - if (!artistCoin?.mint) { + if (!fanClub?.mint) { return null } diff --git a/packages/mobile/src/screens/profile-screen/ProfileHeader/ArtistProfilePicture.tsx b/packages/mobile/src/screens/profile-screen/ProfileHeader/ArtistProfilePicture.tsx index 497b718dd53..8840b2a5e5b 100644 --- a/packages/mobile/src/screens/profile-screen/ProfileHeader/ArtistProfilePicture.tsx +++ b/packages/mobile/src/screens/profile-screen/ProfileHeader/ArtistProfilePicture.tsx @@ -1,6 +1,6 @@ import { useCallback } from 'react' -import { useArtistCreatedCoin } from '@audius/common/api' +import { useArtistCreatedFanClub } from '@audius/common/api' import { css } from '@emotion/native' import { TouchableOpacity } from 'react-native' @@ -10,7 +10,7 @@ import { env } from 'app/services/env' import { zIndex } from 'app/utils/zIndex' const messages = { - artistCoinBadge: 'Artist coin badge' + fanClubBadge: 'Fan club badge' } export type ArtistProfilePictureProps = { @@ -20,9 +20,9 @@ export type ArtistProfilePictureProps = { export const ArtistProfilePicture = ({ userId }: ArtistProfilePictureProps) => { const navigation = useNavigation() - const { data: ownedCoin } = useArtistCreatedCoin(userId) + const { data: ownedCoin } = useArtistCreatedFanClub(userId) - const shouldShowArtistCoinBadge = + const shouldShowFanClubBadge = !!ownedCoin?.mint && !!ownedCoin?.logoUri && ownedCoin.mint !== env.WAUDIO_MINT_ADDRESS @@ -38,10 +38,10 @@ export const ArtistProfilePicture = ({ userId }: ArtistProfilePictureProps) => { return ( <> - {shouldShowArtistCoinBadge && ( + {shouldShowFanClubBadge && ( { userId: userId || 0, pageSize: 1 }) - const { data: artistCoin, isPending: isArtistCoinLoading } = - useArtistCreatedCoin(userId) + const { data: fanClub, isPending: isFanClubLoading } = + useArtistCreatedFanClub(userId) const { tier } = useTierAndVerifiedForUser(userId) const hasTier = tier !== 'none' const isOwner = userId === accountId @@ -150,8 +150,8 @@ export const ProfileHeader = memo(() => { )} - {!isArtistCoinLoading && userId && artistCoin?.mint ? ( - + {!isFanClubLoading && userId && fanClub?.mint ? ( + ) : null} diff --git a/packages/mobile/src/screens/track-screen/TrackScreenDetailsTile.tsx b/packages/mobile/src/screens/track-screen/TrackScreenDetailsTile.tsx index 5e0168933fe..55526ddeca7 100644 --- a/packages/mobile/src/screens/track-screen/TrackScreenDetailsTile.tsx +++ b/packages/mobile/src/screens/track-screen/TrackScreenDetailsTile.tsx @@ -7,7 +7,7 @@ import { useTrackRank, useStems, useCurrentUserId, - useArtistCoin, + useFanClub, useTrackDownloadCount } from '@audius/common/api' import { useCurrentTrack, useGatedContentAccess } from '@audius/common/hooks' @@ -74,7 +74,7 @@ import { MusicBadge, Paper, Text, - IconArtistCoin + IconFanClub } from '@audius/harmony-native' import { useCommentDrawer } from 'app/components/comments/CommentDrawerContext' import { Tag } from 'app/components/core' @@ -259,7 +259,7 @@ export const TrackScreenDetailsTile = ({ const { data: downloadCount = 0 } = useTrackDownloadCount(trackIdHash) const isTokenGated = isContentTokenGated(streamConditions) - const { data: token } = useArtistCoin( + const { data: token } = useFanClub( (streamConditions as TokenGatedConditions)?.token_gate?.token_mint, { enabled: isTokenGated } ) @@ -559,7 +559,7 @@ export const TrackScreenDetailsTile = ({ - {isTokenGated ? : null} + {isTokenGated ? : null} { const { params } = useRoute<'CoinLeaderboard'>() const { mint } = params const reduxMint = useSelector(coinLeaderboardUserListSelectors.getMint) - const { data: coin } = useArtistCoin(reduxMint ?? mint) + const { data: coin } = useFanClub(reduxMint ?? mint) const { data, isFetchingNextPage, fetchNextPage, isPending } = - useArtistCoinMembers({ mint: reduxMint ?? mint }) + useFanClubMembers({ mint: reduxMint ?? mint }) useEffect(() => { if (mint) { diff --git a/packages/mobile/src/screens/wallet-screen/components/CoinCard.tsx b/packages/mobile/src/screens/wallet-screen/components/CoinCard.tsx index 682a5f2c030..28ebb4a3395 100644 --- a/packages/mobile/src/screens/wallet-screen/components/CoinCard.tsx +++ b/packages/mobile/src/screens/wallet-screen/components/CoinCard.tsx @@ -1,6 +1,6 @@ import { useCallback } from 'react' -import { useArtistCoin } from '@audius/common/api' +import { useFanClub } from '@audius/common/api' import { useFormattedCoinBalance } from '@audius/common/hooks' import { Image, TouchableOpacity } from 'react-native' @@ -47,7 +47,7 @@ export type CoinCardProps = { export const CoinCard = ({ mint, showUserBalance = true }: CoinCardProps) => { const navigation = useNavigation() - const { data: coinData, isPending: coinsDataLoading } = useArtistCoin(mint) + const { data: coinData, isPending: coinsDataLoading } = useFanClub(mint) const ticker = coinData?.ticker ?? '' const icon = coinData?.logoUri ?? '' diff --git a/packages/mobile/src/screens/wallet-screen/components/YourCoins.tsx b/packages/mobile/src/screens/wallet-screen/components/YourCoins.tsx index b5525e48036..73c4a5db20b 100644 --- a/packages/mobile/src/screens/wallet-screen/components/YourCoins.tsx +++ b/packages/mobile/src/screens/wallet-screen/components/YourCoins.tsx @@ -1,7 +1,7 @@ import React, { useCallback } from 'react' import { - useArtistCreatedCoin, + useArtistCreatedFanClub, useCurrentUserId, useQueryContext, useUserCoins @@ -71,7 +71,7 @@ const YourCoinsHeader = () => { ) } -const DiscoverArtistCoinsCard = ({ onPress }: { onPress: () => void }) => { +const DiscoverFanClubsCard = ({ onPress }: { onPress: () => void }) => { return ( void }) => { alignItems='center' > - {walletMessages.artistCoins.title} + {walletMessages.fanClubs.title} @@ -96,14 +96,14 @@ export const YourCoins = () => { const navigation = useNavigation() const { env } = useQueryContext() - const { data: artistCoins, isPending: isLoadingCoins } = useUserCoins({ + const { data: fanClubs, isPending: isLoadingCoins } = useUserCoins({ userId: currentUserId }) - const { data: artistOwnedCoin } = useArtistCreatedCoin(currentUserId) - const audioCoin = artistCoins?.find( + const { data: artistOwnedCoin } = useArtistCreatedFanClub(currentUserId) + const audioCoin = fanClubs?.find( (coin) => coin?.mint === env.WAUDIO_MINT_ADDRESS ) - const otherCoins = artistCoins?.filter( + const otherCoins = fanClubs?.filter( (coin) => coin?.mint !== env.WAUDIO_MINT_ADDRESS && coin?.mint !== artistOwnedCoin?.mint && @@ -119,11 +119,11 @@ export const YourCoins = () => { const coins = orderedCoins.length === 0 ? ['audio-coin' as const] : orderedCoins - // Add cash card at the beginning, and discover artist coins card at the end - const cards = ['cash' as const, ...coins, 'discover-artist-coins' as const] + // Add cash card at the beginning, and discover fan clubs card at the end + const cards = ['cash' as const, ...coins, 'discover-fan-clubs' as const] - const handleDiscoverArtistCoins = useCallback(() => { - navigation.navigate('ArtistCoinsExplore') + const handleDiscoverFanClubs = useCallback(() => { + navigation.navigate('FanClubsExplore') }, [navigation]) return ( @@ -137,8 +137,8 @@ export const YourCoins = () => { {item === 'cash' ? ( - ) : item === 'discover-artist-coins' ? ( - + ) : item === 'discover-fan-clubs' ? ( + ) : item === 'audio-coin' ? ( ) : ( diff --git a/packages/web/examples/README.md b/packages/web/examples/README.md index c9cef52a0f5..abd63e51c5f 100644 --- a/packages/web/examples/README.md +++ b/packages/web/examples/README.md @@ -10,7 +10,7 @@ Runnable examples for building Audius-style web features (Vite + React). Use the | [update-profile](./update-profile/) | **Vite + React + Node server**: OAuth (write scope) + server-side update of user description (mirrors mobile update-profile example). | Run server first (see example README). Then `cd packages/web/examples/update-profile && npm install && npm run dev` or `npm run web:example:update-profile`. Requires .env. | | [upload](./upload/) | **Vite + React + Node server**: OAuth popup + uploadTrackFiles + server create-track (mirrors mobile upload example). | Run server first. Then `cd packages/web/examples/upload && npm run dev` or `npm run web:example:upload`. Requires .env. | | [gated-upload](./gated-upload/) | **Vite + React + Node server**: Same as upload + geo-gated streaming (ip-api.com). Server gates /stream/:trackId by IP/country. | Run server first. Then `cd packages/web/examples/gated-upload && npm run dev` or `npm run web:example:gated-upload`. Requires .env. | -| [coin-gated](./coin-gated/) | **Vite + React**: Browse artist coins, sign in via OAuth or Phantom wallet, stream coin-gated tracks. | `cd packages/web/examples/coin-gated && npm install && npm run dev`. Requires .env with `VITE_AUDIUS_API_KEY`. | +| [coin-gated](./coin-gated/) | **Vite + React**: Browse fan clubs, sign in via OAuth or Phantom wallet, stream coin-gated tracks. | `cd packages/web/examples/coin-gated && npm install && npm run dev`. Requires .env with `VITE_AUDIUS_API_KEY`. | ## Quick start diff --git a/packages/web/examples/coin-gated/README.md b/packages/web/examples/coin-gated/README.md index 6eb42e49ec0..0f005d70308 100644 --- a/packages/web/examples/coin-gated/README.md +++ b/packages/web/examples/coin-gated/README.md @@ -56,4 +56,4 @@ Vite + React app that lets users browse and stream **coin-gated tracks** on Audi ## Keywords (for search / AI) -Coin-gated, token-gated, artist coin, Phantom wallet, Solana wallet, OAuth, PKCE, streaming, getCoinByTicker, getTracksByUser, streamTrack, getUserCoin, getWalletCoins, Audius SDK, web example, React Query. +Coin-gated, token-gated, fan club, Phantom wallet, Solana wallet, OAuth, PKCE, streaming, getCoinByTicker, getTracksByUser, streamTrack, getUserCoin, getWalletCoins, Audius SDK, web example, React Query. diff --git a/packages/web/examples/coin-gated/src/App.tsx b/packages/web/examples/coin-gated/src/App.tsx index 94a308b542e..61a2e381a2b 100644 --- a/packages/web/examples/coin-gated/src/App.tsx +++ b/packages/web/examples/coin-gated/src/App.tsx @@ -317,7 +317,7 @@ export default function App() { {/* Header */}

Coin-Gated Tracks

- Browse and stream coin-gated tracks using an artist coin. + Browse and stream coin-gated tracks using an fan club. Sign in with Audius or connect a Solana wallet.

diff --git a/packages/web/public/documents/ArtistCoinAcceptableUsePolicy.pdf b/packages/web/public/documents/FanClubAcceptableUsePolicy.pdf similarity index 100% rename from packages/web/public/documents/ArtistCoinAcceptableUsePolicy.pdf rename to packages/web/public/documents/FanClubAcceptableUsePolicy.pdf diff --git a/packages/web/public/documents/ArtistCoinTerms.pdf b/packages/web/public/documents/FanClubTerms.pdf similarity index 100% rename from packages/web/public/documents/ArtistCoinTerms.pdf rename to packages/web/public/documents/FanClubTerms.pdf diff --git a/packages/web/public/llms.txt b/packages/web/public/llms.txt index 8e75b545486..a7e5f9d0887 100644 --- a/packages/web/public/llms.txt +++ b/packages/web/public/llms.txt @@ -9,7 +9,7 @@ Unlike traditional streaming services such as Spotify or Apple Music, Audius con ### Key facts about Audius - **Free to use** for both listeners and artists — no premium tier required to access full-quality audio -- **Artist-first economics**: Artists earn directly from fans via tips, track sales, and artist coins, keeping the vast majority of revenue +- **Artist-first economics**: Artists earn directly from fans via tips, track sales, and fan clubs, keeping the vast majority of revenue - **Millions of users** across web (https://audius.co), iOS (https://apps.apple.com/us/app/audius-music/id1491270519), and Android apps (https://play.google.com/store/apps/details?id=co.audius.app) - **Open catalog**: Anyone can upload — independent artists, labels, DJs, podcasters, and producers - **Remix culture**: Built-in remix contests, stems sharing, private releases, and attribution for derivative works diff --git a/packages/web/src/app/web-player/WebPlayer.tsx b/packages/web/src/app/web-player/WebPlayer.tsx index da2ac4e06bd..fb350eb1fda 100644 --- a/packages/web/src/app/web-player/WebPlayer.tsx +++ b/packages/web/src/app/web-player/WebPlayer.tsx @@ -81,22 +81,20 @@ const TrendingGenreSelectionPage = lazy( () => import('components/trending-genre-selection/TrendingGenreSelectionPage') ) // Lazy load heavy page components for code-splitting -const ArtistCoinsExplorePage = lazy(() => - import('pages/artist-coins-explore-page/ArtistCoinsExplorePage').then( - (m) => ({ default: m.ArtistCoinsExplorePage }) - ) +const FanClubsExplorePage = lazy(() => + import('pages/fan-clubs-explore-page/FanClubsExplorePage').then((m) => ({ + default: m.FanClubsExplorePage + })) ) const LaunchpadPage = lazy(() => - import('pages/artist-coins-launchpad-page').then((m) => ({ + import('pages/fan-clubs-launchpad-page').then((m) => ({ default: m.LaunchpadPage })) ) -const MobileArtistCoinsSortPage = lazy(() => - import('pages/artist-coins-sort-page/MobileArtistCoinsSortPage').then( - (m) => ({ - default: m.MobileArtistCoinsSortPage - }) - ) +const MobileFanClubsSortPage = lazy(() => + import('pages/fan-clubs-sort-page/MobileFanClubsSortPage').then((m) => ({ + default: m.MobileFanClubsSortPage + })) ) const CashPage = lazy(() => import('pages/cash-page').then((m) => ({ default: m.CashPage })) @@ -917,15 +915,15 @@ const WebPlayer = (props: WebPlayerProps) => { /> } + element={} /> } + element={} /> } + element={} /> } /> } /> @@ -1362,7 +1360,7 @@ const WebPlayer = (props: WebPlayerProps) => { /> } + element={} /> } /> } /> diff --git a/packages/web/src/common/store/profile/sagas.js b/packages/web/src/common/store/profile/sagas.js index 94f56855983..2a27433f49c 100644 --- a/packages/web/src/common/store/profile/sagas.js +++ b/packages/web/src/common/store/profile/sagas.js @@ -155,7 +155,7 @@ function* confirmUpdateProfile(userId, metadata) { // Invalidate the user query to refetch fresh data from the server // This ensures we get the canonical data including: // - Processed image sizes (cover photo, profile picture) - // - Computed artist_coin_badge (based on coin_flair_mint and user's coins) + // - Computed fan_club_badge (based on coin_flair_mint and user's coins) queryClient.invalidateQueries({ queryKey: getUserQueryKey(confirmedUser.user_id) }) diff --git a/packages/web/src/components/CoinSuccessModal.tsx b/packages/web/src/components/CoinSuccessModal.tsx index 10afd828b89..328a60698c7 100644 --- a/packages/web/src/components/CoinSuccessModal.tsx +++ b/packages/web/src/components/CoinSuccessModal.tsx @@ -66,7 +66,7 @@ export const CoinSuccessModal = () => { if (!coinData?.ticker || !coinData?.mint) return const coinUrl = `https://audius.co${route.coinPage(coinData.ticker)}` - const shareText = `My artist coin $${coinData.ticker} is live on @Audius. Be the first to buy and unlock my exclusive fan club!\n\n${coinData.mint}\n` + const shareText = `My fan club $${coinData.ticker} is live on @Audius. Be the first to buy and unlock my exclusive fan club!\n\n${coinData.mint}\n` openXLink(coinUrl, shareText) }, [coinData]) diff --git a/packages/web/src/components/access-type-label/AccessTypeLabel.tsx b/packages/web/src/components/access-type-label/AccessTypeLabel.tsx index 431ce81950f..6f9d5d400ff 100644 --- a/packages/web/src/components/access-type-label/AccessTypeLabel.tsx +++ b/packages/web/src/components/access-type-label/AccessTypeLabel.tsx @@ -9,7 +9,7 @@ import { IconColors, Flex, Text, - IconArtistCoin + IconFanClub } from '@audius/harmony' type AccessTypeLabelProps = { @@ -55,7 +55,7 @@ const ACCESS_TYPE_CONFIG: Record = { color: 'special' }, [AccessType.TOKEN_GATED]: { - icon: IconArtistCoin, + icon: IconFanClub, label: 'Fan Club', color: 'subdued' }, diff --git a/packages/web/src/components/banner/ArtistCoinsLaunchBanner.tsx b/packages/web/src/components/banner/FanClubsLaunchBanner.tsx similarity index 82% rename from packages/web/src/components/banner/ArtistCoinsLaunchBanner.tsx rename to packages/web/src/components/banner/FanClubsLaunchBanner.tsx index bd9be16277b..356d3bb04b5 100644 --- a/packages/web/src/components/banner/ArtistCoinsLaunchBanner.tsx +++ b/packages/web/src/components/banner/FanClubsLaunchBanner.tsx @@ -10,19 +10,18 @@ import { useNavigateToPage } from 'hooks/useNavigateToPage' import { CallToActionBanner } from './CallToActionBanner' -const ARTIST_COIN_BANNER_LOCAL_STORAGE_KEY = - 'dismissArtistCoinsLaunchBanner10.15.25' +const FAN_CLUB_BANNER_LOCAL_STORAGE_KEY = 'dismissFanClubsLaunchBanner10.15.25' const messages = { pill: 'New', text: 'Fan Clubs Are LIVE! See If Your Favorite Artist Launched One' } -export const ArtistCoinsLaunchBanner = () => { +export const FanClubsLaunchBanner = () => { const dispatch = useDispatch() const navigate = useNavigateToPage() const [isDismissed, setIsDismissed] = useLocalStorage( - ARTIST_COIN_BANNER_LOCAL_STORAGE_KEY, + FAN_CLUB_BANNER_LOCAL_STORAGE_KEY, false ) const [isVisible, setIsVisible] = useState(!isDismissed) @@ -33,7 +32,7 @@ export const ArtistCoinsLaunchBanner = () => { }, [setIsDismissed]) const handleAccept = useCallback(() => { - dispatch(make(Name.BANNER_ARTIST_COINS_LAUNCH_CLICKED, {})) + dispatch(make(Name.BANNER_FAN_CLUBS_LAUNCH_CLICKED, {})) navigate(route.CLUBS_EXPLORE_PAGE) handleClose() }, [dispatch, handleClose, navigate]) diff --git a/packages/web/src/components/buy-sell-modal/BuySellFlow.tsx b/packages/web/src/components/buy-sell-modal/BuySellFlow.tsx index a298184a675..38625eb2d39 100644 --- a/packages/web/src/components/buy-sell-modal/BuySellFlow.tsx +++ b/packages/web/src/components/buy-sell-modal/BuySellFlow.tsx @@ -9,7 +9,7 @@ import { import { SwapStatus, - useArtistCoin, + useFanClub, useCoinPair, useCurrentAccountUser, useSwapCoins, @@ -411,9 +411,7 @@ export const BuySellFlow = (props: BuySellFlowProps) => { setResetState(() => resetFunction) }, [setResetState, resetFunction]) - const { data: outputCoin } = useArtistCoin( - swapTokens.outputTokenInfo?.address - ) + const { data: outputCoin } = useFanClub(swapTokens.outputTokenInfo?.address) const pricePerBaseToken = useMemo(() => { return outputCoin?.price !== undefined && outputCoin.price !== 0 ? outputCoin.price diff --git a/packages/web/src/components/buy-sell-modal/BuyTab.tsx b/packages/web/src/components/buy-sell-modal/BuyTab.tsx index 890087dded3..770d90eaf02 100644 --- a/packages/web/src/components/buy-sell-modal/BuyTab.tsx +++ b/packages/web/src/components/buy-sell-modal/BuyTab.tsx @@ -1,10 +1,10 @@ import { useEffect, useMemo, useRef, useState } from 'react' import { - TEMP_ARTIST_COINS_PAGE_SIZE, - transformArtistCoinsToTokenInfoMap, - useArtistCoin, - useArtistCoins, + TEMP_FAN_CLUBS_PAGE_SIZE, + transformFanClubsToTokenInfoMap, + useFanClub, + useFanClubs, useCurrentAccountUser } from '@audius/common/api' import { buySellMessages } from '@audius/common/messages' @@ -44,8 +44,9 @@ export const BuyTab = ({ ) }, [baseToken.symbol, baseToken]) - const { data: tokenPriceData, isPending: isTokenPriceLoading } = - useArtistCoin(selectedOutputToken.address) + const { data: tokenPriceData, isPending: isTokenPriceLoading } = useFanClub( + selectedOutputToken.address + ) const decimalPlaces = useMemo(() => { if (!tokenPriceData?.price) return 2 @@ -71,11 +72,11 @@ export const BuyTab = ({ externalWalletAddress: externalWalletAccount?.address }) - const { data: coins } = useArtistCoins({ - pageSize: TEMP_ARTIST_COINS_PAGE_SIZE + const { data: coins } = useFanClubs({ + pageSize: TEMP_FAN_CLUBS_PAGE_SIZE }) - const artistCoins: CoinInfo[] = useMemo(() => { - return Object.values(transformArtistCoinsToTokenInfoMap(coins ?? [])) + const fanClubs: CoinInfo[] = useMemo(() => { + return Object.values(transformFanClubsToTokenInfoMap(coins ?? [])) }, [coins]) // Token change handlers @@ -129,7 +130,7 @@ export const BuyTab = ({ tokenPrice={tokenPriceData?.price?.toString() ?? null} isTokenPriceLoading={isTokenPriceLoading} tokenPriceDecimalPlaces={decimalPlaces} - availableTokens={artistCoins} + availableTokens={fanClubs} onTokenChange={handleOutputTokenChange} /> diff --git a/packages/web/src/components/buy-sell-modal/ConvertTab.tsx b/packages/web/src/components/buy-sell-modal/ConvertTab.tsx index a1955f42ee6..e7ab3189e49 100644 --- a/packages/web/src/components/buy-sell-modal/ConvertTab.tsx +++ b/packages/web/src/components/buy-sell-modal/ConvertTab.tsx @@ -1,9 +1,9 @@ import { useCallback, useEffect, useMemo, useRef, useState } from 'react' import { - transformArtistCoinsToTokenInfoMap, - useArtistCoin, - useArtistCoins + transformFanClubsToTokenInfoMap, + useFanClub, + useFanClubs } from '@audius/common/api' import { buySellMessages } from '@audius/common/messages' import type { CoinInfo } from '@audius/common/store' @@ -44,8 +44,9 @@ export const ConvertTab = ({ setSelectedOutputToken(quoteToken) }, [baseToken, quoteToken]) - const { data: tokenPriceData, isPending: isTokenPriceLoading } = - useArtistCoin(selectedOutputToken.address) + const { data: tokenPriceData, isPending: isTokenPriceLoading } = useFanClub( + selectedOutputToken.address + ) const decimalPlaces = useMemo(() => { if (!tokenPriceData?.price) return 2 @@ -71,17 +72,17 @@ export const ConvertTab = ({ externalWalletAddress: externalWalletAccount?.address }) - const { data: coins } = useArtistCoins() - const artistCoins: CoinInfo[] = useMemo(() => { - return Object.values(transformArtistCoinsToTokenInfoMap(coins ?? [])) + const { data: coins } = useFanClubs() + const fanClubs: CoinInfo[] = useMemo(() => { + return Object.values(transformFanClubsToTokenInfoMap(coins ?? [])) }, [coins]) const totalAvailableTokens = useMemo(() => { - return [...(availableOutputTokens ?? []), ...artistCoins].filter( + return [...(availableOutputTokens ?? []), ...fanClubs].filter( (token, index, arr) => arr.findIndex((t) => t.symbol === token.symbol) === index ) // Remove duplicates - }, [availableOutputTokens, artistCoins]) + }, [availableOutputTokens, fanClubs]) // Filter out the currently selected input token from available output tokens const filteredAvailableOutputTokens = useMemo(() => { diff --git a/packages/web/src/components/buy-sell-modal/SellTab.tsx b/packages/web/src/components/buy-sell-modal/SellTab.tsx index 311fe18c9ab..418ddcd0ae1 100644 --- a/packages/web/src/components/buy-sell-modal/SellTab.tsx +++ b/packages/web/src/components/buy-sell-modal/SellTab.tsx @@ -1,6 +1,6 @@ import { useEffect, useMemo, useRef, useState } from 'react' -import { useArtistCoin } from '@audius/common/api' +import { useFanClub } from '@audius/common/api' import { buySellMessages } from '@audius/common/messages' import type { CoinInfo } from '@audius/common/store' import { useCoinSwapForm } from '@audius/common/store' @@ -37,8 +37,9 @@ export const SellTab = ({ ) }, [baseToken.symbol, baseToken]) - const { data: tokenPriceData, isPending: isTokenPriceLoading } = - useArtistCoin(selectedInputToken.address) + const { data: tokenPriceData, isPending: isTokenPriceLoading } = useFanClub( + selectedInputToken.address + ) const decimalPlaces = useMemo(() => { if (!tokenPriceData?.price) return 2 diff --git a/packages/web/src/components/buy-sell-modal/components/StaticTokenDisplay.tsx b/packages/web/src/components/buy-sell-modal/components/StaticTokenDisplay.tsx index 983badf88ae..c5b39d2107f 100644 --- a/packages/web/src/components/buy-sell-modal/components/StaticTokenDisplay.tsx +++ b/packages/web/src/components/buy-sell-modal/components/StaticTokenDisplay.tsx @@ -9,7 +9,7 @@ type StaticTokenDisplayProps = { /** * A non-interactive token display component that shows the token icon and symbol - * without any dropdown functionality. Used when artist-coins feature flag is disabled. + * without any dropdown functionality. Used when fan-clubs feature flag is disabled. */ export const StaticTokenDisplay = ({ tokenInfo }: StaticTokenDisplayProps) => { const { logoURI, icon } = tokenInfo diff --git a/packages/web/src/components/comments/CommentBadge.tsx b/packages/web/src/components/comments/CommentBadge.tsx index 6e23b255aa4..792dd82b150 100644 --- a/packages/web/src/components/comments/CommentBadge.tsx +++ b/packages/web/src/components/comments/CommentBadge.tsx @@ -3,7 +3,7 @@ import { useIsCoinMember } from '@audius/common/hooks' import { ID } from '@audius/common/models' import { Flex, - IconArtistCoin, + IconFanClub, IconComponent, IconStar, Text @@ -13,7 +13,7 @@ type BadgeType = 'artist' | 'coinMember' const iconMap: Record = { artist: IconStar, - coinMember: IconArtistCoin + coinMember: IconFanClub } const messages: Record = { artist: 'Artist', diff --git a/packages/web/src/components/dog-ear/DogEar.tsx b/packages/web/src/components/dog-ear/DogEar.tsx index 6bd8333a543..bca794bd4b0 100644 --- a/packages/web/src/components/dog-ear/DogEar.tsx +++ b/packages/web/src/components/dog-ear/DogEar.tsx @@ -7,7 +7,7 @@ import { useTheme, ColorTheme, Box, - IconArtistCoin + IconFanClub } from '@audius/harmony' import Rectangle from 'assets/img/dogEarRectangle.svg' @@ -28,7 +28,7 @@ const getIcon = (type: DogEarType) => { case DogEarType.USDC_EXTRAS: return IconReceive case DogEarType.TOKEN_GATED: - return IconArtistCoin + return IconFanClub case DogEarType.SPECIAL_ACCESS: default: return IconSparkles diff --git a/packages/web/src/components/edit/fields/price-and-audience/PriceAndAudienceField.tsx b/packages/web/src/components/edit/fields/price-and-audience/PriceAndAudienceField.tsx index 5a30c830cd1..e1c497cea7e 100644 --- a/packages/web/src/components/edit/fields/price-and-audience/PriceAndAudienceField.tsx +++ b/packages/web/src/components/edit/fields/price-and-audience/PriceAndAudienceField.tsx @@ -1,6 +1,6 @@ import { useCallback, useMemo, useState } from 'react' -import { useArtistCoin, useCurrentUserId } from '@audius/common/api' +import { useFanClub, useCurrentUserId } from '@audius/common/api' import { useUSDCPurchaseConfig } from '@audius/common/hooks' import { priceAndAudienceMessages } from '@audius/common/messages' import { @@ -381,7 +381,7 @@ export const PriceAndAudienceField = (props: PriceAndAudienceFieldProps) => { ] ) - const { data: token } = useArtistCoin( + const { data: token } = useFanClub( tempStreamConditions.token_gate?.token_mint ?? '' ) diff --git a/packages/web/src/components/edit/fields/stream-availability/token-gated/TokenGatedRadioField.tsx b/packages/web/src/components/edit/fields/stream-availability/token-gated/TokenGatedRadioField.tsx index e1074740a70..e549934274c 100644 --- a/packages/web/src/components/edit/fields/stream-availability/token-gated/TokenGatedRadioField.tsx +++ b/packages/web/src/components/edit/fields/stream-availability/token-gated/TokenGatedRadioField.tsx @@ -1,11 +1,11 @@ import { useCallback } from 'react' -import { useArtistCreatedCoin, useCurrentUserId } from '@audius/common/api' +import { useArtistCreatedFanClub, useCurrentUserId } from '@audius/common/api' import { useAccessAndRemixSettings, useHasNoTokens } from '@audius/common/hooks' import { priceAndAudienceMessages as messages } from '@audius/common/messages' import { StreamTrackAvailabilityType } from '@audius/common/models' import { useField } from 'formik' -import { IconArtistCoin } from '~harmony/icons' +import { IconFanClub } from '~harmony/icons' import { TokenIcon } from 'components/buy-sell-modal/TokenIcon' import { ModalRadioItem } from 'components/modal-radio/ModalRadioItem' @@ -24,7 +24,7 @@ type TokenGatedRadioFieldProps = { export const TokenGatedRadioField = (props: TokenGatedRadioFieldProps) => { const { isRemix, isUpload, isInitiallyUnlisted, isAlbum } = props const { data: userId } = useCurrentUserId() - const { data: coin } = useArtistCreatedCoin(userId) + const { data: coin } = useArtistCreatedFanClub(userId) const [, , { setValue: setStreamConditionsValue }] = useField( @@ -58,7 +58,7 @@ export const TokenGatedRadioField = (props: TokenGatedRadioFieldProps) => { coin?.logoUri ? ( ) : ( - + ) } label={messages.tokenGatedRadio.title} diff --git a/packages/web/src/components/hover-card/ArtistCoinHoverCard.tsx b/packages/web/src/components/hover-card/FanClubHoverCard.tsx similarity index 80% rename from packages/web/src/components/hover-card/ArtistCoinHoverCard.tsx rename to packages/web/src/components/hover-card/FanClubHoverCard.tsx index 806c35b7142..e8cb24a5447 100644 --- a/packages/web/src/components/hover-card/ArtistCoinHoverCard.tsx +++ b/packages/web/src/components/hover-card/FanClubHoverCard.tsx @@ -1,6 +1,6 @@ import { useCallback, useState } from 'react' -import { useArtistCoin, useCoinBalance, useUser } from '@audius/common/api' +import { useFanClub, useCoinBalance, useUser } from '@audius/common/api' import { ID } from '@audius/common/models' import { formatCount, route } from '@audius/common/utils' import { @@ -23,7 +23,7 @@ const messages = { visitCoinPage: 'Visit Coin Page' } -type ArtistCoinHoverCardProps = Pick< +type FanClubHoverCardProps = Pick< HoverCardProps, | 'children' | 'onClose' @@ -39,9 +39,9 @@ type ArtistCoinHoverCardProps = Pick< } /** - * A complete HoverCard for artist coin badges that includes both header and body + * A complete HoverCard for fan club badges that includes both header and body */ -export const ArtistCoinHoverCard = ({ +export const FanClubHoverCard = ({ children, userId, onClose, @@ -49,33 +49,33 @@ export const ArtistCoinHoverCard = ({ transformOrigin, onClick, triggeredBy -}: ArtistCoinHoverCardProps) => { +}: FanClubHoverCardProps) => { const navigate = useNavigateToPage() const { spacing } = useTheme() // Track hover state to conditionally fetch token balance const [isHovered, setIsHovered] = useState(false) - // Get user data to access artist_coin_badge + // Get user data to access fan_club_badge const { data: user } = useUser(userId, { select: (user) => ({ - artistCoinBadge: user?.artist_coin_badge + fanClubBadge: user?.fan_club_badge }) }) - const { artistCoinBadge } = user ?? {} + const { fanClubBadge } = user ?? {} // Fetch full coin data to get name and ownerId - const { data: coinData } = useArtistCoin(artistCoinBadge?.mint, { - enabled: isHovered && !!artistCoinBadge?.mint + const { data: coinData } = useFanClub(fanClubBadge?.mint, { + enabled: isHovered && !!fanClubBadge?.mint }) // Only fetch token balance when hovered and we have the mint address const { data: tokenBalance, isPending: isTokenBalancePending } = useCoinBalance({ - mint: artistCoinBadge?.mint ?? '', + mint: fanClubBadge?.mint ?? '', userId, - enabled: isHovered && !!artistCoinBadge?.mint + enabled: isHovered && !!fanClubBadge?.mint }) // Determine if the user whose badge we're showing is the creator of this coin @@ -84,18 +84,18 @@ export const ArtistCoinHoverCard = ({ const handleClick = useCallback(() => { onClick?.() onClose?.() - if (artistCoinBadge?.ticker) { - navigate(route.coinPage(artistCoinBadge.ticker)) + if (fanClubBadge?.ticker) { + navigate(route.coinPage(fanClubBadge.ticker)) } - }, [onClick, onClose, navigate, artistCoinBadge?.ticker]) + }, [onClick, onClose, navigate, fanClubBadge?.ticker]) // Don't render if we don't have the basic coin info - if (!artistCoinBadge?.ticker || !artistCoinBadge?.logo_uri) { + if (!fanClubBadge?.ticker || !fanClubBadge?.logo_uri) { return null } - const coinName = coinData?.name || artistCoinBadge.ticker || '' - const coinTicker = artistCoinBadge.ticker || '' + const coinName = coinData?.name || fanClubBadge.ticker || '' + const coinTicker = fanClubBadge.ticker || '' const formattedBalance = tokenBalance ? formatCount(Number(tokenBalance.balance)) : null @@ -141,9 +141,9 @@ export const ArtistCoinHoverCard = ({ {/* Token Icon */} - {artistCoinBadge?.logo_uri ? ( + {fanClubBadge?.logo_uri ? ( & { noOverflow?: boolean center?: boolean fullWidth?: boolean - hideArtistCoinBadge?: boolean + hideFanClubBadge?: boolean } export const UserLink = (props: UserLinkProps) => { @@ -36,7 +36,7 @@ export const UserLink = (props: UserLinkProps) => { noOverflow, center, fullWidth, - hideArtistCoinBadge, + hideFanClubBadge, ...other } = props const { spacing } = useTheme() @@ -62,7 +62,7 @@ export const UserLink = (props: UserLinkProps) => { display: 'inline-flex', verticalAlign: 'middle' }} - hideArtistCoinBadge={hideArtistCoinBadge} + hideFanClubBadge={hideFanClubBadge} /> ) diff --git a/packages/web/src/components/nav/desktop/LeftNav.tsx b/packages/web/src/components/nav/desktop/LeftNav.tsx index 7d9ed1a3146..c203371b7eb 100644 --- a/packages/web/src/components/nav/desktop/LeftNav.tsx +++ b/packages/web/src/components/nav/desktop/LeftNav.tsx @@ -26,7 +26,7 @@ import { UploadNavItem, DevToolsNavItem, PlaylistsNavItem, - ArtistCoinsNavItem + FanClubsNavItem } from './nav-items' export const LEFT_NAV_WIDTH = 240 @@ -119,7 +119,7 @@ export const LeftNav = (props: OwnProps) => { - + diff --git a/packages/web/src/components/nav/desktop/nav-items/ArtistCoinsNavItem.tsx b/packages/web/src/components/nav/desktop/nav-items/FanClubsNavItem.tsx similarity index 74% rename from packages/web/src/components/nav/desktop/nav-items/ArtistCoinsNavItem.tsx rename to packages/web/src/components/nav/desktop/nav-items/FanClubsNavItem.tsx index 98450288704..c6d67ab279d 100644 --- a/packages/web/src/components/nav/desktop/nav-items/ArtistCoinsNavItem.tsx +++ b/packages/web/src/components/nav/desktop/nav-items/FanClubsNavItem.tsx @@ -1,5 +1,5 @@ import { route } from '@audius/common/utils' -import { IconArtistCoin } from '@audius/harmony' +import { IconFanClub } from '@audius/harmony' import { LeftNavLink } from '../LeftNavLink' @@ -9,10 +9,10 @@ const messages = { title: 'Fan Clubs' } -export const ArtistCoinsNavItem = () => { +export const FanClubsNavItem = () => { return ( { + const goToFanClubsExplorePage = useCallback(() => { setImmediate(() => goToRoute(CLUBS_EXPLORE_PAGE)) onClose() }, [goToRoute, onClose]) @@ -64,8 +64,8 @@ export const NavBarActionDrawer = ({ onClick: goToWalletPage }, { - text: messages.artistCoins, - onClick: goToArtistCoinsExplorePage + text: messages.fanClubs, + onClick: goToFanClubsExplorePage }, { text: messages.rewards, @@ -76,12 +76,7 @@ export const NavBarActionDrawer = ({ onClick: goToSettingsPage } ], - [ - goToRewardsPage, - goToSettingsPage, - goToWalletPage, - goToArtistCoinsExplorePage - ] + [goToRewardsPage, goToSettingsPage, goToWalletPage, goToFanClubsExplorePage] ) return diff --git a/packages/web/src/components/notification/Notification/FanClubTextPostNotification.tsx b/packages/web/src/components/notification/Notification/FanClubTextPostNotification.tsx index c102e02daa6..02086b0e90f 100644 --- a/packages/web/src/components/notification/Notification/FanClubTextPostNotification.tsx +++ b/packages/web/src/components/notification/Notification/FanClubTextPostNotification.tsx @@ -3,7 +3,7 @@ import { useCallback } from 'react' import { useUser } from '@audius/common/api' import { FanClubTextPostNotification as FanClubTextPostNotificationType } from '@audius/common/store' import { route } from '@audius/common/utils' -import { Artwork, Flex, IconArtistCoin } from '@audius/harmony' +import { Artwork, Flex, IconFanClub } from '@audius/harmony' import { useDispatch } from 'react-redux' import { push } from 'utils/navigation' @@ -35,8 +35,8 @@ export const FanClubTextPostNotification = ( const { data: user } = useUser(entityUserId) const handleClick = useCallback(() => { - if (user?.artist_coin_badge?.ticker) { - dispatch(push(coinPage(user.artist_coin_badge.ticker))) + if (user?.fan_club_badge?.ticker) { + dispatch(push(coinPage(user.fan_club_badge.ticker))) } }, [user, dispatch]) @@ -44,13 +44,13 @@ export const FanClubTextPostNotification = ( return ( - }> + }> - {user.artist_coin_badge?.logo_uri ? ( - + {user.fan_club_badge?.logo_uri ? ( + ) : null} diff --git a/packages/web/src/components/profile-picture/ProfilePicture.jsx b/packages/web/src/components/profile-picture/ProfilePicture.jsx index afcd3c2ca4c..c1ed8c44c31 100644 --- a/packages/web/src/components/profile-picture/ProfilePicture.jsx +++ b/packages/web/src/components/profile-picture/ProfilePicture.jsx @@ -1,6 +1,6 @@ import { memo, useState, useEffect, useMemo } from 'react' -import { useArtistCreatedCoin } from '@audius/common/api' +import { useArtistCreatedFanClub } from '@audius/common/api' import { SquareSizes } from '@audius/common/models' import { route } from '@audius/common/utils' import { useTheme } from '@audius/harmony' @@ -44,7 +44,7 @@ const ProfilePicture = ({ const [processing, setProcessing] = useState(false) const [modalOpen, setModalOpen] = useState(false) - const { data: ownedCoin } = useArtistCreatedCoin(userId) + const { data: ownedCoin } = useArtistCreatedFanClub(userId) const navigate = useNavigate() const handleCoinClick = () => { @@ -53,7 +53,7 @@ const ProfilePicture = ({ } } - const shouldShowArtistCoinBadge = useMemo(() => { + const shouldShowFanClubBadge = useMemo(() => { if (!ownedCoin?.mint || !ownedCoin?.logoUri) { return false } @@ -130,7 +130,7 @@ const ProfilePicture = ({ source='ProfilePicture' /> ) : null} - {shouldShowArtistCoinBadge && ( + {shouldShowFanClubBadge && ( { const { isMobile } = useMedia() const { isOpen, onClose, data } = useReceiveTokensModal() const { mint } = data ?? {} - const { data: coin } = useArtistCoin(mint) + const { data: coin } = useFanClub(mint) const { coinBalanceFormatted: balance } = useFormattedCoinBalance( mint ?? '', 'en-US', @@ -50,7 +47,7 @@ export const ReceiveTokensModal = () => { const { userBankAddress, loading: userBankLoading } = useUserbank(mint) const { rootWalletAddress, loading: rootWalletLoading } = useRootWalletAddress() - const tokenInfo = coin ? transformArtistCoinToTokenInfo(coin) : undefined + const tokenInfo = coin ? transformFanClubToTokenInfo(coin) : undefined // Use root wallet address for USDC, user bank for others const isUsdc = mint === env.USDC_MINT_ADDRESS @@ -101,7 +98,7 @@ export const ReceiveTokensModal = () => { icon={IconError} actions={ diff --git a/packages/web/src/components/send-tokens-modal/SendTokensConfirmation.tsx b/packages/web/src/components/send-tokens-modal/SendTokensConfirmation.tsx index f100fff3c2e..1bf587924dd 100644 --- a/packages/web/src/components/send-tokens-modal/SendTokensConfirmation.tsx +++ b/packages/web/src/components/send-tokens-modal/SendTokensConfirmation.tsx @@ -1,9 +1,6 @@ import React from 'react' -import { - useArtistCoin, - transformArtistCoinToTokenInfo -} from '@audius/common/api' +import { useFanClub, transformFanClubToTokenInfo } from '@audius/common/api' import { User, SquareSizes } from '@audius/common/models' import { FixedDecimal } from '@audius/fixed-decimal' import { @@ -58,8 +55,8 @@ const SendTokensConfirmation = ({ onBack }: SendTokensConfirmationProps) => { // Get token data - const { data: coin } = useArtistCoin(mint) - const tokenInfo = coin ? transformArtistCoinToTokenInfo(coin) : undefined + const { data: coin } = useFanClub(mint) + const tokenInfo = coin ? transformFanClubToTokenInfo(coin) : undefined const profilePicture = useProfilePicture({ userId: selectedUser?.user_id, diff --git a/packages/web/src/components/send-tokens-modal/SendTokensFailure.tsx b/packages/web/src/components/send-tokens-modal/SendTokensFailure.tsx index 0e9990e9b65..c6518ab585d 100644 --- a/packages/web/src/components/send-tokens-modal/SendTokensFailure.tsx +++ b/packages/web/src/components/send-tokens-modal/SendTokensFailure.tsx @@ -1,7 +1,7 @@ import { - useArtistCoin, + useFanClub, useCoinBalance, - transformArtistCoinToTokenInfo + transformFanClubToTokenInfo } from '@audius/common/api' import { User, SquareSizes } from '@audius/common/models' import { FixedDecimal } from '@audius/fixed-decimal' @@ -52,13 +52,13 @@ const SendTokensFailure = ({ onClose }: SendTokensFailureProps) => { // Get token data and balance using the same hooks as ReceiveTokensModal - const { data: coin } = useArtistCoin(mint) + const { data: coin } = useFanClub(mint) const { data: tokenBalance } = useCoinBalance({ mint, includeExternalWallets: false, includeStaked: false }) - const tokenInfo = coin ? transformArtistCoinToTokenInfo(coin) : undefined + const tokenInfo = coin ? transformFanClubToTokenInfo(coin) : undefined const currentBalance = tokenBalance?.balance ? tokenBalance.balance.value : BigInt(0) diff --git a/packages/web/src/components/send-tokens-modal/SendTokensInput.tsx b/packages/web/src/components/send-tokens-modal/SendTokensInput.tsx index 930c7d7e043..66773d1c34a 100644 --- a/packages/web/src/components/send-tokens-modal/SendTokensInput.tsx +++ b/packages/web/src/components/send-tokens-modal/SendTokensInput.tsx @@ -1,9 +1,9 @@ import { ChangeEvent, useCallback, useMemo, useState } from 'react' import { - useArtistCoin, + useFanClub, useCoinBalance, - transformArtistCoinToTokenInfo, + transformFanClubToTokenInfo, useCurrentUserId, useTradeableCoins } from '@audius/common/api' @@ -113,14 +113,14 @@ const SendTokensInput = ({ ) // Get the coin data and balance for selected token - const { data: coin } = useArtistCoin(selectedMint) + const { data: coin } = useFanClub(selectedMint) const { data: tokenBalance } = useCoinBalance({ mint: selectedMint, includeExternalWallets: false, // CurrentWalletBanner handles external wallet balance includeStaked: false }) const { data: currentUserId } = useCurrentUserId() - const tokenInfo = coin ? transformArtistCoinToTokenInfo(coin) : undefined + const tokenInfo = coin ? transformFanClubToTokenInfo(coin) : undefined // Calculate USD value for display const usdValueInfo = useMemo(() => { diff --git a/packages/web/src/components/send-tokens-modal/SendTokensSuccess.tsx b/packages/web/src/components/send-tokens-modal/SendTokensSuccess.tsx index 2feef85ff65..ee0255fa94a 100644 --- a/packages/web/src/components/send-tokens-modal/SendTokensSuccess.tsx +++ b/packages/web/src/components/send-tokens-modal/SendTokensSuccess.tsx @@ -1,7 +1,7 @@ import { - useArtistCoin, + useFanClub, useCoinBalance, - transformArtistCoinToTokenInfo + transformFanClubToTokenInfo } from '@audius/common/api' import { User, SquareSizes } from '@audius/common/models' import { makeSolanaTransactionLink } from '@audius/common/utils' @@ -50,13 +50,13 @@ const SendTokensSuccess = ({ signature, onClose }: SendTokensSuccessProps) => { - const { data: coin } = useArtistCoin(mint) + const { data: coin } = useFanClub(mint) const { data: tokenBalance } = useCoinBalance({ mint, includeExternalWallets: false, includeStaked: false }) - const tokenInfo = coin ? transformArtistCoinToTokenInfo(coin) : undefined + const tokenInfo = coin ? transformFanClubToTokenInfo(coin) : undefined const currentBalance = tokenBalance?.balance ? tokenBalance.balance.value : BigInt(0) diff --git a/packages/web/src/components/stat-banner/StatBanner.tsx b/packages/web/src/components/stat-banner/StatBanner.tsx index 4e12d76948e..7ff593058cc 100644 --- a/packages/web/src/components/stat-banner/StatBanner.tsx +++ b/packages/web/src/components/stat-banner/StatBanner.tsx @@ -43,7 +43,7 @@ const messages = { save: 'Save Changes', message: 'Send Message', sendTokens: 'Send Tokens', - sendArtistCoins: 'Send Coins', + sendFanClubs: 'Send Coins', unblockMessages: 'Unblock Messages', blockMessages: 'Block Messages', unmuteComments: 'Unmute Comments', @@ -269,7 +269,7 @@ export const StatBanner = (props: StatsBannerProps) => { variant='secondary' size='small' iconLeft={IconMoneySend} - aria-label={messages.sendArtistCoins} + aria-label={messages.sendFanClubs} onClick={() => { openSendTokensModal({ mint: env.WAUDIO_MINT_ADDRESS, diff --git a/packages/web/src/components/track/CardTitle.tsx b/packages/web/src/components/track/CardTitle.tsx index 0ea196b68a2..fff9a7cfc10 100644 --- a/packages/web/src/components/track/CardTitle.tsx +++ b/packages/web/src/components/track/CardTitle.tsx @@ -9,7 +9,7 @@ import { IconCart, IconSparkles, Flex, - IconArtistCoin + IconFanClub } from '@audius/harmony' const messages = { @@ -57,7 +57,7 @@ export const CardTitle = ({ icon = message = messages.premiumTrack } else if (isContentTokenGated(streamConditions)) { - icon = + icon = message = messages.coinGated } else { icon = diff --git a/packages/web/src/components/track/GatedContentSection.tsx b/packages/web/src/components/track/GatedContentSection.tsx index 30b319ae836..3d79180c94b 100644 --- a/packages/web/src/components/track/GatedContentSection.tsx +++ b/packages/web/src/components/track/GatedContentSection.tsx @@ -1,6 +1,6 @@ import { useCallback, useEffect } from 'react' -import { useArtistCoin, useUsers } from '@audius/common/api' +import { useFanClub, useUsers } from '@audius/common/api' import { Name, FollowSource, @@ -28,7 +28,7 @@ import { IconSparkles, Button, IconUserFollow, - IconArtistCoin + IconFanClub } from '@audius/harmony' import cn from 'classnames' import { useDispatch, useSelector } from 'react-redux' @@ -59,7 +59,7 @@ const getMessages = (contentType: PurchaseableContentType) => ({ coinGated: 'COIN GATED', specialAccess: 'SPECIAL ACCESS', followArtist: 'Follow Artist', - buyArtistCoin: 'Buy Coins', + buyFanClub: 'Buy Coins', period: '.', exclamationMark: '!', ownFollowGated: 'Users can unlock access by following your account!', @@ -69,7 +69,7 @@ const getMessages = (contentType: PurchaseableContentType) => ({ thankYouForSupporting: 'Thank you for supporting', unlockWithPurchase: `Unlock this ${contentType} with a one-time purchase!`, ofArtistsCoin: "of the artist's fan club", - artistCoin: 'Fan club', + fanClub: 'Fan club', unlockTokenGatedContentPrefix: (amount: number) => `You must hold at least ${amount} `, unlockTokenGatedContentSuffix: ' in a connected wallet.', @@ -109,7 +109,7 @@ const LockedGatedContentSection = ({ useModalState('LockedContent') const { onOpen: openPremiumContentPurchaseModal } = usePremiumContentPurchaseModal() - const { data: coin } = useArtistCoin( + const { data: coin } = useFanClub( isContentTokenGated(streamConditions) ? streamConditions.token_gate.token_mint : '' @@ -271,7 +271,7 @@ const LockedGatedContentSection = ({ onClick={handlePurchaseToken} fullWidth > - {messages.buyArtistCoin} + {messages.buyFanClub} ) } @@ -415,7 +415,7 @@ const UnlockedGatedContentSection = ({ 'contentId' | 'buttonClassName' | 'source' >) => { const messages = getMessages(contentType) - const { data: coin } = useArtistCoin( + const { data: coin } = useFanClub( isContentTokenGated(streamConditions) ? streamConditions.token_gate.token_mint : '' @@ -443,7 +443,7 @@ const UnlockedGatedContentSection = ({ ${coin.ticker}
) : ( - messages.artistCoin + messages.fanClub )} {messages.unlockedTokenGatedSuffix} @@ -482,7 +482,7 @@ const UnlockedGatedContentSection = ({ IconComponent = IconCart gatedConditionTitle = messages.payToUnlock } else if (isContentTokenGated(streamConditions)) { - IconComponent = IconArtistCoin + IconComponent = IconFanClub gatedConditionTitle = messages.coinGated } diff --git a/packages/web/src/components/user-badges/UserBadges.tsx b/packages/web/src/components/user-badges/UserBadges.tsx index 25903548687..e615cf5b241 100644 --- a/packages/web/src/components/user-badges/UserBadges.tsx +++ b/packages/web/src/components/user-badges/UserBadges.tsx @@ -28,8 +28,8 @@ import { import { Origin } from '@audius/harmony/src/components/popup/types' import cn from 'classnames' -import { ArtistCoinHoverCard } from 'components/hover-card/ArtistCoinHoverCard' import { AudioHoverCard } from 'components/hover-card/AudioHoverCard' +import { FanClubHoverCard } from 'components/hover-card/FanClubHoverCard' import { env } from 'services/env' import styles from './UserBadges.module.css' @@ -62,12 +62,12 @@ type UserBadgesProps = { isVerifiedOverride?: boolean overrideTier?: BadgeTier - // Optional mint address for displaying specific artist coin - // If provided, shows the artist coin badge for that token + // Optional mint address for displaying specific fan club + // If provided, shows the fan club badge for that token mint?: string - // Optional flag to hide the artist coin badge - hideArtistCoinBadge?: boolean + // Optional flag to hide the fan club badge + hideFanClubBadge?: boolean } /** @@ -83,23 +83,23 @@ const UserBadges = ({ isVerifiedOverride, overrideTier, mint, - hideArtistCoinBadge = false + hideFanClubBadge = false }: UserBadgesProps) => { const { tier: currentTier, isVerified } = useTierAndVerifiedForUser(userId) const { data: user } = useUser(userId, { select: (user) => ({ - artistCoinBadge: user?.artist_coin_badge + fanClubBadge: user?.fan_club_badge }) }) - const { artistCoinBadge: userArtistCoinBadge } = user ?? {} + const { fanClubBadge: userFanClubBadge } = user ?? {} const displayMint = useMemo(() => { - // Priority: explicit mint prop > user's artist_coin_badge > null + // Priority: explicit mint prop > user's fan_club_badge > null if (mint) return mint - if (userArtistCoinBadge?.mint) return userArtistCoinBadge.mint + if (userFanClubBadge?.mint) return userFanClubBadge.mint return null - }, [mint, userArtistCoinBadge?.mint]) + }, [mint, userFanClubBadge?.mint]) const tier = overrideTier || currentTier const isUserVerified = isVerifiedOverride ?? isVerified @@ -169,16 +169,16 @@ const UserBadges = ({ ) }, [tier, userId, anchorOrigin, transformOrigin, size]) - const shouldShowArtistCoinBadge = - !hideArtistCoinBadge && + const shouldShowFanClubBadge = + !hideFanClubBadge && !!displayMint && displayMint !== env.WAUDIO_MINT_ADDRESS - const artistCoinBadge = useMemo(() => { - if (!shouldShowArtistCoinBadge) return null + const fanClubBadge = useMemo(() => { + if (!shouldShowFanClubBadge) return null return ( -
- + ) }, [ - shouldShowArtistCoinBadge, + shouldShowFanClubBadge, userId, anchorOrigin, transformOrigin, - userArtistCoinBadge?.logo_uri, + userFanClubBadge?.logo_uri, size ]) @@ -235,7 +235,7 @@ const UserBadges = ({ > {verifiedBadge} {tierBadge} - {artistCoinBadge} + {fanClubBadge} ) diff --git a/packages/web/src/components/user-list/lists/CoinLeaderboardUserList.tsx b/packages/web/src/components/user-list/lists/CoinLeaderboardUserList.tsx index 04252347980..bfc2152aee0 100644 --- a/packages/web/src/components/user-list/lists/CoinLeaderboardUserList.tsx +++ b/packages/web/src/components/user-list/lists/CoinLeaderboardUserList.tsx @@ -1,4 +1,4 @@ -import { useArtistCoinMembers } from '@audius/common/api' +import { useFanClubMembers } from '@audius/common/api' import { coinLeaderboardUserListSelectors } from '@audius/common/store' import { Text } from '@audius/harmony' import { useSelector } from 'react-redux' @@ -9,7 +9,7 @@ export const CoinLeaderboardUserList = () => { const mint = useSelector(coinLeaderboardUserListSelectors.getMint) const { data, hasNextPage, isFetchingNextPage, fetchNextPage, isPending } = - useArtistCoinMembers({ mint: mint ?? '' }) + useFanClubMembers({ mint: mint ?? '' }) if (!mint) return null diff --git a/packages/web/src/hooks/useClaimFees.ts b/packages/web/src/hooks/useClaimFees.ts index 4fb071b1c8b..0f78df51921 100644 --- a/packages/web/src/hooks/useClaimFees.ts +++ b/packages/web/src/hooks/useClaimFees.ts @@ -1,5 +1,5 @@ import { - getArtistCoinQueryKey, + getFanClubQueryKey, useCurrentAccountUser, useQueryContext, pollUntilAudioBalanceChanges @@ -97,16 +97,16 @@ export const useClaimFees = ( // Call the original onError if provided reportToSentry({ error, - feature: Feature.ArtistCoins, - name: 'Artist coin fees claim error', + feature: Feature.FanClubs, + name: 'Fan club fees claim error', additionalInfo: { ...params } }) }, onSuccess: async (data, variables, context) => { - // Invalidate the artist coin query to refetch the updated fees - const queryKey = getArtistCoinQueryKey(variables.tokenMint) + // Invalidate the fan club query to refetch the updated fees + const queryKey = getFanClubQueryKey(variables.tokenMint) await queryClient.setQueryData(queryKey, (oldData) => { if (!oldData) return oldData return { diff --git a/packages/web/src/hooks/useClaimVestedCoins.ts b/packages/web/src/hooks/useClaimVestedCoins.ts index ba5205b5628..26c66a2a92a 100644 --- a/packages/web/src/hooks/useClaimVestedCoins.ts +++ b/packages/web/src/hooks/useClaimVestedCoins.ts @@ -1,6 +1,6 @@ import { type Coin } from '@audius/common/adapters' import { - getArtistCoinQueryKey, + getFanClubQueryKey, getUserCoinQueryKey, useCurrentAccountUser, useQueryContext, @@ -33,8 +33,8 @@ export type ClaimVestedCoinsResult = { } /** - * Hook for claiming vested/unlocked artist coins from the vesting schedule. - * After an artist coin graduates, the artist's reserved coins unlock daily over a 5-year period. + * Hook for claiming vested/unlocked fan clubs from the vesting schedule. + * After an fan club graduates, the artist's reserved coins unlock daily over a 5-year period. * This gets the TX from solana relay, then signs and sends the claim vested coins transaction. * NOTE: This is a web feature only because the user must sign with the same external wallet they used to launch the coin (wallet connect wallet). */ @@ -126,8 +126,8 @@ export const useClaimVestedCoins = ( onError: (error, params) => { reportToSentry({ error, - feature: Feature.ArtistCoins, - name: 'Artist coin vested coins claim error', + feature: Feature.FanClubs, + name: 'Fan club vested coins claim error', additionalInfo: { ...params } @@ -136,7 +136,7 @@ export const useClaimVestedCoins = ( }, onSuccess: (data: ClaimVestedCoinsResult, variables, context) => { // Optimistically update the coin data with new locker amounts - const queryKey = getArtistCoinQueryKey(variables.tokenMint) + const queryKey = getFanClubQueryKey(variables.tokenMint) queryClient.setQueryData(queryKey, (existingCoin) => { if ( !existingCoin || diff --git a/packages/web/src/hooks/useConnectExternalWallets.ts b/packages/web/src/hooks/useConnectExternalWallets.ts index eab8c79fd1d..7323b944c00 100644 --- a/packages/web/src/hooks/useConnectExternalWallets.ts +++ b/packages/web/src/hooks/useConnectExternalWallets.ts @@ -163,7 +163,7 @@ export const useConnectExternalWallets = ( reportToSentry({ error: new Error('No wallets found to connect'), name: 'Connect Wallet Error', - feature: Feature.ArtistCoins + feature: Feature.FanClubs }) } @@ -187,7 +187,7 @@ export const useConnectExternalWallets = ( reportToSentry({ error: new Error('Connect Wallet Error'), name: 'Connect Wallet Error', - feature: Feature.ArtistCoins, + feature: Feature.FanClubs, additionalInfo: { error: String(event.data) } diff --git a/packages/web/src/hooks/useExternalWalletSwap.ts b/packages/web/src/hooks/useExternalWalletSwap.ts index 5f4d4831e9f..8e42d4446b2 100644 --- a/packages/web/src/hooks/useExternalWalletSwap.ts +++ b/packages/web/src/hooks/useExternalWalletSwap.ts @@ -3,7 +3,7 @@ import { useCurrentAccountUser, useQueryContext, getExternalWalletBalanceQueryKey, - getArtistCoinQueryKey, + getFanClubQueryKey, SwapErrorType, SwapStatus, SwapTokensParams, @@ -15,7 +15,7 @@ import { getJupiterQuoteByMintWithRetry, jupiterInstance } from '@audius/common/src/services/Jupiter' -import { NON_ARTIST_COIN_MINTS, TOKEN_LISTING_MAP } from '@audius/common/store' +import { NON_FAN_CLUB_MINTS, TOKEN_LISTING_MAP } from '@audius/common/store' import { FixedDecimal } from '@audius/fixed-decimal' import { QuoteResponse, SwapRequest } from '@jup-ag/api' import type { Provider as SolanaProvider } from '@reown/appkit-adapter-solana/react' @@ -66,10 +66,10 @@ const getDirectSwapTx = async (quote: QuoteResponse, walletAddress: string) => { } /** - * Checks if a mint is an artist coin (not in NON_ARTIST_COIN_MINTS) + * Checks if a mint is an fan club (not in NON_FAN_CLUB_MINTS) */ -const isArtistCoinMint = (mint: string): boolean => { - return !NON_ARTIST_COIN_MINTS.includes(mint) +const isFanClubMint = (mint: string): boolean => { + return !NON_FAN_CLUB_MINTS.includes(mint) } /** @@ -102,7 +102,7 @@ const extractInstructionsFromVersionedTx = ( /** * Combines two Meteora swap transactions into a single transaction - * Used for artist-coin ↔ artist-coin swaps + * Used for fan-club ↔ fan-club swaps */ const getCombinedMeteoraSwapTx = async ({ inputMint, @@ -131,7 +131,7 @@ const getCombinedMeteoraSwapTx = async ({ inputAmount: SwapAmount outputAmount: SwapAmount }> => { - // First swap: artist-coin → AUDIO + // First swap: fan-club → AUDIO const rawInputAmount = BigInt( Math.floor(amountUi * Math.pow(10, inputDecimals)) ).toString() @@ -146,7 +146,7 @@ const getCombinedMeteoraSwapTx = async ({ const audioOutputAmount = firstSwapResult.outputAmount - // Second swap: AUDIO → artist-coin + // Second swap: AUDIO → fan-club const secondSwapResult = await solanaRelay.swapCoin({ inputAmount: audioOutputAmount, coinMint: outputMint, @@ -199,7 +199,7 @@ const getCombinedMeteoraSwapTx = async ({ /** * Executes an indirect swap using two separate transactions - * Used for USDC/SOL ↔ artist-coin swaps (Jupiter + Meteora) + * Used for USDC/SOL ↔ fan-club swaps (Jupiter + Meteora) */ const executeIndirectSwapWithTwoTransactions = async ({ inputMint, @@ -230,13 +230,13 @@ const executeIndirectSwapWithTwoTransactions = async ({ inputAmount: SwapAmount outputAmount: SwapAmount }> => { - const isInputArtistCoin = isArtistCoinMint(inputMint) + const isInputFanClub = isFanClubMint(inputMint) // Determine which leg uses Jupiter and which uses Meteora - if (isInputArtistCoin) { - // artist-coin → AUDIO (Meteora), then AUDIO → USDC/SOL (Jupiter) + if (isInputFanClub) { + // fan-club → AUDIO (Meteora), then AUDIO → USDC/SOL (Jupiter) - // First transaction: artist-coin → AUDIO (Meteora) + // First transaction: fan-club → AUDIO (Meteora) const firstLegResult = await getMeteoraSwapTx({ inputMint, outputMint: audioMint, @@ -301,7 +301,7 @@ const executeIndirectSwapWithTwoTransactions = async ({ } } } else { - // USDC/SOL → AUDIO (Jupiter), then AUDIO → artist-coin (Meteora) + // USDC/SOL → AUDIO (Jupiter), then AUDIO → fan-club (Meteora) // First transaction: USDC/SOL → AUDIO (Jupiter) const { quoteResult: firstQuote } = await getJupiterQuoteByMintWithRetry({ @@ -332,7 +332,7 @@ const executeIndirectSwapWithTwoTransactions = async ({ 'confirmed' ) - // Second transaction: AUDIO → artist-coin (Meteora) + // Second transaction: AUDIO → fan-club (Meteora) const secondLegResult = await getMeteoraSwapTx({ inputMint: audioMint, outputMint, @@ -372,8 +372,8 @@ const executeIndirectSwapWithTwoTransactions = async ({ } /** - * Gets a Meteora swap transaction for artist coin swaps - * Meteora only supports swaps between AUDIO and artist coins + * Gets a Meteora swap transaction for fan club swaps + * Meteora only supports swaps between AUDIO and fan clubs */ const getMeteoraSwapTx = async ({ inputMint, @@ -392,17 +392,17 @@ const getMeteoraSwapTx = async ({ inputAmount: SwapAmount outputAmount: SwapAmount }> => { - // Determine which mint is the artist coin and which is AUDIO + // Determine which mint is the fan club and which is AUDIO const isInputAudio = inputMint === audioMint const isOutputAudio = outputMint === audioMint if (!isInputAudio && !isOutputAudio) { throw new Error( - 'Meteora swaps only support swaps between AUDIO and artist coins' + 'Meteora swaps only support swaps between AUDIO and fan clubs' ) } - const artistCoinMint = isInputAudio ? outputMint : inputMint + const fanClubMint = isInputAudio ? outputMint : inputMint const swapDirection = isInputAudio ? 'audioToCoin' : 'coinToAudio' // Convert UI amount to raw amount (bigint string) @@ -414,14 +414,14 @@ const getMeteoraSwapTx = async ({ // Get quote first await solanaRelay.getSwapCoinQuote({ inputAmount: rawInputAmount, - coinMint: artistCoinMint, + coinMint: fanClubMint, swapDirection: swapDirection as 'audioToCoin' | 'coinToAudio' }) // Get swap transaction const swapResult = await solanaRelay.swapCoin({ inputAmount: rawInputAmount, - coinMint: artistCoinMint, + coinMint: fanClubMint, swapDirection: swapDirection as 'audioToCoin' | 'coinToAudio', userPublicKey: new PublicKey(walletAddress), isExternalWallet: true @@ -490,26 +490,25 @@ export const useExternalWalletSwap = () => { let inputAmount: SwapAmount let outputAmount: SwapAmount - // Check if swap involves artist coins - const isInputArtistCoin = isArtistCoinMint(inputMint) - const isOutputArtistCoin = isArtistCoinMint(outputMint) + // Check if swap involves fan clubs + const isInputFanClub = isFanClubMint(inputMint) + const isOutputFanClub = isFanClubMint(outputMint) const isInputAudio = inputMint === env.WAUDIO_MINT_ADDRESS const isOutputAudio = outputMint === env.WAUDIO_MINT_ADDRESS // Determine swap type const isDirectMeteoraSwap = - (isInputArtistCoin && isOutputAudio) || - (isInputAudio && isOutputArtistCoin) + (isInputFanClub && isOutputAudio) || (isInputAudio && isOutputFanClub) - const isBothArtistCoins = isInputArtistCoin && isOutputArtistCoin + const isBothFanClubs = isInputFanClub && isOutputFanClub const isMixedIndirectSwap = - (isInputArtistCoin || isOutputArtistCoin) && + (isInputFanClub || isOutputFanClub) && !isInputAudio && !isOutputAudio && - !isBothArtistCoins + !isBothFanClubs if (isDirectMeteoraSwap) { - // Case 1: Direct Meteora swap: AUDIO ↔ artist-coin (single transaction) + // Case 1: Direct Meteora swap: AUDIO ↔ fan-club (single transaction) const meteoraResult = await getMeteoraSwapTx({ inputMint, outputMint, @@ -528,8 +527,8 @@ export const useExternalWalletSwap = () => { transaction = meteoraResult.transaction inputAmount = meteoraResult.inputAmount outputAmount = meteoraResult.outputAmount - } else if (isBothArtistCoins) { - // Case 2: artist-coin ↔ artist-coin (ONE combined transaction with both Meteora swaps) + } else if (isBothFanClubs) { + // Case 2: fan-club ↔ fan-club (ONE combined transaction with both Meteora swaps) const combinedResult = await getCombinedMeteoraSwapTx({ inputMint, outputMint, @@ -550,7 +549,7 @@ export const useExternalWalletSwap = () => { inputAmount = combinedResult.inputAmount outputAmount = combinedResult.outputAmount } else if (isMixedIndirectSwap) { - // Case 3: USDC/SOL ↔ artist-coin (TWO separate transactions: Jupiter + Meteora) + // Case 3: USDC/SOL ↔ fan-club (TWO separate transactions: Jupiter + Meteora) const intermediateAmount = await executeIndirectSwapWithTwoTransactions({ inputMint, @@ -574,7 +573,7 @@ export const useExternalWalletSwap = () => { outputAmount: intermediateAmount.outputAmount } } else { - // Case 4: Non-artist coin swaps (Jupiter only) + // Case 4: Non-fan club swaps (Jupiter only) const { quoteResult: quote } = await getJupiterQuoteByMintWithRetry({ inputMint, outputMint, @@ -656,7 +655,7 @@ export const useExternalWalletSwap = () => { reportToSentry({ error: error instanceof Error ? error : new Error(errorMessage), level: ErrorLevel.Error, - feature: Feature.ArtistCoins, + feature: Feature.FanClubs, name: 'External Wallet Swap Error', additionalInfo: { ...params, @@ -737,15 +736,15 @@ export const useExternalWalletSwap = () => { ) } - // Invalidate artist coin queries to refresh fee claiming and graduation progress + // Invalidate fan club queries to refresh fee claiming and graduation progress if (params.inputMint && !isSpendingAudio) { queryClient.invalidateQueries({ - queryKey: getArtistCoinQueryKey(params.inputMint) + queryKey: getFanClubQueryKey(params.inputMint) }) } if (params.outputMint && !isReceivingAudio) { queryClient.invalidateQueries({ - queryKey: getArtistCoinQueryKey(params.outputMint) + queryKey: getFanClubQueryKey(params.outputMint) }) } } diff --git a/packages/web/src/hooks/useLaunchCoin.ts b/packages/web/src/hooks/useLaunchCoin.ts index 9785ecb858c..083b5e96e57 100644 --- a/packages/web/src/hooks/useLaunchCoin.ts +++ b/packages/web/src/hooks/useLaunchCoin.ts @@ -1,6 +1,6 @@ import { QUERY_KEYS, - getArtistCreatedCoinQueryKey, + getArtistCreatedFanClubQueryKey, getConnectedWalletsQueryOptions, getCurrentAccountQueryKey, getUserQueryKey, @@ -158,7 +158,7 @@ export const useLaunchCoin = () => { reportToSentry({ error: e instanceof Error ? e : new Error(e as string), name: 'Confirm Launch Failure', - feature: Feature.ArtistCoins, + feature: Feature.FanClubs, additionalInfo: errorMetadata }) } @@ -230,7 +230,7 @@ export const useLaunchCoin = () => { link2: sanitizedLinks[1], link3: sanitizedLinks[2], link4: sanitizedLinks[3] - // intentionally don't send description to prevent the Artist Coin page from referencing itself + // intentionally don't send description to prevent the Fan Club page from referencing itself } }) errorMetadata.sdkCoinAdded = true @@ -240,7 +240,7 @@ export const useLaunchCoin = () => { reportToSentry({ error: e instanceof Error ? e : new Error(e as string), name: 'SDK Create Coin Failure', - feature: Feature.ArtistCoins, + feature: Feature.FanClubs, additionalInfo: errorMetadata }) } @@ -257,7 +257,7 @@ export const useLaunchCoin = () => { reportToSentry({ error: error instanceof Error ? error : new Error(error as string), name: 'Launch Coin Failure', - feature: Feature.ArtistCoins, + feature: Feature.FanClubs, additionalInfo: errorMetadata }) } @@ -265,7 +265,7 @@ export const useLaunchCoin = () => { } }, onSuccess: (_result, params, _context) => { - // Invalidate the list of artist coins to add it to the list + // Invalidate the list of fan clubs to add it to the list queryClient.invalidateQueries({ queryKey: [QUERY_KEYS.coins] }) // Invalidate the user to refresh their badge info queryClient.invalidateQueries({ @@ -277,7 +277,7 @@ export const useLaunchCoin = () => { // Invalidate our user - this will refresh their badge info // NOTE: this will eventually move to the users metadata queryClient.invalidateQueries({ - queryKey: getArtistCreatedCoinQueryKey(params.userId) + queryKey: getArtistCreatedFanClubQueryKey(params.userId) }) // The confirmation call will associate the external wallet, so we need to invalidate the connected wallets query queryClient.invalidateQueries({ diff --git a/packages/web/src/hooks/useLaunchpadConfig.ts b/packages/web/src/hooks/useLaunchpadConfig.ts index 4afb0f8aa3f..af5286afcfe 100644 --- a/packages/web/src/hooks/useLaunchpadConfig.ts +++ b/packages/web/src/hooks/useLaunchpadConfig.ts @@ -8,7 +8,7 @@ import { queryOptions, useQuery } from '@tanstack/react-query' import { AUDIO_DECIMALS, TOKEN_DECIMALS -} from 'pages/artist-coins-launchpad-page/constants' +} from 'pages/fan-clubs-launchpad-page/constants' type LaunchpadConfigHookResponse = { maxAudioInputAmount: number diff --git a/packages/web/src/pages/chat-page/components/ChatBlastModal.tsx b/packages/web/src/pages/chat-page/components/ChatBlastModal.tsx index f4c8ac4b00d..ef25cba74f7 100644 --- a/packages/web/src/pages/chat-page/components/ChatBlastModal.tsx +++ b/packages/web/src/pages/chat-page/components/ChatBlastModal.tsx @@ -1,8 +1,8 @@ import { - useArtistCreatedCoin, + useArtistCreatedFanClub, useCurrentAccountUser, useCurrentUserId, - useArtistCoinMembersCount + useFanClubMembersCount } from '@audius/common/api' import { useFirstAvailableBlastAudience, @@ -322,11 +322,11 @@ const RemixCreatorsMessageField = () => { const CoinHoldersMessageField = () => { const { data: currentUserId } = useCurrentUserId() const [{ value: targetAudience }] = useField(TARGET_AUDIENCE_FIELD) - const { data: coin } = useArtistCreatedCoin(currentUserId) + const { data: coin } = useArtistCreatedFanClub(currentUserId) const coinSymbol = coin?.ticker ?? '' const isSelected = targetAudience === ChatBlastAudience.COIN_HOLDERS - const { data: coinMembersCount } = useArtistCoinMembersCount({ + const { data: coinMembersCount } = useFanClubMembersCount({ mint: coin?.mint }) const isDisabled = coinMembersCount === 0 diff --git a/packages/web/src/pages/chat-page/components/ChatMessageListItem.tsx b/packages/web/src/pages/chat-page/components/ChatMessageListItem.tsx index 467f77e74e3..43fcbb57e17 100644 --- a/packages/web/src/pages/chat-page/components/ChatMessageListItem.tsx +++ b/packages/web/src/pages/chat-page/components/ChatMessageListItem.tsx @@ -21,11 +21,11 @@ import { UserGeneratedTextV2 } from 'components/user-generated-text/UserGenerate import ChatTail from '../../../assets/img/ChatTail.svg' -import { ArtistCoinHeader } from './ArtistCoinHeader' import { CONTENT_EXPANDED_LISTENER_KEY } from './ChatMessageList' import styles from './ChatMessageListItem.module.css' import { ChatMessagePlaylist } from './ChatMessagePlaylist' import { ChatMessageTrack } from './ChatMessageTrack' +import { FanClubHeader } from './FanClubHeader' import { LinkPreview } from './LinkPreview' import { ReactionPopupMenu } from './ReactionPopupMenu' @@ -188,10 +188,7 @@ export const ChatMessageListItem = (props: ChatMessageListItemProps) => { > - + {isCollectionUrl(linkValue) ? ( { - const artistCoinSymbol = useArtistCoinMessageHeader({ + const fanClubSymbol = useFanClubMessageHeader({ userId, audience }) const { coins } = useTradeableCoins() - if (!artistCoinSymbol) return null + if (!fanClubSymbol) return null return ( - + - {artistCoinSymbol} + {fanClubSymbol} diff --git a/packages/web/src/pages/coin-redeem-page/CoinRedeemPage.tsx b/packages/web/src/pages/coin-redeem-page/CoinRedeemPage.tsx index e3ff48cd284..01814a2740d 100644 --- a/packages/web/src/pages/coin-redeem-page/CoinRedeemPage.tsx +++ b/packages/web/src/pages/coin-redeem-page/CoinRedeemPage.tsx @@ -2,7 +2,7 @@ import { useCallback, useMemo } from 'react' import { Coin } from '@audius/common/adapters' import { - useArtistCoinByTicker, + useFanClubByTicker, useCoinRedeemAmount, useCoinRedeemCodeAmount, useCurrentUserId, @@ -182,7 +182,7 @@ export const CoinRedeemPage = () => { isPending: coinPending, isError, isSuccess - } = useArtistCoinByTicker({ ticker: formattedTicker }) + } = useFanClubByTicker({ ticker: formattedTicker }) const { data: coinRedeemAmount, isPending: coinRedeemAmountPending } = useCoinRedeemAmount({ mint: coin?.mint }) diff --git a/packages/web/src/pages/dev-tools/DevTools.tsx b/packages/web/src/pages/dev-tools/DevTools.tsx index 3c1376db5cc..2d835a6e28b 100644 --- a/packages/web/src/pages/dev-tools/DevTools.tsx +++ b/packages/web/src/pages/dev-tools/DevTools.tsx @@ -8,7 +8,7 @@ import { IconSolana, IconShieldCheck, IconDashboard, - IconArtistCoin, + IconFanClub, IconUser, Paper, Text, @@ -211,7 +211,7 @@ export const DevTools = () => { /> { data: coins, isPending: isLoadingCoins, error: coinsError - } = useArtistCoins() + } = useFanClubs() // Set default token when coins are loaded const availableCoins = coins?.filter((coin) => coin.ticker) ?? [] diff --git a/packages/web/src/pages/edit-coin-details-page/EditCoinDetailsPage.tsx b/packages/web/src/pages/edit-coin-details-page/EditCoinDetailsPage.tsx index dadb90a0985..38822e7d87d 100644 --- a/packages/web/src/pages/edit-coin-details-page/EditCoinDetailsPage.tsx +++ b/packages/web/src/pages/edit-coin-details-page/EditCoinDetailsPage.tsx @@ -8,8 +8,8 @@ import { } from 'react' import { - useArtistCoinByTicker, - useUpdateArtistCoin, + useFanClubByTicker, + useUpdateFanClub, useCurrentUserId, useCurrentAccountUser } from '@audius/common/api' @@ -53,7 +53,7 @@ import { resizeImage } from 'utils/imageProcessingUtil' -import { MAX_IMAGE_SIZE } from '../artist-coins-launchpad-page/constants' +import { MAX_IMAGE_SIZE } from '../fan-clubs-launchpad-page/constants' // Local scroll context for the coin details form const EditFormScrollContext = createContext(() => {}) @@ -276,7 +276,7 @@ export const EditCoinDetailsPage = () => { isPending, isSuccess, isError - } = useArtistCoinByTicker({ ticker: ticker ?? '' }) + } = useFanClubByTicker({ ticker: ticker ?? '' }) const { image: defaultBannerImageUrl } = useCoverPhoto({ userId: currentUser?.user_id, @@ -290,7 +290,7 @@ export const EditCoinDetailsPage = () => { scrollRef.current?.scrollIntoView({ behavior: 'smooth', block: 'start' }) }, []) - const updateCoinMutation = useUpdateArtistCoin() + const updateCoinMutation = useUpdateFanClub() const bannerFileInputRef = useRef(null) const [bannerImageFile, setBannerImageFile] = useState(null) diff --git a/packages/web/src/pages/fan-club-detail-page/FanClubDetailPage.test.tsx b/packages/web/src/pages/fan-club-detail-page/FanClubDetailPage.test.tsx index a3635b62f16..faecb41eedc 100644 --- a/packages/web/src/pages/fan-club-detail-page/FanClubDetailPage.test.tsx +++ b/packages/web/src/pages/fan-club-detail-page/FanClubDetailPage.test.tsx @@ -12,10 +12,10 @@ import { } from 'vitest' import { - mockArtistCoin, + mockFanClub, mockUserCoinHasBalance, mockUserCoinNoBalance -} from 'test/mocks/fixtures/artistCoins' +} from 'test/mocks/fixtures/fanClubs' import { artistUser, generateRandomTestUsers, @@ -51,7 +51,7 @@ vi.mock('app/ReownAppKitModal', () => ({ })) export function renderFanClubDetailPage( - coin: typeof mockArtistCoin = mockArtistCoin, + coin: typeof mockFanClub = mockFanClub, options?: RenderOptions ) { const randomUsers = generateRandomTestUsers(10) @@ -128,7 +128,7 @@ const assertFanClubInsightsSection = async () => { within(copyAddressRow).getByRole('button', { name: /copy coin address/i }) ).toBeInTheDocument() expect( - within(copyAddressRow).getByText(shortenSPLAddress(mockArtistCoin.mint)) + within(copyAddressRow).getByText(shortenSPLAddress(mockFanClub.mint)) ).toBeInTheDocument() } @@ -165,7 +165,7 @@ const assertHeader = async () => { // Check that the coin name is rendered in the header (h1) const headings = screen.getAllByRole('heading', { - name: mockArtistCoin.name + name: mockFanClub.name }) expect(headings.length).toBeGreaterThan(0) expect(headings[0]).toBeInTheDocument() @@ -295,10 +295,8 @@ const assertFanClubInfoSection = async ({ await assertFanClubHeroSection() // Check for coin description - if (mockArtistCoin.description) { - expect( - within(hero).getByText(mockArtistCoin.description) - ).toBeInTheDocument() + if (mockFanClub.description) { + expect(within(hero).getByText(mockFanClub.description)).toBeInTheDocument() } // Check for social links (link_2, link_3, link_4) @@ -306,32 +304,32 @@ const assertFanClubInfoSection = async ({ hidden: true }) - if (mockArtistCoin.link_2) { + if (mockFanClub.link_2) { const link2 = allLinks.find( - (link) => link.getAttribute('href') === mockArtistCoin.link_2 + (link) => link.getAttribute('href') === mockFanClub.link_2 ) expect(link2).toBeDefined() - expect(link2).toHaveAttribute('href', mockArtistCoin.link_2) + expect(link2).toHaveAttribute('href', mockFanClub.link_2) } - if (mockArtistCoin.link_3) { + if (mockFanClub.link_3) { const twitterLink = allLinks.find( - (link) => link.getAttribute('href') === mockArtistCoin.link_3 + (link) => link.getAttribute('href') === mockFanClub.link_3 ) expect(twitterLink).toBeDefined() - expect(twitterLink).toHaveAttribute('href', mockArtistCoin.link_3) + expect(twitterLink).toHaveAttribute('href', mockFanClub.link_3) } - if (mockArtistCoin.link_4) { + if (mockFanClub.link_4) { const instagramLink = allLinks.find( - (link) => link.getAttribute('href') === mockArtistCoin.link_4 + (link) => link.getAttribute('href') === mockFanClub.link_4 ) expect(instagramLink).toBeDefined() - expect(instagramLink).toHaveAttribute('href', mockArtistCoin.link_4) + expect(instagramLink).toHaveAttribute('href', mockFanClub.link_4) } // Check for website "Learn More" button - if (mockArtistCoin.website) { + if (mockFanClub.website) { const learnMoreButton = within(hero).getByRole('button', { name: /learn more/i }) @@ -420,11 +418,11 @@ describe('FanClubDetailPage', () => { mswServer.use( mockUserCoinsByMint( nonArtistUser.id, - mockArtistCoin.mint, + mockFanClub.mint, mockUserCoinNoBalance ) ) - renderFanClubDetailPage(mockArtistCoin) + renderFanClubDetailPage(mockFanClub) await assertHeader() @@ -443,11 +441,11 @@ describe('FanClubDetailPage', () => { mswServer.use( mockUserCoinsByMint( nonArtistUser.id, - mockArtistCoin.mint, + mockFanClub.mint, mockUserCoinHasBalance ) ) - renderFanClubDetailPage(mockArtistCoin) + renderFanClubDetailPage(mockFanClub) await assertHeader() @@ -462,7 +460,7 @@ describe('FanClubDetailPage', () => { }) it('Unauthed User', async () => { - renderFanClubDetailPage(mockArtistCoin) + renderFanClubDetailPage(mockFanClub) await assertHeader() @@ -482,11 +480,11 @@ describe('FanClubDetailPage', () => { mswServer.use( mockUserCoinsByMint( artistUser.id, - mockArtistCoin.mint, + mockFanClub.mint, mockUserCoinNoBalance ) ) - renderFanClubDetailPage(mockArtistCoin) + renderFanClubDetailPage(mockFanClub) await assertHeader() await assertFanClubBalanceSection({ @@ -505,11 +503,11 @@ describe('FanClubDetailPage', () => { mswServer.use( mockUserCoinsByMint( artistUser.id, - mockArtistCoin.mint, + mockFanClub.mint, mockUserCoinHasBalance ) ) - renderFanClubDetailPage(mockArtistCoin) + renderFanClubDetailPage(mockFanClub) await assertHeader() @@ -526,9 +524,9 @@ describe('FanClubDetailPage', () => { }) it('Coin Creator - has unclaimed fees from both DBC & DAMM v2', async () => { const mockCoinWithDammV2Fees = { - ...mockArtistCoin, + ...mockFanClub, artist_fees: { - ...mockArtistCoin.artist_fees, + ...mockFanClub.artist_fees, unclaimed_damm_v2_fees: 1000000000, total_damm_v2_fees: 1000000000, unclaimed_fees: 703028314 + 1000000000, @@ -553,9 +551,9 @@ describe('FanClubDetailPage', () => { }) it('Coin Creator - has unclaimed fees from just DAMM v2', async () => { const mockCoinWithDammV2Fees = { - ...mockArtistCoin, + ...mockFanClub, artist_fees: { - ...mockArtistCoin.artist_fees, + ...mockFanClub.artist_fees, unclaimed_dbc_fees: 0, total_dbc_fees: 0, unclaimed_damm_v2_fees: 110300000, diff --git a/packages/web/src/pages/fan-club-detail-page/FanClubDetailPage.tsx b/packages/web/src/pages/fan-club-detail-page/FanClubDetailPage.tsx index 5dbb9d6b64c..96ef25c2519 100644 --- a/packages/web/src/pages/fan-club-detail-page/FanClubDetailPage.tsx +++ b/packages/web/src/pages/fan-club-detail-page/FanClubDetailPage.tsx @@ -1,5 +1,5 @@ import { - useArtistCoinByTicker, + useFanClubByTicker, useCurrentUserId, useUser } from '@audius/common/api' @@ -98,7 +98,7 @@ export const FanClubDetailPage = () => { isPending: coinPending, isError, isSuccess - } = useArtistCoinByTicker({ ticker: formattedTicker }) + } = useFanClubByTicker({ ticker: formattedTicker }) const { data: owner } = useUser(coin?.ownerId, { enabled: !!coin?.ownerId diff --git a/packages/web/src/pages/fan-club-detail-page/MobileFanClubDetailContent.tsx b/packages/web/src/pages/fan-club-detail-page/MobileFanClubDetailContent.tsx index 9799584d514..28f53df3be3 100644 --- a/packages/web/src/pages/fan-club-detail-page/MobileFanClubDetailContent.tsx +++ b/packages/web/src/pages/fan-club-detail-page/MobileFanClubDetailContent.tsx @@ -1,7 +1,7 @@ import { useCallback, useState } from 'react' import { - useArtistCoin, + useFanClub, useCoinBalance, useCurrentUserId } from '@audius/common/api' @@ -95,7 +95,7 @@ type FanClubTabContentProps = { } const FanClubTabContent = ({ mint }: FanClubTabContentProps) => { - const { data: coin } = useArtistCoin(mint) + const { data: coin } = useFanClub(mint) const { data: currentUserId } = useCurrentUserId() const { data: tokenBalance } = useCoinBalance({ mint }) diff --git a/packages/web/src/pages/fan-club-detail-page/components/ArtistFanClubDetailsModal.tsx b/packages/web/src/pages/fan-club-detail-page/components/ArtistFanClubDetailsModal.tsx index f106a7b6ed6..8a1b3ce8544 100644 --- a/packages/web/src/pages/fan-club-detail-page/components/ArtistFanClubDetailsModal.tsx +++ b/packages/web/src/pages/fan-club-detail-page/components/ArtistFanClubDetailsModal.tsx @@ -2,7 +2,7 @@ import { useCallback, type ReactNode } from 'react' import type { Coin } from '@audius/common/adapters' import { - useArtistCoin, + useFanClub, useCoinGeckoCoin, useUser, type CoinGeckoCoinResponse @@ -34,9 +34,9 @@ import { copyToClipboard } from 'utils/clipboardUtil' import { TokenIcon } from '../../../components/buy-sell-modal/TokenIcon' import ResponsiveModal from '../../../components/modal/ResponsiveModal' -import { LAUNCHPAD_COIN_DESCRIPTION } from '../../artist-coins-launchpad-page/constants' +import { LAUNCHPAD_COIN_DESCRIPTION } from '../../fan-clubs-launchpad-page/constants' -const { artistCoinDetails, overflowMenu } = coinDetailsMessages +const { fanClubDetails, overflowMenu } = coinDetailsMessages type ArtistFanClubDetailsModalProps = { /** @@ -48,7 +48,7 @@ type ArtistFanClubDetailsModalProps = { */ onClose: () => void /** - * The mint address of the artist coin + * The mint address of the fan club */ mint: string } @@ -127,9 +127,9 @@ export const ArtistFanClubDetailsModal = ({ const dispatch = useDispatch() const isAudio = mint === env.WAUDIO_MINT_ADDRESS const { spacing } = useTheme() - const { data: artistCoin } = useArtistCoin(mint) + const { data: fanClub } = useFanClub(mint) - const { data: artistHandle } = useUser(artistCoin?.ownerId, { + const { data: artistHandle } = useUser(fanClub?.ownerId, { select: (user) => { return user.handle } @@ -140,40 +140,40 @@ export const ArtistFanClubDetailsModal = ({ ) const handleCopyMint = useCallback(() => { - if (artistCoin?.mint) { - copyToClipboard(artistCoin.mint) + if (fanClub?.mint) { + copyToClipboard(fanClub.mint) dispatch(toast({ content: overflowMenu.copiedToClipboard, type: 'info' })) } - }, [artistCoin?.mint, dispatch]) + }, [fanClub?.mint, dispatch]) const handleCopyRewardsPoolAddress = useCallback(() => { - if (artistCoin?.rewardPool?.address) { - copyToClipboard(artistCoin.rewardPool.address) + if (fanClub?.rewardPool?.address) { + copyToClipboard(fanClub.rewardPool.address) dispatch(toast({ content: overflowMenu.copiedToClipboard, type: 'info' })) } - }, [artistCoin?.rewardPool?.address, dispatch]) + }, [fanClub?.rewardPool?.address, dispatch]) const marketProps = isAudio ? convertCoinGeckoResponseToStatsDetailsProps(coingeckoResponse) - : artistCoin + : fanClub - const decimals = artistCoin?.decimals ?? 9 - const hasGraduated = artistCoin?.dynamicBondingCurve?.isMigrated ?? false - const locker = artistCoin?.artistLocker + const decimals = fanClub?.decimals ?? 9 + const hasGraduated = fanClub?.dynamicBondingCurve?.isMigrated ?? false + const locker = fanClub?.artistLocker const showLockerStats = !isAudio && hasGraduated && !!locker - const formattedArtistEarnings = artistCoin?.artistFees?.totalFees - ? formatModalFeeNumber(Math.trunc(artistCoin.artistFees.totalFees)) + const formattedArtistEarnings = fanClub?.artistFees?.totalFees + ? formatModalFeeNumber(Math.trunc(fanClub.artistFees.totalFees)) : null const rewardsPoolBalance = - artistCoin?.rewardPool?.balance != null - ? formatModalTokenAmount(artistCoin.rewardPool.balance, decimals) + fanClub?.rewardPool?.balance != null + ? formatModalTokenAmount(fanClub.rewardPool.balance, decimals) : null return ( - {artistCoin?.name} + {fanClub?.name} - ${artistCoin?.ticker} + ${fanClub?.ticker} - {artistCoin?.mint ? ( + {fanClub?.mint ? ( - {artistCoinDetails.coinAddress} + {fanClubDetails.coinAddress} - + @@ -230,7 +227,7 @@ export const ArtistFanClubDetailsModal = ({ wordBreak: 'break-all' }} > - {artistCoin.mint} + {fanClub.mint} ) : null} - {artistCoin?.ticker && artistHandle && !isAudio ? ( + {fanClub?.ticker && artistHandle && !isAudio ? ( - {artistCoinDetails.onChainDescription} + {fanClubDetails.onChainDescription} - {LAUNCHPAD_COIN_DESCRIPTION(artistHandle, artistCoin.ticker)} + {LAUNCHPAD_COIN_DESCRIPTION(artistHandle, fanClub.ticker)} ) : null} @@ -269,8 +266,8 @@ export const ArtistFanClubDetailsModal = ({ left={ marketProps?.totalSupply != null ? ( {marketProps.totalSupply.toLocaleString()} @@ -283,8 +280,8 @@ export const ArtistFanClubDetailsModal = ({ right={ marketProps?.displayPrice != null ? ( {formatCurrencyWithSubscript(marketProps.displayPrice)} @@ -299,8 +296,8 @@ export const ArtistFanClubDetailsModal = ({ left={ marketProps?.displayMarketCap != null ? ( ${marketProps.displayMarketCap.toLocaleString()} @@ -313,8 +310,8 @@ export const ArtistFanClubDetailsModal = ({ right={ marketProps?.liquidity != null ? ( ${marketProps.liquidity.toLocaleString()} @@ -327,7 +324,7 @@ export const ArtistFanClubDetailsModal = ({ /> - {!isAudio && artistCoin ? ( + {!isAudio && fanClub ? ( <> @@ -366,9 +363,7 @@ export const ArtistFanClubDetailsModal = ({ > {formatModalTokenAmount(locker.locked ?? 0, decimals)}{' '} - {artistCoin.ticker != null - ? `$${artistCoin.ticker}` - : ''} + {fanClub.ticker != null ? `$${fanClub.ticker}` : ''} } @@ -379,9 +374,7 @@ export const ArtistFanClubDetailsModal = ({ > {formatModalTokenAmount(locker.unlocked ?? 0, decimals)}{' '} - {artistCoin.ticker != null - ? `$${artistCoin.ticker}` - : ''} + {fanClub.ticker != null ? `$${fanClub.ticker}` : ''} } @@ -396,16 +389,14 @@ export const ArtistFanClubDetailsModal = ({ > {rewardsPoolBalance}{' '} - {artistCoin.ticker != null - ? `$${artistCoin.ticker}` - : ''} + {fanClub.ticker != null ? `$${fanClub.ticker}` : ''} } right={} /> ) : null} - {artistCoin.rewardPool?.address ? ( + {fanClub.rewardPool?.address ? ( - {artistCoinDetails.rewardsPoolAddress} + {fanClubDetails.rewardsPoolAddress} - {shortenSPLAddress(artistCoin.rewardPool.address, 20)} + {shortenSPLAddress(fanClub.rewardPool.address, 20)} diff --git a/packages/web/src/pages/fan-club-detail-page/components/BalanceSection.tsx b/packages/web/src/pages/fan-club-detail-page/components/BalanceSection.tsx index 67e4b5ecbc9..91a7ed2725f 100644 --- a/packages/web/src/pages/fan-club-detail-page/components/BalanceSection.tsx +++ b/packages/web/src/pages/fan-club-detail-page/components/BalanceSection.tsx @@ -1,7 +1,7 @@ import { useCallback, useEffect, useState } from 'react' import { - useArtistCoin, + useFanClub, useCoinBalance, useCoinBalanceBreakdown, useCurrentAccountUser, @@ -415,7 +415,7 @@ type FanClubMintProps = { } const BalanceSectionContent = ({ mint }: FanClubMintProps) => { - const { data: coin, isPending: coinsLoading } = useArtistCoin(mint) + const { data: coin, isPending: coinsLoading } = useFanClub(mint) const { data: tokenBalance, isLoading: tokenBalanceLoading } = useCoinBalance( { mint } ) diff --git a/packages/web/src/pages/fan-club-detail-page/components/ClaimVestedCoinsModal.tsx b/packages/web/src/pages/fan-club-detail-page/components/ClaimVestedCoinsModal.tsx index d1a3d2986d7..a4f6396a45e 100644 --- a/packages/web/src/pages/fan-club-detail-page/components/ClaimVestedCoinsModal.tsx +++ b/packages/web/src/pages/fan-club-detail-page/components/ClaimVestedCoinsModal.tsx @@ -1,6 +1,6 @@ import { useState } from 'react' -import { useArtistCoinByTicker } from '@audius/common/api' +import { useFanClubByTicker } from '@audius/common/api' import { coinDetailsMessages } from '@audius/common/messages' import { useClaimVestedCoinsModal } from '@audius/common/store' import { FixedDecimal } from '@audius/fixed-decimal' @@ -24,7 +24,7 @@ const DEFAULT_REWARDS_POOL_PERCENT = 50 export const ClaimVestedCoinsModal = () => { const { isOpen, onClose, data } = useClaimVestedCoinsModal() const { ticker, claimable, onClaim, isClaimPending } = data ?? {} - const { data: coin } = useArtistCoinByTicker({ ticker: data?.ticker }) + const { data: coin } = useFanClubByTicker({ ticker: data?.ticker }) const [rewardsPoolPercentage, setRewardsPoolPercentage] = useState( DEFAULT_REWARDS_POOL_PERCENT ) diff --git a/packages/web/src/pages/fan-club-detail-page/components/FanClubInfoSection.tsx b/packages/web/src/pages/fan-club-detail-page/components/FanClubInfoSection.tsx index 076fed2a5d4..582ff696700 100644 --- a/packages/web/src/pages/fan-club-detail-page/components/FanClubInfoSection.tsx +++ b/packages/web/src/pages/fan-club-detail-page/components/FanClubInfoSection.tsx @@ -2,7 +2,7 @@ import { useCallback, useContext, useMemo, type ReactNode } from 'react' import type { Coin } from '@audius/common/adapters' import { - useArtistCoin, + useFanClub, useUser, useUserCoins, useCurrentAccountUser @@ -78,7 +78,7 @@ const toastMessages = coinDetailsMessages.toasts const BANNER_HEIGHT = 160 const DISCOVERY_COVER_HEIGHT = 96 -const fanClubCardMessages = walletMessages.artistCoins +const fanClubCardMessages = walletMessages.fanClubs // Minimum claimable fee amount (0.01 $AUDIO = 10^6 in smallest denomination with 8 decimals) // Below this threshold is considered "dust" and not worth claiming due to transaction fees @@ -236,7 +236,7 @@ type FanClubBannerSectionProps = { } export const FanClubBannerSection = ({ mint }: FanClubBannerSectionProps) => { - const { data: coin, isLoading } = useArtistCoin(mint) + const { data: coin, isLoading } = useFanClub(mint) const theme = useTheme() const { spacing } = theme const { ownerId: ownerIdRaw } = coin ?? {} @@ -554,7 +554,7 @@ export const FanClubInfoSection = ({ const { onOpen: openClaimVestedCoinsModal } = useClaimVestedCoinsModal() - const { data: coin, isLoading: isArtistCoinLoading } = useArtistCoin(mint) + const { data: coin, isLoading: isFanClubLoading } = useFanClub(mint) const { image: ownerCoverPhoto } = useCoverPhoto({ userId: coin?.ownerId, @@ -591,8 +591,8 @@ export const FanClubInfoSection = ({ onError: (error) => { reportToSentry({ error, - feature: Feature.ArtistCoins, - name: 'Failed to claim artist coin fees', + feature: Feature.FanClubs, + name: 'Failed to claim fan club fees', additionalInfo: { coin, tokenMint: mint, @@ -632,8 +632,8 @@ export const FanClubInfoSection = ({ onError: (error) => { reportToSentry({ error, - feature: Feature.ArtistCoins, - name: 'Failed to claim vested artist coins', + feature: Feature.FanClubs, + name: 'Failed to claim vested fan clubs', additionalInfo: { coin, tokenMint: mint @@ -898,7 +898,7 @@ export const FanClubInfoSection = ({ coin?.artistLocker === null || coin?.artistLocker?.claimable === 0 - if (isArtistCoinLoading || !coin) { + if (isFanClubLoading || !coin) { return variant === 'onchainDetails' ? null : } diff --git a/packages/web/src/pages/fan-club-detail-page/components/FanClubInsights.tsx b/packages/web/src/pages/fan-club-detail-page/components/FanClubInsights.tsx index 31b1880f404..cde60ef816a 100644 --- a/packages/web/src/pages/fan-club-detail-page/components/FanClubInsights.tsx +++ b/packages/web/src/pages/fan-club-detail-page/components/FanClubInsights.tsx @@ -1,7 +1,7 @@ import { useCallback, useContext } from 'react' import type { Coin } from '@audius/common/adapters' -import { useArtistCoin, useCoinGeckoCoin } from '@audius/common/api' +import { useFanClub, useCoinGeckoCoin } from '@audius/common/api' import { coinDetailsMessages } from '@audius/common/messages' import { createAudioCoinMetrics, @@ -238,7 +238,7 @@ export const FanClubInsights = ({ mint }: FanClubInsightsProps) => { data: coin, isPending: isCoinPending, isError: isCoinError - } = useArtistCoin(mint) + } = useFanClub(mint) const { data: coingeckoResponse, isPending: isCoingeckoPending, diff --git a/packages/web/src/pages/fan-club-detail-page/components/FanClubInsightsOverflowMenu.tsx b/packages/web/src/pages/fan-club-detail-page/components/FanClubInsightsOverflowMenu.tsx index a16c047db9e..dcbbac9da8a 100644 --- a/packages/web/src/pages/fan-club-detail-page/components/FanClubInsightsOverflowMenu.tsx +++ b/packages/web/src/pages/fan-club-detail-page/components/FanClubInsightsOverflowMenu.tsx @@ -1,6 +1,6 @@ import { useCallback, useContext, useState } from 'react' -import { useArtistCoin, useCurrentUserId, useUser } from '@audius/common/api' +import { useFanClub, useCurrentUserId, useUser } from '@audius/common/api' import { coinDetailsMessages } from '@audius/common/messages' import { COIN_DETAIL_MOBILE_WEB_ROUTE } from '@audius/common/src/utils/route' import { route } from '@audius/common/utils' @@ -40,7 +40,7 @@ const messages = coinDetailsMessages.overflowMenu type FanClubInsightsOverflowMenuProps = { /** - * The mint address of the artist coin + * The mint address of the fan club */ mint: string } @@ -50,27 +50,27 @@ export const FanClubInsightsOverflowMenu = ({ }: FanClubInsightsOverflowMenuProps) => { const navigate = useNavigate() const { toast } = useContext(ToastContext) - const { data: artistCoin } = useArtistCoin(mint) + const { data: fanClub } = useFanClub(mint) const { data: currentUserId } = useCurrentUserId() - const { data: artist } = useUser(artistCoin?.ownerId) + const { data: artist } = useUser(fanClub?.ownerId) const isMobile = useIsMobile() const [isDetailsModalOpen, setIsDetailsModalOpen] = useState(false) const [isMobileOverflowOpen, setIsMobileOverflowOpen] = useState(false) - const isAudio = artistCoin?.mint === env.WAUDIO_MINT_ADDRESS + const isAudio = fanClub?.mint === env.WAUDIO_MINT_ADDRESS const onCopyLink = () => { - if (artistCoin?.ticker) { - copyLinkToClipboard(route.coinPage(artistCoin.ticker)) + if (fanClub?.ticker) { + copyLinkToClipboard(route.coinPage(fanClub.ticker)) toast(messages.copiedLinkToClipboard) } } const onOpenBirdeye = () => { - if (artistCoin?.mint) { + if (fanClub?.mint) { window.open( route.birdeyeUrl( - isAudio ? env.ETH_TOKEN_ADDRESS : artistCoin.mint, + isAudio ? env.ETH_TOKEN_ADDRESS : fanClub.mint, isAudio ? 'ethereum' : 'solana' ), '_blank', @@ -81,8 +81,8 @@ export const FanClubInsightsOverflowMenu = ({ const onOpenDetails = () => { if (isMobile) { - if (artistCoin?.ticker) { - navigate(coinDetailMobilePage(artistCoin.ticker)) + if (fanClub?.ticker) { + navigate(coinDetailMobilePage(fanClub.ticker)) } } else { setIsDetailsModalOpen(true) @@ -90,18 +90,14 @@ export const FanClubInsightsOverflowMenu = ({ } const onShareToX = () => { - if (!artistCoin?.ticker || !artistCoin?.mint || !artist?.handle) return + if (!fanClub?.ticker || !fanClub?.mint || !artist?.handle) return - const isArtistOwner = currentUserId === artistCoin.ownerId - const coinUrl = getCopyableLink(route.coinPage(artistCoin.ticker)) + const isArtistOwner = currentUserId === fanClub.ownerId + const coinUrl = getCopyableLink(route.coinPage(fanClub.ticker)) const shareText = isArtistOwner - ? messages.shareToXArtistCopy(artistCoin.ticker, artistCoin.mint) - : messages.shareToXUserCopy( - artistCoin.ticker, - artist.handle, - artistCoin.mint - ) + ? messages.shareToXArtistCopy(fanClub.ticker, fanClub.mint) + : messages.shareToXUserCopy(fanClub.ticker, artist.handle, fanClub.mint) openXLink(coinUrl, shareText) } @@ -140,8 +136,8 @@ export const FanClubInsightsOverflowMenu = ({ } ] - // Don't render if no artist coin data - if (!artistCoin?.mint) { + // Don't render if no fan club data + if (!fanClub?.mint) { return null } diff --git a/packages/web/src/pages/fan-club-detail-page/components/FanClubLeaderboardCard.tsx b/packages/web/src/pages/fan-club-detail-page/components/FanClubLeaderboardCard.tsx index 71f5284fec9..f2c3e88b7ec 100644 --- a/packages/web/src/pages/fan-club-detail-page/components/FanClubLeaderboardCard.tsx +++ b/packages/web/src/pages/fan-club-detail-page/components/FanClubLeaderboardCard.tsx @@ -1,6 +1,6 @@ import { - useArtistCoinMembers, - useArtistCoinMembersCount, + useFanClubMembers, + useFanClubMembersCount, useUsers } from '@audius/common/api' import { coinDetailsMessages } from '@audius/common/messages' @@ -52,7 +52,7 @@ export const FanClubLeaderboardCard = ({ const { isMedium: isSmallScreen } = useMedia() // <1024px const numUsersShowing = isSmallScreen ? 6 : 8 const { data: leaderboardUsers, isPending: isLeaderboardPending } = - useArtistCoinMembers({ mint }) + useFanClubMembers({ mint }) const userListUserIds = leaderboardUsers ?.slice(0, numUsersShowing) .map((user) => user.userId) @@ -62,7 +62,7 @@ export const FanClubLeaderboardCard = ({ const isPending = isLeaderboardPending || isUsersPending const isMobile = useIsMobile() - const { data: membersCount = 0 } = useArtistCoinMembersCount({ mint }) + const { data: membersCount = 0 } = useFanClubMembersCount({ mint }) const handleViewLeaderboard = () => { if (isMobile) { diff --git a/packages/web/src/pages/fan-club-detail-page/components/LockedTextPostModal.tsx b/packages/web/src/pages/fan-club-detail-page/components/LockedTextPostModal.tsx index 2560a00d532..92215ac1a04 100644 --- a/packages/web/src/pages/fan-club-detail-page/components/LockedTextPostModal.tsx +++ b/packages/web/src/pages/fan-club-detail-page/components/LockedTextPostModal.tsx @@ -1,11 +1,11 @@ import { useCallback } from 'react' -import { useArtistCoin } from '@audius/common/api' +import { useFanClub } from '@audius/common/api' import { useBuySellModal } from '@audius/common/store' import { Button, Flex, - IconArtistCoin, + IconFanClub, IconLock, Modal, ModalContent, @@ -31,7 +31,7 @@ export const LockedTextPostModal = ({ onClose, mint }: LockedTextPostModalProps) => { - const { data: coin } = useArtistCoin(mint) + const { data: coin } = useFanClub(mint) const { onOpen: openBuySellModal } = useBuySellModal() const handleBuyCoins = useCallback(() => { @@ -62,7 +62,7 @@ export const LockedTextPostModal = ({ variant='primary' color='coinGradient' onClick={handleBuyCoins} - iconLeft={IconArtistCoin} + iconLeft={IconFanClub} fullWidth > {messages.buyCoins} diff --git a/packages/web/src/pages/fan-club-detail-page/components/PostUpdateCard.tsx b/packages/web/src/pages/fan-club-detail-page/components/PostUpdateCard.tsx index 8431d8939cf..e52925c7340 100644 --- a/packages/web/src/pages/fan-club-detail-page/components/PostUpdateCard.tsx +++ b/packages/web/src/pages/fan-club-detail-page/components/PostUpdateCard.tsx @@ -1,7 +1,7 @@ import { useCallback, useState } from 'react' import { - useArtistCoin, + useFanClub, useCurrentUserId, usePostTextUpdate } from '@audius/common/api' @@ -39,7 +39,7 @@ export const PostUpdateCard = ({ mint }: PostUpdateCardProps) => { const [videoUrl, setVideoUrl] = useState() const [showAttachVideoModal, setShowAttachVideoModal] = useState(false) const { data: currentUserId } = useCurrentUserId() - const { data: coin } = useArtistCoin(mint) + const { data: coin } = useFanClub(mint) const { mutate: postTextUpdate, isPending } = usePostTextUpdate() const { isEnabled: isTextPostPostingEnabled } = useFeatureFlag( FeatureFlags.FAN_CLUB_TEXT_POST_POSTING diff --git a/packages/web/src/pages/fan-club-detail-page/components/TextPostCard.tsx b/packages/web/src/pages/fan-club-detail-page/components/TextPostCard.tsx index e1c5c8c25f9..23dedc5f976 100644 --- a/packages/web/src/pages/fan-club-detail-page/components/TextPostCard.tsx +++ b/packages/web/src/pages/fan-club-detail-page/components/TextPostCard.tsx @@ -6,7 +6,7 @@ import { useEditComment, useDeleteTextPost, useReactToComment, - useArtistCoin + useFanClub } from '@audius/common/api' import { ID } from '@audius/common/models' import { @@ -74,7 +74,7 @@ type TextPostCardProps = { export const TextPostCard = ({ commentId, mint }: TextPostCardProps) => { const { data: comment, isPending } = useComment(commentId) const { data: currentUserId } = useCurrentUserId() - const { data: coin } = useArtistCoin(mint) + const { data: coin } = useFanClub(mint) const { mutate: editComment } = useEditComment() const { mutate: deleteTextPost } = useDeleteTextPost() const { mutate: reactToComment } = useReactToComment() diff --git a/packages/web/src/pages/fan-club-detail-page/components/mobile/ArtistFanClubDetailsPage.tsx b/packages/web/src/pages/fan-club-detail-page/components/mobile/ArtistFanClubDetailsPage.tsx index cb2d6ebd339..fd31a696542 100644 --- a/packages/web/src/pages/fan-club-detail-page/components/mobile/ArtistFanClubDetailsPage.tsx +++ b/packages/web/src/pages/fan-club-detail-page/components/mobile/ArtistFanClubDetailsPage.tsx @@ -1,5 +1,5 @@ import { - useArtistCoinByTicker, + useFanClubByTicker, useCoinGeckoCoin, useUser } from '@audius/common/api' @@ -14,8 +14,8 @@ import { useLocation } from 'react-router' import { TokenIcon } from 'components/buy-sell-modal/TokenIcon' import MobilePageContainer from 'components/mobile-page-container/MobilePageContainer' import { UserGeneratedTextV2 } from 'components/user-generated-text/UserGeneratedTextV2' -import { TokenInfoRow } from 'pages/artist-coins-launchpad-page/components' -import { LAUNCHPAD_COIN_DESCRIPTION } from 'pages/artist-coins-launchpad-page/constants' +import { TokenInfoRow } from 'pages/fan-clubs-launchpad-page/components' +import { LAUNCHPAD_COIN_DESCRIPTION } from 'pages/fan-clubs-launchpad-page/constants' import { convertCoinGeckoResponseToStatsDetailsProps, @@ -37,22 +37,22 @@ const messages = { const tooltipContent = { totalSupply: - 'The total number of your Artist Coins that will ever exist. This amount is fixed and never changes.', + 'The total number of your Fan Clubs that will ever exist. This amount is fixed and never changes.', marketCap: - 'The current total value of all your Artist Coins in circulation, calculated by multiplying the current price by the total supply.', - price: 'The current price of a single artist coin in USD.', + 'The current total value of all your Fan Clubs in circulation, calculated by multiplying the current price by the total supply.', + price: 'The current price of a single fan club in USD.', liquidity: - 'The amount of funds available for trading your artist coin, which affects how easily it can be bought or sold.' + 'The amount of funds available for trading your fan club, which affects how easily it can be bought or sold.' } export const ArtistFanClubDetailsPage = () => { const location = useLocation() // Locations should be in the format /coins/:ticker/details (COIN_DETAIL_MOBILE_WEB_ROUTE) const ticker = location.pathname.split('/')[2] - const { data: artistCoin } = useArtistCoinByTicker({ + const { data: fanClub } = useFanClubByTicker({ ticker }) - const { data: artist } = useUser(artistCoin?.ownerId) + const { data: artist } = useUser(fanClub?.ownerId) const { spacing } = useTheme() const isAudio = formatTickerForUrl(ticker) === 'AUDIO' const { data: coingeckoResponse } = useCoinGeckoCoin( @@ -69,21 +69,21 @@ export const ArtistFanClubDetailsPage = () => { {/* Token Icon */} - {artistCoin?.name ?? messages.unknownToken} + {fanClub?.name ?? messages.unknownToken} - {artistCoin?.ticker ?? messages.unknownTicker} + {fanClub?.ticker ?? messages.unknownTicker} @@ -97,7 +97,7 @@ export const ArtistFanClubDetailsPage = () => { {messages.coinAddress} - {artistCoin?.mint ?? messages.unknown} + {fanClub?.mint ?? messages.unknown} @@ -109,7 +109,7 @@ export const ArtistFanClubDetailsPage = () => { {LAUNCHPAD_COIN_DESCRIPTION( artist?.handle ?? '', - artistCoin?.ticker ?? '' + fanClub?.ticker ?? '' )} @@ -120,7 +120,7 @@ export const ArtistFanClubDetailsPage = () => {
diff --git a/packages/web/src/pages/artist-coins-explore-page/ArtistCoinsExplorePage.tsx b/packages/web/src/pages/fan-clubs-explore-page/FanClubsExplorePage.tsx similarity index 88% rename from packages/web/src/pages/artist-coins-explore-page/ArtistCoinsExplorePage.tsx rename to packages/web/src/pages/fan-clubs-explore-page/FanClubsExplorePage.tsx index 73a679d434a..1002be3618d 100644 --- a/packages/web/src/pages/artist-coins-explore-page/ArtistCoinsExplorePage.tsx +++ b/packages/web/src/pages/fan-clubs-explore-page/FanClubsExplorePage.tsx @@ -1,6 +1,9 @@ import { useCallback, useState, ChangeEvent } from 'react' -import { useCurrentAccountUser, useArtistCreatedCoin } from '@audius/common/api' +import { + useCurrentAccountUser, + useArtistCreatedFanClub +} from '@audius/common/api' import { useFeatureFlag } from '@audius/common/hooks' import { walletMessages } from '@audius/common/messages' import { FeatureFlags } from '@audius/common/services' @@ -30,13 +33,13 @@ import { isMobile } from 'utils/clientUtil' import zIndex from 'utils/zIndex' import { - ArtistCoinsTable, + FanClubsTable, FAN_CLUBS_VIEW_STORAGE_KEY, FanClubsViewMode, readInitialFanClubsViewMode -} from '../artist-coins-launchpad-page/components/ArtistCoinsTable' +} from '../fan-clubs-launchpad-page/components/FanClubsTable' -import { MobileArtistCoinsExplorePage } from './MobileArtistCoinsExplorePage' +import { MobileFanClubsExplorePage } from './MobileFanClubsExplorePage' const SEARCH_WIDTH = 400 const MIN_WIDTH = 620 @@ -56,11 +59,13 @@ const messages = { launchYourOwn: 'Launch Your Own Fan Club!', required: 'Required', getStartedTooltip: 'Verified users only. Request verification in settings.', - dismissBanner: 'Dismiss' + dismissBanner: 'Dismiss', + pageDescription: + 'Explore Artist Fan Clubs on Audius. Support your favorite artists, unlock exclusive perks, and become part of their community.' } // Desktop version -const DesktopArtistCoinsExplorePage = () => { +const DesktopFanClubsExplorePage = () => { const navigate = useNavigate() const { motion, spacing, color } = useTheme() const [searchValue, setSearchValue] = useState('') @@ -72,15 +77,15 @@ const DesktopArtistCoinsExplorePage = () => { ) const { data: currentUser } = useCurrentAccountUser() const { data: createdCoin, isPending: isLoadingCreatedCoin } = - useArtistCreatedCoin(currentUser?.user_id) + useArtistCreatedFanClub(currentUser?.user_id) const { isEnabled: isLaunchpadVerificationEnabled } = useFeatureFlag( FeatureFlags.LAUNCHPAD_VERIFICATION ) - const hasExistingArtistCoin = !!createdCoin + const hasExistingFanClub = !!createdCoin const existingClubTicker = createdCoin?.ticker ?? null const canViewExistingClub = - hasExistingArtistCoin && + hasExistingFanClub && existingClubTicker !== null && existingClubTicker !== '' @@ -115,7 +120,7 @@ const DesktopArtistCoinsExplorePage = () => { }, []) const shouldShowLaunchCta = - (!hasExistingArtistCoin && !isLoadingCreatedCoin) || + (!hasExistingFanClub && !isLoadingCreatedCoin) || !isLaunchpadVerificationEnabled const launchCtaReserveY = @@ -131,7 +136,8 @@ const DesktopArtistCoinsExplorePage = () => { return ( @@ -161,7 +167,7 @@ const DesktopArtistCoinsExplorePage = () => { }} > - {walletMessages.artistCoins.title} + {walletMessages.fanClubs.title} @@ -190,12 +196,12 @@ const DesktopArtistCoinsExplorePage = () => { > - {walletMessages.artistCoins.view} + {walletMessages.fanClubs.view} { handleFanClubsViewModeChange('cards') @@ -203,7 +209,7 @@ const DesktopArtistCoinsExplorePage = () => { /> { handleFanClubsViewModeChange('table') @@ -217,16 +223,13 @@ const DesktopArtistCoinsExplorePage = () => { onClick={handleHeaderClubCta} > {canViewExistingClub - ? walletMessages.artistCoins.viewYourClub - : walletMessages.artistCoins.launchYourClub} + ? walletMessages.fanClubs.viewYourClub + : walletMessages.fanClubs.launchYourClub} - + {shouldShowLaunchCta && !isLaunchBannerDismissed ? ( @@ -340,10 +343,10 @@ const DesktopArtistCoinsExplorePage = () => { } // Main component that conditionally renders desktop or mobile version -export const ArtistCoinsExplorePage = () => { +export const FanClubsExplorePage = () => { return isMobile() ? ( - + ) : ( - + ) } diff --git a/packages/web/src/pages/artist-coins-explore-page/MobileArtistCoinsExplorePage.module.css b/packages/web/src/pages/fan-clubs-explore-page/MobileFanClubsExplorePage.module.css similarity index 100% rename from packages/web/src/pages/artist-coins-explore-page/MobileArtistCoinsExplorePage.module.css rename to packages/web/src/pages/fan-clubs-explore-page/MobileFanClubsExplorePage.module.css diff --git a/packages/web/src/pages/artist-coins-explore-page/MobileArtistCoinsExplorePage.tsx b/packages/web/src/pages/fan-clubs-explore-page/MobileFanClubsExplorePage.tsx similarity index 91% rename from packages/web/src/pages/artist-coins-explore-page/MobileArtistCoinsExplorePage.tsx rename to packages/web/src/pages/fan-clubs-explore-page/MobileFanClubsExplorePage.tsx index f56fe34578e..64f22894450 100644 --- a/packages/web/src/pages/artist-coins-explore-page/MobileArtistCoinsExplorePage.tsx +++ b/packages/web/src/pages/fan-clubs-explore-page/MobileFanClubsExplorePage.tsx @@ -9,7 +9,7 @@ import React, { import { Coin } from '@audius/common/adapters' import { - useArtistCoins, + useFanClubs, GetCoinsSortMethodEnum, GetCoinsSortDirectionEnum } from '@audius/common/api' @@ -41,7 +41,12 @@ import NavContext, { import { env } from 'services/env' import { getScrollParent } from 'utils/scrollParent' -import styles from './MobileArtistCoinsExplorePage.module.css' +import styles from './MobileFanClubsExplorePage.module.css' + +const messages = { + pageDescription: + 'Explore Artist Fan Clubs on Audius. Support your favorite artists, unlock exclusive perks, and become part of their community.' +} type CoinRowProps = { coin: Coin @@ -83,10 +88,10 @@ const NoCoinsContent = () => { > - {walletMessages.artistCoins.noCoins} + {walletMessages.fanClubs.noCoins} - {walletMessages.artistCoins.noCoinsDescription} + {walletMessages.fanClubs.noCoinsDescription}
) @@ -103,19 +108,19 @@ const SearchSection = ({ ) => setSearchValue(e.target.value) } - label={walletMessages.artistCoins.searchPlaceholder} + label={walletMessages.fanClubs.searchPlaceholder} startIcon={IconSearch} /> ) } -export const MobileArtistCoinsExplorePage: React.FC = () => { +export const MobileFanClubsExplorePage: React.FC = () => { const navigate = useNavigate() const location = useLocation() const [searchValue, setSearchValue] = useState('') @@ -137,7 +142,7 @@ export const MobileArtistCoinsExplorePage: React.FC = () => { hasNextPage, fetchNextPage, isFetchingNextPage - } = useArtistCoins({ + } = useFanClubs({ sortMethod, sortDirection, query: debouncedSearchValue @@ -192,7 +197,8 @@ export const MobileArtistCoinsExplorePage: React.FC = () => { return ( { color: 'transparent' // fallback for browsers that don't support background-clip }} > - {walletMessages.artistCoins.title} + {walletMessages.fanClubs.title} @@ -185,7 +179,7 @@ const LaunchpadPageContent = ({ reportToSentry({ error: new Error(messages.errors.noSolanaWalletFound), name: 'Launchpad Page', - feature: Feature.ArtistCoins, + feature: Feature.FanClubs, additionalInfo: { newWallets, externalWalletAccount @@ -222,7 +216,7 @@ const LaunchpadPageContent = ({ reportToSentry({ error: error instanceof Error ? error : new Error(error as string), name: 'Launchpad Page', - feature: Feature.ArtistCoins, + feature: Feature.FanClubs, additionalInfo: { newWallets, externalWalletAccount @@ -380,7 +374,7 @@ const LaunchpadPageContent = ({ {renderCurrentPage()} @@ -391,11 +385,11 @@ const LaunchpadPageContent = ({ export const LaunchpadPage = () => { const { data: currentUser } = useCurrentAccountUser() - const { data: createdCoin } = useArtistCreatedCoin(currentUser?.user_id) + const { data: createdCoin } = useArtistCreatedFanClub(currentUser?.user_id) const { isEnabled: isLaunchpadVerificationEnabled } = useFeatureFlag( FeatureFlags.LAUNCHPAD_VERIFICATION ) - const hasExistingArtistCoin = !!createdCoin + const hasExistingFanClub = !!createdCoin const [isModalOpen, setIsModalOpen] = useState(false) const { toast } = useContext(ToastContext) @@ -571,7 +565,7 @@ export const LaunchpadPage = () => { 'Unable to submit launchpad form. No user or connected wallet found' ), name: 'Launchpad Submit Error', - feature: Feature.ArtistCoins, + feature: Feature.FanClubs, additionalInfo: { currentUser, connectedWalletAddress, @@ -617,7 +611,7 @@ export const LaunchpadPage = () => { 'First buy retry failed. No mint address or pay amount found.' ), name: 'First Buy Retry Failure', - feature: Feature.ArtistCoins, + feature: Feature.FanClubs, additionalInfo: { errorMetadata, formValues: sanitizeFormValuesForLogging(formValues) @@ -643,7 +637,7 @@ export const LaunchpadPage = () => { 'Failed to copy banner image from cover photo' ), name: 'Failed to Copy Banner Image', - feature: Feature.ArtistCoins, + feature: Feature.FanClubs, level: ErrorLevel.Warning, additionalInfo: { bannerImageUrl: defaultBannerImageUrl @@ -655,7 +649,7 @@ export const LaunchpadPage = () => { reportToSentry({ error: error instanceof Error ? error : new Error(String(error)), name: 'Error Copying Banner Image', - feature: Feature.ArtistCoins, + feature: Feature.FanClubs, level: ErrorLevel.Warning, additionalInfo: { bannerImageUrl: defaultBannerImageUrl @@ -696,9 +690,9 @@ export const LaunchpadPage = () => { ] ) - // Redirect if user is not verified or already has an artist coin - if (hasExistingArtistCoin && isLaunchpadVerificationEnabled) { - track(make({ eventName: Name.LAUNCHPAD_HAS_EXISTING_ARTIST_COIN })) + // Redirect if user is not verified or already has an fan club + if (hasExistingFanClub && isLaunchpadVerificationEnabled) { + track(make({ eventName: Name.LAUNCHPAD_HAS_EXISTING_FAN_CLUB })) return } diff --git a/packages/web/src/pages/artist-coins-launchpad-page/components/AgreeToTerms.tsx b/packages/web/src/pages/fan-clubs-launchpad-page/components/AgreeToTerms.tsx similarity index 79% rename from packages/web/src/pages/artist-coins-launchpad-page/components/AgreeToTerms.tsx rename to packages/web/src/pages/fan-clubs-launchpad-page/components/AgreeToTerms.tsx index 9f03b2dead9..cf361a42cda 100644 --- a/packages/web/src/pages/artist-coins-launchpad-page/components/AgreeToTerms.tsx +++ b/packages/web/src/pages/fan-clubs-launchpad-page/components/AgreeToTerms.tsx @@ -6,8 +6,8 @@ import { Field, useFormikContext } from 'formik' const messages = { termsText: 'By checking this box I agree to the latest', termsOfService: 'Terms of Use', - artistCoinsTerms: 'Artist Coin Terms', - artistCoinAcceptableUse: 'Artist Coin Acceptable Use Policy' + fanClubsTerms: 'Fan Club Terms', + fanClubAcceptableUse: 'Fan Club Acceptable Use Policy' } export const AgreeToTerms = () => { @@ -32,16 +32,16 @@ export const AgreeToTerms = () => { {messages.termsOfService} , the{' '} - - {messages.artistCoinsTerms} + + {messages.fanClubsTerms} , and the{' '} - {messages.artistCoinAcceptableUse} + {messages.fanClubAcceptableUse} . diff --git a/packages/web/src/pages/artist-coins-launchpad-page/components/CoinFormFields.tsx b/packages/web/src/pages/fan-clubs-launchpad-page/components/CoinFormFields.tsx similarity index 100% rename from packages/web/src/pages/artist-coins-launchpad-page/components/CoinFormFields.tsx rename to packages/web/src/pages/fan-clubs-launchpad-page/components/CoinFormFields.tsx diff --git a/packages/web/src/pages/artist-coins-launchpad-page/components/ConnectedWalletHeader.tsx b/packages/web/src/pages/fan-clubs-launchpad-page/components/ConnectedWalletHeader.tsx similarity index 100% rename from packages/web/src/pages/artist-coins-launchpad-page/components/ConnectedWalletHeader.tsx rename to packages/web/src/pages/fan-clubs-launchpad-page/components/ConnectedWalletHeader.tsx diff --git a/packages/web/src/pages/artist-coins-launchpad-page/components/FanClubCoinCard.tsx b/packages/web/src/pages/fan-clubs-launchpad-page/components/FanClubCoinCard.tsx similarity index 99% rename from packages/web/src/pages/artist-coins-launchpad-page/components/FanClubCoinCard.tsx rename to packages/web/src/pages/fan-clubs-launchpad-page/components/FanClubCoinCard.tsx index 43080e1d319..e3f2dbc4f25 100644 --- a/packages/web/src/pages/artist-coins-launchpad-page/components/FanClubCoinCard.tsx +++ b/packages/web/src/pages/fan-clubs-launchpad-page/components/FanClubCoinCard.tsx @@ -19,7 +19,7 @@ import { TokenIcon } from 'components/buy-sell-modal/TokenIcon' import UserBadges from 'components/user-badges/UserBadges' import { useCoverPhoto } from 'hooks/useCoverPhoto' -const messages = walletMessages.artistCoins +const messages = walletMessages.fanClubs type FanClubCoinCardProps = { coin: Coin diff --git a/packages/web/src/pages/artist-coins-launchpad-page/components/ArtistCoinsSubmitRow.tsx b/packages/web/src/pages/fan-clubs-launchpad-page/components/FanClubsSubmitRow.tsx similarity index 96% rename from packages/web/src/pages/artist-coins-launchpad-page/components/ArtistCoinsSubmitRow.tsx rename to packages/web/src/pages/fan-clubs-launchpad-page/components/FanClubsSubmitRow.tsx index 20fbe9d6bc6..31d2cc9cc56 100644 --- a/packages/web/src/pages/artist-coins-launchpad-page/components/ArtistCoinsSubmitRow.tsx +++ b/packages/web/src/pages/fan-clubs-launchpad-page/components/FanClubsSubmitRow.tsx @@ -20,7 +20,7 @@ const defaultMessages = { fixErrors: 'Please complete all required fields to continue.' } -type ArtistCoinsSubmitRowProps = { +type FanClubsSubmitRowProps = { onContinue: () => void onBack: () => void isValid?: boolean @@ -32,7 +32,7 @@ type ArtistCoinsSubmitRowProps = { errorText?: string } -export const ArtistCoinsSubmitRow = ({ +export const FanClubsSubmitRow = ({ onContinue, onBack, isLoading = false, @@ -42,7 +42,7 @@ export const ArtistCoinsSubmitRow = ({ submit = false, isValid: isValidProp, errorText -}: ArtistCoinsSubmitRowProps) => { +}: FanClubsSubmitRowProps) => { const { color, spacing } = useTheme() const { isValid: isEntireFormValid } = useFormikContext() const isFormValid = isValidProp ?? isEntireFormValid diff --git a/packages/web/src/pages/artist-coins-launchpad-page/components/ArtistCoinsTable.module.css b/packages/web/src/pages/fan-clubs-launchpad-page/components/FanClubsTable.module.css similarity index 100% rename from packages/web/src/pages/artist-coins-launchpad-page/components/ArtistCoinsTable.module.css rename to packages/web/src/pages/fan-clubs-launchpad-page/components/FanClubsTable.module.css diff --git a/packages/web/src/pages/artist-coins-launchpad-page/components/ArtistCoinsTable.tsx b/packages/web/src/pages/fan-clubs-launchpad-page/components/FanClubsTable.tsx similarity index 96% rename from packages/web/src/pages/artist-coins-launchpad-page/components/ArtistCoinsTable.tsx rename to packages/web/src/pages/fan-clubs-launchpad-page/components/FanClubsTable.tsx index d6d30f9ea32..afdff67c802 100644 --- a/packages/web/src/pages/artist-coins-launchpad-page/components/ArtistCoinsTable.tsx +++ b/packages/web/src/pages/fan-clubs-launchpad-page/components/FanClubsTable.tsx @@ -3,7 +3,7 @@ import { useCallback, useEffect, useMemo, useRef, useState } from 'react' import { Coin } from '@audius/common/adapters' import { makeLoadNextPage, - useArtistCoins, + useFanClubs, useExternalWalletBalance, useQueryContext } from '@audius/common/api' @@ -37,8 +37,8 @@ import { useExternalWalletAddress } from 'hooks/useExternalWalletAddress' import { useMainContentRef } from 'pages/MainContentContext' import { getScrollParent } from 'utils/scrollParent' -import styles from './ArtistCoinsTable.module.css' import { FanClubCardSkeleton, FanClubCoinCard } from './FanClubCoinCard' +import styles from './FanClubsTable.module.css' export const FAN_CLUBS_VIEW_STORAGE_KEY = 'audius:fan-clubs-explore-view' @@ -141,7 +141,7 @@ const renderTokenNameCell = (cellInfo: CoinCell) => { badgeSize='xs' ellipses fullWidth - hideArtistCoinBadge + hideFanClubBadge popover /> ) : ( @@ -313,21 +313,21 @@ const sortDirectionMap: Record = { desc: GetCoinsSortDirectionEnum.Desc } -type ArtistCoinsTableProps = { +type FanClubsTableProps = { searchQuery?: string viewMode: FanClubsViewMode } -const ARTIST_COINS_BATCH_SIZE = 50 +const FAN_CLUBS_BATCH_SIZE = 50 const isEmptyRow = (row: any) => { return Boolean(!row?.original || Object.keys(row.original).length === 0) } -export const ArtistCoinsTable = ({ +export const FanClubsTable = ({ searchQuery, viewMode -}: ArtistCoinsTableProps) => { +}: FanClubsTableProps) => { const mainContentRef = useMainContentRef() const navigate = useNavigate() const { onOpen: openBuySellModal } = useBuySellModal() @@ -355,11 +355,11 @@ export const ArtistCoinsTable = ({ GetCoinsSortDirectionEnum.Desc ) - const queryResult = useArtistCoins({ + const queryResult = useFanClubs({ sortMethod, sortDirection, query: searchQuery, - pageSize: ARTIST_COINS_BATCH_SIZE + pageSize: FAN_CLUBS_BATCH_SIZE }) const { @@ -509,10 +509,10 @@ export const ArtistCoinsTable = ({ > - {walletMessages.artistCoins.noCoins} + {walletMessages.fanClubs.noCoins} - {walletMessages.artistCoins.noCoinsDescription} + {walletMessages.fanClubs.noCoinsDescription} ) : null} @@ -535,7 +535,7 @@ export const ArtistCoinsTable = ({ loading={isPending} isEmptyRow={isEmptyRow} fetchMore={loadNextPage} - fetchBatchSize={ARTIST_COINS_BATCH_SIZE} + fetchBatchSize={FAN_CLUBS_BATCH_SIZE} tableHeaderClassName={styles.tableHeader} scrollRef={mainContentRef} /> diff --git a/packages/web/src/pages/artist-coins-launchpad-page/components/ImageUploadArea.tsx b/packages/web/src/pages/fan-clubs-launchpad-page/components/ImageUploadArea.tsx similarity index 100% rename from packages/web/src/pages/artist-coins-launchpad-page/components/ImageUploadArea.tsx rename to packages/web/src/pages/fan-clubs-launchpad-page/components/ImageUploadArea.tsx diff --git a/packages/web/src/pages/artist-coins-launchpad-page/components/LaunchpadBuyModal.tsx b/packages/web/src/pages/fan-clubs-launchpad-page/components/LaunchpadBuyModal.tsx similarity index 100% rename from packages/web/src/pages/artist-coins-launchpad-page/components/LaunchpadBuyModal.tsx rename to packages/web/src/pages/fan-clubs-launchpad-page/components/LaunchpadBuyModal.tsx diff --git a/packages/web/src/pages/artist-coins-launchpad-page/components/LaunchpadModals.tsx b/packages/web/src/pages/fan-clubs-launchpad-page/components/LaunchpadModals.tsx similarity index 97% rename from packages/web/src/pages/artist-coins-launchpad-page/components/LaunchpadModals.tsx rename to packages/web/src/pages/fan-clubs-launchpad-page/components/LaunchpadModals.tsx index 286a643658d..67bca6dc69a 100644 --- a/packages/web/src/pages/artist-coins-launchpad-page/components/LaunchpadModals.tsx +++ b/packages/web/src/pages/fan-clubs-launchpad-page/components/LaunchpadModals.tsx @@ -5,7 +5,7 @@ import { LaunchpadFormValues, LaunchCoinErrorMetadata } from '@audius/common/models' -import { AUDIUS_ARTIST_COIN_HELP_LINK } from '@audius/common/src/utils/route' +import { AUDIUS_FAN_CLUB_HELP_LINK } from '@audius/common/src/utils/route' import { useSendTokensModal } from '@audius/common/store' import { wAUDIO } from '@audius/fixed-decimal' import { @@ -253,10 +253,7 @@ export const InsufficientBalanceModal = ({ {messages.hintText} - + {messages.learnHowToFund} { {messages.learnMore} diff --git a/packages/web/src/pages/artist-coins-launchpad-page/components/WhyCreateCard.tsx b/packages/web/src/pages/fan-clubs-launchpad-page/components/WhyCreateCard.tsx similarity index 100% rename from packages/web/src/pages/artist-coins-launchpad-page/components/WhyCreateCard.tsx rename to packages/web/src/pages/fan-clubs-launchpad-page/components/WhyCreateCard.tsx diff --git a/packages/web/src/pages/artist-coins-launchpad-page/components/index.ts b/packages/web/src/pages/fan-clubs-launchpad-page/components/index.ts similarity index 75% rename from packages/web/src/pages/artist-coins-launchpad-page/components/index.ts rename to packages/web/src/pages/fan-clubs-launchpad-page/components/index.ts index 9076d3efae3..6aca3708c28 100644 --- a/packages/web/src/pages/artist-coins-launchpad-page/components/index.ts +++ b/packages/web/src/pages/fan-clubs-launchpad-page/components/index.ts @@ -1,4 +1,4 @@ -export { ArtistCoinsSubmitRow } from './ArtistCoinsSubmitRow' +export { FanClubsSubmitRow } from './FanClubsSubmitRow' export { ConnectedWalletHeader } from './ConnectedWalletHeader' export { WalletSetupCard } from './WalletSetupCard' export { WhyCreateCard } from './WhyCreateCard' @@ -6,4 +6,4 @@ export { CoinFormFields } from './CoinFormFields' export { ImageUploadArea } from './ImageUploadArea' export { StepHeader } from './StepHeader' export { TokenInfoRow } from './TokenInfoRow' -export { ArtistCoinsTable } from './ArtistCoinsTable' +export { FanClubsTable } from './FanClubsTable' diff --git a/packages/web/src/pages/artist-coins-launchpad-page/components/types.ts b/packages/web/src/pages/fan-clubs-launchpad-page/components/types.ts similarity index 100% rename from packages/web/src/pages/artist-coins-launchpad-page/components/types.ts rename to packages/web/src/pages/fan-clubs-launchpad-page/components/types.ts diff --git a/packages/web/src/pages/artist-coins-launchpad-page/constants.ts b/packages/web/src/pages/fan-clubs-launchpad-page/constants.ts similarity index 75% rename from packages/web/src/pages/artist-coins-launchpad-page/constants.ts rename to packages/web/src/pages/fan-clubs-launchpad-page/constants.ts index 536d5448b81..21bb32b41be 100644 --- a/packages/web/src/pages/artist-coins-launchpad-page/constants.ts +++ b/packages/web/src/pages/fan-clubs-launchpad-page/constants.ts @@ -13,7 +13,7 @@ export const LAUNCHPAD_COIN_DESCRIPTION = ( artistHandle: string, coinTicker: string ) => { - return `$${coinTicker?.toUpperCase()} is an artist coin created by @${artistHandle} on Audius. Learn more at https://audius.co/coins/${coinTicker?.toUpperCase()}` + return `$${coinTicker?.toUpperCase()} is an fan club created by @${artistHandle} on Audius. Learn more at https://audius.co/coins/${coinTicker?.toUpperCase()}` } export const SOLANA_DECIMALS = 9 diff --git a/packages/web/src/pages/artist-coins-launchpad-page/index.ts b/packages/web/src/pages/fan-clubs-launchpad-page/index.ts similarity index 100% rename from packages/web/src/pages/artist-coins-launchpad-page/index.ts rename to packages/web/src/pages/fan-clubs-launchpad-page/index.ts diff --git a/packages/web/src/pages/artist-coins-launchpad-page/pages/BuyCoinPage.tsx b/packages/web/src/pages/fan-clubs-launchpad-page/pages/BuyCoinPage.tsx similarity index 99% rename from packages/web/src/pages/artist-coins-launchpad-page/pages/BuyCoinPage.tsx rename to packages/web/src/pages/fan-clubs-launchpad-page/pages/BuyCoinPage.tsx index a5020b09acf..c987788baef 100644 --- a/packages/web/src/pages/artist-coins-launchpad-page/pages/BuyCoinPage.tsx +++ b/packages/web/src/pages/fan-clubs-launchpad-page/pages/BuyCoinPage.tsx @@ -29,7 +29,7 @@ import { IconAUDIO } from 'components/shared-icons/Icons' import { useFormImageUrl } from 'hooks/useFormImageUrl' import { useLaunchpadConfig } from 'hooks/useLaunchpadConfig' -import { ArtistCoinsSubmitRow } from '../components/ArtistCoinsSubmitRow' +import { FanClubsSubmitRow } from '../components/FanClubsSubmitRow' import { LaunchpadBuyModal } from '../components/LaunchpadBuyModal' import type { PhasePageProps } from '../components/types' import { AMOUNT_OF_STEPS } from '../constants' @@ -428,7 +428,7 @@ export const BuyCoinPage = ({ ) : null} - { const imageUrl = useFormImageUrl(values.coinImage) const styles = useStyles() const { env } = useQueryContext() - const { data: audioCoinData } = useArtistCoin(env.WAUDIO_MINT_ADDRESS) + const { data: audioCoinData } = useFanClub(env.WAUDIO_MINT_ADDRESS) const { data: currentUser } = useCurrentAccountUser() const { image: defaultBannerImageUrl } = useCoverPhoto({ userId: currentUser?.user_id, @@ -313,7 +313,7 @@ export const ReviewPage = ({ onContinue, onBack }: PhasePageProps) => { - { reportToSentry({ error: error instanceof Error ? error : new Error(error as string), name: 'Launchpad Image Upload Processing Error', - feature: Feature.ArtistCoins, + feature: Feature.FanClubs, level: ErrorLevel.Warning // not worth alerting on here }) setImageError(messages.errors.processingError) @@ -169,7 +169,7 @@ export const SetupPage = ({ onContinue, onBack }: SetupPageProps) => { - val === true, { message: - 'You must agree to the Terms of Use, Artist Coin Terms, and Artist Coin Acceptable Use Policy to continue' + 'You must agree to the Terms of Use, Fan Club Terms, and Fan Club Acceptable Use Policy to continue' }) }) .superRefine((values, context) => { diff --git a/packages/web/src/pages/artist-coins-sort-page/MobileArtistCoinsSortPage.tsx b/packages/web/src/pages/fan-clubs-sort-page/MobileFanClubsSortPage.tsx similarity index 90% rename from packages/web/src/pages/artist-coins-sort-page/MobileArtistCoinsSortPage.tsx rename to packages/web/src/pages/fan-clubs-sort-page/MobileFanClubsSortPage.tsx index c0ad0a96471..1df90d03f72 100644 --- a/packages/web/src/pages/artist-coins-sort-page/MobileArtistCoinsSortPage.tsx +++ b/packages/web/src/pages/fan-clubs-sort-page/MobileFanClubsSortPage.tsx @@ -21,23 +21,23 @@ import { useMobileHeader } from 'components/header/mobile/hooks' const sortOptions = [ { value: GetCoinsSortMethodEnum.Price, - label: walletMessages.artistCoins.sortPrice + label: walletMessages.fanClubs.sortPrice }, { value: GetCoinsSortMethodEnum.Volume, - label: walletMessages.artistCoins.sortVolume + label: walletMessages.fanClubs.sortVolume }, { value: GetCoinsSortMethodEnum.MarketCap, - label: walletMessages.artistCoins.sortMarketCap + label: walletMessages.fanClubs.sortMarketCap }, { value: GetCoinsSortMethodEnum.CreatedAt, - label: walletMessages.artistCoins.sortLaunchDate + label: walletMessages.fanClubs.sortLaunchDate }, { value: GetCoinsSortMethodEnum.Holder, - label: walletMessages.artistCoins.sortHolders + label: walletMessages.fanClubs.sortHolders } ] @@ -48,17 +48,17 @@ const directionOptions: Array<{ }> = [ { key: GetCoinsSortDirectionEnum.Asc, - text: walletMessages.artistCoins.sortAscending, + text: walletMessages.fanClubs.sortAscending, leftIcon: IconSortUp }, { key: GetCoinsSortDirectionEnum.Desc, - text: walletMessages.artistCoins.sortDescending, + text: walletMessages.fanClubs.sortDescending, leftIcon: IconSortDown } ] -export const MobileArtistCoinsSortPage = () => { +export const MobileFanClubsSortPage = () => { const navigate = useNavigate() const location = useLocation() diff --git a/packages/web/src/pages/oauth-pay-page/hooks.ts b/packages/web/src/pages/oauth-pay-page/hooks.ts index c236e44e731..3ece27b3bbb 100644 --- a/packages/web/src/pages/oauth-pay-page/hooks.ts +++ b/packages/web/src/pages/oauth-pay-page/hooks.ts @@ -1,9 +1,9 @@ import { useCallback, useMemo, useState } from 'react' import { - useArtistCoin, + useFanClub, useCoinBalance, - transformArtistCoinToTokenInfo, + transformFanClubToTokenInfo, useSendCoins, useCurrentAccountUser, useUserByHandle, @@ -209,8 +209,8 @@ export const useOAuthPaySetup = ({ const currentUserWallet = userBankAddress // Get token info - const { data: coin } = useArtistCoin(mint ?? '') - const tokenInfo = coin ? transformArtistCoinToTokenInfo(coin) : undefined + const { data: coin } = useFanClub(mint ?? '') + const tokenInfo = coin ? transformFanClubToTokenInfo(coin) : undefined // Get user balance for the mint const { data: tokenBalance, isLoading: balanceLoading } = useCoinBalance({ diff --git a/packages/web/src/pages/profile-page/ProfilePage.test.tsx b/packages/web/src/pages/profile-page/ProfilePage.test.tsx index 17b0d795c08..cf52357c6f4 100644 --- a/packages/web/src/pages/profile-page/ProfilePage.test.tsx +++ b/packages/web/src/pages/profile-page/ProfilePage.test.tsx @@ -12,7 +12,7 @@ import { beforeEach } from 'vitest' -import { mockArtistCoin } from 'test/mocks/fixtures/artistCoins' +import { mockFanClub } from 'test/mocks/fixtures/fanClubs' import { artistUser, nonArtistUser } from 'test/mocks/fixtures/users' import { mockUserByHandle, @@ -225,7 +225,7 @@ describe('ProfilePage', () => { }) it('shows fan club UI when the profile belongs to an artist with an owned coin', async () => { - mswServer.use(mockUserCreatedCoin(artistUser.id, mockArtistCoin)) + mswServer.use(mockUserCreatedCoin(artistUser.id, mockFanClub)) // Mock a different current user to simulate viewing another user's profile renderProfilePage( diff --git a/packages/web/src/pages/profile-page/components/ArtistCoinFlairInput.tsx b/packages/web/src/pages/profile-page/components/FanClubFlairInput.tsx similarity index 94% rename from packages/web/src/pages/profile-page/components/ArtistCoinFlairInput.tsx rename to packages/web/src/pages/profile-page/components/FanClubFlairInput.tsx index 3dde97f5a36..b6920d73507 100644 --- a/packages/web/src/pages/profile-page/components/ArtistCoinFlairInput.tsx +++ b/packages/web/src/pages/profile-page/components/FanClubFlairInput.tsx @@ -9,25 +9,25 @@ import { Box, Text, Flex, IconCaretDown } from '@audius/harmony' import { TokenIcon } from 'components/buy-sell-modal/TokenIcon' import { TokenDropdown } from 'components/buy-sell-modal/components/TokenDropdown' -type ArtistCoinBadge = { +type FanClubBadge = { mint: string logo_uri: string ticker: string } -type ArtistCoinFlairInputProps = { - selectedBadge?: Nullable - onChange: (badge: ArtistCoinBadge | null) => void +type FanClubFlairInputProps = { + selectedBadge?: Nullable + onChange: (badge: FanClubBadge | null) => void } // Special option values for Default and None const DEFAULT_OPTION_VALUE = '__default__' const NONE_OPTION_VALUE = '__none__' -export const ArtistCoinFlairInput = ({ +export const FanClubFlairInput = ({ selectedBadge, onChange -}: ArtistCoinFlairInputProps) => { +}: FanClubFlairInputProps) => { // Fetch all tradeable coins, excluding USDC and AUDIO const { coinsArray: allCoins, isLoading } = useTradeableCoins({ excludeSymbols: ['USDC', 'AUDIO'] @@ -144,8 +144,8 @@ export const ArtistCoinFlairInput = ({ return } - // Convert CoinInfo to ArtistCoinBadge - const badge: ArtistCoinBadge = { + // Convert CoinInfo to FanClubBadge + const badge: FanClubBadge = { mint: coin.address, logo_uri: coin.logoURI || '', ticker: coin.symbol diff --git a/packages/web/src/pages/profile-page/components/desktop/BuyArtistCoinCard.tsx b/packages/web/src/pages/profile-page/components/desktop/BuyFanClubCard.tsx similarity index 64% rename from packages/web/src/pages/profile-page/components/desktop/BuyArtistCoinCard.tsx rename to packages/web/src/pages/profile-page/components/desktop/BuyFanClubCard.tsx index da17b7cb497..a89f8b8490c 100644 --- a/packages/web/src/pages/profile-page/components/desktop/BuyArtistCoinCard.tsx +++ b/packages/web/src/pages/profile-page/components/desktop/BuyFanClubCard.tsx @@ -1,6 +1,6 @@ -import { useArtistCoin } from '@audius/common/api' +import { useFanClub } from '@audius/common/api' import { route } from '@audius/common/utils' -import { Button, Flex, IconArtistCoin, Paper, Text } from '@audius/harmony' +import { Button, Flex, IconFanClub, Paper, Text } from '@audius/harmony' import { useNavigate } from 'react-router' import { TokenIcon } from 'components/buy-sell-modal/TokenIcon' @@ -12,25 +12,22 @@ const messages = { viewFanClub: 'View Fan Club' } -export const BuyArtistCoinCard = ({ mint }: { mint: string }) => { - const { data: artistCoin, isLoading } = useArtistCoin(mint) +export const BuyFanClubCard = ({ mint }: { mint: string }) => { + const { data: fanClub, isLoading } = useFanClub(mint) const navigate = useNavigate() const handleViewFanClub = () => { - if (artistCoin?.ticker) { - navigate(route.coinPage(artistCoin.ticker)) + if (fanClub?.ticker) { + navigate(route.coinPage(fanClub.ticker)) } } - if (isLoading || !artistCoin) { + if (isLoading || !fanClub) { return null } return ( - + { border='default' > - + - {artistCoin.name} + {fanClub.name} - {`$${artistCoin.ticker}`} + {`$${fanClub.ticker}`} diff --git a/packages/web/src/pages/profile-page/components/desktop/ProfileLeftNav.tsx b/packages/web/src/pages/profile-page/components/desktop/ProfileLeftNav.tsx index 92042afca6c..8be2dd8a379 100644 --- a/packages/web/src/pages/profile-page/components/desktop/ProfileLeftNav.tsx +++ b/packages/web/src/pages/profile-page/components/desktop/ProfileLeftNav.tsx @@ -1,4 +1,4 @@ -import { useArtistCreatedCoin } from '@audius/common/api' +import { useArtistCreatedFanClub } from '@audius/common/api' import { ID } from '@audius/common/models' import { Nullable } from '@audius/common/utils' import { @@ -16,10 +16,10 @@ import { Type } from 'pages/profile-page/components/SocialLink' import { ProfileTopTags } from 'pages/profile-page/components/desktop/ProfileTopTags' import { zIndex } from 'utils/zIndex' -import { ArtistCoinFlairInput } from '../ArtistCoinFlairInput' +import { FanClubFlairInput } from '../FanClubFlairInput' import SocialLinkInput from '../SocialLinkInput' -import { BuyArtistCoinCard } from './BuyArtistCoinCard' +import { BuyFanClubCard } from './BuyFanClubCard' import { ProfileBio } from './ProfileBio' import { ProfileMutuals } from './ProfileMutuals' import { RecentComments } from './RecentComments' @@ -31,7 +31,7 @@ const messages = { description: 'Description', location: 'Location', socialHandles: 'Social Handles', - artistCoinFlair: 'Artist Coin Flair', + fanClubFlair: 'Fan Club Flair', website: 'Website' } @@ -55,12 +55,12 @@ type ProfileLeftNavProps = { onUpdateLocation: (location: string) => void bio: string onUpdateBio: (bio: string) => void - artistCoinBadge?: Nullable<{ + fanClubBadge?: Nullable<{ mint: string logo_uri: string ticker: string }> - onUpdateArtistCoinBadge: ( + onUpdateFanClubBadge: ( badge: { mint: string logo_uri: string @@ -95,18 +95,18 @@ export const ProfileLeftNav = (props: ProfileLeftNavProps) => { onUpdateLocation, bio, onUpdateBio, - artistCoinBadge, - onUpdateArtistCoinBadge, + fanClubBadge, + onUpdateFanClubBadge, twitterVerified, instagramVerified, tikTokVerified, isOwner } = props - const { data: ownedCoin, isPending: isArtistCoinLoading } = - useArtistCreatedCoin(userId) + const { data: ownedCoin, isPending: isFanClubLoading } = + useArtistCreatedFanClub(userId) - const showArtistCoinCTA = !isArtistCoinLoading && !!ownedCoin + const showFanClubCTA = !isFanClubLoading && !!ownedCoin if (editMode) { return ( @@ -185,11 +185,11 @@ export const ProfileLeftNav = (props: ProfileLeftNavProps) => { - {messages.artistCoinFlair} + {messages.fanClubFlair} - @@ -231,8 +231,8 @@ export const ProfileLeftNav = (props: ProfileLeftNavProps) => { tikTokHandle={tikTokHandle} /> - {/* For artist coin owners, replace the tip CTA with their coin */} - {showArtistCoinCTA ? : null} + {/* For fan club owners, replace the tip CTA with their coin */} + {showFanClubCTA ? : null} diff --git a/packages/web/src/pages/profile-page/components/desktop/ProfilePage.tsx b/packages/web/src/pages/profile-page/components/desktop/ProfilePage.tsx index 4a6818177ba..3032b2848e1 100644 --- a/packages/web/src/pages/profile-page/components/desktop/ProfilePage.tsx +++ b/packages/web/src/pages/profile-page/components/desktop/ProfilePage.tsx @@ -96,7 +96,7 @@ const ProfilePage = ({ containerRef }: ProfilePageProps) => { instagramVerified, tikTokVerified, website, - artistCoinBadge, + fanClubBadge, hasProfilePicture, mode, stats, @@ -144,7 +144,7 @@ const ProfilePage = ({ containerRef }: ProfilePageProps) => { updateInstagramHandle, updateTikTokHandle, updateWebsite, - updateArtistCoinBadge, + updateFanClubBadge, updateCoverPhoto, didChangeTabsFrom, onCloseArtistRecommendations, @@ -573,7 +573,7 @@ const ProfilePage = ({ containerRef }: ProfilePageProps) => { instagramVerified={instagramVerified} tikTokVerified={tikTokVerified} website={website} - artistCoinBadge={artistCoinBadge} + fanClubBadge={fanClubBadge} created={created} onUpdateBio={updateBio} onUpdateLocation={updateLocation} @@ -581,7 +581,7 @@ const ProfilePage = ({ containerRef }: ProfilePageProps) => { onUpdateInstagramHandle={updateInstagramHandle} onUpdateTikTokHandle={updateTikTokHandle} onUpdateWebsite={updateWebsite} - onUpdateArtistCoinBadge={updateArtistCoinBadge} + onUpdateFanClubBadge={updateFanClubBadge} /> {body} diff --git a/packages/web/src/pages/profile-page/components/mobile/BuyArtistCoinButton.tsx b/packages/web/src/pages/profile-page/components/mobile/BuyFanClubButton.tsx similarity index 56% rename from packages/web/src/pages/profile-page/components/mobile/BuyArtistCoinButton.tsx rename to packages/web/src/pages/profile-page/components/mobile/BuyFanClubButton.tsx index 30d63c73dc1..855011a3846 100644 --- a/packages/web/src/pages/profile-page/components/mobile/BuyArtistCoinButton.tsx +++ b/packages/web/src/pages/profile-page/components/mobile/BuyFanClubButton.tsx @@ -1,4 +1,4 @@ -import { useArtistCreatedCoin } from '@audius/common/api' +import { useArtistCreatedFanClub } from '@audius/common/api' import { route } from '@audius/common/utils' import { Button } from '@audius/harmony' import { useNavigate } from 'react-router' @@ -7,23 +7,23 @@ const messages = { viewFanClub: 'View Fan Club' } -type BuyArtistCoinButtonProps = { +type BuyFanClubButtonProps = { userId: number } -export const BuyArtistCoinButton = ({ userId }: BuyArtistCoinButtonProps) => { - const { data: artistCoin, isPending: isArtistCoinLoading } = - useArtistCreatedCoin(userId) +export const BuyFanClubButton = ({ userId }: BuyFanClubButtonProps) => { + const { data: fanClub, isPending: isFanClubLoading } = + useArtistCreatedFanClub(userId) const navigate = useNavigate() const handleViewFanClub = () => { - if (artistCoin?.ticker) { - navigate(route.coinPage(artistCoin.ticker)) + if (fanClub?.ticker) { + navigate(route.coinPage(fanClub.ticker)) } } // Don't render if user doesn't own a coin - if (!artistCoin?.mint || isArtistCoinLoading) { + if (!fanClub?.mint || isFanClubLoading) { return null } diff --git a/packages/web/src/pages/profile-page/components/mobile/ProfileHeader.tsx b/packages/web/src/pages/profile-page/components/mobile/ProfileHeader.tsx index 313b57e4356..700996c440e 100644 --- a/packages/web/src/pages/profile-page/components/mobile/ProfileHeader.tsx +++ b/packages/web/src/pages/profile-page/components/mobile/ProfileHeader.tsx @@ -1,6 +1,6 @@ import { useState, useRef, useCallback, useEffect } from 'react' -import { useArtistCreatedCoin } from '@audius/common/api' +import { useArtistCreatedFanClub } from '@audius/common/api' import { imageCoverPhotoBlank, imageProfilePicEmpty @@ -41,7 +41,7 @@ import { UserGeneratedText } from 'components/user-generated-text' import { useCoverPhoto } from 'hooks/useCoverPhoto' import { useProfilePicture } from 'hooks/useProfilePicture' -import { BuyArtistCoinButton } from './BuyArtistCoinButton' +import { BuyFanClubButton } from './BuyFanClubButton' import GrowingCoverPhoto from './GrowingCoverPhoto' import styles from './ProfileHeader.module.css' import { SocialLink } from './SocialLink' @@ -215,9 +215,9 @@ const ProfileHeader = ({ size: SquareSizes.SIZE_150_BY_150 }) - // Artist coin detection - const { data: artistCoin, isPending: isArtistCoinLoading } = - useArtistCreatedCoin(userId) + // Fan club detection + const { data: fanClub, isPending: isFanClubLoading } = + useArtistCreatedFanClub(userId) const record = useRecord() @@ -453,9 +453,9 @@ const ProfileHeader = ({ onClose={onCloseArtistRecommendations} /> - {/* Artist coin buy button or tip button */} - {mode !== 'owner' && !isArtistCoinLoading && artistCoin?.mint && ( - + {/* Fan club buy button or tip button */} + {mode !== 'owner' && !isFanClubLoading && fanClub?.mint && ( + )} )} diff --git a/packages/web/src/pages/profile-page/useProfilePage.ts b/packages/web/src/pages/profile-page/useProfilePage.ts index fdeba15313b..d81a6e6cf42 100644 --- a/packages/web/src/pages/profile-page/useProfilePage.ts +++ b/packages/web/src/pages/profile-page/useProfilePage.ts @@ -158,7 +158,7 @@ export const useProfilePage = ( null ) const [updatedWebsite, setUpdatedWebsite] = useState(null) - const [updatedArtistCoinBadge, setUpdatedArtistCoinBadge] = useState< + const [updatedFanClubBadge, setUpdatedFanClubBadge] = useState< Nullable<{ mint: string logo_uri: string @@ -245,7 +245,7 @@ export const useProfilePage = ( setUpdatedInstagramHandle(null) setUpdatedTikTokHandle(null) setUpdatedWebsite(null) - setUpdatedArtistCoinBadge(null) + setUpdatedFanClubBadge(null) setAreArtistRecommendationsVisible(false) }, [profile?.handle, params?.tab]) @@ -352,26 +352,26 @@ export const useProfilePage = ( ? updatedWebsite : (profile?.website ?? '') - // Determine artist coin badge - let artistCoinBadge = null + // Determine fan club badge + let fanClubBadge = null if (profile) { - if (updatedArtistCoinBadge !== null) { - artistCoinBadge = updatedArtistCoinBadge + if (updatedFanClubBadge !== null) { + fanClubBadge = updatedFanClubBadge } else { if (profile.coin_flair_mint === '') { - artistCoinBadge = { + fanClubBadge = { mint: '__none__', logo_uri: '', ticker: '' } } else if (profile.coin_flair_mint === null) { - artistCoinBadge = { + fanClubBadge = { mint: '__default__', logo_uri: '', ticker: '' } } else { - artistCoinBadge = profile.artist_coin_badge || null + fanClubBadge = profile.fan_club_badge || null } } } @@ -595,7 +595,7 @@ export const useProfilePage = ( setUpdatedInstagramHandle(null) setUpdatedTikTokHandle(null) setUpdatedWebsite(null) - setUpdatedArtistCoinBadge(null) + setUpdatedFanClubBadge(null) }, []) const onCancel = useCallback(() => { @@ -605,7 +605,7 @@ export const useProfilePage = ( setUpdatedProfilePicture(null) setUpdatedBio(null) setUpdatedLocation(null) - setUpdatedArtistCoinBadge(null) + setUpdatedFanClubBadge(null) }, []) const updateName = useCallback((name: string) => setUpdatedName(name), []) @@ -667,7 +667,7 @@ export const useProfilePage = ( [updatedCoverPhoto] ) - const updateArtistCoinBadge = useCallback( + const updateFanClubBadge = useCallback( async ( badge: Nullable<{ mint: string @@ -675,7 +675,7 @@ export const useProfilePage = ( ticker: string }> ) => { - setUpdatedArtistCoinBadge(badge) + setUpdatedFanClubBadge(badge) // Optimistically update the user cache if (profile?.user_id && queryClient) { @@ -724,19 +724,19 @@ export const useProfilePage = ( (prevUser: any) => { if (!prevUser) return undefined - let artistCoinBadge = null + let fanClubBadge = null let coinFlairMint = null if (optimisticBadge) { if (optimisticBadge.mint === '__default__') { coinFlairMint = null - artistCoinBadge = null + fanClubBadge = null } else if (optimisticBadge.mint === '__none__') { coinFlairMint = '' - artistCoinBadge = null + fanClubBadge = null } else { coinFlairMint = optimisticBadge.mint - artistCoinBadge = { + fanClubBadge = { mint: optimisticBadge.mint, logo_uri: optimisticBadge.logo_uri, ticker: optimisticBadge.ticker @@ -747,7 +747,7 @@ export const useProfilePage = ( return { ...prevUser, coin_flair_mint: coinFlairMint, - artist_coin_badge: artistCoinBadge + fan_club_badge: fanClubBadge } } ) @@ -806,34 +806,34 @@ export const useProfilePage = ( updatedMetadata.website = updatedWebsite } - let artistCoinBadgeValue = null - if (updatedArtistCoinBadge !== null) { - artistCoinBadgeValue = updatedArtistCoinBadge + let fanClubBadgeValue = null + if (updatedFanClubBadge !== null) { + fanClubBadgeValue = updatedFanClubBadge } else { if (profile.coin_flair_mint === '') { - artistCoinBadgeValue = { + fanClubBadgeValue = { mint: '__none__', logo_uri: '', ticker: '' } } else if (profile.coin_flair_mint === null) { - artistCoinBadgeValue = { + fanClubBadgeValue = { mint: '__default__', logo_uri: '', ticker: '' } } else { - artistCoinBadgeValue = profile.artist_coin_badge || null + fanClubBadgeValue = profile.fan_club_badge || null } } - if (artistCoinBadgeValue) { - if (artistCoinBadgeValue.mint === '__default__') { + if (fanClubBadgeValue) { + if (fanClubBadgeValue.mint === '__default__') { updatedMetadata.coin_flair_mint = null - } else if (artistCoinBadgeValue.mint === '__none__') { + } else if (fanClubBadgeValue.mint === '__none__') { updatedMetadata.coin_flair_mint = '' } else { - updatedMetadata.coin_flair_mint = artistCoinBadgeValue.mint + updatedMetadata.coin_flair_mint = fanClubBadgeValue.mint } } else { updatedMetadata.coin_flair_mint = null @@ -851,7 +851,7 @@ export const useProfilePage = ( updatedInstagramHandle, updatedTikTokHandle, updatedWebsite, - updatedArtistCoinBadge, + updatedFanClubBadge, updateProfile, dispatch ]) @@ -945,7 +945,7 @@ export const useProfilePage = ( updatedInstagramHandle !== null || updatedTikTokHandle !== null || updatedWebsite !== null || - updatedArtistCoinBadge !== null || + updatedFanClubBadge !== null || updatedCoverPhoto !== null || updatedProfilePicture !== null @@ -981,7 +981,7 @@ export const useProfilePage = ( instagramVerified, tikTokVerified, website, - artistCoinBadge, + fanClubBadge, hasProfilePicture: !!hasProfilePicture, following, mode, @@ -1055,7 +1055,7 @@ export const useProfilePage = ( updateInstagramHandle, updateTikTokHandle, updateWebsite, - updateArtistCoinBadge, + updateFanClubBadge, updateCoverPhoto, updateProfile, didChangeTabsFrom, diff --git a/packages/web/src/pages/search-explore-page/components/desktop/FanClubsExploreSection.tsx b/packages/web/src/pages/search-explore-page/components/desktop/FanClubsExploreSection.tsx index 4a11246f4a2..42206d65c68 100644 --- a/packages/web/src/pages/search-explore-page/components/desktop/FanClubsExploreSection.tsx +++ b/packages/web/src/pages/search-explore-page/components/desktop/FanClubsExploreSection.tsx @@ -1,6 +1,6 @@ import { useMemo } from 'react' -import { useArtistCoinsList, useQueryContext } from '@audius/common/api' +import { useFanClubsList, useQueryContext } from '@audius/common/api' import { exploreMessages as messages } from '@audius/common/messages' import { route } from '@audius/common/utils' import { Box } from '@audius/harmony' @@ -9,7 +9,7 @@ import { GetCoinsSortDirectionEnum, GetCoinsSortMethodEnum } from '@audius/sdk' import { FanClubCardSkeleton, FanClubCoinCard -} from 'pages/artist-coins-launchpad-page/components/FanClubCoinCard' +} from 'pages/fan-clubs-launchpad-page/components/FanClubCoinCard' import { Carousel } from './Carousel' import { useExploreSectionTracking } from './useExploreSectionTracking' @@ -21,7 +21,7 @@ export const FanClubsExploreSection = () => { const { ref, inView } = useExploreSectionTracking('Fan Clubs') const { env } = useQueryContext() - const { data, isPending, isError, isSuccess } = useArtistCoinsList( + const { data, isPending, isError, isSuccess } = useFanClubsList( { limit: FAN_CLUBS_PREVIEW_LIMIT, offset: 0, diff --git a/packages/web/src/pages/settings-page/components/desktop/SettingsPage.tsx b/packages/web/src/pages/settings-page/components/desktop/SettingsPage.tsx index 189e92f5985..fa1b41b92c7 100644 --- a/packages/web/src/pages/settings-page/components/desktop/SettingsPage.tsx +++ b/packages/web/src/pages/settings-page/components/desktop/SettingsPage.tsx @@ -4,7 +4,7 @@ import { useCurrentAccountUser, useQueryContext } from '@audius/common/api' import { useIsManagedAccount } from '@audius/common/hooks' import { settingsMessages } from '@audius/common/messages' import { Name, Theme, ThemeMode, ThemePalette } from '@audius/common/models' -import { API_TERMS, ARTIST_COIN_TERMS } from '@audius/common/src/utils/route' +import { API_TERMS, FAN_CLUB_TERMS } from '@audius/common/src/utils/route' import { BrowserNotificationSetting, EmailFrequency, @@ -627,11 +627,11 @@ export const SettingsPage = () => { -{' '} - {settingsMessages.artistCoinTerms} + {settingsMessages.fanClubTerms} {!isManagedAccount ? ( diff --git a/packages/web/src/pages/track-page/components/mobile/TrackHeader.tsx b/packages/web/src/pages/track-page/components/mobile/TrackHeader.tsx index a9cb78912ac..599e2c9cd79 100644 --- a/packages/web/src/pages/track-page/components/mobile/TrackHeader.tsx +++ b/packages/web/src/pages/track-page/components/mobile/TrackHeader.tsx @@ -22,7 +22,7 @@ import { Button, MusicBadge, Text, - IconArtistCoin + IconFanClub } from '@audius/harmony' import IconCalendarMonth from '@audius/harmony/src/assets/icons/CalendarMonth.svg' import IconTrending from '@audius/harmony/src/assets/icons/Trending.svg' @@ -304,7 +304,7 @@ const TrackHeader = ({ IconComponent = IconCart titleMessage = messages.premiumTrack } else if (isContentTokenGated(streamConditions)) { - IconComponent = IconArtistCoin + IconComponent = IconFanClub titleMessage = messages.coinGated } return ( diff --git a/packages/web/src/pages/wallet-page/components/WalletCoinsList.tsx b/packages/web/src/pages/wallet-page/components/WalletCoinsList.tsx index 679e4fa7235..16e2113b5ec 100644 --- a/packages/web/src/pages/wallet-page/components/WalletCoinsList.tsx +++ b/packages/web/src/pages/wallet-page/components/WalletCoinsList.tsx @@ -2,8 +2,8 @@ import { useCallback, useContext, useState } from 'react' import { UserCoin, - useArtistCoin, - useArtistCreatedCoin, + useFanClub, + useArtistCreatedFanClub, useCoinBalance, useCurrentUserId, useQueryContext, @@ -74,7 +74,7 @@ const USDCCoinCard = () => { ) } -const DiscoverArtistCoinsCard = ({ onClick }: { onClick: () => void }) => { +const DiscoverFanClubsCard = ({ onClick }: { onClick: () => void }) => { const { color } = useTheme() return ( @@ -91,7 +91,7 @@ const DiscoverArtistCoinsCard = ({ onClick }: { onClick: () => void }) => { }} > - {walletMessages.artistCoins.title} + {walletMessages.fanClubs.title} @@ -251,9 +251,7 @@ const CoinCardWithBalance = ({ coin }: { coin: UserCoin }) => { formattedHeldValue } = useFormattedCoinBalance(coin.mint) - const { data: coinData, isPending: coinsDataLoading } = useArtistCoin( - coin.mint - ) + const { data: coinData, isPending: coinsDataLoading } = useFanClub(coin.mint) const isLoading = isCoinBalanceLoading || isCoinPriceLoading || coinsDataLoading @@ -287,14 +285,14 @@ export const WalletCoinsList = () => { setIsOpenAppDrawerOpen(false) }, []) - const { data: artistCoins, isPending: isLoadingCoins } = useUserCoins({ + const { data: fanClubs, isPending: isLoadingCoins } = useUserCoins({ userId: currentUserId }) - const { data: artistOwnedCoin } = useArtistCreatedCoin(currentUserId) - const audioCoin = artistCoins?.find( + const { data: artistOwnedCoin } = useArtistCreatedFanClub(currentUserId) + const audioCoin = fanClubs?.find( (coin) => coin?.mint === env.WAUDIO_MINT_ADDRESS ) - const otherCoins = artistCoins?.filter( + const otherCoins = fanClubs?.filter( (coin) => coin?.mint !== env.WAUDIO_MINT_ADDRESS && coin?.mint !== artistOwnedCoin?.mint && @@ -310,10 +308,10 @@ export const WalletCoinsList = () => { // Show audio coin card when no coins are available const coins = orderedCoins.length === 0 ? ['audio-coin' as const] : orderedCoins - // Add discover artist coins card at the end - const allCoins = [...coins, 'discover-artist-coins' as const] + // Add discover fan clubs card at the end + const allCoins = [...coins, 'discover-fan-clubs' as const] - const handleDiscoverArtistCoins = useCallback(() => { + const handleDiscoverFanClubs = useCallback(() => { navigate(CLUBS_EXPLORE_PAGE) }, [navigate]) @@ -338,10 +336,8 @@ export const WalletCoinsList = () => { {allCoins.map((item, idx) => ( - {item === 'discover-artist-coins' ? ( - + {item === 'discover-fan-clubs' ? ( + ) : item === 'audio-coin' ? ( ) : ( diff --git a/packages/web/src/public-site/PublicSite.tsx b/packages/web/src/public-site/PublicSite.tsx index 4188457d994..f2a39cc3f7d 100644 --- a/packages/web/src/public-site/PublicSite.tsx +++ b/packages/web/src/public-site/PublicSite.tsx @@ -29,14 +29,11 @@ const DownloadPage = lazy(() => import('./pages/download-page/DownloadPage')) const TermsOfUsePage = lazy( () => import('./pages/terms-of-use-page/TermsOfUsePage') ) -const ArtistCoinTermsPage = lazy( - () => import('./pages/artist-coin-terms-page/ArtistCoinTermsPage') +const FanClubTermsPage = lazy( + () => import('./pages/fan-club-terms-page/FanClubTermsPage') ) -const ArtistCoinAcceptableUsePage = lazy( - () => - import( - './pages/artist-coin-acceptable-use-page/ArtistCoinAcceptableUsePage' - ) +const FanClubAcceptableUsePage = lazy( + () => import('./pages/fan-club-acceptable-use-page/FanClubAcceptableUsePage') ) const ROOT_ID = 'root' @@ -152,9 +149,9 @@ export const PublicSite = (props: PublicSiteProps) => { } /> { } /> void setRenderPublicSite: (shouldRender: boolean) => void } -const ArtistCoinAcceptableUsePage = ( - props: ArtistCoinAcceptableUsePageProps -) => { +const FanClubAcceptableUsePage = (props: FanClubAcceptableUsePageProps) => { return ( -
+
@@ -45,7 +43,7 @@ const ArtistCoinAcceptableUsePage = ( ) : ( )} @@ -58,4 +56,4 @@ const ArtistCoinAcceptableUsePage = ( ) } -export default ArtistCoinAcceptableUsePage +export default FanClubAcceptableUsePage diff --git a/packages/web/src/public-site/pages/artist-coin-terms-page/ArtistCoinTermsPage.module.css b/packages/web/src/public-site/pages/fan-club-terms-page/FanClubTermsPage.module.css similarity index 100% rename from packages/web/src/public-site/pages/artist-coin-terms-page/ArtistCoinTermsPage.module.css rename to packages/web/src/public-site/pages/fan-club-terms-page/FanClubTermsPage.module.css diff --git a/packages/web/src/public-site/pages/artist-coin-terms-page/ArtistCoinTermsPage.tsx b/packages/web/src/public-site/pages/fan-club-terms-page/FanClubTermsPage.tsx similarity index 68% rename from packages/web/src/public-site/pages/artist-coin-terms-page/ArtistCoinTermsPage.tsx rename to packages/web/src/public-site/pages/fan-club-terms-page/FanClubTermsPage.tsx index 12286e37208..8708ca127af 100644 --- a/packages/web/src/public-site/pages/artist-coin-terms-page/ArtistCoinTermsPage.tsx +++ b/packages/web/src/public-site/pages/fan-club-terms-page/FanClubTermsPage.tsx @@ -2,26 +2,26 @@ import Footer from 'public-site/components/Footer' import NavBanner from 'public-site/components/NavBanner' import { env } from 'services/env' -import styles from './ArtistCoinTermsPage.module.css' +import styles from './FanClubTermsPage.module.css' const BASENAME = env.BASENAME const messages = { - download: 'Download Artist Coin Terms', - title: 'Artist Coin Terms' + download: 'Download Fan Club Terms', + title: 'Fan Club Terms' } -const ArtistCoinTermsDocumentRoute = `${BASENAME}/documents/ArtistCoinTerms.pdf` +const FanClubTermsDocumentRoute = `${BASENAME}/documents/FanClubTerms.pdf` -type ArtistCoinTermsPageProps = { +type FanClubTermsPageProps = { isMobile: boolean openNavScreen: () => void setRenderPublicSite: (shouldRender: boolean) => void } -const ArtistCoinTermsPage = (props: ArtistCoinTermsPageProps) => { +const FanClubTermsPage = (props: FanClubTermsPageProps) => { return ( -
+
{ {props.isMobile ? (
@@ -43,7 +43,7 @@ const ArtistCoinTermsPage = (props: ArtistCoinTermsPageProps) => { ) : ( )} @@ -56,4 +56,4 @@ const ArtistCoinTermsPage = (props: ArtistCoinTermsPageProps) => { ) } -export default ArtistCoinTermsPage +export default FanClubTermsPage diff --git a/packages/web/src/ssr/metaTags.ts b/packages/web/src/ssr/metaTags.ts index 6196d11b5fe..7067e415166 100644 --- a/packages/web/src/ssr/metaTags.ts +++ b/packages/web/src/ssr/metaTags.ts @@ -526,9 +526,9 @@ export const getCollectionPageContext = ({ * Coins page meta tag context */ export const getCoinsPageContext = () => { - const pageTitle = 'Discover Artist Coins' + const pageTitle = 'Discover Fan Clubs • Audius' const pageDescription = - 'Explore Artist Coins on Audius. Support your favorite artists, unlock exclusive perks, and become part of their community.' + 'Explore Artist Fan Clubs on Audius. Support your favorite artists, unlock exclusive perks, and become part of their community.' const canonicalUrl = 'https://audius.co/coins' return { @@ -547,7 +547,7 @@ export const getCoinsPageContext = () => { export const getWalletPageContext = () => { const pageTitle = 'Wallet' const pageDescription = - 'Manage your Audius wallet. View your cash balance, artist coins, and linked wallets all in one place.' + 'Manage your Audius wallet. View your cash balance, fan clubs, and linked wallets all in one place.' const canonicalUrl = 'https://audius.co/wallet' return { diff --git a/packages/web/src/test/mocks/fixtures/artistCoins.ts b/packages/web/src/test/mocks/fixtures/fanClubs.ts similarity index 93% rename from packages/web/src/test/mocks/fixtures/artistCoins.ts rename to packages/web/src/test/mocks/fixtures/fanClubs.ts index 704a56eb12c..d7a24a1712d 100644 --- a/packages/web/src/test/mocks/fixtures/artistCoins.ts +++ b/packages/web/src/test/mocks/fixtures/fanClubs.ts @@ -1,6 +1,6 @@ import { Id } from '@audius/sdk' -export const mockArtistCoin = { +export const mockFanClub = { ticker: 'MOCK', name: 'Mock Coin', mint: 'abcedfg1234567890', @@ -90,10 +90,10 @@ export const mockArtistCoin = { } export const mockUserCoinHasBalance = { - ticker: mockArtistCoin.ticker, - mint: mockArtistCoin.mint, + ticker: mockFanClub.ticker, + mint: mockFanClub.mint, decimals: 5, - logo_uri: mockArtistCoin.logo_uri, + logo_uri: mockFanClub.logo_uri, // Should match the sum of all the balances in the accounts array balance: 8943183931062 + 2806208545 + 3406392544, balance_usd: 0.418136809630839 + 0.062363526989732576 + 0.002378729223560982, @@ -124,12 +124,12 @@ export const mockUserCoinHasBalance = { } export const mockUserCoinNoBalance = { - ticker: mockArtistCoin.ticker, - mint: mockArtistCoin.mint, - decimals: mockArtistCoin.decimals, - has_discord: mockArtistCoin.has_discord, - owner_id: mockArtistCoin.owner_id, - logo_uri: mockArtistCoin.logo_uri, + ticker: mockFanClub.ticker, + mint: mockFanClub.mint, + decimals: mockFanClub.decimals, + has_discord: mockFanClub.has_discord, + owner_id: mockFanClub.owner_id, + logo_uri: mockFanClub.logo_uri, balance: 0, balance_usd: 0, accounts: [] diff --git a/packages/web/src/test/msw/mswMocks.ts b/packages/web/src/test/msw/mswMocks.ts index 46c349aef8a..0eb0a2f88f5 100644 --- a/packages/web/src/test/msw/mswMocks.ts +++ b/packages/web/src/test/msw/mswMocks.ts @@ -9,12 +9,12 @@ import { developmentConfig, HashId } from '@audius/sdk' import { http, HttpResponse } from 'msw' import { queryClient } from 'services/query-client' +import { testCollection } from 'test/mocks/fixtures/collections' import { - mockArtistCoin, + mockFanClub, mockUserCoinHasBalance, mockCoinMembers -} from 'test/mocks/fixtures/artistCoins' -import { testCollection } from 'test/mocks/fixtures/collections' +} from 'test/mocks/fixtures/fanClubs' import { testTrack } from 'test/mocks/fixtures/tracks' import { artistUser, nonArtistUser } from 'test/mocks/fixtures/users' @@ -105,14 +105,14 @@ export const mockEvents = (/* todo: */) => ) /** - * Artist Coins + * Fan Clubs */ -export const mockCoinByMint = (coin: typeof mockArtistCoin) => +export const mockCoinByMint = (coin: typeof mockFanClub) => http.get(`${apiEndpoint}/v1/coins/${coin.mint}`, () => HttpResponse.json({ data: coin }) ) -export const mockCoinByTicker = (coin: typeof mockArtistCoin) => +export const mockCoinByTicker = (coin: typeof mockFanClub) => http.get(`${apiEndpoint}/v1/coins/ticker/${coin.ticker}`, () => HttpResponse.json({ data: coin }) ) @@ -140,7 +140,7 @@ export const mockCoinMembersList = ( ) export const mockUserCreatedCoin = ( userId: string, - coin: typeof mockArtistCoin + coin: typeof mockFanClub ) => { return http.get(`${apiEndpoint}/v1/coins`, ({ request }) => { const url = new URL(request.url)