diff --git a/packages/common/src/models/Collection.ts b/packages/common/src/models/Collection.ts
index 052c53d4fcd..2f197c510db 100644
--- a/packages/common/src/models/Collection.ts
+++ b/packages/common/src/models/Collection.ts
@@ -58,6 +58,7 @@ export type CollectionMetadata = {
playlist_image_sizes_multihash?: string
offline?: OfflineCollectionMetadata
local?: boolean
+ release_date?: string
}
export type CollectionDownloadReason = { is_from_favorites: boolean }
diff --git a/packages/mobile/src/components/core/ContextualMenu.tsx b/packages/mobile/src/components/core/ContextualMenu.tsx
index fd9264ac1c5..cc0d2d2c0ba 100644
--- a/packages/mobile/src/components/core/ContextualMenu.tsx
+++ b/packages/mobile/src/components/core/ContextualMenu.tsx
@@ -26,6 +26,7 @@ export type ContextualMenuProps = {
error?: boolean
errorMessage?: string
lastItem?: boolean
+ formattedValue?: string
renderValue?: (value: any) => JSX.Element | null
}
@@ -66,7 +67,8 @@ export const ContextualMenu = (props: ContextualMenuProps) => {
errorMessage,
error,
lastItem,
- renderValue: renderValueProp
+ renderValue: renderValueProp,
+ formattedValue
} = props
const styles = useStyles()
@@ -120,7 +122,9 @@ export const ContextualMenu = (props: ContextualMenuProps) => {
/>
{hasValue ? (
- {renderValue(value)}
+
+ {renderValue(formattedValue ?? value)}
+
) : null}
{error && errorMessage ? (
diff --git a/packages/mobile/src/components/details-tile/DetailsTile.tsx b/packages/mobile/src/components/details-tile/DetailsTile.tsx
index 0ee139f315b..691234a3584 100644
--- a/packages/mobile/src/components/details-tile/DetailsTile.tsx
+++ b/packages/mobile/src/components/details-tile/DetailsTile.tsx
@@ -12,9 +12,11 @@ import {
getDogEarType,
isPremiumContentUSDCPurchaseGated
} from '@audius/common'
+import moment from 'moment'
import { TouchableOpacity, View } from 'react-native'
import { useSelector } from 'react-redux'
+import { Text as HarmonyText, IconCalendarMonth } from '@audius/harmony-native'
import IconPause from 'app/assets/images/iconPause.svg'
import IconPlay from 'app/assets/images/iconPlay.svg'
import IconRepeat from 'app/assets/images/iconRepeatOff.svg'
@@ -139,6 +141,12 @@ const useStyles = makeStyles(({ palette, spacing, typography }) => ({
},
link: {
color: palette.primary
+ },
+ releaseContainer: {
+ flexDirection: 'row',
+ alignItems: 'flex-start',
+ justifyContent: 'center',
+ gap: spacing(1)
}
}))
@@ -241,12 +249,14 @@ export const DetailsTile = ({
light()
onPressPreview?.()
}, [onPressPreview])
-
+ const isScheduledRelease = track?.release_date
+ ? moment(track.release_date).isAfter(moment())
+ : false
const renderDogEar = () => {
const dogEarType = getDogEarType({
isOwner,
premiumConditions,
- isUnlisted
+ isUnlisted: isUnlisted && !isScheduledRelease
})
return dogEarType ? : null
}
@@ -401,6 +411,18 @@ export const DetailsTile = ({
/>
) : null}
{showPreviewButton ? : null}
+ {isScheduledRelease && track?.release_date ? (
+
+
+
+ Release on{' '}
+ {moment
+ .utc(track.release_date)
+ .local()
+ .format('M/D/YY @ h:mm A')}
+
+
+ ) : null}
{
@@ -139,6 +142,7 @@ export const LineupTile = ({
isOwner={isOwner}
isArtistPick={isArtistPick}
showArtistPick={showArtistPick}
+ releaseDate={item?.release_date ? item.release_date : undefined}
/>
{children}
diff --git a/packages/mobile/src/components/lineup-tile/LineupTileStats.tsx b/packages/mobile/src/components/lineup-tile/LineupTileStats.tsx
index 06b6491470d..1d7ffb01ffe 100644
--- a/packages/mobile/src/components/lineup-tile/LineupTileStats.tsx
+++ b/packages/mobile/src/components/lineup-tile/LineupTileStats.tsx
@@ -13,9 +13,11 @@ import {
favoritesUserListActions,
isPremiumContentUSDCPurchaseGated
} from '@audius/common'
+import moment from 'moment'
import { View, TouchableOpacity } from 'react-native'
import { useDispatch } from 'react-redux'
+import { IconCalendarMonth } from '@audius/harmony-native'
import IconHeart from 'app/assets/images/iconHeart.svg'
import IconHidden from 'app/assets/images/iconHidden.svg'
import IconRepost from 'app/assets/images/iconRepost.svg'
@@ -108,6 +110,7 @@ type Props = {
isOwner: boolean
isArtistPick?: boolean
showArtistPick?: boolean
+ releaseDate?: string
}
export const LineupTileStats = ({
@@ -128,11 +131,12 @@ export const LineupTileStats = ({
premiumConditions,
isOwner,
isArtistPick,
- showArtistPick
+ showArtistPick,
+ releaseDate
}: Props) => {
const styles = useStyles()
const trackTileStyles = useTrackTileStyles()
- const { neutralLight4 } = useThemeColors()
+ const { neutralLight4, accentPurple } = useThemeColors()
const dispatch = useDispatch()
const navigation = useNavigation()
@@ -155,7 +159,7 @@ export const LineupTileStats = ({
)
const isReadonly = variant === 'readonly'
-
+ const isScheduledRelease = isUnlisted && moment(releaseDate).isAfter(moment())
return (
@@ -181,7 +185,7 @@ export const LineupTileStats = ({
) : null}
- {isUnlisted ? (
+ {isUnlisted && !isScheduledRelease ? (
) : null}
+ {isUnlisted && isScheduledRelease ? (
+
+
+
+ Releases{' '}
+ {moment.utc(releaseDate).local().format('M/D/YY @ h:mm A')}
+
+
+ ) : null}
{hasEngagement && !isUnlisted ? (
<>
diff --git a/packages/mobile/src/screens/edit-track-screen/EditTrackForm.tsx b/packages/mobile/src/screens/edit-track-screen/EditTrackForm.tsx
index 41bbd4d863d..3f1a7550dd7 100644
--- a/packages/mobile/src/screens/edit-track-screen/EditTrackForm.tsx
+++ b/packages/mobile/src/screens/edit-track-screen/EditTrackForm.tsx
@@ -1,6 +1,6 @@
import { useCallback } from 'react'
-import type { UploadTrack } from '@audius/common'
+import { FeatureFlags, type UploadTrack } from '@audius/common'
import { Keyboard } from 'react-native'
import { KeyboardAwareScrollView } from 'react-native-keyboard-aware-scroll-view'
import { useDispatch } from 'react-redux'
@@ -13,6 +13,7 @@ import { InputErrorMessage } from 'app/components/core/InputErrorMessage'
import { PickArtworkField, TextField } from 'app/components/fields'
import { useNavigation } from 'app/hooks/useNavigation'
import { useOneTimeDrawer } from 'app/hooks/useOneTimeDrawer'
+import { useFeatureFlag } from 'app/hooks/useRemoteConfig'
import { setVisibility } from 'app/store/drawers/slice'
import { makeStyles } from 'app/styles'
@@ -26,6 +27,7 @@ import {
TagField,
SubmenuList,
RemixSettingsField,
+ ReleaseDateField,
AdvancedOptionsField,
AccessAndSaleField
} from './fields'
@@ -92,6 +94,10 @@ export const EditTrackForm = (props: EditTrackFormProps) => {
}
}, [dirty, navigation, dispatch])
+ const { isEnabled: isScheduledReleasesEnabled } = useFeatureFlag(
+ FeatureFlags.SCHEDULED_RELEASES
+ )
+
return (
<>
{
+ {isScheduledReleasesEnabled ? : <>>}
diff --git a/packages/mobile/src/screens/edit-track-screen/EditTrackNavigator.tsx b/packages/mobile/src/screens/edit-track-screen/EditTrackNavigator.tsx
index 10501896cde..b2b7a6f9f1c 100644
--- a/packages/mobile/src/screens/edit-track-screen/EditTrackNavigator.tsx
+++ b/packages/mobile/src/screens/edit-track-screen/EditTrackNavigator.tsx
@@ -1,7 +1,9 @@
+import { FeatureFlags } from '@audius/common'
import { createNativeStackNavigator } from '@react-navigation/native-stack'
import { GatedContentUploadPromptDrawer } from 'app/components/gated-content-upload-prompt-drawer'
import { SupportersInfoDrawer } from 'app/components/supporters-info-drawer'
+import { useFeatureFlag } from 'app/hooks/useRemoteConfig'
import { useAppScreenOptions } from 'app/screens/app-screen/useAppScreenOptions'
import { EditTrackForm } from './EditTrackForm'
@@ -13,7 +15,8 @@ import {
LicenseTypeScreen,
RemixSettingsScreen,
SelectGenreScreen,
- SelectMoodScreen
+ SelectMoodScreen,
+ ReleaseDateScreen
} from './screens'
import { NFTCollectionsScreen } from './screens/NFTCollectionsScreen'
import type { EditTrackFormProps } from './types'
@@ -26,6 +29,9 @@ type EditTrackNavigatorProps = EditTrackFormProps
export const EditTrackNavigator = (props: EditTrackNavigatorProps) => {
const screenOptions = useAppScreenOptions(screenOptionOverrides)
+ const { isEnabled: isScheduledReleasesEnabled } = useFeatureFlag(
+ FeatureFlags.SCHEDULED_RELEASES
+ )
return (
<>
@@ -36,6 +42,9 @@ export const EditTrackNavigator = (props: EditTrackNavigatorProps) => {
+ {isScheduledReleasesEnabled ? (
+
+ ) : null}
moment(date).isSame(moment(), 'day')
+import { ContextualMenu } from 'app/components/core'
const messages = {
label: 'Release Date',
today: 'Today'
}
-const useStyles = makeStyles(({ spacing }) => ({
- root: {
- flexDirection: 'row',
- justifyContent: 'space-between',
- alignItems: 'center',
- paddingHorizontal: spacing(6),
- paddingVertical: spacing(2)
- },
- dateText: {
- textTransform: 'uppercase'
- },
- datePickerModal: {
- // Specific padding to hide the underlying "done" button with the "cancel" button
- paddingBottom: 37
- }
-}))
+export const ReleaseDateField = (props) => {
+ const [{ value }] = useField>('release_date')
-const ConfirmDateButton = (props: CustomConfirmButtonPropTypes) => {
- const { label, onPress } = props
return (
-
)
}
-
-const CancelDateButton = (props: CustomCancelButtonPropTypes) => {
- const { label, onPress } = props
- return (
-
- )
-}
-
-export const ReleaseDateField = () => {
- const styles = useStyles()
- const [{ value, onChange }] = useField>('release_date')
- const [isOpen, setIsOpen] = useState(false)
- const { primary } = useThemeColors()
- const theme = useThemeVariant()
- const maximumDate = useRef(new Date())
-
- const releaseDate = useMemo(
- () => (value ? new Date(value) : new Date()),
- [value]
- )
-
- const handlePress = useCallback(() => {
- setIsOpen(true)
- }, [])
-
- const handleClose = useCallback(() => {
- setIsOpen(false)
- }, [])
-
- const handleChange = useCallback(
- (selectedDate: Date) => {
- // This must be called first to prevent android date-picker
- // from showing up twice
- handleClose()
- const dateString = moment(selectedDate).toString()
- if (dateString) {
- onChange('release_date')(dateString)
- }
- },
- [onChange, handleClose]
- )
-
- return (
- <>
-
-
- {messages.label}
-
-
-
- {isToday(releaseDate)
- ? messages.today
- : moment(releaseDate).format('MM/DD/YY')}
-
-
-
-
- >
- )
-}
diff --git a/packages/mobile/src/screens/edit-track-screen/fields/ReleaseDateFieldLegacy.tsx b/packages/mobile/src/screens/edit-track-screen/fields/ReleaseDateFieldLegacy.tsx
new file mode 100644
index 00000000000..1bfe341da75
--- /dev/null
+++ b/packages/mobile/src/screens/edit-track-screen/fields/ReleaseDateFieldLegacy.tsx
@@ -0,0 +1,135 @@
+import { useCallback, useMemo, useRef, useState } from 'react'
+
+import type { Nullable } from '@audius/common'
+import { Theme } from '@audius/common'
+import { useField } from 'formik'
+import moment from 'moment'
+import { TouchableOpacity } from 'react-native-gesture-handler'
+import type {
+ CustomCancelButtonPropTypes,
+ CustomConfirmButtonPropTypes
+} from 'react-native-modal-datetime-picker'
+import DateTimePickerModal from 'react-native-modal-datetime-picker'
+
+import { Button, Pill, Text } from 'app/components/core'
+import { makeStyles } from 'app/styles'
+import { useThemeColors, useThemeVariant } from 'app/utils/theme'
+
+const isToday = (date: Date) => moment(date).isSame(moment(), 'day')
+
+const messages = {
+ label: 'Release Date',
+ today: 'Today'
+}
+
+const useStyles = makeStyles(({ spacing }) => ({
+ root: {
+ flexDirection: 'row',
+ justifyContent: 'space-between',
+ alignItems: 'center',
+ paddingHorizontal: spacing(6),
+ paddingVertical: spacing(2)
+ },
+ dateText: {
+ textTransform: 'uppercase'
+ },
+ datePickerModal: {
+ // Specific padding to hide the underlying "done" button with the "cancel" button
+ paddingBottom: 37
+ }
+}))
+
+const ConfirmDateButton = (props: CustomConfirmButtonPropTypes) => {
+ const { label, onPress } = props
+ return (
+
+ )
+}
+
+const CancelDateButton = (props: CustomCancelButtonPropTypes) => {
+ const { label, onPress } = props
+ return (
+
+ )
+}
+
+export const ReleaseDateFieldLegacy = () => {
+ const styles = useStyles()
+ const [{ value, onChange }] = useField>('release_date')
+ const [isOpen, setIsOpen] = useState(false)
+ const { primary } = useThemeColors()
+ const theme = useThemeVariant()
+ const maximumDate = useRef(new Date())
+
+ const releaseDate = useMemo(
+ () => (value ? new Date(value) : new Date()),
+ [value]
+ )
+
+ const handlePress = useCallback(() => {
+ setIsOpen(true)
+ }, [])
+
+ const handleClose = useCallback(() => {
+ setIsOpen(false)
+ }, [])
+
+ const handleChange = useCallback(
+ (selectedDate: Date) => {
+ // This must be called first to prevent android date-picker
+ // from showing up twice
+ handleClose()
+ const dateString = moment(selectedDate).toString()
+ if (dateString) {
+ onChange('release_date')(dateString)
+ }
+ },
+ [onChange, handleClose]
+ )
+
+ return (
+ <>
+
+
+ {messages.label}
+
+
+
+ {isToday(releaseDate)
+ ? messages.today
+ : moment(releaseDate).format('MM/DD/YY')}
+
+
+
+
+ >
+ )
+}
diff --git a/packages/mobile/src/screens/edit-track-screen/fields/index.ts b/packages/mobile/src/screens/edit-track-screen/fields/index.ts
index 9c51ebbd8be..613b632ff61 100644
--- a/packages/mobile/src/screens/edit-track-screen/fields/index.ts
+++ b/packages/mobile/src/screens/edit-track-screen/fields/index.ts
@@ -4,9 +4,10 @@ export * from './TagField'
export * from './SelectMoodField'
export * from './SubmenuList'
export * from './RemixSettingsField'
+export * from './ReleaseDateField'
+export * from './ReleaseDateFieldLegacy'
export * from './AdvancedOptionsField'
export * from './AccessAndSaleField'
export * from './SwitchField'
-export * from './ReleaseDateField'
export * from './IsrcIswcField'
export * from './LicenseTypeField'
diff --git a/packages/mobile/src/screens/edit-track-screen/screens/AdvancedOptionsScreen.tsx b/packages/mobile/src/screens/edit-track-screen/screens/AdvancedOptionsScreen.tsx
index f4e09203915..964e0aac680 100644
--- a/packages/mobile/src/screens/edit-track-screen/screens/AdvancedOptionsScreen.tsx
+++ b/packages/mobile/src/screens/edit-track-screen/screens/AdvancedOptionsScreen.tsx
@@ -1,13 +1,15 @@
+import { FeatureFlags } from '@audius/common'
import { View } from 'react-native'
import IconIndent from 'app/assets/images/iconIndent.svg'
+import { useFeatureFlag } from 'app/hooks/useRemoteConfig'
import { FormScreen } from '../components'
import {
IsrcField,
LicenseTypeField,
- ReleaseDateField,
- SubmenuList
+ SubmenuList,
+ ReleaseDateFieldLegacy
} from '../fields'
const messages = {
@@ -15,6 +17,10 @@ const messages = {
}
export const AdvancedOptionsScreen = () => {
+ const { isEnabled: isScheduledReleasesEnabled } = useFeatureFlag(
+ FeatureFlags.SCHEDULED_RELEASES
+ )
+
return (
{
variant='white'
>
-
+ {isScheduledReleasesEnabled ? null : }
diff --git a/packages/mobile/src/screens/edit-track-screen/screens/ReleaseDateScreen.tsx b/packages/mobile/src/screens/edit-track-screen/screens/ReleaseDateScreen.tsx
new file mode 100644
index 00000000000..65e11c9c63d
--- /dev/null
+++ b/packages/mobile/src/screens/edit-track-screen/screens/ReleaseDateScreen.tsx
@@ -0,0 +1,290 @@
+import { useCallback, useEffect, useState } from 'react'
+
+import type { Nullable } from '@audius/common'
+import { remixSettingsActions, removeNullable } from '@audius/common'
+import { useField } from 'formik'
+import moment from 'moment'
+import { Dimensions, View } from 'react-native'
+import DateTimePickerModal from 'react-native-modal-datetime-picker'
+import { useDispatch } from 'react-redux'
+
+import { IconCalendarMonth, Text } from '@audius/harmony-native'
+import { Button } from 'app/components/core'
+import { TextField } from 'app/components/fields'
+import { HelpCallout } from 'app/components/help-callout/HelpCallout'
+import { useNavigation } from 'app/hooks/useNavigation'
+import { makeStyles } from 'app/styles'
+import { useThemeColors } from 'app/utils/theme'
+
+import type { ListSelectionData } from './ListSelectionScreen'
+import { ListSelectionScreen } from './ListSelectionScreen'
+
+export enum ReleaseDateType {
+ RELEASE_NOW = 'RELEASE_NOW',
+ SCHEDULED_RELEASE = 'SCHEDULED_RELEASE'
+}
+
+const { reset } = remixSettingsActions
+
+const screenWidth = Dimensions.get('screen').width
+
+const messages = {
+ screenTitle: 'Release Date',
+ description:
+ 'Specify a release date for your music or schedule it to be released in the future.',
+ done: 'Done',
+ releaseNowRadio: 'Release immediately',
+ scheduleReleaseDateRadio: 'Schedule a release date',
+ futureReleaseHint:
+ 'Your scheduled track will become live on Audius on the date and time you’ve chosen above in your time zone.',
+ pastReleaseHint:
+ 'Setting a release date in the past will impact the order tracks appear on your profile.'
+}
+
+const useStyles = makeStyles(({ palette, spacing, typography }) => ({
+ todayPill: {
+ flexDirection: 'row',
+ borderRadius: 99,
+ backgroundColor: palette.secondary,
+ paddingHorizontal: 10,
+ paddingVertical: 2,
+ alignItems: 'center',
+ gap: spacing(1)
+ },
+ releaseNowContainer: {
+ flexDirection: 'row',
+ gap: spacing(4)
+ },
+ description: {
+ marginHorizontal: spacing(6),
+ marginTop: spacing(8),
+ marginBottom: spacing(1)
+ },
+ releaseDateInputContainer: {
+ paddingTop: spacing(4),
+ marginLeft: spacing(-10),
+ width: screenWidth - spacing(12)
+ },
+ releaseDateInput: {
+ marginTop: spacing(4)
+ }
+}))
+
+const data: ListSelectionData[] = [
+ {
+ label: ReleaseDateType.RELEASE_NOW,
+ value: ReleaseDateType.RELEASE_NOW,
+ disabled: false
+ },
+ {
+ label: ReleaseDateType.SCHEDULED_RELEASE,
+ value: ReleaseDateType.SCHEDULED_RELEASE,
+ disabled: false
+ }
+].filter(removeNullable)
+
+export const ScheduledReleaseRadioField = (props) => {
+ const { selected } = props
+ const { primary } = useThemeColors()
+ const styles = useStyles()
+
+ const [{ value: releaseDateValue }, , { setValue: setReleaseDateValue }] =
+ useField>('release_date')
+
+ let initIsDateOpen = false
+ if (!releaseDateValue && selected) {
+ initIsDateOpen = true
+ }
+
+ const [isDateOpen, setIsDateOpen] = useState(initIsDateOpen)
+ const [isTimeOpen, setIsTimeOpen] = useState(false)
+
+ const handleDateChange = useCallback(
+ (selectedDate: Date) => {
+ const newReleaseDate = moment(selectedDate).hour(0).minute(0).second(0)
+ setReleaseDateValue(newReleaseDate.toString())
+ setIsDateOpen(false)
+ },
+ [setReleaseDateValue, setIsDateOpen]
+ )
+ const handleTimeChange = useCallback(
+ (selectedTime) => {
+ const newReleaseDate = moment(selectedTime)
+ if (releaseDateValue) {
+ const releaseDateMoment = moment(releaseDateValue)
+ newReleaseDate
+ .year(releaseDateMoment.year())
+ .month(releaseDateMoment.month())
+ .day(releaseDateMoment.day())
+ }
+
+ setReleaseDateValue(newReleaseDate.toString())
+ setIsTimeOpen(false)
+ },
+ [setReleaseDateValue, setIsTimeOpen]
+ )
+
+ return (
+ <>
+
+
+ {messages.scheduleReleaseDateRadio}
+
+
+ {selected ? (
+ setIsDateOpen(true)}
+ noGutter
+ style={styles.releaseDateInput}
+ value={
+ releaseDateValue
+ ? moment(releaseDateValue).calendar(undefined, {
+ sameDay: '[Today]',
+ nextDay: '[Tomorrow]',
+ nextWeek: 'dddd',
+ lastDay: '[Yesterday]',
+ lastWeek: '[Last] dddd',
+ sameElse: 'M/D/YY' // This is where you format dates that don't fit in the above categories
+ })
+ : undefined
+ }
+ />
+ ) : null}
+ {selected &&
+ releaseDateValue &&
+ moment(releaseDateValue).isSameOrAfter(moment().startOf('day')) ? (
+ setIsTimeOpen(true)}
+ noGutter
+ style={styles.releaseDateInput}
+ value={
+ releaseDateValue
+ ? moment(releaseDateValue).format('h:mm A')
+ : undefined
+ }
+ />
+ ) : null}
+ setIsDateOpen(false)}
+ display='inline'
+ themeVariant={'light'}
+ isDarkModeEnabled={false}
+ accentColor={primary}
+ />
+ setIsTimeOpen(false)}
+ accentColor={primary}
+ />
+ {selected && releaseDateValue ? (
+
+ ) : null}
+
+
+ >
+ )
+}
+
+export const ReleaseNowRadioField = (props) => {
+ const { selected } = props
+ const [{ value: releaseDateValue }, , { setValue: setReleaseDateValue }] =
+ useField>('release_date')
+ const styles = useStyles()
+
+ useEffect(() => {
+ if (selected) {
+ setReleaseDateValue(null)
+ }
+ }, [selected, releaseDateValue, setReleaseDateValue])
+
+ return (
+
+
+ {messages.releaseNowRadio}
+
+ {selected ? (
+
+
+ Today
+
+ ) : null}
+
+ )
+}
+
+export const ReleaseDateScreen = () => {
+ const [{ value }] = useField>('release_date')
+
+ const [releaseDateType, setReleaseDateType] = useState(
+ value ? ReleaseDateType.SCHEDULED_RELEASE : ReleaseDateType.RELEASE_NOW
+ )
+
+ const styles = useStyles()
+
+ const items = {
+ [ReleaseDateType.RELEASE_NOW]: (
+
+ ),
+ [ReleaseDateType.SCHEDULED_RELEASE]: (
+
+ )
+ }
+ const navigation = useNavigation()
+ const dispatch = useDispatch()
+
+ const handleSubmit = useCallback(() => {
+ navigation.goBack()
+ dispatch(reset())
+ }, [navigation, dispatch])
+
+ return (
+ items[item.label]}
+ screenTitle={'Release Date'}
+ icon={IconCalendarMonth}
+ header={
+
+ {messages.description}
+
+ }
+ value={releaseDateType}
+ onChange={setReleaseDateType}
+ disableSearch
+ allowDeselect={false}
+ hideSelectionLabel
+ bottomSection={
+
+ }
+ />
+ )
+}
diff --git a/packages/mobile/src/screens/edit-track-screen/screens/index.ts b/packages/mobile/src/screens/edit-track-screen/screens/index.ts
index baa7727c91b..210262d9947 100644
--- a/packages/mobile/src/screens/edit-track-screen/screens/index.ts
+++ b/packages/mobile/src/screens/edit-track-screen/screens/index.ts
@@ -5,3 +5,4 @@ export * from './AdvancedOptionsScreen'
export * from './AccessAndSaleScreen'
export * from './IsrcIswcScreen'
export * from './LicenseTypeScreen'
+export * from './ReleaseDateScreen'
diff --git a/packages/mobile/src/screens/track-screen/TrackScreenDetailsTile.tsx b/packages/mobile/src/screens/track-screen/TrackScreenDetailsTile.tsx
index 37e26a5a0fa..81037e01124 100644
--- a/packages/mobile/src/screens/track-screen/TrackScreenDetailsTile.tsx
+++ b/packages/mobile/src/screens/track-screen/TrackScreenDetailsTile.tsx
@@ -272,9 +272,7 @@ export const TrackScreenDetailsTile = ({
{
isHidden: is_unlisted,
label: 'Released',
- value: release_date
- ? formatDate(release_date, 'ddd MMM DD YYYY HH:mm:ss')
- : formatDate(created_at, 'YYYY-MM-DD HH:mm:ss')
+ value: release_date ? formatDate(release_date) : formatDate(created_at)
},
{
icon: