Skip to content

Commit e6374bc

Browse files
[PAY-3282] Prevent publishing 0 length playlist (#9328)
1 parent b799fcb commit e6374bc

File tree

2 files changed

+19
-4
lines changed

2 files changed

+19
-4
lines changed

packages/web/src/components/edit-collection/EditCollectionForm.tsx

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,8 @@ export const EditCollectionForm = (props: EditCollectionFormProps) => {
6262
const {
6363
playlist_id,
6464
is_private: initiallyHidden,
65-
is_scheduled_release: isInitiallyScheduled
65+
is_scheduled_release: isInitiallyScheduled,
66+
playlist_contents: initialContents
6667
} = initialValues
6768

6869
const [isDeleteConfirmationOpen, setIsDeleteConfirmationOpen] =
@@ -157,6 +158,12 @@ export const EditCollectionForm = (props: EditCollectionFormProps) => {
157158
<VisibilityField
158159
entityType={isAlbum ? 'album' : 'playlist'}
159160
isUpload={isUpload}
161+
isPublishable={
162+
isAlbum ||
163+
(!isAlbum &&
164+
(initialContents?.track_ids?.length ?? 1) > 0 &&
165+
!isUpload)
166+
}
160167
/>
161168
) : (
162169
<ReleaseDateFieldLegacy />

packages/web/src/components/edit/fields/visibility/VisibilityField.tsx

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,14 +30,16 @@ import { mergeReleaseDateValues } from './mergeReleaseDateValues'
3030

3131
const messages = {
3232
...visibilityMessages,
33-
scheduled: (date: string) => `Scheduled for ${formatCalendarTime(date)}`
33+
scheduled: (date: string) => `Scheduled for ${formatCalendarTime(date)}`,
34+
emptyPlaylistTooltipText: 'You must add at least 1 song.'
3435
}
3536

3637
type VisibilityType = 'scheduled' | 'public' | 'hidden'
3738

3839
type VisibilityFieldProps = {
3940
entityType: 'track' | 'album' | 'playlist'
4041
isUpload: boolean
42+
isPublishable?: boolean
4143
}
4244

4345
const visibilitySchema = z
@@ -76,7 +78,7 @@ const visibilitySchema = z
7678
)
7779

7880
export const VisibilityField = (props: VisibilityFieldProps) => {
79-
const { entityType, isUpload } = props
81+
const { entityType, isUpload, isPublishable = true } = props
8082
const useEntityField = entityType === 'track' ? useTrackField : useField
8183
const [
8284
{ value: isHidden },
@@ -179,6 +181,7 @@ export const VisibilityField = (props: VisibilityFieldProps) => {
179181
<VisibilityMenuFields
180182
entityType={entityType}
181183
initiallyPublic={!initiallyHidden && !isUpload}
184+
isPublishable={isPublishable}
182185
/>
183186
}
184187
/>
@@ -188,6 +191,7 @@ export const VisibilityField = (props: VisibilityFieldProps) => {
188191
type VisibilityMenuFieldsProps = {
189192
entityType: 'track' | 'album' | 'playlist'
190193
initiallyPublic?: boolean
194+
isPublishable?: boolean
191195
}
192196

193197
const VisibilityMenuFields = (props: VisibilityMenuFieldsProps) => {
@@ -197,7 +201,7 @@ const VisibilityMenuFields = (props: VisibilityMenuFieldsProps) => {
197201
const { isEnabled: isPaidScheduledEnabled } = useFeatureFlag(
198202
FeatureFlags.PAID_SCHEDULED
199203
)
200-
const { initiallyPublic, entityType } = props
204+
const { initiallyPublic, isPublishable = true, entityType } = props
201205
const [field] = useField<VisibilityType>('visibilityType')
202206

203207
return (
@@ -206,6 +210,10 @@ const VisibilityMenuFields = (props: VisibilityMenuFieldsProps) => {
206210
value='public'
207211
label={messages.public}
208212
description={messages.publicDescription}
213+
disabled={!isPublishable}
214+
tooltipText={
215+
isPublishable ? undefined : messages.emptyPlaylistTooltipText
216+
}
209217
/>
210218
<ModalRadioItem
211219
value='hidden'

0 commit comments

Comments
 (0)