@yh-ui/request 0.1.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +274 -0
  3. package/dist/adapters/fetch.cjs +157 -0
  4. package/dist/adapters/fetch.d.ts +25 -0
  5. package/dist/adapters/fetch.mjs +148 -0
  6. package/dist/adapters/index.cjs +27 -0
  7. package/dist/adapters/index.d.ts +5 -0
  8. package/dist/adapters/index.mjs +2 -0
  9. package/dist/adapters/platform.cjs +394 -0
  10. package/dist/adapters/platform.d.ts +72 -0
  11. package/dist/adapters/platform.mjs +369 -0
  12. package/dist/cache/index.cjs +56 -0
  13. package/dist/cache/index.d.ts +21 -0
  14. package/dist/cache/index.mjs +14 -0
  15. package/dist/cache/indexedDB.cjs +188 -0
  16. package/dist/cache/indexedDB.d.ts +58 -0
  17. package/dist/cache/indexedDB.mjs +176 -0
  18. package/dist/cache/localStorage.cjs +158 -0
  19. package/dist/cache/localStorage.d.ts +58 -0
  20. package/dist/cache/localStorage.mjs +153 -0
  21. package/dist/cache/memory.cjs +112 -0
  22. package/dist/cache/memory.d.ts +71 -0
  23. package/dist/cache/memory.mjs +103 -0
  24. package/dist/graphql.cjs +255 -0
  25. package/dist/graphql.d.ts +192 -0
  26. package/dist/graphql.mjs +235 -0
  27. package/dist/http-cache.cjs +248 -0
  28. package/dist/http-cache.d.ts +156 -0
  29. package/dist/http-cache.mjs +233 -0
  30. package/dist/index.cjs +181 -0
  31. package/dist/index.d.ts +23 -0
  32. package/dist/index.mjs +16 -0
  33. package/dist/interceptors/debug.cjs +139 -0
  34. package/dist/interceptors/debug.d.ts +92 -0
  35. package/dist/interceptors/debug.mjs +130 -0
  36. package/dist/interceptors/index.cjs +38 -0
  37. package/dist/interceptors/index.d.ts +6 -0
  38. package/dist/interceptors/index.mjs +3 -0
  39. package/dist/interceptors/progress.cjs +185 -0
  40. package/dist/interceptors/progress.d.ts +97 -0
  41. package/dist/interceptors/progress.mjs +177 -0
  42. package/dist/interceptors/security.cjs +154 -0
  43. package/dist/interceptors/security.d.ts +83 -0
  44. package/dist/interceptors/security.mjs +134 -0
  45. package/dist/plugin.cjs +166 -0
  46. package/dist/plugin.d.ts +106 -0
  47. package/dist/plugin.mjs +163 -0
  48. package/dist/request.cjs +396 -0
  49. package/dist/request.d.ts +111 -0
  50. package/dist/request.mjs +339 -0
  51. package/dist/types.cjs +13 -0
  52. package/dist/types.d.ts +157 -0
  53. package/dist/types.mjs +7 -0
  54. package/dist/useAIStream.cjs +125 -0
  55. package/dist/useAIStream.d.ts +89 -0
  56. package/dist/useAIStream.mjs +108 -0
  57. package/dist/useLoadMore.cjs +136 -0
  58. package/dist/useLoadMore.d.ts +84 -0
  59. package/dist/useLoadMore.mjs +134 -0
  60. package/dist/usePagination.cjs +141 -0
  61. package/dist/usePagination.d.ts +89 -0
  62. package/dist/usePagination.mjs +132 -0
  63. package/dist/useQueue.cjs +243 -0
  64. package/dist/useQueue.d.ts +118 -0
  65. package/dist/useQueue.mjs +239 -0
  66. package/dist/useRequest.cjs +325 -0
  67. package/dist/useRequest.d.ts +126 -0
  68. package/dist/useRequest.mjs +329 -0
  69. package/dist/useRequestQueue.cjs +36 -0
  70. package/dist/useRequestQueue.d.ts +52 -0
  71. package/dist/useRequestQueue.mjs +27 -0
  72. package/dist/useSSE.cjs +241 -0
  73. package/dist/useSSE.d.ts +74 -0
  74. package/dist/useSSE.mjs +226 -0
  75. package/dist/websocket.cjs +325 -0
  76. package/dist/websocket.d.ts +163 -0
  77. package/dist/websocket.mjs +316 -0
  78. package/package.json +61 -0
@@ -0,0 +1,89 @@
1
+ import { type Ref } from 'vue';
2
+ import { type UseSSEOptions, type SSEMessage } from './useSSE';
3
+ /** AI 流式响应消息 */
4
+ export interface AIStreamMessage {
5
+ /** 内容类型 */
6
+ type: 'text' | 'tool_call' | 'tool_result' | 'thinking' | 'done' | 'error';
7
+ /** 内容 */
8
+ content: string;
9
+ /** 工具调用 */
10
+ toolCalls?: Array<{
11
+ id: string;
12
+ name: string;
13
+ arguments: unknown;
14
+ }>;
15
+ /** 工具结果 */
16
+ toolResults?: Array<{
17
+ toolCallId: string;
18
+ result: unknown;
19
+ }>;
20
+ /** 思考内容 */
21
+ thinking?: string;
22
+ /** 元数据 */
23
+ metadata?: Record<string, unknown>;
24
+ }
25
+ /** AI 流式响应 Hook 配置 */
26
+ export interface UseAIStreamOptions extends UseSSEOptions {
27
+ /** 解析 AI 消息格式 */
28
+ parseAIMessage?: boolean;
29
+ /** 文本追加模式(用于打字机效果) */
30
+ appendMode?: boolean;
31
+ /** AI 消息回调 */
32
+ onText?: (text: string, delta: string) => void;
33
+ /** 工具调用回调 */
34
+ onToolCall?: (toolCalls: AIStreamMessage['toolCalls']) => void;
35
+ /** 思考更新回调 */
36
+ onThinking?: (thinking: string) => void;
37
+ }
38
+ /** AI 流式响应 Hook 返回值 */
39
+ export interface UseAIStreamReturn {
40
+ /** 是否正在加载 */
41
+ loading: Ref<boolean>;
42
+ /** 内容 */
43
+ content: Ref<string>;
44
+ /** 消息列表 */
45
+ messages: Ref<SSEMessage[]>;
46
+ /** 错误 */
47
+ error: Ref<Error | undefined>;
48
+ /** 当前文本 */
49
+ text: Ref<string>;
50
+ /** 思考内容 */
51
+ thinking: Ref<string>;
52
+ /** 工具调用列表 */
53
+ toolCalls: Ref<AIStreamMessage['toolCalls']>;
54
+ /** 是否完成 */
55
+ done: Ref<boolean>;
56
+ /** 启动流式请求 */
57
+ start: (options?: UseAIStreamOptions) => void;
58
+ /** 停止流式请求 */
59
+ stop: () => void;
60
+ /** 重置状态 */
61
+ reset: () => void;
62
+ }
63
+ /**
64
+ * useAIStream - AI 流式响应 Hook
65
+ *
66
+ * 专为 AI 应用设计,支持打字机效果、工具调用等
67
+ *
68
+ * @example
69
+ * const { text, thinking, toolCalls, done, loading, start, stop } = useAIStream({
70
+ * onText: (text, delta) => {
71
+ * // 打字机效果
72
+ * content.value += delta
73
+ * },
74
+ * onThinking: (thinking) => {
75
+ * // 更新思考内容
76
+ * },
77
+ * onToolCall: (tools) => {
78
+ * // 处理工具调用
79
+ * },
80
+ * })
81
+ *
82
+ * // 发起 AI 请求
83
+ * start({
84
+ * url: '/api/ai/chat',
85
+ * method: 'POST',
86
+ * data: { messages: [...] },
87
+ * })
88
+ */
89
+ export declare function useAIStream(options?: UseAIStreamOptions): UseAIStreamReturn;
@@ -0,0 +1,108 @@
1
+ import { ref } from "vue";
2
+ import { useSSE } from "./useSSE.mjs";
3
+ export function useAIStream(options = {}) {
4
+ const {
5
+ parseAIMessage = true,
6
+ appendMode = true,
7
+ onText,
8
+ onThinking,
9
+ onToolCall,
10
+ onMessage: userOnMessage,
11
+ ...sseOptions
12
+ } = options;
13
+ const text = ref("");
14
+ const thinking = ref("");
15
+ const toolCalls = ref([]);
16
+ const done = ref(false);
17
+ const handleMessage = (message) => {
18
+ if (!parseAIMessage) return;
19
+ const { event, data } = message;
20
+ switch (event) {
21
+ case "chunk":
22
+ case "message":
23
+ if (typeof data === "string") {
24
+ const delta = data;
25
+ text.value += delta;
26
+ onText?.(text.value, delta);
27
+ } else if (data !== null && typeof data === "object") {
28
+ const aiData = data;
29
+ const delta = aiData.content || aiData.text || aiData.delta || "";
30
+ if (delta) {
31
+ if (appendMode) {
32
+ text.value += delta;
33
+ } else {
34
+ text.value = delta;
35
+ }
36
+ onText?.(text.value, delta);
37
+ }
38
+ if (aiData.thinking) {
39
+ thinking.value = aiData.thinking;
40
+ onThinking?.(aiData.thinking);
41
+ }
42
+ if (aiData.tool_calls) {
43
+ toolCalls.value = aiData.tool_calls;
44
+ onToolCall?.(aiData.tool_calls);
45
+ }
46
+ }
47
+ break;
48
+ case "thinking":
49
+ if (typeof data === "string") {
50
+ thinking.value = data;
51
+ onThinking?.(data);
52
+ } else if (data !== null && typeof data === "object") {
53
+ const aiData = data;
54
+ const thinkContent = aiData.thinking || aiData.content || "";
55
+ thinking.value = thinkContent;
56
+ onThinking?.(thinkContent);
57
+ }
58
+ break;
59
+ case "tool":
60
+ if (data !== null && typeof data === "object") {
61
+ const aiData = data;
62
+ if (aiData.tool_calls) {
63
+ toolCalls.value = aiData.tool_calls;
64
+ onToolCall?.(aiData.tool_calls);
65
+ }
66
+ }
67
+ break;
68
+ case "done":
69
+ done.value = true;
70
+ break;
71
+ case "error":
72
+ done.value = true;
73
+ break;
74
+ }
75
+ };
76
+ const wrappedOnMessage = (msg) => {
77
+ handleMessage(msg);
78
+ userOnMessage?.(msg);
79
+ };
80
+ const { loading, content, messages, error, start, stop, reset } = useSSE({
81
+ ...sseOptions,
82
+ onMessage: wrappedOnMessage
83
+ });
84
+ const aiReset = () => {
85
+ text.value = "";
86
+ thinking.value = "";
87
+ toolCalls.value = [];
88
+ done.value = false;
89
+ reset();
90
+ };
91
+ const aiStart = (requestOptions) => {
92
+ aiReset();
93
+ start(requestOptions);
94
+ };
95
+ return {
96
+ loading,
97
+ content,
98
+ text,
99
+ thinking,
100
+ toolCalls,
101
+ done,
102
+ messages,
103
+ error,
104
+ start: aiStart,
105
+ stop,
106
+ reset: aiReset
107
+ };
108
+ }
@@ -0,0 +1,136 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.useLoadMore = useLoadMore;
7
+ var _vue = require("vue");
8
+ function useLoadMore(service, options = {}) {
9
+ const {
10
+ initialPage = 1,
11
+ pageSize: defaultPageSize = 10,
12
+ isLoadMore = true,
13
+ threshold: _threshold = 100,
14
+ loadMoreService,
15
+ onSuccess,
16
+ onError,
17
+ onFinally,
18
+ manual = false,
19
+ defaultParams = []
20
+ } = options;
21
+ const current = (0, _vue.ref)(initialPage);
22
+ const pageSize = (0, _vue.ref)(defaultPageSize);
23
+ const total = (0, _vue.ref)(0);
24
+ const totalPages = (0, _vue.computed)(() => {
25
+ if (total.value <= 0) return 0;
26
+ return Math.ceil(total.value / pageSize.value);
27
+ });
28
+ const data = (0, _vue.shallowRef)(void 0);
29
+ const loading = (0, _vue.ref)(false);
30
+ const refreshing = (0, _vue.ref)(false);
31
+ const loadingMore = (0, _vue.ref)(false);
32
+ const error = (0, _vue.shallowRef)(void 0);
33
+ const params = (0, _vue.ref)(defaultParams);
34
+ const noMore = (0, _vue.computed)(() => {
35
+ return current.value >= totalPages.value && total.value > 0;
36
+ });
37
+ const canLoadMore = (0, _vue.computed)(() => {
38
+ return isLoadMore && !noMore.value && !loadingMore.value;
39
+ });
40
+ const loadService = loadMoreService || service;
41
+ const loadData = async (isRefresh = false) => {
42
+ if (loading.value || loadingMore.value) return;
43
+ const isLoadMoreOp = !isRefresh;
44
+ loading.value = isLoadMoreOp ? false : true;
45
+ if (isRefresh) refreshing.value = true;
46
+ if (isLoadMoreOp) loadingMore.value = true;
47
+ error.value = void 0;
48
+ try {
49
+ const extraParams = params.value.slice(2);
50
+ const response = await loadService(current.value, pageSize.value, ...extraParams);
51
+ const pageData = response.data;
52
+ if (pageData && typeof pageData === "object") {
53
+ const paginatedData = pageData;
54
+ if (typeof paginatedData.total !== "undefined") total.value = paginatedData.total;else if (typeof paginatedData.totalCount !== "undefined") total.value = paginatedData.totalCount;else if (typeof paginatedData.totalElements !== "undefined") total.value = paginatedData.totalElements;
55
+ }
56
+ if (isRefresh) {
57
+ data.value = pageData;
58
+ current.value = initialPage + 1;
59
+ } else {
60
+ const oldData = data.value;
61
+ if (Array.isArray(oldData) && Array.isArray(pageData)) {
62
+ data.value = [...oldData, ...pageData];
63
+ } else {
64
+ data.value = pageData;
65
+ }
66
+ current.value++;
67
+ }
68
+ onSuccess?.(pageData, params.value);
69
+ } catch (err) {
70
+ error.value = err;
71
+ onError?.(err, params.value);
72
+ } finally {
73
+ loading.value = false;
74
+ refreshing.value = false;
75
+ loadingMore.value = false;
76
+ onFinally?.(params.value);
77
+ }
78
+ };
79
+ const loadMore = async () => {
80
+ if (noMore.value || loadingMore.value) return;
81
+ await loadData(false);
82
+ };
83
+ const reload = async () => {
84
+ current.value = initialPage;
85
+ await loadData(true);
86
+ };
87
+ const refresh = async () => {
88
+ await reload();
89
+ };
90
+ const pagination = {
91
+ loadPage: async page => {
92
+ current.value = page;
93
+ await loadData(true);
94
+ },
95
+ nextPage: loadMore,
96
+ prevPage: async () => {
97
+ await pagination.loadPage(current.value - 1);
98
+ },
99
+ firstPage: async () => {
100
+ await pagination.loadPage(1);
101
+ },
102
+ lastPage: async () => {
103
+ await pagination.loadPage(totalPages.value);
104
+ },
105
+ refresh: reload,
106
+ setPageSize: size => {
107
+ pageSize.value = size;
108
+ },
109
+ setTotal: newTotal => {
110
+ total.value = newTotal;
111
+ }
112
+ };
113
+ if (!manual) {
114
+ (0, _vue.onMounted)(() => {
115
+ loadData();
116
+ });
117
+ }
118
+ return {
119
+ current,
120
+ pageSize,
121
+ total,
122
+ totalPages,
123
+ data,
124
+ loading,
125
+ refreshing,
126
+ loadingMore,
127
+ error,
128
+ params,
129
+ noMore,
130
+ canLoadMore,
131
+ loadMore,
132
+ reload,
133
+ refresh,
134
+ pagination
135
+ };
136
+ }
@@ -0,0 +1,84 @@
1
+ import { type Ref, type ShallowRef } from 'vue';
2
+ import { type RequestResponse } from './types';
3
+ /**
4
+ * useLoadMore - 无限滚动加载更多 Hook
5
+ *
6
+ * @example
7
+ * const {
8
+ * data, loading, loadingMore, noMore,
9
+ * loadMore, refresh, reload
10
+ * } = useLoadMore(
11
+ * (page, size) => request.get('/api/list', { params: { page, size } }),
12
+ * { initialPage: 1, pageSize: 10 }
13
+ * )
14
+ */
15
+ /** 加载更多配置 */
16
+ export interface UseLoadMoreOptions<TData, TParams extends unknown[] = unknown[]> {
17
+ /** 请求函数(当作为第一个参数传入时可省略) */
18
+ service?: (page: number, pageSize: number, ...args: TParams) => Promise<RequestResponse<TData>>;
19
+ /** 初始页码 */
20
+ initialPage?: number;
21
+ /** 每页条数 */
22
+ pageSize?: number;
23
+ /** 是否在底部触发加载 */
24
+ isLoadMore?: boolean;
25
+ /** 距离底部多少像素触发加载 */
26
+ threshold?: number;
27
+ /** 加载更多的请求函数(可以与 service 不同) */
28
+ loadMoreService?: (page: number, pageSize: number) => Promise<RequestResponse<TData>>;
29
+ /** 成功回调 */
30
+ onSuccess?: (data: TData, params: TParams) => void;
31
+ /** 错误回调 */
32
+ onError?: (error: unknown, params: TParams) => void;
33
+ /** 完成后回调 */
34
+ onFinally?: (params: TParams) => void;
35
+ /** 是否手动触发 */
36
+ manual?: boolean;
37
+ /** 默认参数 */
38
+ defaultParams?: TParams;
39
+ }
40
+ /** 加载更多返回 */
41
+ export interface UseLoadMoreReturn<TData, TParams extends unknown[] = unknown[]> {
42
+ /** 当前页码 */
43
+ current: Ref<number>;
44
+ /** 每页条数 */
45
+ pageSize: Ref<number>;
46
+ /** 总数 */
47
+ total: Ref<number>;
48
+ /** 总页数 */
49
+ totalPages: Ref<number>;
50
+ /** 数据 */
51
+ data: ShallowRef<TData | undefined>;
52
+ /** 加载状态 */
53
+ loading: Ref<boolean>;
54
+ /** 刷新状态 */
55
+ refreshing: Ref<boolean>;
56
+ /** 加载更多状态 */
57
+ loadingMore: Ref<boolean>;
58
+ /** 错误 */
59
+ error: ShallowRef<unknown>;
60
+ /** 请求参数 */
61
+ params: Ref<TParams>;
62
+ /** 是否没有更多 */
63
+ noMore: Ref<boolean>;
64
+ /** 是否可以加载更多 */
65
+ canLoadMore: Ref<boolean>;
66
+ /** 加载更多 */
67
+ loadMore: () => Promise<void>;
68
+ /** 重新加载(重置分页) */
69
+ reload: () => Promise<void>;
70
+ /** 刷新 */
71
+ refresh: () => Promise<void>;
72
+ /** 分页方法 */
73
+ pagination: {
74
+ loadPage: (page: number) => Promise<void>;
75
+ nextPage: () => Promise<void>;
76
+ prevPage: () => Promise<void>;
77
+ firstPage: () => Promise<void>;
78
+ lastPage: () => Promise<void>;
79
+ refresh: () => Promise<void>;
80
+ setPageSize: (size: number) => void;
81
+ setTotal: (total: number) => void;
82
+ };
83
+ }
84
+ export declare function useLoadMore<TData = unknown, TParams extends unknown[] = unknown[]>(service: (page: number, pageSize: number, ...args: TParams) => Promise<RequestResponse<TData>>, options?: UseLoadMoreOptions<TData, TParams>): UseLoadMoreReturn<TData, TParams>;
@@ -0,0 +1,134 @@
1
+ import { ref, shallowRef, computed, onMounted } from "vue";
2
+ export function useLoadMore(service, options = {}) {
3
+ const {
4
+ initialPage = 1,
5
+ pageSize: defaultPageSize = 10,
6
+ isLoadMore = true,
7
+ threshold: _threshold = 100,
8
+ loadMoreService,
9
+ onSuccess,
10
+ onError,
11
+ onFinally,
12
+ manual = false,
13
+ defaultParams = []
14
+ } = options;
15
+ const current = ref(initialPage);
16
+ const pageSize = ref(defaultPageSize);
17
+ const total = ref(0);
18
+ const totalPages = computed(() => {
19
+ if (total.value <= 0) return 0;
20
+ return Math.ceil(total.value / pageSize.value);
21
+ });
22
+ const data = shallowRef(void 0);
23
+ const loading = ref(false);
24
+ const refreshing = ref(false);
25
+ const loadingMore = ref(false);
26
+ const error = shallowRef(void 0);
27
+ const params = ref(defaultParams);
28
+ const noMore = computed(() => {
29
+ return current.value >= totalPages.value && total.value > 0;
30
+ });
31
+ const canLoadMore = computed(() => {
32
+ return isLoadMore && !noMore.value && !loadingMore.value;
33
+ });
34
+ const loadService = loadMoreService || service;
35
+ const loadData = async (isRefresh = false) => {
36
+ if (loading.value || loadingMore.value) return;
37
+ const isLoadMoreOp = !isRefresh;
38
+ loading.value = isLoadMoreOp ? false : true;
39
+ if (isRefresh) refreshing.value = true;
40
+ if (isLoadMoreOp) loadingMore.value = true;
41
+ error.value = void 0;
42
+ try {
43
+ const extraParams = params.value.slice(2);
44
+ const response = await loadService(current.value, pageSize.value, ...extraParams);
45
+ const pageData = response.data;
46
+ if (pageData && typeof pageData === "object") {
47
+ const paginatedData = pageData;
48
+ if (typeof paginatedData.total !== "undefined") total.value = paginatedData.total;
49
+ else if (typeof paginatedData.totalCount !== "undefined")
50
+ total.value = paginatedData.totalCount;
51
+ else if (typeof paginatedData.totalElements !== "undefined")
52
+ total.value = paginatedData.totalElements;
53
+ }
54
+ if (isRefresh) {
55
+ data.value = pageData;
56
+ current.value = initialPage + 1;
57
+ } else {
58
+ const oldData = data.value;
59
+ if (Array.isArray(oldData) && Array.isArray(pageData)) {
60
+ data.value = [...oldData, ...pageData];
61
+ } else {
62
+ data.value = pageData;
63
+ }
64
+ current.value++;
65
+ }
66
+ onSuccess?.(pageData, params.value);
67
+ } catch (err) {
68
+ error.value = err;
69
+ onError?.(err, params.value);
70
+ } finally {
71
+ loading.value = false;
72
+ refreshing.value = false;
73
+ loadingMore.value = false;
74
+ onFinally?.(params.value);
75
+ }
76
+ };
77
+ const loadMore = async () => {
78
+ if (noMore.value || loadingMore.value) return;
79
+ await loadData(false);
80
+ };
81
+ const reload = async () => {
82
+ current.value = initialPage;
83
+ await loadData(true);
84
+ };
85
+ const refresh = async () => {
86
+ await reload();
87
+ };
88
+ const pagination = {
89
+ loadPage: async (page) => {
90
+ current.value = page;
91
+ await loadData(true);
92
+ },
93
+ nextPage: loadMore,
94
+ prevPage: async () => {
95
+ await pagination.loadPage(current.value - 1);
96
+ },
97
+ firstPage: async () => {
98
+ await pagination.loadPage(1);
99
+ },
100
+ lastPage: async () => {
101
+ await pagination.loadPage(totalPages.value);
102
+ },
103
+ refresh: reload,
104
+ setPageSize: (size) => {
105
+ pageSize.value = size;
106
+ },
107
+ setTotal: (newTotal) => {
108
+ total.value = newTotal;
109
+ }
110
+ };
111
+ if (!manual) {
112
+ onMounted(() => {
113
+ loadData();
114
+ });
115
+ }
116
+ return {
117
+ current,
118
+ pageSize,
119
+ total,
120
+ totalPages,
121
+ data,
122
+ loading,
123
+ refreshing,
124
+ loadingMore,
125
+ error,
126
+ params,
127
+ noMore,
128
+ canLoadMore,
129
+ loadMore,
130
+ reload,
131
+ refresh,
132
+ pagination
133
+ };
134
+ }
@@ -0,0 +1,141 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.usePagination = usePagination;
7
+ var _vue = require("vue");
8
+ function usePagination(service, options = {}) {
9
+ const {
10
+ defaultPagination = {
11
+ current: 1,
12
+ pageSize: 10
13
+ },
14
+ onSuccess,
15
+ onError,
16
+ onFinally,
17
+ manual = false,
18
+ defaultParams = []
19
+ } = options;
20
+ const current = (0, _vue.ref)(defaultPagination.current || 1);
21
+ const pageSize = (0, _vue.ref)(defaultPagination.pageSize || 10);
22
+ const total = (0, _vue.ref)(defaultPagination.total || 0);
23
+ const totalPages = (0, _vue.computed)(() => {
24
+ if (total.value <= 0) return 0;
25
+ return Math.ceil(total.value / pageSize.value);
26
+ });
27
+ const noMore = (0, _vue.computed)(() => {
28
+ return current.value >= totalPages.value && total.value > 0;
29
+ });
30
+ const data = (0, _vue.shallowRef)(void 0);
31
+ const loading = (0, _vue.ref)(false);
32
+ const refreshing = (0, _vue.ref)(false);
33
+ const loadingMore = (0, _vue.ref)(false);
34
+ const error = (0, _vue.shallowRef)(void 0);
35
+ const params = (0, _vue.ref)(defaultParams);
36
+ const loadData = async () => {
37
+ if (loading.value) return;
38
+ loading.value = true;
39
+ error.value = void 0;
40
+ try {
41
+ const page = current.value;
42
+ const size = pageSize.value;
43
+ const extraParams = params.value.slice(2);
44
+ const response = await service(page, size, ...extraParams);
45
+ const pageData = response.data;
46
+ if (pageData && typeof pageData === "object") {
47
+ const paginatedData = pageData;
48
+ if (typeof paginatedData.total !== "undefined") {
49
+ total.value = paginatedData.total;
50
+ }
51
+ if (typeof paginatedData.totalCount !== "undefined") {
52
+ total.value = paginatedData.totalCount;
53
+ }
54
+ if (typeof paginatedData.totalElements !== "undefined") {
55
+ total.value = paginatedData.totalElements;
56
+ }
57
+ }
58
+ data.value = pageData;
59
+ onSuccess?.(pageData, params.value);
60
+ } catch (err) {
61
+ error.value = err;
62
+ onError?.(err, params.value);
63
+ } finally {
64
+ loading.value = false;
65
+ refreshing.value = false;
66
+ loadingMore.value = false;
67
+ onFinally?.(params.value);
68
+ }
69
+ };
70
+ const loadPage = async page => {
71
+ if (page < 1 || totalPages.value > 0 && page > totalPages.value) return;
72
+ current.value = page;
73
+ await loadData();
74
+ };
75
+ const nextPage = async () => {
76
+ if (noMore.value) return;
77
+ await loadPage(current.value + 1);
78
+ };
79
+ const prevPage = async () => {
80
+ await loadPage(current.value - 1);
81
+ };
82
+ const firstPage = async () => {
83
+ await loadPage(1);
84
+ };
85
+ const lastPage = async () => {
86
+ await loadPage(totalPages.value);
87
+ };
88
+ const refresh = async () => {
89
+ current.value = 1;
90
+ refreshing.value = true;
91
+ await loadData();
92
+ };
93
+ const setPageSize = size => {
94
+ pageSize.value = size;
95
+ if (!manual) {
96
+ refresh();
97
+ }
98
+ };
99
+ const setTotal = newTotal => {
100
+ total.value = newTotal;
101
+ };
102
+ (0, _vue.watch)(pageSize, () => {
103
+ if (!manual) {
104
+ current.value = 1;
105
+ loadData();
106
+ }
107
+ });
108
+ (0, _vue.watch)(current, () => {
109
+ if (!manual) {
110
+ loadData();
111
+ }
112
+ });
113
+ if (!manual) {
114
+ (0, _vue.onMounted)(() => {
115
+ loadData();
116
+ });
117
+ }
118
+ return {
119
+ current,
120
+ pageSize,
121
+ total,
122
+ totalPages,
123
+ data,
124
+ loading,
125
+ refreshing,
126
+ loadingMore,
127
+ error,
128
+ params,
129
+ noMore,
130
+ pagination: {
131
+ loadPage,
132
+ nextPage,
133
+ prevPage,
134
+ firstPage,
135
+ lastPage,
136
+ refresh,
137
+ setPageSize,
138
+ setTotal
139
+ }
140
+ };
141
+ }