Fix editing playlist tracks
This commit is contained in:
parent
b04b2ece50
commit
c897ee0771
|
@ -0,0 +1 @@
|
||||||
|
Fix editing playlist tracks (#1362)
|
|
@ -29,7 +29,7 @@ const props = defineProps<Props>()
|
||||||
const { playlistTracks, playlist } = useVModels(props, emit)
|
const { playlistTracks, playlist } = useVModels(props, emit)
|
||||||
|
|
||||||
const errors = ref([] as string[])
|
const errors = ref([] as string[])
|
||||||
const duplicateTrackAddInfo = ref<APIErrorResponse | null>(null)
|
const duplicateTrackAddInfo = ref<{ tracks: string[] }>()
|
||||||
const showDuplicateTrackAddConfirmation = ref(false)
|
const showDuplicateTrackAddConfirmation = ref(false)
|
||||||
|
|
||||||
const { tracks: queueTracks } = useQueue()
|
const { tracks: queueTracks } = useQueue()
|
||||||
|
@ -57,10 +57,10 @@ const labels = computed(() => ({
|
||||||
const isLoading = ref(false)
|
const isLoading = ref(false)
|
||||||
const status = computed(() => isLoading.value
|
const status = computed(() => isLoading.value
|
||||||
? 'loading'
|
? 'loading'
|
||||||
: errors.value.length
|
|
||||||
? 'errored'
|
|
||||||
: showDuplicateTrackAddConfirmation.value
|
: showDuplicateTrackAddConfirmation.value
|
||||||
? 'confirmDuplicateAdd'
|
? 'confirmDuplicateAdd'
|
||||||
|
: errors.value.length > 0
|
||||||
|
? 'errored'
|
||||||
: 'saved'
|
: 'saved'
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -70,18 +70,11 @@ const responseHandlers = {
|
||||||
showDuplicateTrackAddConfirmation.value = false
|
showDuplicateTrackAddConfirmation.value = false
|
||||||
},
|
},
|
||||||
errored (error: BackendError): void {
|
errored (error: BackendError): void {
|
||||||
const { backendErrors, rawPayload } = error
|
showDuplicateTrackAddConfirmation.value = false
|
||||||
// if backendErrors isn't populated (e.g. duplicate track exceptions raised by
|
|
||||||
// the playlist model), read directly from the response
|
|
||||||
// TODO (wvffle): Check if such case exists after rewrite
|
|
||||||
if (error.rawPayload?.playlist) {
|
|
||||||
error.backendErrors = error.rawPayload.playlist as string[]
|
|
||||||
error.rawPayload = undefined
|
|
||||||
return this.errored(error)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (backendErrors.length === 1 && backendErrors[0] === 'Tracks already exist in playlist') {
|
const { backendErrors, rawPayload = {} } = error
|
||||||
duplicateTrackAddInfo.value = rawPayload ?? null
|
if (backendErrors.length === 1 && backendErrors[0] === 'Tracks Already Exist In Playlist') {
|
||||||
|
duplicateTrackAddInfo.value = ((rawPayload.playlist as APIErrorResponse).non_field_errors as APIErrorResponse)[0] as { tracks: string[] }
|
||||||
showDuplicateTrackAddConfirmation.value = true
|
showDuplicateTrackAddConfirmation.value = true
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -90,6 +83,12 @@ const responseHandlers = {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const fetchTracks = async () => {
|
||||||
|
// NOTE: This is handled by other functions and never used directly
|
||||||
|
const response = await axios.get(`playlists/${playlist.value?.id}/tracks/`)
|
||||||
|
playlistTracks.value = response.data.results
|
||||||
|
}
|
||||||
|
|
||||||
const store = useStore()
|
const store = useStore()
|
||||||
const reorder = async ({ oldIndex: from, newIndex: to }: { oldIndex: number, newIndex: number }) => {
|
const reorder = async ({ oldIndex: from, newIndex: to }: { oldIndex: number, newIndex: number }) => {
|
||||||
isLoading.value = true
|
isLoading.value = true
|
||||||
|
@ -111,7 +110,10 @@ const removePlaylistTrack = async (index: number) => {
|
||||||
try {
|
try {
|
||||||
tracks.value.splice(index, 1)
|
tracks.value.splice(index, 1)
|
||||||
await axios.post(`playlists/${playlist.value?.id}/remove/`, { index })
|
await axios.post(`playlists/${playlist.value?.id}/remove/`, { index })
|
||||||
await store.dispatch('playlists/fetchOwn')
|
await Promise.all([
|
||||||
|
store.dispatch('playlists/fetchOwn'),
|
||||||
|
fetchTracks()
|
||||||
|
])
|
||||||
responseHandlers.success()
|
responseHandlers.success()
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
responseHandlers.errored(error as BackendError)
|
responseHandlers.errored(error as BackendError)
|
||||||
|
@ -125,7 +127,7 @@ const clearPlaylist = async () => {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
tracks.value = []
|
tracks.value = []
|
||||||
await axios.post(`playlists/${playlist.value?.id}/clear/`)
|
await axios.delete(`playlists/${playlist.value?.id}/clear/`)
|
||||||
await store.dispatch('playlists/fetchOwn')
|
await store.dispatch('playlists/fetchOwn')
|
||||||
responseHandlers.success()
|
responseHandlers.success()
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
@ -145,7 +147,10 @@ const insertMany = async (insertedTracks: Track[], allowDuplicates: boolean) =>
|
||||||
})
|
})
|
||||||
|
|
||||||
tracks.value.push(...response.data.results)
|
tracks.value.push(...response.data.results)
|
||||||
await store.dispatch('playlists/fetchOwn')
|
await Promise.all([
|
||||||
|
store.dispatch('playlists/fetchOwn'),
|
||||||
|
fetchTracks()
|
||||||
|
])
|
||||||
responseHandlers.success()
|
responseHandlers.success()
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
responseHandlers.errored(error as BackendError)
|
responseHandlers.errored(error as BackendError)
|
||||||
|
@ -185,8 +190,8 @@ const insertMany = async (insertedTracks: Track[], allowDuplicates: boolean) =>
|
||||||
>
|
>
|
||||||
<ul class="list">
|
<ul class="list">
|
||||||
<li
|
<li
|
||||||
v-for="(error, key) in errors"
|
v-for="error in errors"
|
||||||
:key="key"
|
:key="error"
|
||||||
>
|
>
|
||||||
{{ error }}
|
{{ error }}
|
||||||
</li>
|
</li>
|
||||||
|
@ -206,8 +211,8 @@ const insertMany = async (insertedTracks: Track[], allowDuplicates: boolean) =>
|
||||||
</p>
|
</p>
|
||||||
<ul class="ui relaxed divided list duplicate-tracks-list">
|
<ul class="ui relaxed divided list duplicate-tracks-list">
|
||||||
<li
|
<li
|
||||||
v-for="(track, key) in duplicateTrackAddInfo?.tracks ?? []"
|
v-for="track in duplicateTrackAddInfo?.tracks ?? []"
|
||||||
:key="key"
|
:key="track"
|
||||||
class="ui item"
|
class="ui item"
|
||||||
>
|
>
|
||||||
{{ track }}
|
{{ track }}
|
||||||
|
|
Loading…
Reference in New Issue