Skip to content

Commit 8b5c3b8

Browse files
authored
[PE-6020] Add submissions section to remix contest container on mobile (#11939)
1 parent 636118d commit 8b5c3b8

File tree

2 files changed

+145
-12
lines changed

2 files changed

+145
-12
lines changed

packages/mobile/src/screens/track-screen/RemixContestSubmissionsTab.tsx

Lines changed: 140 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,155 @@
1-
import { useRemixContest } from '@audius/common/api'
1+
import type { LineupData } from '@audius/common/api'
2+
import { useRemixes, useTrack, useUser } from '@audius/common/api'
23
import type { ID } from '@audius/common/models'
34

4-
import { Flex, Text } from '@audius/harmony-native'
5+
import {
6+
Artwork,
7+
Box,
8+
Flex,
9+
IconArrowRight,
10+
PlainButton,
11+
Skeleton,
12+
Text
13+
} from '@audius/harmony-native'
14+
import { TrackLink } from 'app/components/track/TrackLink'
15+
import { TrackFlair, Size } from 'app/components/track-flair'
16+
import { UserLink } from 'app/components/user-link'
17+
import { useNavigation } from 'app/hooks/useNavigation'
518

6-
type Props = {
19+
const artworkSize = 120
20+
const userAvatarSize = 40
21+
22+
const messages = {
23+
noSubmissions: 'No submissions yet',
24+
beFirst: 'Be the first to upload a remix!',
25+
viewAll: 'View All'
26+
}
27+
28+
type RemixContestSubmissionsTabProps = {
729
trackId: ID
830
}
931

1032
/**
1133
* Tab content displaying submissions for a remix contest
1234
*/
13-
export const RemixContestSubmissionsTab = ({ trackId }: Props) => {
14-
const { data: remixContest } = useRemixContest(trackId)
35+
export const RemixContestSubmissionsTab = ({
36+
trackId
37+
}: RemixContestSubmissionsTabProps) => {
38+
const { data: remixes } = useRemixes({ trackId, isContestEntry: true })
39+
const submissions = remixes?.slice(0, 6)
1540

16-
if (!remixContest) return null
41+
// If there are no submissions, show the empty state
42+
if (submissions.length === 0) {
43+
return <EmptyRemixContestSubmissions />
44+
}
45+
46+
return <RemixContestSubmissions trackId={trackId} submissions={submissions} />
47+
}
48+
49+
const SubmissionCard = ({ submission }: { submission: LineupData }) => {
50+
const { data: track, isLoading: trackLoading } = useTrack(submission.id)
51+
const { data: user, isLoading: userLoading } = useUser(track?.owner_id)
52+
const isLoading = trackLoading || userLoading
53+
const displaySkeleton = isLoading || !track || !user
54+
55+
return (
56+
<Flex column gap='s'>
57+
<Flex h={artworkSize} w={artworkSize}>
58+
{displaySkeleton ? (
59+
<Skeleton />
60+
) : (
61+
<>
62+
<TrackFlair
63+
style={{
64+
height: '100%',
65+
width: '100%',
66+
borderRadius: 4,
67+
overflow: 'hidden'
68+
}}
69+
trackId={track.track_id}
70+
size={Size.SMALL}
71+
>
72+
<Artwork source={{ uri: track.artwork['150x150'] }} />
73+
</TrackFlair>
74+
<Box
75+
h={userAvatarSize}
76+
w={userAvatarSize}
77+
borderRadius='circle'
78+
style={{
79+
position: 'absolute',
80+
top: -8,
81+
right: -8,
82+
overflow: 'hidden'
83+
}}
84+
>
85+
<Artwork source={{ uri: user.profile_picture['150x150'] }} />
86+
</Box>
87+
</>
88+
)}
89+
</Flex>
90+
<Flex column gap='xs' alignItems='center'>
91+
{displaySkeleton ? (
92+
<>
93+
<Box h={20} w={100}>
94+
<Skeleton />
95+
</Box>
96+
<Box h={20} w={64}>
97+
<Skeleton />
98+
</Box>
99+
</>
100+
) : (
101+
<>
102+
<TrackLink textVariant='title' size='s' trackId={track.track_id} />
103+
<UserLink userId={user.user_id} size='s' />
104+
</>
105+
)}
106+
</Flex>
107+
</Flex>
108+
)
109+
}
110+
const RemixContestSubmissions = ({
111+
trackId,
112+
submissions
113+
}: {
114+
trackId: ID
115+
submissions: LineupData[]
116+
}) => {
117+
const navigation = useNavigation()
118+
119+
return (
120+
<Flex w='100%' column gap='2xl' pv='xl' ph='l' borderTop='default'>
121+
<Flex gap='2xl' wrap='wrap'>
122+
{submissions.map((submission) => (
123+
<SubmissionCard key={submission.id} submission={submission} />
124+
))}
125+
</Flex>
126+
<Flex justifyContent='center'>
127+
<PlainButton
128+
iconRight={IconArrowRight}
129+
onPress={() => {
130+
navigation.navigate('TrackRemixes', { trackId })
131+
}}
132+
>
133+
{messages.viewAll}
134+
</PlainButton>
135+
</Flex>
136+
</Flex>
137+
)
138+
}
17139

140+
const EmptyRemixContestSubmissions = () => {
18141
return (
19-
<Flex p='xl' borderTop='default'>
20-
<Text variant='body' size='l'>
21-
{/* TODO: Implement submissions content */}
142+
<Flex
143+
column
144+
w='100%'
145+
pv='2xl'
146+
gap='s'
147+
justifyContent='center'
148+
alignItems='center'
149+
>
150+
<Text variant='title'>{messages.noSubmissions}</Text>
151+
<Text variant='body' color='subdued'>
152+
{messages.beFirst}
22153
</Text>
23154
</Flex>
24155
)

packages/mobile/src/screens/track-screen/TrackScreenLineup.tsx

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { useCallback } from 'react'
22

3-
import { useTrackPageLineup } from '@audius/common/api'
3+
import { useRemixContest, useTrackPageLineup } from '@audius/common/api'
44
import { trackPageMessages as messages } from '@audius/common/messages'
55
import type { ID, User } from '@audius/common/models'
66
import { useFocusEffect } from '@react-navigation/native'
@@ -50,6 +50,8 @@ export const TrackScreenLineup = ({
5050
data,
5151
loadCachedDataIntoLineup
5252
} = useTrackPageLineup({ trackId, disableAutomaticCacheHandling: true })
53+
const { data: remixContest } = useRemixContest(trackId)
54+
const isRemixContest = !!remixContest
5355

5456
useFocusEffect(
5557
useCallback(() => {
@@ -166,8 +168,8 @@ export const TrackScreenLineup = ({
166168

167169
return (
168170
<Flex direction='column' gap='2xl'>
169-
{renderRemixParentSection()}
170-
{renderRemixesSection()}
171+
{!isRemixContest ? renderRemixParentSection() : null}
172+
{!isRemixContest ? renderRemixesSection() : null}
171173
{renderMoreBySection()}
172174
{renderRecommendedSection()}
173175
</Flex>

0 commit comments

Comments
 (0)