Fix editing playlist tracks

This commit is contained in:
wvffle 2022-09-13 11:00:38 +00:00 committed by Ciarán Ainsworth
parent b04b2ece50
commit c897ee0771
2 changed files with 29 additions and 23 deletions

View File

@ -0,0 +1 @@
Fix editing playlist tracks (#1362)

View File

@ -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 }}