lx-music-desktop/src/renderer/core/useApp/useSaveData.js
2021-12-03 22:11:11 +08:00

128 lines
3.9 KiB
JavaScript

import { throttle, saveSetting } from '@renderer/utils'
import { saveMyList, saveDownloadList, saveSearchHistoryList, setUserApi } from '@renderer/utils/tools'
import music from '@renderer/utils/music'
import { useCommit, watch, toRaw, onBeforeUnmount } from '@renderer/utils/vueTools'
import { apiSource, qualityList, userApi, proxy } from '@renderer/core/share'
import { allList, defaultList, loveList, userLists, tempList } from '@renderer/core/share/list'
import { downloadList } from '@renderer/core/share/download'
import { list as eventListNames, download as eventDownloadNames } from '@renderer/event/names'
const listThrottle = (fn, delay = 100) => {
let timer = null
let _data = {}
return function(data) {
Object.assign(_data, data)
if (timer) return
timer = setTimeout(() => {
timer = null
fn.call(this, _data)
_data = {}
}, delay)
}
}
const saveMyListThrottle = listThrottle(data => saveMyList(data), 300)
const saveDownloadListThrottle = throttle(list => saveDownloadList(list), 1000)
const saveSearchHistoryListThrottle = throttle(list => saveSearchHistoryList(list), 500)
export default ({
setting,
searchHistoryList,
}) => {
watch(setting, (newValue, oldValue) => {
saveSetting(toRaw(newValue))
global.appSetting = newValue
}, { deep: true })
// watch(defaultList, (newValue, oldValue) => {
// saveMyListThrottle({ defaultList: toRaw(newValue) })
// }, { deep: true })
// watch(loveList, (newValue, oldValue) => {
// saveMyListThrottle({ loveList: toRaw(newValue) })
// }, { deep: true })
// watch(userList, (newValue, oldValue) => {
// saveMyListThrottle({ userList: toRaw(newValue) })
// }, { deep: true })
// watch(downloadList, (newValue, oldValue) => {
// saveDownloadListThrottle(window.downloadListFull)
// }, { deep: true })
watch(searchHistoryList, (newValue, oldValue) => {
saveSearchHistoryListThrottle(toRaw(newValue))
}, { deep: true })
const setApiSource = useCommit('setApiSource')
watch(apiSource, (apiSource, oldValue) => {
if (/^user_api/.test(apiSource)) {
qualityList.value = {}
userApi.status = false
userApi.message = 'initing'
} else {
qualityList.value = music.supportQuality[apiSource]
}
if (oldValue === null) return
setUserApi(apiSource)
if (apiSource != setting.value.apiSource) {
setApiSource(apiSource)
}
})
const setProxyEnable = useCommit('setProxyEnable')
watch(() => proxy.enable, (enable, oldValue) => {
if (enable != setting.value.network.proxy.enable) setProxyEnable(enable)
})
const handelListChange = ids => {
const lists = {}
let isUserList = false
for (const id of ids) {
switch (id) {
case defaultList.id:
lists.defaultList = { ...toRaw(defaultList), list: toRaw(allList[id]) }
break
case loveList.id:
lists.loveList = { ...toRaw(loveList), list: toRaw(allList[id]) }
break
case tempList.id:
lists.tempList = { ...toRaw(tempList), list: toRaw(allList[id]) }
break
default:
isUserList = true
}
}
if (isUserList) {
lists.userList = userLists.map(l => ({ ...toRaw(l), list: toRaw(allList[l.id]) }))
}
saveMyListThrottle(lists)
}
const handelSaveList = ({ id }) => {
handelListChange([id])
}
const handelDownloadListChange = () => {
saveDownloadListThrottle(toRaw(downloadList))
}
window.eventHub.on(eventListNames.listChange, handelListChange)
window.eventHub.on(eventListNames.musicInfoChange, handelSaveList)
window.eventHub.on(eventDownloadNames.listChange, handelDownloadListChange)
onBeforeUnmount(() => {
window.eventHub.off(eventListNames.listChange, handelListChange)
window.eventHub.off(eventListNames.musicInfoChange, handelSaveList)
window.eventHub.off(eventDownloadNames.listChange, handelDownloadListChange)
})
return {
saveMyListThrottle,
saveSearchHistoryListThrottle,
}
}