diff --git a/packages/common/src/api/tan-query/comments/useDeleteTextPost.ts b/packages/common/src/api/tan-query/comments/useDeleteTextPost.ts
index c7cc968f3f1..f0e6faef09d 100644
--- a/packages/common/src/api/tan-query/comments/useDeleteTextPost.ts
+++ b/packages/common/src/api/tan-query/comments/useDeleteTextPost.ts
@@ -39,10 +39,7 @@ export const useDeleteTextPost = () => {
newState.pages = newState.pages.map((page: FanClubFeedItem[]) =>
page.filter(
(item) =>
- !(
- item.itemType === 'text_post' &&
- item.commentId === commentId
- )
+ !(item.itemType === 'text_post' && item.commentId === commentId)
)
)
}
@@ -69,9 +66,7 @@ export const useDeleteTextPost = () => {
name: 'Comments',
feature: Feature.Comments
})
- dispatch(
- toast({ content: 'There was an error deleting the post.' })
- )
+ dispatch(toast({ content: 'There was an error deleting the post.' }))
// Reset to server state
queryClient.invalidateQueries({
queryKey: getFanClubFeedQueryKey({
diff --git a/packages/common/src/utils/route.ts b/packages/common/src/utils/route.ts
index 8de0254b7cf..7cf6d07a3f2 100644
--- a/packages/common/src/utils/route.ts
+++ b/packages/common/src/utils/route.ts
@@ -77,10 +77,17 @@ export const COIN_DETAIL_BUY_PAGE = '/coins/:ticker/buy'
export const COIN_REDEEM_PAGE = '/coins/:ticker/redeem/:code?'
export const COIN_EXCLUSIVE_TRACKS_PAGE = '/coins/:ticker/exclusive-tracks'
export const EDIT_COIN_DETAILS_PAGE = '/coins/:ticker/edit'
+/** Primary club detail route */
+export const CLUB_DETAIL_PAGE = '/clubs/:ticker'
+export const CLUB_DETAIL_BUY_PAGE = '/clubs/:ticker/buy'
+export const CLUB_REDEEM_PAGE = '/clubs/:ticker/redeem/:code?'
+export const CLUB_EXCLUSIVE_TRACKS_PAGE = '/clubs/:ticker/exclusive-tracks'
+export const EDIT_CLUB_DETAILS_PAGE = '/clubs/:ticker/edit'
export const WALLET_PAGE = '/wallet'
export const WALLET_GUIDE_PAGE = '/wallet/guide'
export const CASH_PAGE = '/cash'
export const COINS_CREATE_PAGE = '/coins/create'
+export const CLUBS_CREATE_PAGE = '/clubs/create'
/** Legacy explore URL; app redirects to CLUBS_EXPLORE_PAGE. */
export const COINS_EXPLORE_PAGE = '/coins'
/** Fan club discovery (primary); same UI as legacy /coins. */
@@ -160,8 +167,11 @@ export const FOLLOWING_USERS_ROUTE = '/following'
export const FOLLOWERS_USERS_ROUTE = '/followers'
export const LEADERBOARD_USERS_ROUTE = '/leaderboard'
export const COIN_DETAIL_MOBILE_WEB_ROUTE = '/coins/:ticker/details'
+export const CLUB_DETAIL_MOBILE_WEB_ROUTE = '/clubs/:ticker/details'
export const COIN_EXCLUSIVE_TRACKS_MOBILE_ROUTE =
'/coins/:ticker/exclusive-tracks/mobile'
+export const CLUB_EXCLUSIVE_TRACKS_MOBILE_ROUTE =
+ '/clubs/:ticker/exclusive-tracks/mobile'
export const ACCOUNT_SETTINGS_PAGE = '/settings/account'
export const NOTIFICATION_SETTINGS_PAGE = '/settings/notifications'
export const ABOUT_SETTINGS_PAGE = '/settings/about'
@@ -243,6 +253,7 @@ export const authenticatedRoutes = [
PAYMENTS_PAGE,
WITHDRAWALS_PAGE,
COINS_CREATE_PAGE,
+ CLUBS_CREATE_PAGE,
WALLET_GUIDE_PAGE,
CASH_PAGE
]
@@ -297,12 +308,15 @@ export const orderedRoutes = [
AUDIO_PAGE,
WALLET_AUDIO_PAGE,
COIN_DETAIL_PAGE,
+ CLUB_DETAIL_PAGE,
EDIT_COIN_DETAILS_PAGE,
+ EDIT_CLUB_DETAILS_PAGE,
WALLET_PAGE,
CASH_PAGE,
COINS_EXPLORE_PAGE,
CLUBS_EXPLORE_PAGE,
COINS_CREATE_PAGE,
+ CLUBS_CREATE_PAGE,
WALLET_GUIDE_PAGE,
REWARDS_PAGE,
SETTINGS_PAGE,
@@ -354,6 +368,7 @@ export const staticRoutes = new Set([
COINS_EXPLORE_PAGE,
CLUBS_EXPLORE_PAGE,
COINS_CREATE_PAGE,
+ CLUBS_CREATE_PAGE,
WALLET_AUDIO_PAGE,
CASH_PAGE,
REWARDS_PAGE,
@@ -466,5 +481,11 @@ export const searchPage = (searchOptions: SearchOptions) => {
export const coinPage = (ticker: string) =>
`/coins/${formatTickerForUrl(ticker)}`
+export const clubPage = (ticker: string) =>
+ `/clubs/${formatTickerForUrl(ticker)}`
+
export const coinRedeemPage = (ticker: string, code?: string) =>
`/coins/${formatTickerForUrl(ticker)}/redeem${code ? `/${code}` : ''}`
+
+export const clubRedeemPage = (ticker: string, code?: string) =>
+ `/clubs/${formatTickerForUrl(ticker)}/redeem${code ? `/${code}` : ''}`
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 244f687b36b..2d146c1c579 100644
--- a/packages/mobile/src/screens/coin-details-screen/components/FanClubTab.tsx
+++ b/packages/mobile/src/screens/coin-details-screen/components/FanClubTab.tsx
@@ -377,9 +377,7 @@ export const FanClubTab = ({ mint, onSwitchToCoinTab }: FanClubTabProps) => {
) : null}
- {membershipKnown ? (
-
- ) : null}
+ {membershipKnown ? : null}
)
}
diff --git a/packages/web/src/app/web-player/WebPlayer.tsx b/packages/web/src/app/web-player/WebPlayer.tsx
index 42c8c7b7c04..dd94a60b997 100644
--- a/packages/web/src/app/web-player/WebPlayer.tsx
+++ b/packages/web/src/app/web-player/WebPlayer.tsx
@@ -18,6 +18,14 @@ import { Client, Status } from '@audius/common/models'
import { StringKeys } from '@audius/common/services'
import {
COIN_DETAIL_BUY_PAGE,
+ CLUB_DETAIL_PAGE,
+ CLUB_DETAIL_BUY_PAGE,
+ CLUB_REDEEM_PAGE,
+ CLUB_EXCLUSIVE_TRACKS_PAGE,
+ CLUB_EXCLUSIVE_TRACKS_MOBILE_ROUTE,
+ CLUB_DETAIL_MOBILE_WEB_ROUTE,
+ EDIT_CLUB_DETAILS_PAGE,
+ CLUBS_CREATE_PAGE,
guestRoutes
} from '@audius/common/src/utils/route'
import { route } from '@audius/common/utils'
@@ -382,10 +390,13 @@ const FanClubDetailPageRoute = ({
const { ticker } = params
if (ticker && ticker !== ticker.toUpperCase()) {
+ // Preserve the current path prefix (/clubs or /coins)
+ const isClubsRoute = location.pathname.startsWith('/clubs')
+ const detailPage = isClubsRoute ? CLUB_DETAIL_PAGE : COIN_DETAIL_PAGE
return (
{
const params = useParams<{ ticker?: string }>()
+ const location = useLocation()
const ticker = (params.ticker ?? '').toUpperCase()
- return
+ const isClubsRoute = location.pathname.startsWith('/clubs')
+ const detailPage = isClubsRoute ? CLUB_DETAIL_PAGE : COIN_DETAIL_PAGE
+ return
}
type HomePageRedirectProps = {
@@ -924,32 +938,62 @@ const WebPlayer = (props: WebPlayerProps) => {
path='/coins/sort'
element={}
/>
+ }
+ />
} />
+ } />
}
/>
+
+ }
+ />
}
/>
+
+ }
+ />
} />
+ } />
}
/>
+ }
+ />
}
/>
+ }
+ />
}
/>
+ }
+ />
} />
} />
} />
@@ -1166,6 +1210,10 @@ const WebPlayer = (props: WebPlayerProps) => {
path={COIN_DETAIL_MOBILE_WEB_ROUTE}
element={}
/>
+ }
+ />
} />
>
) : (
@@ -1194,6 +1242,10 @@ const WebPlayer = (props: WebPlayerProps) => {
path={COIN_DETAIL_MOBILE_WEB_ROUTE}
element={}
/>
+ }
+ />
}
@@ -1328,31 +1380,57 @@ const WebPlayer = (props: WebPlayerProps) => {
element={}
/>
} />
+ } />
}
/>
+
+ }
+ />
}
/>
+
+ }
+ />
} />
+ } />
}
/>
+ }
+ />
}
/>
+ }
+ />
}
/>
+ }
+ />
} />
} />
} />
@@ -1499,6 +1577,10 @@ const WebPlayer = (props: WebPlayerProps) => {
path={COIN_DETAIL_MOBILE_WEB_ROUTE}
element={}
/>
+ }
+ />
}
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 6b71c210064..5dbb9d6b64c 100644
--- a/packages/web/src/pages/fan-club-detail-page/FanClubDetailPage.tsx
+++ b/packages/web/src/pages/fan-club-detail-page/FanClubDetailPage.tsx
@@ -4,10 +4,10 @@ import {
useUser
} from '@audius/common/api'
import { coinDetailsMessages } from '@audius/common/messages'
-import { coinPage } from '@audius/common/src/utils/route'
+import { coinPage, clubPage } from '@audius/common/src/utils/route'
import { formatTickerForUrl, route } from '@audius/common/utils'
import { Flex, LoadingSpinner } from '@audius/harmony'
-import { Navigate, useParams } from 'react-router'
+import { Navigate, useLocation, useParams } from 'react-router'
import { Header } from 'components/header/desktop/Header'
import MobilePageContainer from 'components/mobile-page-container/MobilePageContainer'
@@ -87,9 +87,11 @@ const MobileFanClubDetailPageContent = ({
export const FanClubDetailPage = () => {
const { ticker } = useParams<{ ticker?: string }>()
+ const location = useLocation()
const isMobile = useIsMobile()
const { data: currentUserId } = useCurrentUserId()
const formattedTicker = formatTickerForUrl(ticker ?? '')
+ const isClubsRoute = location.pathname.startsWith('/clubs')
const {
data: coin,
@@ -107,7 +109,8 @@ export const FanClubDetailPage = () => {
}
if (ticker !== formattedTicker) {
- return
+ const detailPage = isClubsRoute ? clubPage : coinPage
+ return
}
if (isError || (isSuccess && !coin)) {
diff --git a/packages/web/src/ssr/coins/+route.ts b/packages/web/src/ssr/coins/+route.ts
index 6f3eb882eda..dfcc914c195 100644
--- a/packages/web/src/ssr/coins/+route.ts
+++ b/packages/web/src/ssr/coins/+route.ts
@@ -1,3 +1,25 @@
import { makePageRoute } from 'ssr/util'
-export default makePageRoute(['/clubs', '/coins'], 'Fan Clubs Page')
+export default makePageRoute(
+ [
+ '/clubs',
+ '/coins',
+ '/coins/create',
+ '/coins/sort',
+ '/coins/@ticker',
+ '/coins/@ticker/buy',
+ '/coins/@ticker/redeem',
+ '/coins/@ticker/redeem/@code',
+ '/coins/@ticker/exclusive-tracks',
+ '/coins/@ticker/edit',
+ '/clubs/create',
+ '/clubs/sort',
+ '/clubs/@ticker',
+ '/clubs/@ticker/buy',
+ '/clubs/@ticker/redeem',
+ '/clubs/@ticker/redeem/@code',
+ '/clubs/@ticker/exclusive-tracks',
+ '/clubs/@ticker/edit'
+ ],
+ 'Fan Clubs Page'
+)