import { useCallback, useEffect, useRef, useState } from 'react'
import { useDataProvider, useNotify, useRefresh } from 'react-admin'
import subsonic from '../subsonic'
export const useToggleLove = (resource, record = {}) => {
const [loading, setLoading] = useState(false)
const notify = useNotify()
const mountedRef = useRef(false)
useEffect(() => {
mountedRef.current = true
return () => {
mountedRef.current = false
}
}, [])
const dataProvider = useDataProvider()
const refresh = useRefresh()
const refreshRecord = useCallback(() => {
const isPlaylistTrack = !!record.mediaFileId
const target = isPlaylistTrack
? { resource: 'song', params: { id: record.mediaFileId } }
: { resource, params: { id: record.id } }
dataProvider
.getOne(target.resource, target.params)
.catch((e) => {
console.log('Error encountered: ' + e)
})
.finally(() => {
if (isPlaylistTrack) {
refresh()
}
if (mountedRef.current) {
setLoading(false)
}
})
}, [dataProvider, record.mediaFileId, record.id, refresh, resource])
const toggleLove = () => {
const toggle = record.starred ? subsonic.unstar : subsonic.star
const id = record.mediaFileId || record.id
setLoading(true)
toggle(id)
.then(refreshRecord)
.catch((e) => {
console.log('Error toggling love: ', e)
notify('ra.page.error', 'warning')
if (mountedRef.current) {
setLoading(false)
}
})
}
return [toggleLove, loading]
}