navidrome/ui/src/common/useToggleLove.js

44 lines
1.1 KiB
JavaScript

import { useCallback, useEffect, useRef, useState } from 'react'
import { useDataProvider, useNotify } 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 refreshRecord = useCallback(() => {
dataProvider.getOne(resource, { id: record.id }).then(() => {
if (mountedRef.current) {
setLoading(false)
}
})
}, [dataProvider, record.id, resource])
const toggleLove = () => {
const toggle = record.starred ? subsonic.unstar : subsonic.star
setLoading(true)
toggle(record.id)
.then(refreshRecord)
.catch((e) => {
console.log('Error toggling love: ', e)
notify('ra.page.error', 'warning')
if (mountedRef.current) {
setLoading(false)
}
})
}
return [toggleLove, loading]
}