@yh-ui/hooks 0.1.17 → 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.
- package/README.md +289 -0
- package/dist/index.cjs +147 -1460
- package/dist/index.d.ts +18 -698
- package/dist/index.mjs +15 -1427
- package/dist/storage/index.cjs +128 -0
- package/dist/storage/index.d.ts +26 -0
- package/dist/storage/index.mjs +112 -0
- package/dist/use-ai/index.cjs +11 -0
- package/dist/use-ai/index.d.ts +1 -0
- package/dist/use-ai/index.mjs +1 -0
- package/dist/use-ai/use-ai-conversations.cjs +73 -6
- package/dist/use-ai/use-ai-conversations.d.ts +34 -4
- package/dist/use-ai/use-ai-conversations.mjs +71 -4
- package/dist/use-ai/use-ai-persistence.cjs +160 -0
- package/dist/use-ai/use-ai-persistence.d.ts +62 -0
- package/dist/use-ai/use-ai-persistence.mjs +154 -0
- package/dist/use-countdown/index.cjs +51 -0
- package/dist/use-countdown/index.d.ts +17 -0
- package/dist/use-countdown/index.mjs +40 -0
- package/dist/use-sku/index.cjs +62 -0
- package/dist/use-sku/index.d.ts +30 -0
- package/dist/use-sku/index.mjs +58 -0
- package/dist/use-virtual-scroll/index.cjs +17 -26
- package/dist/use-virtual-scroll/index.d.ts +5 -9
- package/dist/use-virtual-scroll/index.mjs +18 -23
- package/package.json +6 -4
- package/dist/index.d.cts +0 -699
- package/dist/index.d.mts +0 -699
package/dist/index.d.ts
CHANGED
|
@@ -1,699 +1,19 @@
|
|
|
1
|
-
import * as vue from 'vue';
|
|
2
|
-
import { Ref, InjectionKey, ComputedRef, ShallowRef, MaybeRef } from 'vue';
|
|
3
|
-
import { Language } from '@yh-ui/locale';
|
|
4
|
-
export { Language } from '@yh-ui/locale';
|
|
5
|
-
|
|
6
|
-
declare const defaultNamespace = "yh";
|
|
7
|
-
declare const namespaceContextKey: InjectionKey<Ref<string>>;
|
|
8
1
|
/**
|
|
9
|
-
*
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
b: (blockSuffix?: string) => string;
|
|
28
|
-
e: (element?: string) => string;
|
|
29
|
-
m: (modifier?: string) => string;
|
|
30
|
-
bem: (blockSuffix?: string, element?: string, modifier?: string) => string;
|
|
31
|
-
em: (element?: string, modifier?: string) => string;
|
|
32
|
-
is: (state: string, value?: boolean) => string;
|
|
33
|
-
cssVar: (name: string) => string;
|
|
34
|
-
cssVarObj: (vars: Record<string, string>) => Record<string, string>;
|
|
35
|
-
cssVarBlock: (name: string) => string;
|
|
36
|
-
cssVarBlockObj: (vars: Record<string, string>) => Record<string, string>;
|
|
37
|
-
};
|
|
38
|
-
type UseNamespaceReturn = ReturnType<typeof useNamespace>;
|
|
39
|
-
|
|
40
|
-
declare const zIndexContextKey: InjectionKey<Ref<number | undefined>>;
|
|
41
|
-
declare const zIndexCounterKey: InjectionKey<{
|
|
42
|
-
current: number;
|
|
43
|
-
}>;
|
|
44
|
-
declare const getNextZIndex: () => number;
|
|
45
|
-
/**
|
|
46
|
-
* 重置 z-index 计数器
|
|
47
|
-
*/
|
|
48
|
-
declare const resetZIndex: (value?: number) => void;
|
|
49
|
-
/**
|
|
50
|
-
* 创建 z-index 计数器(用于 provide)
|
|
51
|
-
*/
|
|
52
|
-
declare const createZIndexCounter: (initialValue?: number) => {
|
|
53
|
-
current: number;
|
|
54
|
-
};
|
|
55
|
-
/**
|
|
56
|
-
* useZIndex - z-index 管理
|
|
57
|
-
* @param zIndexOverrides - 可选的自定义 z-index
|
|
58
|
-
* @returns z-index 相关方法
|
|
59
|
-
*
|
|
60
|
-
* @example
|
|
61
|
-
* const { currentZIndex, nextZIndex } = useZIndex()
|
|
62
|
-
*/
|
|
63
|
-
declare const useZIndex: (zIndexOverrides?: Ref<number>) => {
|
|
64
|
-
initialZIndex: vue.ComputedRef<number>;
|
|
65
|
-
currentZIndex: vue.ComputedRef<number>;
|
|
66
|
-
nextZIndex: () => number;
|
|
67
|
-
};
|
|
68
|
-
type UseZIndexReturn = ReturnType<typeof useZIndex>;
|
|
69
|
-
|
|
70
|
-
/**
|
|
71
|
-
* 获取 dayjs locale code
|
|
72
|
-
*/
|
|
73
|
-
declare const getDayjsLocale: (localeCode: string) => string;
|
|
74
|
-
/**
|
|
75
|
-
* 动态加载并设置 dayjs locale
|
|
76
|
-
*/
|
|
77
|
-
declare const setDayjsLocale: (localeCode: string) => Promise<void>;
|
|
78
|
-
/**
|
|
79
|
-
* 同步设置 dayjs locale(立即生效,异步加载后会更新)
|
|
80
|
-
*/
|
|
81
|
-
declare const setDayjsLocaleSync: (localeCode: string) => void;
|
|
82
|
-
/**
|
|
83
|
-
* 使用自定义月份名称更新 dayjs locale
|
|
84
|
-
*/
|
|
85
|
-
declare const updateDayjsMonths: (localeCode: string, months: {
|
|
86
|
-
jan: string;
|
|
87
|
-
feb: string;
|
|
88
|
-
mar: string;
|
|
89
|
-
apr: string;
|
|
90
|
-
may: string;
|
|
91
|
-
jun: string;
|
|
92
|
-
jul: string;
|
|
93
|
-
aug: string;
|
|
94
|
-
sep: string;
|
|
95
|
-
oct: string;
|
|
96
|
-
nov: string;
|
|
97
|
-
dec: string;
|
|
98
|
-
}) => void;
|
|
99
|
-
|
|
100
|
-
/**
|
|
101
|
-
* useLocale - 国际化
|
|
102
|
-
* @param localeOverrides - 可选的自定义语言包
|
|
103
|
-
* @returns 国际化相关方法
|
|
104
|
-
*/
|
|
105
|
-
declare const useLocale: (localeOverrides?: Ref<Language>) => {
|
|
106
|
-
locale: vue.ComputedRef<Language>;
|
|
107
|
-
lang: vue.ComputedRef<string>;
|
|
108
|
-
t: (path: string, options?: Record<string, string | number>) => string;
|
|
109
|
-
tRaw: <T = unknown>(path: string) => T;
|
|
110
|
-
};
|
|
111
|
-
type UseLocaleReturn = ReturnType<typeof useLocale>;
|
|
112
|
-
|
|
113
|
-
declare const idInjectionKey: InjectionKey<Ref<string | undefined>>;
|
|
114
|
-
/**
|
|
115
|
-
* useId - 生成唯一 ID
|
|
116
|
-
* @param idOverrides - 可选的自定义 ID 前缀
|
|
117
|
-
* @returns 唯一 ID
|
|
118
|
-
*
|
|
119
|
-
* @example
|
|
120
|
-
* const id = useId() // 'yh-id-1' (or vue native id)
|
|
121
|
-
* const customId = useId(ref('custom')) // 'custom'
|
|
122
|
-
*/
|
|
123
|
-
declare const useId: (idOverrides?: Ref<string | undefined>) => Ref<string>;
|
|
124
|
-
/**
|
|
125
|
-
* useIdInjection - ID 注入工具
|
|
126
|
-
* @description 用于组件内部生成关联 ID
|
|
127
|
-
*/
|
|
128
|
-
declare const useIdInjection: () => {
|
|
129
|
-
prefix: vue.ComputedRef<string>;
|
|
130
|
-
current: number;
|
|
131
|
-
};
|
|
132
|
-
type UseIdReturn = ReturnType<typeof useId>;
|
|
133
|
-
|
|
134
|
-
interface FormContext {
|
|
135
|
-
model: Record<string, unknown>;
|
|
136
|
-
rules?: Record<string, unknown>;
|
|
137
|
-
labelWidth?: string | number;
|
|
138
|
-
labelPosition?: string;
|
|
139
|
-
labelSuffix?: string;
|
|
140
|
-
showMessage?: boolean;
|
|
141
|
-
scrollToError?: boolean;
|
|
142
|
-
scrollIntoViewOptions?: boolean | ScrollIntoViewOptions;
|
|
143
|
-
disabled?: boolean;
|
|
144
|
-
size?: string;
|
|
145
|
-
statusIcon?: boolean;
|
|
146
|
-
layout?: string;
|
|
147
|
-
addField: (field: FormItemContext) => void;
|
|
148
|
-
removeField: (field: FormItemContext) => void;
|
|
149
|
-
themeOverrides?: Record<string, string | undefined>;
|
|
150
|
-
}
|
|
151
|
-
interface FormItemContext {
|
|
152
|
-
prop: string;
|
|
153
|
-
validate: (trigger: string, callback?: (isValid: boolean) => void) => Promise<boolean | unknown>;
|
|
154
|
-
resetField: () => void;
|
|
155
|
-
clearValidate: () => void;
|
|
156
|
-
validateStatus: string;
|
|
157
|
-
validateMessage: string;
|
|
158
|
-
label: string;
|
|
159
|
-
errorId?: string;
|
|
160
|
-
inputId?: string;
|
|
161
|
-
size?: string;
|
|
162
|
-
disabled?: boolean;
|
|
163
|
-
}
|
|
164
|
-
declare const FormContextKey: InjectionKey<FormContext>;
|
|
165
|
-
declare const FormItemContextKey: InjectionKey<FormItemContext>;
|
|
166
|
-
/**
|
|
167
|
-
* useFormItem - 供组件内部使用的 Hook
|
|
168
|
-
* @description 获取表单项上下文。已优化内部触发校验逻辑,防止 Promise 拒绝导致控制台报错。
|
|
169
|
-
*/
|
|
170
|
-
declare const useFormItem: () => {
|
|
171
|
-
form: FormContext | undefined;
|
|
172
|
-
formItem: FormItemContext | undefined;
|
|
173
|
-
validate: (trigger: string) => Promise<boolean | unknown>;
|
|
174
|
-
};
|
|
175
|
-
type UseFormItemReturn = ReturnType<typeof useFormItem>;
|
|
176
|
-
|
|
177
|
-
/**
|
|
178
|
-
* useVirtualScroll - 虚拟滚动 Hook
|
|
179
|
-
* @description 用于大数据量列表的虚拟滚动渲染
|
|
180
|
-
*/
|
|
181
|
-
|
|
182
|
-
interface VirtualScrollOptions<T = unknown> {
|
|
183
|
-
/** 每项高度 */
|
|
184
|
-
itemHeight: number;
|
|
185
|
-
/** 容器高度 */
|
|
186
|
-
containerHeight: number;
|
|
187
|
-
/** 数据列表 */
|
|
188
|
-
items: Ref<T[]> | T[];
|
|
189
|
-
/** 上下额外渲染数量 */
|
|
190
|
-
overscan?: number;
|
|
191
|
-
}
|
|
192
|
-
interface VirtualScrollReturn<T = unknown> {
|
|
193
|
-
/** 可见项列表 */
|
|
194
|
-
visibleItems: ComputedRef<T[]>;
|
|
195
|
-
/** 总高度 */
|
|
196
|
-
totalHeight: ComputedRef<number>;
|
|
197
|
-
/** Y轴偏移量 */
|
|
198
|
-
offsetY: ComputedRef<number>;
|
|
199
|
-
/** 起始索引 */
|
|
200
|
-
startIndex: Ref<number>;
|
|
201
|
-
/** 结束索引 */
|
|
202
|
-
endIndex: Ref<number>;
|
|
203
|
-
/** 滚动事件处理 */
|
|
204
|
-
onScroll: (event: Event) => void;
|
|
205
|
-
/** 滚动到指定索引 */
|
|
206
|
-
scrollToIndex: (index: number) => void;
|
|
207
|
-
/** 容器引用 */
|
|
208
|
-
containerRef: Ref<HTMLElement | null>;
|
|
209
|
-
}
|
|
210
|
-
declare function useVirtualScroll<T = unknown>(options: VirtualScrollOptions<T>): VirtualScrollReturn<T>;
|
|
211
|
-
|
|
212
|
-
interface UseCacheReturn<T> {
|
|
213
|
-
data: ShallowRef<T | null>;
|
|
214
|
-
execute: () => Promise<void>;
|
|
215
|
-
}
|
|
216
|
-
/**
|
|
217
|
-
* 一个简单的 SSR 友好的缓存 Hook
|
|
218
|
-
* 在服务端可以将结果存入缓存,客户端可以从缓存中恢复或重新计算
|
|
219
|
-
*/
|
|
220
|
-
declare function useCache<T>(key: string, fetcher: () => T | Promise<T>): UseCacheReturn<T>;
|
|
221
|
-
|
|
222
|
-
declare function useEventListener(target: MaybeRef<EventTarget | null | undefined> | (() => EventTarget | null | undefined), event: string, handler: (e: Event) => void, options?: boolean | AddEventListenerOptions): void;
|
|
223
|
-
|
|
224
|
-
/**
|
|
225
|
-
* useScrollLock - 极致稳定的滚动锁定管理
|
|
226
|
-
* @description 深度对标 市面组件库 / Naive UI,解决复杂环境(包括 VitePress 等文档站点)下的内容移位问题
|
|
227
|
-
*/
|
|
228
|
-
declare const useScrollLock: (trigger: Ref<boolean>) => {
|
|
229
|
-
isLocked: Ref<boolean, boolean>;
|
|
230
|
-
};
|
|
231
|
-
|
|
232
|
-
declare function useClickOutside(target: MaybeRef<HTMLElement | null | undefined>, handler: (evt: MouseEvent | TouchEvent) => void): void;
|
|
233
|
-
|
|
234
|
-
interface ConfigProviderContext {
|
|
235
|
-
size?: 'small' | 'default' | 'large';
|
|
236
|
-
zIndex?: number;
|
|
237
|
-
locale?: Language;
|
|
238
|
-
message?: {
|
|
239
|
-
max?: number;
|
|
240
|
-
duration?: number;
|
|
241
|
-
offset?: number;
|
|
242
|
-
};
|
|
243
|
-
}
|
|
244
|
-
declare const configProviderContextKey: InjectionKey<ComputedRef<ConfigProviderContext>>;
|
|
245
|
-
/**
|
|
246
|
-
* 获取全局配置 Hook
|
|
247
|
-
*/
|
|
248
|
-
declare const useConfig: () => {
|
|
249
|
-
config: ComputedRef<ConfigProviderContext> | null;
|
|
250
|
-
globalSize: ComputedRef<"small" | "default" | "large">;
|
|
251
|
-
globalZIndex: ComputedRef<number>;
|
|
252
|
-
globalLocale: ComputedRef<Language | undefined>;
|
|
253
|
-
};
|
|
254
|
-
|
|
255
|
-
type StreamChunkParser = (raw: string) => string | null;
|
|
256
|
-
/**
|
|
257
|
-
* OpenAI / DeepSeek 格式解析器
|
|
258
|
-
* data: {"choices":[{"delta":{"content":"hello"}}]}
|
|
259
|
-
*/
|
|
260
|
-
declare const openaiParser: StreamChunkParser;
|
|
261
|
-
/**
|
|
262
|
-
* 文心一言 / ERNIE 格式解析器
|
|
263
|
-
* data: {"result":"hello","is_end":false}
|
|
264
|
-
*/
|
|
265
|
-
declare const ernieParser: StreamChunkParser;
|
|
266
|
-
/**
|
|
267
|
-
* 通义千问 / Qwen 格式解析器
|
|
268
|
-
* data: {"output":{"text":"hello"},"finish_reason":null}
|
|
269
|
-
*/
|
|
270
|
-
declare const qwenParser: StreamChunkParser;
|
|
271
|
-
/**
|
|
272
|
-
* Anthropic / Claude 格式解析器
|
|
273
|
-
* data: {"type":"content_block_delta","delta":{"type":"text_delta","text":"hello"}}
|
|
274
|
-
*/
|
|
275
|
-
declare const claudeParser: StreamChunkParser;
|
|
276
|
-
/**
|
|
277
|
-
* Google / Gemini 格式解析器
|
|
278
|
-
* data: {"candidates":[{"content":{"parts":[{"text":"hello"}]}}]}
|
|
279
|
-
*/
|
|
280
|
-
declare const geminiParser: StreamChunkParser;
|
|
281
|
-
/**
|
|
282
|
-
* 纯文本流解析器(AsyncGenerator 输出的原始字符串)
|
|
283
|
-
*/
|
|
284
|
-
declare const plainTextParser: StreamChunkParser;
|
|
285
|
-
interface AiStreamOptions {
|
|
286
|
-
/**
|
|
287
|
-
* 请求适配器,返回 AsyncGenerator 或 fetch Response
|
|
288
|
-
*/
|
|
289
|
-
request: (query: string, ...args: unknown[]) => Promise<Response | AsyncGenerator<string, void, unknown>> | AsyncGenerator<string, void, unknown>;
|
|
290
|
-
/**
|
|
291
|
-
* 流式块解析器,用于适配不同厂商的格式
|
|
292
|
-
* @default plainTextParser(直接输出原始字符串)
|
|
293
|
-
*/
|
|
294
|
-
parser?: StreamChunkParser;
|
|
295
|
-
/**
|
|
296
|
-
* 是否启用打字机平滑节流效果
|
|
297
|
-
* @default true
|
|
298
|
-
*/
|
|
299
|
-
typewriter?: boolean;
|
|
300
|
-
/**
|
|
301
|
-
* 每帧渲染的字符数(打字机速度控制)
|
|
302
|
-
* @default 3
|
|
303
|
-
*/
|
|
304
|
-
charsPerFrame?: number;
|
|
305
|
-
onUpdate?: (chunk: string, fullContent: string) => void;
|
|
306
|
-
onFinish?: (content: string) => void;
|
|
307
|
-
onError?: (err: Error) => void;
|
|
308
|
-
}
|
|
309
|
-
/**
|
|
310
|
-
* useAiStream - 多厂商兼容流式请求引擎
|
|
311
|
-
*
|
|
312
|
-
* 特性:
|
|
313
|
-
* - 支持 OpenAI / DeepSeek / 文心一言 / 通义千问 等主流格式(Adapter 模式)
|
|
314
|
-
* - 内置 rAF 打字机节流,保证平滑输出体验
|
|
315
|
-
* - 完整的 AbortController 取消支持
|
|
316
|
-
*/
|
|
317
|
-
declare function useAiStream(options: AiStreamOptions): {
|
|
318
|
-
isStreaming: vue.Ref<boolean, boolean>;
|
|
319
|
-
currentContent: vue.Ref<string, string>;
|
|
320
|
-
fetchStream: (query: string, ...args: unknown[]) => Promise<void>;
|
|
321
|
-
stop: () => void;
|
|
322
|
-
parsers: {
|
|
323
|
-
openaiParser: StreamChunkParser;
|
|
324
|
-
ernieParser: StreamChunkParser;
|
|
325
|
-
qwenParser: StreamChunkParser;
|
|
326
|
-
claudeParser: StreamChunkParser;
|
|
327
|
-
geminiParser: StreamChunkParser;
|
|
328
|
-
plainTextParser: StreamChunkParser;
|
|
329
|
-
};
|
|
330
|
-
};
|
|
331
|
-
|
|
332
|
-
interface AiChatMessage {
|
|
333
|
-
/** 唯一标识,避免使用 index 做 key */
|
|
334
|
-
id: string;
|
|
335
|
-
/** 消息发送方 */
|
|
336
|
-
role: 'user' | 'assistant' | 'system';
|
|
337
|
-
/** 消息内容 */
|
|
338
|
-
content: string;
|
|
339
|
-
/**
|
|
340
|
-
* 消息状态
|
|
341
|
-
* - loading: 初始加载中(占位)
|
|
342
|
-
* - generating: 流式生成中
|
|
343
|
-
* - success: 已成功完成
|
|
344
|
-
* - error: 发生错误
|
|
345
|
-
* - stopped: 被用户中途打断
|
|
346
|
-
*/
|
|
347
|
-
status?: 'loading' | 'generating' | 'success' | 'error' | 'stopped';
|
|
348
|
-
/** 消息时间戳(ms) */
|
|
349
|
-
createAt: number;
|
|
350
|
-
/** 用于展示的时间字符串(可选,不传则自动格式化) */
|
|
351
|
-
time?: string;
|
|
352
|
-
/** 扩展字段 */
|
|
353
|
-
[key: string]: unknown;
|
|
354
|
-
}
|
|
355
|
-
interface UseAiChatOptions {
|
|
356
|
-
/** 初始化的消息列表 */
|
|
357
|
-
initialMessages?: AiChatMessage[];
|
|
358
|
-
/** 自定义生成 ID 的函数 */
|
|
359
|
-
idGenerator?: () => string;
|
|
360
|
-
/**
|
|
361
|
-
* 请求适配器
|
|
362
|
-
* 支持:
|
|
363
|
-
* - AsyncGenerator<string>:最原始的字符流,每次 yield 一段字符
|
|
364
|
-
* - Promise<string>:直接返回完整回复
|
|
365
|
-
* - Promise<Response>:SSE 流式响应
|
|
366
|
-
*/
|
|
367
|
-
request?: (message: string, history: AiChatMessage[], abortSignal: AbortSignal) => AsyncGenerator<string, void, unknown> | Promise<string | Response>;
|
|
368
|
-
/**
|
|
369
|
-
* SSE / 流式块的解析器(适配不同厂商格式)
|
|
370
|
-
* 传入各厂商对应的 parser(来自 useAiStream 模块)
|
|
371
|
-
* @default plainTextParser
|
|
372
|
-
*/
|
|
373
|
-
parser?: StreamChunkParser;
|
|
374
|
-
/**
|
|
375
|
-
* 是否启用打字机平滑输出效果
|
|
376
|
-
* @default true
|
|
377
|
-
*/
|
|
378
|
-
typewriter?: boolean;
|
|
379
|
-
/**
|
|
380
|
-
* 打字机每帧输出字符数(越大越快)
|
|
381
|
-
* @default 3
|
|
382
|
-
*/
|
|
383
|
-
charsPerFrame?: number;
|
|
384
|
-
/**
|
|
385
|
-
* 系统 Prompt(会自动插入到历史的首位)
|
|
386
|
-
*/
|
|
387
|
-
systemPrompt?: string;
|
|
388
|
-
/** 出现错误时的回调 */
|
|
389
|
-
onError?: (err: Error) => void;
|
|
390
|
-
/** 消息发送完成回调 */
|
|
391
|
-
onFinish?: (message: AiChatMessage) => void;
|
|
392
|
-
}
|
|
393
|
-
/**
|
|
394
|
-
* useAiChat - 核心 AI 会话管理 Hook
|
|
395
|
-
*
|
|
396
|
-
* 特性:
|
|
397
|
-
* - 消息列表 CRUD + 状态机管理
|
|
398
|
-
* - 支持流式 / 非流式响应
|
|
399
|
-
* - 内置多厂商适配器接口(通过 parser 选项传入)
|
|
400
|
-
* - rAF 打字机平滑效果(可关闭)
|
|
401
|
-
* - 完整的 AbortController 取消支持
|
|
402
|
-
* - 系统 Prompt 自动注入
|
|
403
|
-
*/
|
|
404
|
-
declare function useAiChat(options?: UseAiChatOptions): {
|
|
405
|
-
/** 会话历史 */
|
|
406
|
-
messages: vue.Ref<{
|
|
407
|
-
[x: string]: unknown;
|
|
408
|
-
id: string;
|
|
409
|
-
role: "user" | "assistant" | "system";
|
|
410
|
-
content: string;
|
|
411
|
-
status?: "loading" | "generating" | "success" | "error" | "stopped"
|
|
412
|
-
/** 消息时间戳(ms) */
|
|
413
|
-
| undefined;
|
|
414
|
-
createAt: number;
|
|
415
|
-
time?: string
|
|
416
|
-
/** 扩展字段 */
|
|
417
|
-
| undefined;
|
|
418
|
-
}[], AiChatMessage[] | {
|
|
419
|
-
[x: string]: unknown;
|
|
420
|
-
id: string;
|
|
421
|
-
role: "user" | "assistant" | "system";
|
|
422
|
-
content: string;
|
|
423
|
-
status?: "loading" | "generating" | "success" | "error" | "stopped"
|
|
424
|
-
/** 消息时间戳(ms) */
|
|
425
|
-
| undefined;
|
|
426
|
-
createAt: number;
|
|
427
|
-
time?: string
|
|
428
|
-
/** 扩展字段 */
|
|
429
|
-
| undefined;
|
|
430
|
-
}[]>;
|
|
431
|
-
/** 是否正在生成(等同 isSending,别名友好) */
|
|
432
|
-
isGenerating: vue.Ref<boolean, boolean>;
|
|
433
|
-
/** 同 isGenerating,语义别名 */
|
|
434
|
-
isSending: vue.ComputedRef<boolean>;
|
|
435
|
-
/** 触发发送(自动处理流、打字机) */
|
|
436
|
-
sendMessage: (content: string) => Promise<void>;
|
|
437
|
-
/** 停止/中断当前生成 */
|
|
438
|
-
stop: () => void;
|
|
439
|
-
/** 移除单条消息 */
|
|
440
|
-
removeMessage: (id: string) => void;
|
|
441
|
-
/** 修改单条消息内容 */
|
|
442
|
-
updateMessage: (id: string, patch: Partial<AiChatMessage>) => void;
|
|
443
|
-
/** 重置清空所有会话 */
|
|
444
|
-
clear: () => void;
|
|
445
|
-
};
|
|
446
|
-
|
|
447
|
-
interface AiConversation {
|
|
448
|
-
id: string;
|
|
449
|
-
title: string;
|
|
450
|
-
/**
|
|
451
|
-
* 最近更新时间(时间戳 ms)
|
|
452
|
-
*/
|
|
453
|
-
updatedAt: number;
|
|
454
|
-
/**
|
|
455
|
-
* 对话预览/最后一条消息内容
|
|
456
|
-
*/
|
|
457
|
-
excerpt?: string;
|
|
458
|
-
/**
|
|
459
|
-
* 是否置顶
|
|
460
|
-
*/
|
|
461
|
-
pinned?: boolean;
|
|
462
|
-
/**
|
|
463
|
-
* 自定义数据(例如知识库 ID 等业务数据)
|
|
464
|
-
*/
|
|
465
|
-
meta?: Record<string, unknown>;
|
|
466
|
-
}
|
|
467
|
-
interface StorageAdapter {
|
|
468
|
-
getItem(key: string): string | null | Promise<string | null>;
|
|
469
|
-
setItem(key: string, value: string): void | Promise<void>;
|
|
470
|
-
removeItem(key: string): void | Promise<void>;
|
|
471
|
-
}
|
|
472
|
-
/**
|
|
473
|
-
* localStorage 适配器(默认)
|
|
474
|
-
*/
|
|
475
|
-
declare const localStorageAdapter: StorageAdapter;
|
|
476
|
-
/**
|
|
477
|
-
* IndexedDB 适配器(适合大量数据持久化)
|
|
478
|
-
*/
|
|
479
|
-
declare class IndexedDBAdapter implements StorageAdapter {
|
|
480
|
-
private db;
|
|
481
|
-
private dbName;
|
|
482
|
-
private storeName;
|
|
483
|
-
private ready;
|
|
484
|
-
constructor(dbName?: string);
|
|
485
|
-
private init;
|
|
486
|
-
getItem(key: string): Promise<string | null>;
|
|
487
|
-
setItem(key: string, value: string): Promise<void>;
|
|
488
|
-
removeItem(key: string): Promise<void>;
|
|
489
|
-
}
|
|
490
|
-
type ConversationGroup = {
|
|
491
|
-
label: string;
|
|
492
|
-
items: AiConversation[];
|
|
493
|
-
};
|
|
494
|
-
interface UseAiConversationsOptions {
|
|
495
|
-
/** 初始化数据(或从后端的直出) */
|
|
496
|
-
initialConversations?: AiConversation[];
|
|
497
|
-
/** 自定义生成 ID 的函数 */
|
|
498
|
-
idGenerator?: () => string;
|
|
499
|
-
/**
|
|
500
|
-
* 持久化存储适配器
|
|
501
|
-
* - false: 不持久化(仅内存)
|
|
502
|
-
* - 'localStorage': 使用 localStorage(默认)
|
|
503
|
-
* - 'indexedDB': 使用 IndexedDB
|
|
504
|
-
* - StorageAdapter: 自定义适配器
|
|
505
|
-
*/
|
|
506
|
-
storage?: false | 'localStorage' | 'indexedDB' | StorageAdapter;
|
|
507
|
-
/** 持久化 key 前缀 */
|
|
508
|
-
storageKey?: string;
|
|
509
|
-
/**
|
|
510
|
-
* 每次加载的数量(用于分页 / 懒加载)
|
|
511
|
-
* @default 20
|
|
512
|
-
*/
|
|
513
|
-
pageSize?: number;
|
|
514
|
-
}
|
|
515
|
-
/**
|
|
516
|
-
* useAiConversations - 会话历史管理 Hook
|
|
517
|
-
*
|
|
518
|
-
* 特性:
|
|
519
|
-
* - 完整的 CRUD + 置顶操作
|
|
520
|
-
* - 可插拔持久化(localStorage / IndexedDB / 自定义)
|
|
521
|
-
* - 按时间自动分组(今天 / 最近 7 天 / 最近 30 天 / 更早)
|
|
522
|
-
* - 分页懒加载
|
|
523
|
-
*/
|
|
524
|
-
declare function useAiConversations(options?: UseAiConversationsOptions): {
|
|
525
|
-
/** 完整会话列表 */
|
|
526
|
-
conversations: vue.Ref<{
|
|
527
|
-
id: string;
|
|
528
|
-
title: string;
|
|
529
|
-
updatedAt: number;
|
|
530
|
-
excerpt?: string
|
|
531
|
-
/**
|
|
532
|
-
* 是否置顶
|
|
533
|
-
*/
|
|
534
|
-
| undefined;
|
|
535
|
-
pinned?: boolean
|
|
536
|
-
/**
|
|
537
|
-
* 自定义数据(例如知识库 ID 等业务数据)
|
|
538
|
-
*/
|
|
539
|
-
| undefined;
|
|
540
|
-
meta?: Record<string, unknown> | undefined;
|
|
541
|
-
}[], AiConversation[] | {
|
|
542
|
-
id: string;
|
|
543
|
-
title: string;
|
|
544
|
-
updatedAt: number;
|
|
545
|
-
excerpt?: string
|
|
546
|
-
/**
|
|
547
|
-
* 是否置顶
|
|
548
|
-
*/
|
|
549
|
-
| undefined;
|
|
550
|
-
pinned?: boolean
|
|
551
|
-
/**
|
|
552
|
-
* 自定义数据(例如知识库 ID 等业务数据)
|
|
553
|
-
*/
|
|
554
|
-
| undefined;
|
|
555
|
-
meta?: Record<string, unknown> | undefined;
|
|
556
|
-
}[]>;
|
|
557
|
-
/** 按时间分组后的列表(置顶 / 今天 / 最近 7 天 / 更早) */
|
|
558
|
-
groupedConversations: vue.ComputedRef<ConversationGroup[]>;
|
|
559
|
-
/** 分页后的列表 */
|
|
560
|
-
pagedConversations: vue.ComputedRef<{
|
|
561
|
-
id: string;
|
|
562
|
-
title: string;
|
|
563
|
-
updatedAt: number;
|
|
564
|
-
excerpt?: string
|
|
565
|
-
/**
|
|
566
|
-
* 是否置顶
|
|
567
|
-
*/
|
|
568
|
-
| undefined;
|
|
569
|
-
pinned?: boolean
|
|
570
|
-
/**
|
|
571
|
-
* 自定义数据(例如知识库 ID 等业务数据)
|
|
572
|
-
*/
|
|
573
|
-
| undefined;
|
|
574
|
-
meta?: Record<string, unknown> | undefined;
|
|
575
|
-
}[]>;
|
|
576
|
-
/** 是否还有更多数据 */
|
|
577
|
-
hasMore: vue.ComputedRef<boolean>;
|
|
578
|
-
/** 加载更多 */
|
|
579
|
-
loadMore: () => Promise<void>;
|
|
580
|
-
/** 加载更多状态 */
|
|
581
|
-
isLoadingMore: vue.Ref<boolean, boolean>;
|
|
582
|
-
/** 等待初始化完成(SSR 场景使用) */
|
|
583
|
-
ready: Promise<void>;
|
|
584
|
-
/** 新建会话 */
|
|
585
|
-
createConversation: (title: string, meta?: Record<string, unknown>) => Promise<AiConversation>;
|
|
586
|
-
/** 删除会话 */
|
|
587
|
-
removeConversation: (id: string) => Promise<void>;
|
|
588
|
-
/** 更新会话属性 */
|
|
589
|
-
updateConversation: (id: string, updates: Partial<Omit<AiConversation, "id">>) => Promise<void>;
|
|
590
|
-
/** 置顶/取消置顶 */
|
|
591
|
-
pinConversation: (id: string, pinned?: boolean) => Promise<void>;
|
|
592
|
-
/** 清空全部 */
|
|
593
|
-
clear: () => Promise<void>;
|
|
594
|
-
};
|
|
595
|
-
|
|
596
|
-
interface AiRequestOptions {
|
|
597
|
-
/**
|
|
598
|
-
* 请求函数
|
|
599
|
-
*/
|
|
600
|
-
request: (query: string, ...args: unknown[]) => Promise<string> | string;
|
|
601
|
-
onSuccess?: (content: string) => void;
|
|
602
|
-
onError?: (err: Error) => void;
|
|
603
|
-
}
|
|
604
|
-
/**
|
|
605
|
-
* useAiRequest - 简单的 AI 非流式请求 Hook
|
|
606
|
-
*/
|
|
607
|
-
declare function useAiRequest(options: AiRequestOptions): {
|
|
608
|
-
loading: vue.Ref<boolean, boolean>;
|
|
609
|
-
data: vue.Ref<string, string>;
|
|
610
|
-
error: vue.Ref<Error | null, Error | null>;
|
|
611
|
-
send: (query: string, ...args: unknown[]) => Promise<string>;
|
|
612
|
-
};
|
|
613
|
-
|
|
614
|
-
interface UseAiVoiceOptions {
|
|
615
|
-
/**
|
|
616
|
-
* 语言代码 (用于 SpeechRecognition)
|
|
617
|
-
* @default 'zh-CN'
|
|
618
|
-
*/
|
|
619
|
-
language?: string;
|
|
620
|
-
/**
|
|
621
|
-
* 是否需要临时结果(在说话过程中实时返回)
|
|
622
|
-
* @default true
|
|
623
|
-
*/
|
|
624
|
-
interimResults?: boolean;
|
|
625
|
-
/**
|
|
626
|
-
* 是否连续识别
|
|
627
|
-
* @default false
|
|
628
|
-
*/
|
|
629
|
-
continuous?: boolean;
|
|
630
|
-
/**
|
|
631
|
-
* 智能静音检测(VAD)
|
|
632
|
-
* 开启后,当检测到长时间无声会自动停止录音
|
|
633
|
-
* @default true
|
|
634
|
-
*/
|
|
635
|
-
vad?: boolean;
|
|
636
|
-
/**
|
|
637
|
-
* 静音检测阈值 (ms)
|
|
638
|
-
* @default 2000
|
|
639
|
-
*/
|
|
640
|
-
vadThreshold?: number;
|
|
641
|
-
/**
|
|
642
|
-
* 音量变化敏感度 (0-1)
|
|
643
|
-
* @default 0.05
|
|
644
|
-
*/
|
|
645
|
-
volumeThreshold?: number;
|
|
646
|
-
/**
|
|
647
|
-
* 返回波形柱的数量(对应 AiVoiceTrigger 的 amplitudes)
|
|
648
|
-
* @default 20
|
|
649
|
-
*/
|
|
650
|
-
waveCount?: number;
|
|
651
|
-
/**
|
|
652
|
-
* 是否在开始时自动执行浏览器语音识别 (SpeechRecognition)
|
|
653
|
-
* 如果关闭,则只进行物理音频录制
|
|
654
|
-
* @default true
|
|
655
|
-
*/
|
|
656
|
-
useSTT?: boolean;
|
|
657
|
-
/** 回调事件 */
|
|
658
|
-
onStart?: () => void;
|
|
659
|
-
/** 停止回调,包含最终转写文本和录音文件 Blob */
|
|
660
|
-
onStop?: (transcript: string, blob: Blob | null) => void;
|
|
661
|
-
onResult?: (transcript: string) => void;
|
|
662
|
-
onPartialResult?: (transcript: string) => void;
|
|
663
|
-
onError?: (error: unknown) => void;
|
|
664
|
-
}
|
|
665
|
-
interface UseAiVoiceReturn {
|
|
666
|
-
/** 是否正在录音 */
|
|
667
|
-
isRecording: vue.Ref<boolean>;
|
|
668
|
-
/** 最终转写文本 */
|
|
669
|
-
transcript: vue.Ref<string>;
|
|
670
|
-
/** 过程中的临时文本 */
|
|
671
|
-
interimTranscript: vue.Ref<string>;
|
|
672
|
-
/** 实时波形数据 */
|
|
673
|
-
amplitudes: vue.Ref<number[]>;
|
|
674
|
-
/** 实时音量 (0-100) */
|
|
675
|
-
volume: vue.Ref<number>;
|
|
676
|
-
/** 录音文件的 Blob */
|
|
677
|
-
audioBlob: vue.Ref<Blob | null>;
|
|
678
|
-
/** 开始录音 */
|
|
679
|
-
start: () => Promise<void>;
|
|
680
|
-
/** 停止录音 */
|
|
681
|
-
stop: () => void;
|
|
682
|
-
/** 取消并放弃当前结果 */
|
|
683
|
-
cancel: () => void;
|
|
684
|
-
/** 浏览器是否支持 SpeechRecognition (用于显示警告) */
|
|
685
|
-
sttSupported: boolean;
|
|
686
|
-
}
|
|
687
|
-
/**
|
|
688
|
-
* useAiVoice - 专业级 AI 语音交互 Hook
|
|
689
|
-
*
|
|
690
|
-
* 核心能力:
|
|
691
|
-
* 1. 【音频录制】:通过 MediaRecorder 真实录制音频并导出 Blob 文件。
|
|
692
|
-
* 2. 【视觉分析】:通过 Web Audio API 实时输出驱动 AiVoiceTrigger 的波形数组。
|
|
693
|
-
* 3. 【智能 VAD】:多维检测静音状态,支持自动停顿结束。
|
|
694
|
-
* 4. 【语音转写】:内置 Web Speech API 实时转写及临时结果反馈。
|
|
695
|
-
*/
|
|
696
|
-
declare function useAiVoice(options?: UseAiVoiceOptions): UseAiVoiceReturn;
|
|
697
|
-
|
|
698
|
-
export { FormContextKey, FormItemContextKey, IndexedDBAdapter, claudeParser, configProviderContextKey, createZIndexCounter, defaultNamespace, ernieParser, geminiParser, getDayjsLocale, getNextZIndex, idInjectionKey, localStorageAdapter, namespaceContextKey, openaiParser, plainTextParser, qwenParser, resetZIndex, setDayjsLocale, setDayjsLocaleSync, updateDayjsMonths, useAiChat, useAiConversations, useAiRequest, useAiStream, useAiVoice, useCache, useClickOutside, useConfig, useEventListener, useFormItem, useGlobalNamespace, useId, useIdInjection, useLocale, useNamespace, useScrollLock, useVirtualScroll, useZIndex, zIndexContextKey, zIndexCounterKey };
|
|
699
|
-
export type { AiChatMessage, AiConversation, AiRequestOptions, AiStreamOptions, ConfigProviderContext, ConversationGroup, FormContext, FormItemContext, StorageAdapter, StreamChunkParser, UseAiChatOptions, UseAiConversationsOptions, UseAiVoiceOptions, UseAiVoiceReturn, UseCacheReturn, UseFormItemReturn, UseIdReturn, UseLocaleReturn, UseNamespaceReturn, UseZIndexReturn, VirtualScrollOptions, VirtualScrollReturn };
|
|
2
|
+
* @yh-ui/hooks - Composition Hooks
|
|
3
|
+
* @description Vue 3 Composition API Hooks
|
|
4
|
+
*/
|
|
5
|
+
export * from './use-namespace';
|
|
6
|
+
export * from './use-z-index';
|
|
7
|
+
export * from './use-sku';
|
|
8
|
+
export * from './use-countdown';
|
|
9
|
+
export * from './use-locale';
|
|
10
|
+
export * from './use-id';
|
|
11
|
+
export * from './use-form-item';
|
|
12
|
+
export * from './use-virtual-scroll';
|
|
13
|
+
export * from './use-cache';
|
|
14
|
+
export * from './use-event-listener';
|
|
15
|
+
export * from './use-scroll-lock';
|
|
16
|
+
export * from './use-click-outside';
|
|
17
|
+
export * from './use-config';
|
|
18
|
+
export * from './use-ai';
|
|
19
|
+
export * from './storage';
|