Skip to content

Commit 4c35a80

Browse files
cursor[bot]cursoragentraymondjacobson
authored
Fix visibility copy for playlist edit privacy tile (#14076)
## Summary - fix incorrect visibility tile copy shown in edit flows for non-track entities - update web visibility field to compute title/description from `entityType` - update mobile visibility label/screen title to compute title from `entityType` ## Bug Playlists were showing track-specific copy in the Edit Playlist privacy tile (`Track Privacy` and track scheduling language), even though playlists cannot be scheduled. ## Fix - `packages/web/src/components/edit/fields/visibility/VisibilityField.tsx` - replaced static shared `title`/`description` usage with `entityType`-aware copy - playlists now show `Playlist Privacy` and description without scheduling text - `packages/mobile/src/components/edit/VisibilityField/VisibilityField.tsx` - updated contextual menu label to `entityType`-aware privacy title - `packages/mobile/src/components/edit/VisibilityField/VisibilityScreen.tsx` - updated form screen title to `entityType`-aware privacy title ## Validation - attempted targeted lint checks for edited files in web and mobile workspaces - environment is missing local `eslint` binary (`sh: 1: eslint: not found`), so lint could not be executed in this runner <div><a href="https://cursor.com/agents/bc-e3060d50-d639-567b-8e0b-410aa84af00b"><picture><source media="(prefers-color-scheme: dark)" srcset="https://cursor.com/assets/images/open-in-web-dark.png"><source media="(prefers-color-scheme: light)" srcset="https://cursor.com/assets/images/open-in-web-light.png"><img alt="Open in Web" width="114" height="28" src="https://cursor.com/assets/images/open-in-web-dark.png"></picture></a>&nbsp;<a href="https://cursor.com/automations/c63aa103-66df-4558-b31d-675358e5c6a1"><picture><source media="(prefers-color-scheme: dark)" srcset="https://cursor.com/assets/images/view-automation-dark.png"><source media="(prefers-color-scheme: light)" srcset="https://cursor.com/assets/images/view-automation-light.png"><img alt="View Automation" width="141" height="28" src="https://cursor.com/assets/images/view-automation-dark.png"></picture></a>&nbsp;</div> Co-authored-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: Ray Jacobson <raymondjacobson@users.noreply.github.com>
1 parent 64c29cc commit 4c35a80

File tree

3 files changed

+36
-14
lines changed

3 files changed

+36
-14
lines changed

packages/mobile/src/components/edit/VisibilityField/VisibilityField.tsx

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,17 @@ export const visibilityScreenName = 'Visibility'
88

99
const messages = {
1010
...visibilityMessages,
11+
title: (entityType: 'track' | 'album' | 'playlist') =>
12+
`${entityType === 'track' ? 'Track' : entityType === 'album' ? 'Album' : 'Playlist'} Privacy`,
1113
scheduled: (date: string) => `Scheduled for ${formatCalendarTime(date)}`
1214
}
1315

1416
export const VisibilityField = () => {
15-
const [{ value: entitiType }] = useField('entityType')
17+
const [{ value: entityType }] = useField<'track' | 'album' | 'playlist'>(
18+
'entityType'
19+
)
1620
const [{ value: isHidden }] = useField(
17-
entitiType === 'track' ? 'is_unlisted' : 'is_private'
21+
entityType === 'track' ? 'is_unlisted' : 'is_private'
1822
)
1923
const [{ value: isScheduledRelease }] = useField('is_scheduled_release')
2024
const [{ value: releaseDate }] = useField('release_date')
@@ -28,7 +32,7 @@ export const VisibilityField = () => {
2832

2933
return (
3034
<ContextualMenu
31-
label={messages.title}
35+
label={messages.title(entityType)}
3236
value={value}
3337
menuScreenName={visibilityScreenName}
3438
/>

packages/mobile/src/components/edit/VisibilityField/VisibilityScreen.tsx

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,15 @@ import { ScheduledReleaseDateField } from './ScheduledReleaseDateField'
1919

2020
type VisibilityType = 'scheduled' | 'public' | 'hidden'
2121

22+
const getMessages = (entityType: 'track' | 'album' | 'playlist') => ({
23+
...messages,
24+
title: `${entityType === 'track' ? 'Track' : entityType === 'album' ? 'Album' : 'Playlist'} Privacy`
25+
})
26+
2227
export const VisibilityScreen = () => {
2328
const { values, initialValues, setValues } = useFormikContext<FormValues>()
2429
const { entityType } = values
30+
const visibilityMessages = getMessages(entityType)
2531
const hiddenKey = entityType === 'track' ? 'is_unlisted' : 'is_private'
2632
const {
2733
[hiddenKey]: isHidden,
@@ -93,7 +99,7 @@ export const VisibilityScreen = () => {
9399

94100
return (
95101
<FormScreen
96-
title={messages.title}
102+
title={visibilityMessages.title}
97103
icon={IconVisibilityPublic}
98104
onSubmit={handleSubmit}
99105
variant='white'
@@ -105,21 +111,21 @@ export const VisibilityScreen = () => {
105111
>
106112
<ExpandableRadio
107113
value='public'
108-
label={messages.public}
109-
description={messages.publicDescription}
114+
label={visibilityMessages.public}
115+
description={visibilityMessages.publicDescription}
110116
/>
111117
<ExpandableRadio
112118
value='hidden'
113-
label={messages.hidden}
119+
label={visibilityMessages.hidden}
114120
icon={IconVisibilityHidden}
115-
description={messages.hiddenDescription}
121+
description={visibilityMessages.hiddenDescription}
116122
/>
117123
{!initiallyPublic &&
118124
(entityType === 'track' || entityType === 'album') ? (
119125
<ExpandableRadio
120126
value='scheduled'
121-
label={messages.scheduledRelease}
122-
description={messages.scheduledReleaseDescription}
127+
label={visibilityMessages.scheduledRelease}
128+
description={visibilityMessages.scheduledReleaseDescription}
123129
checkedContent={
124130
<ScheduledReleaseDateField
125131
releaseDate={releaseDate}

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

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,14 @@ import { mergeReleaseDateValues } from './mergeReleaseDateValues'
2727

2828
const messages = {
2929
...visibilityMessages,
30+
title: (entityType: 'track' | 'album' | 'playlist') =>
31+
`${entityType === 'track' ? 'Track' : entityType === 'album' ? 'Album' : 'Playlist'} Privacy`,
32+
description: (entityType: 'track' | 'album' | 'playlist') =>
33+
entityType === 'track'
34+
? 'Adjust your track’s visibility or schedule it for later release.'
35+
: entityType === 'album'
36+
? 'Adjust your album’s visibility or schedule it for later release.'
37+
: 'Adjust your playlist’s visibility.',
3038
scheduled: (date: string) => `Scheduled for ${formatCalendarTime(date)}`,
3139
emptyPlaylistTooltipText: 'You must add at least 1 song.'
3240
}
@@ -76,6 +84,8 @@ const visibilitySchema = z
7684

7785
export const VisibilityField = (props: VisibilityFieldProps) => {
7886
const { entityType, isUpload, isPublishable = true } = props
87+
const title = messages.title(entityType)
88+
const description = messages.description(entityType)
7989
const useEntityField = entityType === 'track' ? useTrackField : useField
8090
const [
8191
{ value: isHidden },
@@ -134,9 +144,9 @@ export const VisibilityField = (props: VisibilityFieldProps) => {
134144

135145
return (
136146
<ContextualMenu
137-
label={messages.title}
147+
label={title}
138148
icon={<IconVisibilityPublic />}
139-
description={messages.description}
149+
description={description}
140150
renderValue={renderValue}
141151
initialValues={initialValues}
142152
validationSchema={toFormikValidationSchema(visibilitySchema)}
@@ -177,6 +187,7 @@ export const VisibilityField = (props: VisibilityFieldProps) => {
177187
menuFields={
178188
<VisibilityMenuFields
179189
entityType={entityType}
190+
title={title}
180191
initiallyPublic={!initiallyHidden && !isUpload}
181192
isPublishable={isPublishable}
182193
/>
@@ -187,16 +198,17 @@ export const VisibilityField = (props: VisibilityFieldProps) => {
187198

188199
type VisibilityMenuFieldsProps = {
189200
entityType: 'track' | 'album' | 'playlist'
201+
title: string
190202
initiallyPublic?: boolean
191203
isPublishable?: boolean
192204
}
193205

194206
const VisibilityMenuFields = (props: VisibilityMenuFieldsProps) => {
195-
const { initiallyPublic, isPublishable = true, entityType } = props
207+
const { initiallyPublic, isPublishable = true, entityType, title } = props
196208
const [field] = useField<VisibilityType>('visibilityType')
197209

198210
return (
199-
<RadioGroup {...field} aria-label={messages.title}>
211+
<RadioGroup {...field} aria-label={title}>
200212
<ModalRadioItem
201213
value='public'
202214
label={messages.public}

0 commit comments

Comments
 (0)