147 lines
3.7 KiB
TypeScript
147 lines
3.7 KiB
TypeScript
import type { Track, Artist, Album, Playlist, Library, Channel, Actor, ArtistCredit } from '~/types'
|
|
import type { components } from '~/generated/types'
|
|
|
|
import { i18n } from '~/init/locale'
|
|
|
|
import store from '~/store'
|
|
|
|
const { t } = i18n.global
|
|
|
|
interface Objects {
|
|
track?: Track | null
|
|
album?: Album | components['schemas']['TrackAlbum'] | null
|
|
artist?: Artist | components['schemas']['ArtistWithAlbums'] | components["schemas"]["SimpleChannelArtist"] | null
|
|
artistCredit?: ArtistCredit[] | null
|
|
playlist?: Playlist | null
|
|
account?: Actor | components['schemas']['APIActor'] | null
|
|
library?: Library | null
|
|
channel?: Channel | null
|
|
}
|
|
|
|
interface ReportableObject {
|
|
label: string,
|
|
target: {
|
|
type: keyof Objects
|
|
label: string
|
|
typeLabel: string
|
|
_obj: Objects[keyof Objects]
|
|
|
|
full_username?: string
|
|
id?: number
|
|
uuid?: string
|
|
}
|
|
}
|
|
|
|
const getReportableObjects = ({ track, album, artist, artistCredit, playlist, account, library, channel }: Objects) => {
|
|
const reportableObjs: ReportableObject[] = []
|
|
|
|
if (account) {
|
|
reportableObjs.push({
|
|
label: t('composables.moderation.useReport.account.label', { username: account.preferred_username }),
|
|
target: {
|
|
type: 'account',
|
|
_obj: account,
|
|
full_username: account.full_username,
|
|
label: account.full_username,
|
|
typeLabel: t('composables.moderation.useReport.account.typeLabel')
|
|
}
|
|
})
|
|
}
|
|
|
|
if (track) {
|
|
reportableObjs.push({
|
|
label: t('composables.moderation.useReport.track.label'),
|
|
target: {
|
|
type: 'track',
|
|
id: track.id,
|
|
_obj: track,
|
|
label: track.title,
|
|
typeLabel: t('composables.moderation.useReport.track.typeLabel')
|
|
}
|
|
})
|
|
|
|
album = track.album
|
|
artistCredit = track.artist_credit
|
|
}
|
|
|
|
if (album) {
|
|
reportableObjs.push({
|
|
label: t('composables.moderation.useReport.album.label'),
|
|
target: {
|
|
type: 'album',
|
|
id: album.id,
|
|
label: album.title,
|
|
_obj: album,
|
|
typeLabel: t('composables.moderation.useReport.album.typeLabel')
|
|
}
|
|
})
|
|
|
|
if (!artist) {
|
|
artistCredit = album.artist_credit
|
|
}
|
|
}
|
|
|
|
if (channel) {
|
|
reportableObjs.push({
|
|
label: t('composables.moderation.useReport.channel.label'),
|
|
target: {
|
|
type: 'channel',
|
|
uuid: channel.uuid,
|
|
label: channel.artist?.name ?? t('composables.moderation.useReport.artist.unknownLabel'),
|
|
_obj: channel,
|
|
typeLabel: t('composables.moderation.useReport.channel.typeLabel')
|
|
}
|
|
})
|
|
} else if (artistCredit) {
|
|
for (const ac of artistCredit) {
|
|
reportableObjs.push({
|
|
label: t('composables.moderation.useReport.artist.label'),
|
|
target: {
|
|
type: 'artist',
|
|
id: ac.artist.id,
|
|
label: ac.artist.name,
|
|
_obj: artist,
|
|
typeLabel: t('composables.moderation.useReport.artist.typeLabel')
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
if (playlist) {
|
|
reportableObjs.push({
|
|
label: t('composables.moderation.useReport.playlist.label'),
|
|
target: {
|
|
type: 'playlist',
|
|
id: playlist.uuid,
|
|
label: playlist.name,
|
|
_obj: playlist,
|
|
typeLabel: t('composables.moderation.useReport.playlist.typeLabel')
|
|
}
|
|
})
|
|
}
|
|
|
|
if (library) {
|
|
reportableObjs.push({
|
|
label: t('composables.moderation.useReport.library.label'),
|
|
target: {
|
|
type: 'library',
|
|
uuid: library.uuid,
|
|
label: library.name,
|
|
_obj: library,
|
|
typeLabel: t('composables.moderation.useReport.library.typeLabel')
|
|
}
|
|
})
|
|
}
|
|
|
|
return reportableObjs
|
|
}
|
|
|
|
const report = (obj: ReportableObject) => {
|
|
store.dispatch('moderation/report', obj.target)
|
|
}
|
|
|
|
export default () => ({
|
|
getReportableObjects,
|
|
report
|
|
})
|