修复聚合搜索跳转到最后一页后由于列表是空的导致翻页组件隐藏的问题

This commit is contained in:
lyswhut 2023-03-26 12:00:48 +08:00
parent 81167b748c
commit f02cb72786
9 changed files with 36 additions and 26 deletions

View File

@ -34,7 +34,7 @@ export default forwardRef<MusicListType, {}>((props, ref) => {
if (isUnmountedRef.current) return if (isUnmountedRef.current) return
requestAnimationFrame(() => { requestAnimationFrame(() => {
listRef.current?.setList(result.list) listRef.current?.setList(result.list)
listRef.current?.setStatus(boardState.listDetailInfo.maxPage == page ? 'end' : 'idle') listRef.current?.setStatus(boardState.listDetailInfo.maxPage >= page ? 'end' : 'idle')
}) })
}).catch(() => { }).catch(() => {
if (boardState.listDetailInfo.list.length && page == 1) clearListDetail() if (boardState.listDetailInfo.list.length && page == 1) clearListDetail()
@ -64,7 +64,7 @@ export default forwardRef<MusicListType, {}>((props, ref) => {
const result = setListDetail(listDetail, boardState.listDetailInfo.id, page) const result = setListDetail(listDetail, boardState.listDetailInfo.id, page)
if (isUnmountedRef.current) return if (isUnmountedRef.current) return
listRef.current?.setList(result.list) listRef.current?.setList(result.list)
listRef.current?.setStatus(boardState.listDetailInfo.maxPage == page ? 'end' : 'idle') listRef.current?.setStatus(boardState.listDetailInfo.maxPage >= page ? 'end' : 'idle')
}).catch(() => { }).catch(() => {
if (boardState.listDetailInfo.list.length && page == 1) clearListDetail() if (boardState.listDetailInfo.list.length && page == 1) clearListDetail()
listRef.current?.setStatus('error') listRef.current?.setStatus('error')
@ -77,7 +77,7 @@ export default forwardRef<MusicListType, {}>((props, ref) => {
const result = setListDetail(listDetail, boardState.listDetailInfo.id, page) const result = setListDetail(listDetail, boardState.listDetailInfo.id, page)
if (isUnmountedRef.current) return if (isUnmountedRef.current) return
listRef.current?.setList(result.list) listRef.current?.setList(result.list)
listRef.current?.setStatus(boardState.listDetailInfo.maxPage == page ? 'end' : 'idle') listRef.current?.setStatus(boardState.listDetailInfo.maxPage >= page ? 'end' : 'idle')
}).catch(() => { }).catch(() => {
if (boardState.listDetailInfo.list.length && page == 1) clearListDetail() if (boardState.listDetailInfo.list.length && page == 1) clearListDetail()
listRef.current?.setStatus('error') listRef.current?.setStatus('error')

View File

@ -35,7 +35,7 @@ export default forwardRef<MusicListType, {}>((props, ref) => {
if (isUnmountedRef.current) return if (isUnmountedRef.current) return
requestAnimationFrame(() => { requestAnimationFrame(() => {
listRef.current?.setList(list, source == 'all') listRef.current?.setList(list, source == 'all')
listRef.current?.setStatus(searchMusicState.listInfos[searchMusicState.source]!.maxPage == page ? 'end' : 'idle') listRef.current?.setStatus(searchMusicState.listInfos[searchMusicState.source]!.maxPage >= page ? 'end' : 'idle')
}) })
}).catch(() => { }).catch(() => {
listRef.current?.setStatus('error') listRef.current?.setStatus('error')
@ -59,7 +59,7 @@ export default forwardRef<MusicListType, {}>((props, ref) => {
// const result = setListInfo(listDetail, searchMusicState.listDetailInfo.id, page) // const result = setListInfo(listDetail, searchMusicState.listDetailInfo.id, page)
if (isUnmountedRef.current) return if (isUnmountedRef.current) return
listRef.current?.setList(list, searchInfoRef.current.source == 'all') listRef.current?.setList(list, searchInfoRef.current.source == 'all')
listRef.current?.setStatus(searchMusicState.listInfos[searchInfoRef.current.source]!.maxPage == page ? 'end' : 'idle') listRef.current?.setStatus(searchMusicState.listInfos[searchInfoRef.current.source]!.maxPage >= page ? 'end' : 'idle')
}).catch(() => { }).catch(() => {
listRef.current?.setStatus('error') listRef.current?.setStatus('error')
}) })
@ -72,7 +72,7 @@ export default forwardRef<MusicListType, {}>((props, ref) => {
// const result = setListInfo(listDetail, searchMusicState.listDetailInfo.id, page) // const result = setListInfo(listDetail, searchMusicState.listDetailInfo.id, page)
if (isUnmountedRef.current) return if (isUnmountedRef.current) return
listRef.current?.setList(list, searchInfoRef.current.source == 'all') listRef.current?.setList(list, searchInfoRef.current.source == 'all')
listRef.current?.setStatus(info.maxPage == page ? 'end' : 'idle') listRef.current?.setStatus(info.maxPage >= page ? 'end' : 'idle')
}).catch(() => { }).catch(() => {
listRef.current?.setStatus('error') listRef.current?.setStatus('error')
}) })

View File

@ -29,7 +29,7 @@ export default forwardRef<ListType, {}>((props, ref) => {
if (isUnmountedRef.current) return if (isUnmountedRef.current) return
requestAnimationFrame(() => { requestAnimationFrame(() => {
listRef.current?.setList(result.list) listRef.current?.setList(result.list)
listRef.current?.setStatus(songlistState.listInfo.maxPage == page ? 'end' : 'idle') listRef.current?.setStatus(songlistState.listInfo.maxPage >= page ? 'end' : 'idle')
}) })
}).catch(() => { }).catch(() => {
if (songlistState.listInfo.list.length && page == 1) clearList() if (songlistState.listInfo.list.length && page == 1) clearList()
@ -54,7 +54,7 @@ export default forwardRef<ListType, {}>((props, ref) => {
const result = setList(info, songlistState.listInfo.tagId, songlistState.listInfo.sortId, page) const result = setList(info, songlistState.listInfo.tagId, songlistState.listInfo.sortId, page)
if (isUnmountedRef.current) return if (isUnmountedRef.current) return
listRef.current?.setList(result.list) listRef.current?.setList(result.list)
listRef.current?.setStatus(songlistState.listInfo.maxPage == page ? 'end' : 'idle') listRef.current?.setStatus(songlistState.listInfo.maxPage >= page ? 'end' : 'idle')
}).catch(() => { }).catch(() => {
if (songlistState.listInfo.list.length && page == 1) clearList() if (songlistState.listInfo.list.length && page == 1) clearList()
listRef.current?.setStatus('error') listRef.current?.setStatus('error')
@ -67,7 +67,7 @@ export default forwardRef<ListType, {}>((props, ref) => {
const result = setList(info, songlistState.listInfo.tagId, songlistState.listInfo.sortId, page) const result = setList(info, songlistState.listInfo.tagId, songlistState.listInfo.sortId, page)
if (isUnmountedRef.current) return if (isUnmountedRef.current) return
listRef.current?.setList(result.list) listRef.current?.setList(result.list)
listRef.current?.setStatus(songlistState.listInfo.maxPage == page ? 'end' : 'idle') listRef.current?.setStatus(songlistState.listInfo.maxPage >= page ? 'end' : 'idle')
}).catch(() => { }).catch(() => {
if (songlistState.listInfo.list.length && page == 1) clearList() if (songlistState.listInfo.list.length && page == 1) clearList()
listRef.current?.setStatus('error') listRef.current?.setStatus('error')

View File

@ -52,7 +52,7 @@ export default forwardRef<MusicListType, MusicListProps>(({ componentId }, ref)
imgUrl: songlistState.selectListInfo.img ?? listDetailInfo.info.img, imgUrl: songlistState.selectListInfo.img ?? listDetailInfo.info.img,
}) })
listRef.current?.setList(result.list) listRef.current?.setList(result.list)
listRef.current?.setStatus(songlistState.listDetailInfo.maxPage == page ? 'end' : 'idle') listRef.current?.setStatus(songlistState.listDetailInfo.maxPage >= page ? 'end' : 'idle')
}) })
}).catch(() => { }).catch(() => {
if (songlistState.listDetailInfo.list.length && page == 1) clearListDetail() if (songlistState.listDetailInfo.list.length && page == 1) clearListDetail()
@ -82,7 +82,7 @@ export default forwardRef<MusicListType, MusicListProps>(({ componentId }, ref)
const result = setListDetail(listDetail, songlistState.listDetailInfo.id, page) const result = setListDetail(listDetail, songlistState.listDetailInfo.id, page)
if (isUnmountedRef.current) return if (isUnmountedRef.current) return
listRef.current?.setList(result.list) listRef.current?.setList(result.list)
listRef.current?.setStatus(songlistState.listDetailInfo.maxPage == page ? 'end' : 'idle') listRef.current?.setStatus(songlistState.listDetailInfo.maxPage >= page ? 'end' : 'idle')
}).catch(() => { }).catch(() => {
if (songlistState.listDetailInfo.list.length && page == 1) clearListDetail() if (songlistState.listDetailInfo.list.length && page == 1) clearListDetail()
listRef.current?.setStatus('error') listRef.current?.setStatus('error')
@ -95,7 +95,7 @@ export default forwardRef<MusicListType, MusicListProps>(({ componentId }, ref)
const result = setListDetail(listDetail, songlistState.listDetailInfo.id, page) const result = setListDetail(listDetail, songlistState.listDetailInfo.id, page)
if (isUnmountedRef.current) return if (isUnmountedRef.current) return
listRef.current?.setList(result.list) listRef.current?.setList(result.list)
listRef.current?.setStatus(songlistState.listDetailInfo.maxPage == page ? 'end' : 'idle') listRef.current?.setStatus(songlistState.listDetailInfo.maxPage >= page ? 'end' : 'idle')
}).catch(() => { }).catch(() => {
if (songlistState.listDetailInfo.list.length && page == 1) clearListDetail() if (songlistState.listDetailInfo.list.length && page == 1) clearListDetail()
listRef.current?.setStatus('error') listRef.current?.setStatus('error')

View File

@ -12,7 +12,8 @@ export default {
state.listDetailInfo.list = page == 1 ? [...result.list] : [...state.listDetailInfo.list, ...result.list] state.listDetailInfo.list = page == 1 ? [...result.list] : [...state.listDetailInfo.list, ...result.list]
state.listDetailInfo.id = id state.listDetailInfo.id = id
state.listDetailInfo.source = result.source state.listDetailInfo.source = result.source
state.listDetailInfo.total = result.total if (page == 1 || (result.total && result.list.length)) state.listDetailInfo.total = result.total
else state.listDetailInfo.total = result.limit * page
state.listDetailInfo.limit = result.limit state.listDetailInfo.limit = result.limit
state.listDetailInfo.page = page state.listDetailInfo.page = page
state.listDetailInfo.maxPage = Math.ceil(result.total / result.limit) state.listDetailInfo.maxPage = Math.ceil(result.total / result.limit)

View File

@ -48,6 +48,7 @@ export default {
}, },
addHistoryWord(word: string) { addHistoryWord(word: string) {
let index = state.historyList.indexOf(word) let index = state.historyList.indexOf(word)
if (index == 0) return
if (index > -1) state.historyList.splice(index, 1) if (index > -1) state.historyList.splice(index, 1)
if (state.historyList.length >= 15) state.historyList.splice(14, state.historyList.length - 14) if (state.historyList.length >= 15) state.historyList.splice(14, state.historyList.length - 14)
state.historyList.unshift(word) state.historyList.unshift(word)

View File

@ -32,21 +32,23 @@ const handleSortList = (list: LX.Music.MusicInfoOnline[], keyword: string) => {
const setLists = (results: SearchResult[], page: number, text: string): LX.Music.MusicInfoOnline[] => { const setLists = (results: SearchResult[], page: number, text: string): LX.Music.MusicInfoOnline[] => {
let pages = [] let pages = []
let total = 0 let totals = []
// let limit = 0 let limit = 0
let list = [] as LX.Music.MusicInfoOnline[] let list = [] as LX.Music.MusicInfoOnline[]
for (const source of results) { for (const source of results) {
state.maxPages[source.source] = source.allPage state.maxPages[source.source] = source.allPage
limit = Math.max(source.limit, limit)
if (source.allPage < page) continue if (source.allPage < page) continue
arrPush(list, source.list) arrPush(list, source.list)
pages.push(source.allPage) pages.push(source.allPage)
total += source.total totals.push(source.total)
// limit = Math.max(source.limit, limit)
} }
list = handleSortList(list.map(s => toNewMusicInfo(s) as LX.Music.MusicInfoOnline), text) list = handleSortList(list.map(s => toNewMusicInfo(s) as LX.Music.MusicInfoOnline), text)
let listInfo = state.listInfos.all let listInfo = state.listInfos.all
listInfo.maxPage = Math.max(...pages) listInfo.maxPage = Math.max(0, ...pages)
listInfo.total = total const total = Math.max(0, ...totals)
if (page == 1 || (total && list.length)) listInfo.total = total
else listInfo.total = limit * page
// listInfo.limit = limit // listInfo.limit = limit
listInfo.page = page listInfo.page = page
listInfo.list = deduplicationList(page > 1 ? [...listInfo.list, ...list] : list) listInfo.list = deduplicationList(page > 1 ? [...listInfo.list, ...list] : list)
@ -60,7 +62,8 @@ const setList = (datas: SearchResult, page: number, text: string): LX.Music.Musi
let listInfo = state.listInfos[datas.source] as ListInfo let listInfo = state.listInfos[datas.source] as ListInfo
const list = datas.list.map(s => toNewMusicInfo(s) as LX.Music.MusicInfoOnline) const list = datas.list.map(s => toNewMusicInfo(s) as LX.Music.MusicInfoOnline)
listInfo.list = deduplicationList(page == 1 ? list : [...listInfo.list, ...list]) listInfo.list = deduplicationList(page == 1 ? list : [...listInfo.list, ...list])
listInfo.total = datas.total if (page == 1 || (datas.total && datas.list.length)) listInfo.total = datas.total
else listInfo.total = datas.limit * page
listInfo.maxPage = datas.allPage listInfo.maxPage = datas.allPage
listInfo.page = page listInfo.page = page
listInfo.limit = datas.limit listInfo.limit = datas.limit

View File

@ -34,18 +34,20 @@ let maxTotals: Partial<Record<LX.OnlineSource, number>> = {
} }
const setLists = (results: SearchResult[], page: number, text: string): ListInfoItem[] => { const setLists = (results: SearchResult[], page: number, text: string): ListInfoItem[] => {
let totals = [] let totals = []
// let limit = 0 let limit = 0
let list = [] let list = []
for (const source of results) { for (const source of results) {
list.push(...source.list) list.push(...source.list)
totals.push(source.total) totals.push(source.total)
maxTotals[source.source] = source.total maxTotals[source.source] = source.total
state.maxPages[source.source] = Math.ceil(source.total / source.limit) state.maxPages[source.source] = Math.ceil(source.total / source.limit)
// limit = Math.max(source.limit, limit) limit = Math.max(source.limit, limit)
} }
let listInfo = state.listInfos.all let listInfo = state.listInfos.all
listInfo.total = Math.max(...totals) const total = Math.max(0, ...totals)
if (page == 1 || (total && list.length)) listInfo.total = total
else listInfo.total = limit * page
listInfo.page = page listInfo.page = page
list = handleSortList(list, text) list = handleSortList(list, text)
listInfo.list = page > 1 ? [...listInfo.list, ...list] : list listInfo.list = page > 1 ? [...listInfo.list, ...list] : list
@ -57,7 +59,8 @@ const setList = (datas: SearchResult, page: number, text: string): ListInfoItem[
// console.log(datas.source, datas.list) // console.log(datas.source, datas.list)
let listInfo = state.listInfos[datas.source] as SearchListInfo let listInfo = state.listInfos[datas.source] as SearchListInfo
listInfo.list = page == 1 ? datas.list : [...listInfo.list, ...datas.list] listInfo.list = page == 1 ? datas.list : [...listInfo.list, ...datas.list]
listInfo.total = datas.total if (page == 1 || (datas.total && datas.list.length)) listInfo.total = datas.total
else listInfo.total = datas.limit * page
listInfo.page = page listInfo.page = page
listInfo.limit = datas.limit listInfo.limit = datas.limit
state.source = datas.source state.source = datas.source

View File

@ -12,7 +12,8 @@ export default {
}, },
setList(result: ListInfo, tagId: string, sortId: string, page: number) { setList(result: ListInfo, tagId: string, sortId: string, page: number) {
state.listInfo.list = page == 1 ? [...result.list] : [...state.listInfo.list, ...result.list] state.listInfo.list = page == 1 ? [...result.list] : [...state.listInfo.list, ...result.list]
state.listInfo.total = result.total if (page == 1 || (result.total && result.list.length)) state.listInfo.total = result.total
else state.listInfo.total = result.limit * page
state.listInfo.limit = result.limit state.listInfo.limit = result.limit
state.listInfo.page = page state.listInfo.page = page
state.listInfo.source = result.source state.listInfo.source = result.source
@ -37,7 +38,8 @@ export default {
state.listDetailInfo.list = page == 1 ? [...result.list] : [...state.listDetailInfo.list, ...result.list] state.listDetailInfo.list = page == 1 ? [...result.list] : [...state.listDetailInfo.list, ...result.list]
state.listDetailInfo.id = id state.listDetailInfo.id = id
state.listDetailInfo.source = result.source state.listDetailInfo.source = result.source
state.listDetailInfo.total = result.total if (page == 1 || (result.total && result.list.length)) state.listDetailInfo.total = result.total
else state.listDetailInfo.total = result.limit * page
state.listDetailInfo.limit = result.limit state.listDetailInfo.limit = result.limit
state.listDetailInfo.page = page state.listDetailInfo.page = page
state.listDetailInfo.info = { ...result.info } state.listDetailInfo.info = { ...result.info }