refactor: optimize paginator typings

This commit is contained in:
三咲智子 2023-01-09 23:04:09 +08:00
parent 162b56f5cb
commit 01a24a6015
No known key found for this signature in database
GPG key ID: 69992F2250DFD93E

View file

@ -1,16 +1,16 @@
import type { Paginator, WsEvents } from 'masto' import type { Paginator, WsEvents, mastodon } from 'masto'
import type { PaginatorState } from '~/types' import type { PaginatorState } from '~/types'
export function usePaginator<T, P, U = T>( export function usePaginator<T, P, U = T>(
paginator: Paginator<T[], P>, paginator: Paginator<T[], P>,
stream?: Promise<WsEvents>, stream?: Promise<WsEvents>,
eventType: 'notification' | 'update' = 'update', eventType: 'notification' | 'update' = 'update',
preprocess: (items: T[]) => U[] = (items: T[]) => items as unknown as U[], preprocess: (items: T[]) => U[] = items => items as unknown as U[],
buffer = 10, buffer = 10,
) { ) {
const state = ref<PaginatorState>(isMastoInitialised.value ? 'idle' : 'loading') const state = ref<PaginatorState>(isMastoInitialised.value ? 'idle' : 'loading')
const items = ref<T[]>([]) const items = ref<U[]>([])
const nextItems = ref<T[]>([]) const nextItems = ref<U[]>([])
const prevItems = ref<T[]>([]) const prevItems = ref<T[]>([])
const endAnchor = ref<HTMLDivElement>() const endAnchor = ref<HTMLDivElement>()
@ -20,7 +20,7 @@ export function usePaginator<T, P, U = T>(
const deactivated = useDeactivated() const deactivated = useDeactivated()
async function update() { async function update() {
items.value.unshift(...preprocess(prevItems.value as any) as any) (items.value as U[]).unshift(...preprocess(prevItems.value as T[]))
prevItems.value = [] prevItems.value = []
} }
@ -40,17 +40,19 @@ export function usePaginator<T, P, U = T>(
s.on('status.update', (status) => { s.on('status.update', (status) => {
cacheStatus(status, undefined, true) cacheStatus(status, undefined, true)
const index = items.value.findIndex((s: any) => s.id === status.id) const data = items.value as mastodon.v1.Status[]
const index = data.findIndex(s => s.id === status.id)
if (index >= 0) if (index >= 0)
items.value[index] = status as any data[index] = status
}) })
s.on('delete', (id) => { s.on('delete', (id) => {
removeCachedStatus(id) removeCachedStatus(id)
const index = items.value.findIndex((s: any) => s.id === id) const data = items.value as mastodon.v1.Status[]
const index = data.findIndex(s => s.id === id)
if (index >= 0) if (index >= 0)
items.value.splice(index, 1) data.splice(index, 1)
}) })
}) })