diff --git a/front/src/App.vue b/front/src/App.vue
index 4bc357c44..0db4ba1b4 100644
--- a/front/src/App.vue
+++ b/front/src/App.vue
@@ -1,22 +1,23 @@
diff --git a/front/src/components/library/Albums.vue b/front/src/components/library/Albums.vue
index afec15546..6fb0d84b5 100644
--- a/front/src/components/library/Albums.vue
+++ b/front/src/components/library/Albums.vue
@@ -2,19 +2,23 @@
import type { RouteWithPreferences, OrderingField } from '~/store/ui'
import type { OrderingProps } from '~/composables/useOrdering'
-import qs from 'qs'
-import axios from 'axios'
-import $ from 'jquery'
import { onBeforeRouteUpdate, useRouter } from 'vue-router'
import { computed, onMounted, reactive, ref, watch } from 'vue'
import { useGettext } from 'vue3-gettext'
+import { useStore } from '~/store'
+
+import axios from 'axios'
+import $ from 'jquery'
+import qs from 'qs'
+
+import TagsSelector from '~/components/library/TagsSelector.vue'
import AlbumCard from '~/components/audio/album/Card.vue'
import Pagination from '~/components/vui/Pagination.vue'
-import TagsSelector from '~/components/library/TagsSelector.vue'
-import useLogger from '~/composables/useLogger'
+
import useSharedLabels from '~/composables/locale/useSharedLabels'
+import useErrorHandler from '~/composables/useErrorHandler'
import useOrdering from '~/composables/useOrdering'
-import { useStore } from '~/store'
+import useLogger from '~/composables/useLogger'
interface Props extends OrderingProps {
defaultPage?: number
@@ -91,7 +95,7 @@ const fetchData = async () => {
result.value = response.data
} catch (error) {
- // TODO (wvffle): Handle error
+ useErrorHandler(error as Error)
result.value = null
} finally {
logger.timeEnd('Fetching albums')
diff --git a/front/src/components/library/ArtistDetail.vue b/front/src/components/library/ArtistDetail.vue
index 209c415e2..9d2594c92 100644
--- a/front/src/components/library/ArtistDetail.vue
+++ b/front/src/components/library/ArtistDetail.vue
@@ -7,9 +7,11 @@ import { useStore } from '~/store'
import axios from 'axios'
-import AlbumCard from '~/components/audio/album/Card.vue'
-import TrackTable from '~/components/audio/track/Table.vue'
import LibraryWidget from '~/components/federation/LibraryWidget.vue'
+import TrackTable from '~/components/audio/track/Table.vue'
+import AlbumCard from '~/components/audio/album/Card.vue'
+
+import useErrorHandler from '~/composables/useErrorHandler'
interface Props {
object: Artist
@@ -42,7 +44,7 @@ const loadMoreAlbums = async () => {
additionalAlbums.push(...additionalAlbums.concat(response.data.results))
loadMoreAlbumsUrl.value = response.data.next
} catch (error) {
- // TODO (wvffle): Handle error
+ useErrorHandler(error as Error)
}
isLoadingMoreAlbums.value = false
diff --git a/front/src/components/library/Artists.vue b/front/src/components/library/Artists.vue
index a8ea2a136..b3f24d95e 100644
--- a/front/src/components/library/Artists.vue
+++ b/front/src/components/library/Artists.vue
@@ -2,20 +2,23 @@
import type { RouteWithPreferences, OrderingField } from '~/store/ui'
import type { OrderingProps } from '~/composables/useOrdering'
-import qs from 'qs'
-import axios from 'axios'
-import $ from 'jquery'
-
-import ArtistCard from '~/components/audio/artist/Card.vue'
-import Pagination from '~/components/vui/Pagination.vue'
-import TagsSelector from '~/components/library/TagsSelector.vue'
-import useLogger from '~/composables/useLogger'
-import useSharedLabels from '~/composables/locale/useSharedLabels'
import { computed, reactive, ref, watch, onMounted } from 'vue'
+import { onBeforeRouteUpdate, useRouter } from 'vue-router'
import { useGettext } from 'vue3-gettext'
import { useStore } from '~/store'
+
+import axios from 'axios'
+import $ from 'jquery'
+import qs from 'qs'
+
+import TagsSelector from '~/components/library/TagsSelector.vue'
+import ArtistCard from '~/components/audio/artist/Card.vue'
+import Pagination from '~/components/vui/Pagination.vue'
+
+import useSharedLabels from '~/composables/locale/useSharedLabels'
+import useErrorHandler from '~/composables/useErrorHandler'
import useOrdering from '~/composables/useOrdering'
-import { onBeforeRouteUpdate, useRouter } from 'vue-router'
+import useLogger from '~/composables/useLogger'
interface Props extends OrderingProps {
defaultPage?: number
@@ -95,7 +98,7 @@ const fetchData = async () => {
result.value = response.data
} catch (error) {
- // TODO (wvffle): Handle error
+ useErrorHandler(error as Error)
result.value = null
} finally {
logger.timeEnd('Fetching artists')
diff --git a/front/src/components/library/EditCard.vue b/front/src/components/library/EditCard.vue
index 8cc85a89f..79cbb166d 100644
--- a/front/src/components/library/EditCard.vue
+++ b/front/src/components/library/EditCard.vue
@@ -11,6 +11,7 @@ import { useStore } from '~/store'
import axios from 'axios'
import useEditConfigs from '~/composables/moderation/useEditConfigs'
+import useErrorHandler from '~/composables/useErrorHandler'
interface Emits {
(e: 'approved', isApproved: boolean): void
@@ -126,7 +127,7 @@ const remove = async () => {
await axios.delete(`mutations/${props.obj.uuid}/`)
emit('deleted')
} catch (error) {
- // TODO (wvffle): Handle error
+ useErrorHandler(error as Error)
}
isLoading.value = false
@@ -144,7 +145,7 @@ const approve = async (approved: boolean) => {
emit('approved', approved)
store.commit('ui/incrementNotifications', { count: -1, type: 'pendingReviewEdits' })
} catch (error) {
- // TODO (wvffle): Handle error
+ useErrorHandler(error as Error)
}
isLoading.value = false
diff --git a/front/src/components/library/EditDetail.vue b/front/src/components/library/EditDetail.vue
index fee742306..016ff13b0 100644
--- a/front/src/components/library/EditDetail.vue
+++ b/front/src/components/library/EditDetail.vue
@@ -2,11 +2,15 @@
import type { EditObject, EditObjectType } from '~/composables/moderation/useEditConfigs'
import type { ReviewState } from '~/types'
-import axios from 'axios'
-import useEditConfigs from '~/composables/moderation/useEditConfigs'
-import EditCard from '~/components/library/EditCard.vue'
import { computed, ref } from 'vue'
+import axios from 'axios'
+
+import EditCard from '~/components/library/EditCard.vue'
+
+import useEditConfigs from '~/composables/moderation/useEditConfigs'
+import useErrorHandler from '~/composables/useErrorHandler'
+
interface Props {
object: EditObject
objectType: EditObjectType
@@ -32,7 +36,7 @@ const fetchData = async () => {
const response = await axios.get(`mutations/${props.editId}/`)
obj.value = response.data
} catch (error) {
- // TODO (wvffle): Handle error
+ useErrorHandler(error as Error)
} finally {
isLoading.value = false
}
diff --git a/front/src/components/library/FileUpload.vue b/front/src/components/library/FileUpload.vue
index 059e73948..0c14b2d21 100644
--- a/front/src/components/library/FileUpload.vue
+++ b/front/src/components/library/FileUpload.vue
@@ -12,12 +12,14 @@ import { useStore } from '~/store'
import axios from 'axios'
import LibraryFilesTable from '~/views/content/libraries/FilesTable.vue'
-import useWebSocketHandler from '~/composables/useWebSocketHandler'
-import updateQueryString from '~/composables/updateQueryString'
import FileUploadWidget from './FileUploadWidget.vue'
import FsBrowser from './FsBrowser.vue'
import FsLogs from './FsLogs.vue'
+import useWebSocketHandler from '~/composables/useWebSocketHandler'
+import updateQueryString from '~/composables/updateQueryString'
+import useErrorHandler from '~/composables/useErrorHandler'
+
interface Emits {
(e: 'uploads-finished', delta: number):void
}
@@ -111,7 +113,7 @@ const fetchStatus = async () => {
uploads[status as keyof typeof uploads] = response.data.count
} catch (error) {
- // TODO (wvffle): Handle error
+ useErrorHandler(error as Error)
}
}
}
@@ -184,7 +186,7 @@ const fetchQuota = async () => {
const response = await axios.get('users/me/')
quotaStatus.value = response.data.quota_status
} catch (error) {
- // TODO (wvffle): Handle error
+ useErrorHandler(error as Error)
}
isLoadingQuota.value = false
@@ -216,7 +218,7 @@ const fetchFilesystem = async (updateLoading: boolean) => {
const response = await axios.get('libraries/fs-import', { params: { path: fsPath.join('/') } })
fsStatus.value = response.data
} catch (error) {
- // TODO (wvffle): Handle error
+ useErrorHandler(error as Error)
}
if (updateLoading) isLoadingFs.value = false
@@ -252,7 +254,7 @@ const cancelFsScan = async () => {
await axios.delete('libraries/fs-import')
fetchFilesystem(false)
} catch (error) {
- // TODO (wvffle): Handle error
+ useErrorHandler(error as Error)
}
}
diff --git a/front/src/components/library/Home.vue b/front/src/components/library/Home.vue
index ceeb1e43a..bbed52395 100644
--- a/front/src/components/library/Home.vue
+++ b/front/src/components/library/Home.vue
@@ -1,12 +1,16 @@
diff --git a/front/src/views/admin/Settings.vue b/front/src/views/admin/Settings.vue
index ee8c0c1b3..6cdc74db1 100644
--- a/front/src/views/admin/Settings.vue
+++ b/front/src/views/admin/Settings.vue
@@ -4,12 +4,14 @@ import type { SettingsGroup as SettingsGroupType } from '~/types'
import axios from 'axios'
import $ from 'jquery'
+import { ref, nextTick, onMounted, computed, watch } from 'vue'
+import { useCurrentElement } from '@vueuse/core'
+import { useGettext } from 'vue3-gettext'
+import { useRoute } from 'vue-router'
+
import SettingsGroup from '~/components/admin/SettingsGroup.vue'
-import { useCurrentElement } from '@vueuse/core'
-import { ref, nextTick, onMounted, computed, watch } from 'vue'
-import { useRoute } from 'vue-router'
-import { useGettext } from 'vue3-gettext'
+import useErrorHandler from '~/composables/useErrorHandler'
const current = ref()
const settingsData = ref()
@@ -150,7 +152,7 @@ const fetchSettings = async () => {
const response = await axios.get('instance/admin/settings/')
settingsData.value = response.data
} catch (error) {
- // TODO (wvffle): Handle error
+ useErrorHandler(error as Error)
}
isLoading.value = false
diff --git a/front/src/views/admin/library/TrackDetail.vue b/front/src/views/admin/library/TrackDetail.vue
index 853b5d936..6123e8427 100644
--- a/front/src/views/admin/library/TrackDetail.vue
+++ b/front/src/views/admin/library/TrackDetail.vue
@@ -1,13 +1,16 @@
diff --git a/front/src/views/playlists/List.vue b/front/src/views/playlists/List.vue
index 1317d82c8..98994f25b 100644
--- a/front/src/views/playlists/List.vue
+++ b/front/src/views/playlists/List.vue
@@ -4,15 +4,18 @@ import type { OrderingProps } from '~/composables/useOrdering'
import axios from 'axios'
import $ from 'jquery'
-import { computed, ref, watch, onMounted } from 'vue'
+
import { useRouter, onBeforeRouteUpdate } from 'vue-router'
+import { computed, ref, watch, onMounted } from 'vue'
import { useGettext } from 'vue3-gettext'
import PlaylistCardList from '~/components/playlists/CardList.vue'
import Pagination from '~/components/vui/Pagination.vue'
+
import useSharedLabels from '~/composables/locale/useSharedLabels'
-import useLogger from '~/composables/useLogger'
+import useErrorHandler from '~/composables/useErrorHandler'
import useOrdering from '~/composables/useOrdering'
+import useLogger from '~/composables/useLogger'
interface Props extends OrderingProps {
defaultPage?: number
@@ -79,7 +82,7 @@ const fetchData = async () => {
result.value = response.data
} catch (error) {
- // TODO (wvffle): Handle error
+ useErrorHandler(error as Error)
result.value = null
} finally {
logger.timeEnd('Fetching albums')
diff --git a/front/src/views/radios/Detail.vue b/front/src/views/radios/Detail.vue
index 192923988..7657098c5 100644
--- a/front/src/views/radios/Detail.vue
+++ b/front/src/views/radios/Detail.vue
@@ -1,14 +1,18 @@