diff --git a/packages/client/src/components/MkPagination.vue b/packages/client/src/components/MkPagination.vue index aee1fffbe3..dc3721a1c6 100644 --- a/packages/client/src/components/MkPagination.vue +++ b/packages/client/src/components/MkPagination.vue @@ -66,7 +66,7 @@ </transition> </template> -<script lang="ts" setup generic="E extends keyof Endpoints"> +<script lang="ts" setup generic="E extends PagingKey"> import type { ComputedRef } from "vue"; import { computed, isRef, onActivated, onDeactivated, ref, watch } from "vue"; import type { Endpoints, TypeUtils } from "firefish-js"; @@ -81,7 +81,10 @@ import MkButton from "@/components/MkButton.vue"; import { i18n } from "@/i18n"; import { defaultStore } from "@/store"; -export interface Paging<E extends keyof Endpoints = keyof Endpoints> { +// biome-ignore lint/suspicious/noExplicitAny: +export type PagingKey = TypeUtils.EndpointsOf<any[]>; + +export interface Paging<E extends PagingKey = PagingKey> { endpoint: E; limit: number; params?: Endpoints[E]["req"] | ComputedRef<Endpoints[E]["req"]>; @@ -117,14 +120,15 @@ const props = withDefaults( const slots = defineSlots<{ default(props: { items: Item[] }): unknown; - empty(props: null): never; + empty(props: Record<string, never>): never; }>(); const emit = defineEmits<{ (ev: "queue", count: number): void; - (ev: "status", error: boolean): void; + (ev: "status", hasError: boolean): void; }>(); +type Param = Endpoints[E]["req"] | Record<string, never>; type Item = Endpoints[E]["res"][number]; const rootEl = ref<HTMLElement>(); @@ -142,8 +146,9 @@ const error = ref(false); const init = async (): Promise<void> => { queue.value = []; fetching.value = true; + const params = props.pagination.params - ? isRef(props.pagination.params) + ? isRef<Param>(props.pagination.params) ? props.pagination.params.value : props.pagination.params : {}; @@ -155,7 +160,7 @@ const init = async (): Promise<void> => { : (props.pagination.limit || 10) + 1, }) .then( - (res) => { + (res: Item[]) => { for (let i = 0; i < res.length; i++) { const item = res[i]; if (props.pagination.reversed) { @@ -179,7 +184,7 @@ const init = async (): Promise<void> => { error.value = false; fetching.value = false; }, - (err) => { + (_err) => { error.value = true; fetching.value = false; }, @@ -193,7 +198,7 @@ const reload = (): Promise<void> => { const refresh = async (): Promise<void> => { const params = props.pagination.params - ? isRef(props.pagination.params) + ? isRef<Param>(props.pagination.params) ? props.pagination.params.value : props.pagination.params : {}; @@ -204,7 +209,7 @@ const refresh = async (): Promise<void> => { offset: 0, }) .then( - (res) => { + (res: Item[]) => { const ids = items.value.reduce( (a, b) => { a[b.id] = true; @@ -215,7 +220,7 @@ const refresh = async (): Promise<void> => { for (let i = 0; i < res.length; i++) { const item = res[i]; - if (!updateItem(item.id, (old) => item)) { + if (!updateItem(item.id, (_old) => item)) { append(item); } delete ids[item.id]; @@ -225,7 +230,7 @@ const refresh = async (): Promise<void> => { removeItem((i) => i.id === id); } }, - (err) => { + (_err) => { error.value = true; fetching.value = false; }, @@ -243,7 +248,7 @@ const fetchMore = async (): Promise<void> => { moreFetching.value = true; backed.value = true; const params = props.pagination.params - ? isRef(props.pagination.params) + ? isRef<Param>(props.pagination.params) ? props.pagination.params.value : props.pagination.params : {}; @@ -264,7 +269,7 @@ const fetchMore = async (): Promise<void> => { }), }) .then( - (res) => { + (res: Item[]) => { for (let i = 0; i < res.length; i++) { const item = res[i]; if (props.pagination.reversed) { @@ -288,7 +293,7 @@ const fetchMore = async (): Promise<void> => { offset.value += res.length; moreFetching.value = false; }, - (err) => { + (_err) => { moreFetching.value = false; }, ); @@ -304,7 +309,7 @@ const fetchMoreAhead = async (): Promise<void> => { return; moreFetching.value = true; const params = props.pagination.params - ? isRef(props.pagination.params) + ? isRef<Param>(props.pagination.params) ? props.pagination.params.value : props.pagination.params : {}; @@ -325,7 +330,7 @@ const fetchMoreAhead = async (): Promise<void> => { }), }) .then( - (res) => { + (res: Item[]) => { if (res.length > SECOND_FETCH_LIMIT) { res.pop(); items.value = props.pagination.reversed @@ -341,7 +346,7 @@ const fetchMoreAhead = async (): Promise<void> => { offset.value += res.length; moreFetching.value = false; }, - (err) => { + (_err) => { moreFetching.value = false; }, ); @@ -433,7 +438,7 @@ const updateItem = (id: Item["id"], replacer: (old: Item) => Item): boolean => { return true; }; -if (props.pagination.params && isRef(props.pagination.params)) { +if (props.pagination.params && isRef<Param>(props.pagination.params)) { watch(props.pagination.params, init, { deep: true }); }