@easyv/biz-components 0.0.33 → 0.0.35
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/dist/hooks/index.d.ts +1 -1
- package/dist/hooks/useDivAutoScroll.d.ts +8 -0
- package/dist/hooks/useDivAutoScroll.es.js.map +1 -1
- package/dist/hooks/useWatchValue/useWatchValue.cy.d.ts +1 -0
- package/dist/hooks/{useWatchValue.d.ts → useWatchValue/useWatchValue.d.ts} +6 -7
- package/dist/hooks/useWatchValue/useWatchValue.es.js +43 -0
- package/dist/hooks/useWatchValue/useWatchValue.es.js.map +1 -0
- package/dist/index.es.js +1 -1
- package/package.json +1 -1
- package/dist/hooks/useWatchValue.es.js +0 -32
- package/dist/hooks/useWatchValue.es.js.map +0 -1
package/dist/hooks/index.d.ts
CHANGED
|
@@ -5,5 +5,13 @@ interface ScrollControllerProps {
|
|
|
5
5
|
scrollBehavior?: 'auto' | 'smooth';
|
|
6
6
|
containerRef: React.RefObject<HTMLDivElement | null>;
|
|
7
7
|
}
|
|
8
|
+
/**
|
|
9
|
+
* 自动滚动 hook,用法是你传入一个容器的 ref,当你调用返回函数时,那么容器内的内容变化时,会自动滚动到最底部。
|
|
10
|
+
* @param params 传入一个对象,包含以下属性:
|
|
11
|
+
* scrollBuffer:滚动缓冲距离,默认为 50px。
|
|
12
|
+
* scrollBehavior:滚动行为,默认为 'smooth'。
|
|
13
|
+
* containerRef:容器的 React ref 引用对象。
|
|
14
|
+
* @returns 一个触发自动滚动的函数
|
|
15
|
+
*/
|
|
8
16
|
export declare function useDivAutoScroll(params: ScrollControllerProps): () => void;
|
|
9
17
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useDivAutoScroll.es.js","sources":["../../src/hooks/useDivAutoScroll.ts"],"sourcesContent":["import React, { useCallback, useEffect, useRef, useState } from 'react';\n\ninterface ScrollControllerProps {\n scrollBuffer?: number;\n scrollBehavior?: 'auto' | 'smooth';\n containerRef: React.RefObject<HTMLDivElement | null>;\n}\n\nexport function useDivAutoScroll(params: ScrollControllerProps) {\n const { scrollBuffer = 50, scrollBehavior = 'smooth', containerRef } = params;\n const [isAutoScroll, setIsAutoScroll] = useState(true);\n const isUserScrolling = useRef(false);\n const scrollTimeout = useRef<NodeJS.Timeout>();\n\n // 检测是否接近底部\n const isNearBottom = useCallback(() => {\n if (!containerRef.current) return false;\n const { scrollHeight, scrollTop, clientHeight } = containerRef.current;\n return scrollHeight - scrollTop - clientHeight < scrollBuffer;\n }, [containerRef, scrollBuffer]);\n\n // 自动滚动逻辑\n const autoScroll = useCallback(() => {\n if (isAutoScroll && containerRef.current) {\n containerRef.current.scrollTo({\n top: containerRef.current.scrollHeight,\n behavior: scrollBehavior,\n });\n }\n }, [containerRef, isAutoScroll, scrollBehavior]);\n\n // 处理滚动事件\n const handleScroll = useCallback(() => {\n if (!containerRef.current) return;\n\n // 清除之前的定时器\n if (scrollTimeout.current) clearTimeout(scrollTimeout.current);\n\n // 标记用户滚动行为\n if (!isUserScrolling.current) {\n isUserScrolling.current = true;\n }\n\n // 设置滚动状态重置\n scrollTimeout.current = setTimeout(() => {\n isUserScrolling.current = false;\n }, 100);\n\n // 判断是否接近底部\n if (isNearBottom()) {\n setIsAutoScroll(true);\n } else {\n setIsAutoScroll(false);\n }\n }, [containerRef, isNearBottom]);\n\n // 初始化事件监听\n useEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n\n container.addEventListener('scroll', handleScroll);\n return () => container.removeEventListener('scroll', handleScroll);\n }, [containerRef, handleScroll]);\n\n // 内容变化时自动滚动\n const triggerAutoScroll = useCallback(() => {\n if (!isUserScrolling.current) {\n autoScroll();\n }\n }, [autoScroll, isUserScrolling]);\n\n return triggerAutoScroll;\n}\n"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"useDivAutoScroll.es.js","sources":["../../src/hooks/useDivAutoScroll.ts"],"sourcesContent":["import React, { useCallback, useEffect, useRef, useState } from 'react';\n\ninterface ScrollControllerProps {\n scrollBuffer?: number;\n scrollBehavior?: 'auto' | 'smooth';\n containerRef: React.RefObject<HTMLDivElement | null>;\n}\n\n/**\n * 自动滚动 hook,用法是你传入一个容器的 ref,当你调用返回函数时,那么容器内的内容变化时,会自动滚动到最底部。\n * @param params 传入一个对象,包含以下属性:\n * scrollBuffer:滚动缓冲距离,默认为 50px。\n * scrollBehavior:滚动行为,默认为 'smooth'。\n * containerRef:容器的 React ref 引用对象。\n * @returns 一个触发自动滚动的函数\n */\nexport function useDivAutoScroll(params: ScrollControllerProps) {\n const { scrollBuffer = 50, scrollBehavior = 'smooth', containerRef } = params;\n const [isAutoScroll, setIsAutoScroll] = useState(true);\n const isUserScrolling = useRef(false);\n const scrollTimeout = useRef<NodeJS.Timeout>();\n\n // 检测是否接近底部\n const isNearBottom = useCallback(() => {\n if (!containerRef.current) return false;\n const { scrollHeight, scrollTop, clientHeight } = containerRef.current;\n return scrollHeight - scrollTop - clientHeight < scrollBuffer;\n }, [containerRef, scrollBuffer]);\n\n // 自动滚动逻辑\n const autoScroll = useCallback(() => {\n if (isAutoScroll && containerRef.current) {\n containerRef.current.scrollTo({\n top: containerRef.current.scrollHeight,\n behavior: scrollBehavior,\n });\n }\n }, [containerRef, isAutoScroll, scrollBehavior]);\n\n // 处理滚动事件\n const handleScroll = useCallback(() => {\n if (!containerRef.current) return;\n\n // 清除之前的定时器\n if (scrollTimeout.current) clearTimeout(scrollTimeout.current);\n\n // 标记用户滚动行为\n if (!isUserScrolling.current) {\n isUserScrolling.current = true;\n }\n\n // 设置滚动状态重置\n scrollTimeout.current = setTimeout(() => {\n isUserScrolling.current = false;\n }, 100);\n\n // 判断是否接近底部\n if (isNearBottom()) {\n setIsAutoScroll(true);\n } else {\n setIsAutoScroll(false);\n }\n }, [containerRef, isNearBottom]);\n\n // 初始化事件监听\n useEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n\n container.addEventListener('scroll', handleScroll);\n return () => container.removeEventListener('scroll', handleScroll);\n }, [containerRef, handleScroll]);\n\n // 内容变化时自动滚动\n const triggerAutoScroll = useCallback(() => {\n if (!isUserScrolling.current) {\n autoScroll();\n }\n }, [autoScroll, isUserScrolling]);\n\n return triggerAutoScroll;\n}\n"],"names":[],"mappings":";AAgBO,SAAS,iBAAiB,QAA+B;AAC9D,QAAM,EAAE,eAAe,IAAI,iBAAiB,UAAU,iBAAiB;AACvE,QAAM,CAAC,cAAc,eAAe,IAAI,SAAS,IAAI;AAC/C,QAAA,kBAAkB,OAAO,KAAK;AACpC,QAAM,gBAAgB,OAAuB;AAGvC,QAAA,eAAe,YAAY,MAAM;AACjC,QAAA,CAAC,aAAa,QAAgB,QAAA;AAClC,UAAM,EAAE,cAAc,WAAW,iBAAiB,aAAa;AACxD,WAAA,eAAe,YAAY,eAAe;AAAA,EAAA,GAChD,CAAC,cAAc,YAAY,CAAC;AAGzB,QAAA,aAAa,YAAY,MAAM;AAC/B,QAAA,gBAAgB,aAAa,SAAS;AACxC,mBAAa,QAAQ,SAAS;AAAA,QAC5B,KAAK,aAAa,QAAQ;AAAA,QAC1B,UAAU;AAAA,MAAA,CACX;AAAA,IAAA;AAAA,EAEF,GAAA,CAAC,cAAc,cAAc,cAAc,CAAC;AAGzC,QAAA,eAAe,YAAY,MAAM;AACjC,QAAA,CAAC,aAAa,QAAS;AAG3B,QAAI,cAAc,QAAsB,cAAA,cAAc,OAAO;AAGzD,QAAA,CAAC,gBAAgB,SAAS;AAC5B,sBAAgB,UAAU;AAAA,IAAA;AAId,kBAAA,UAAU,WAAW,MAAM;AACvC,sBAAgB,UAAU;AAAA,OACzB,GAAG;AAGN,QAAI,gBAAgB;AAClB,sBAAgB,IAAI;AAAA,IAAA,OACf;AACL,sBAAgB,KAAK;AAAA,IAAA;AAAA,EACvB,GACC,CAAC,cAAc,YAAY,CAAC;AAG/B,YAAU,MAAM;AACd,UAAM,YAAY,aAAa;AAC/B,QAAI,CAAC,UAAW;AAEN,cAAA,iBAAiB,UAAU,YAAY;AACjD,WAAO,MAAM,UAAU,oBAAoB,UAAU,YAAY;AAAA,EAAA,GAChE,CAAC,cAAc,YAAY,CAAC;AAGzB,QAAA,oBAAoB,YAAY,MAAM;AACtC,QAAA,CAAC,gBAAgB,SAAS;AACjB,iBAAA;AAAA,IAAA;AAAA,EACb,GACC,CAAC,YAAY,eAAe,CAAC;AAEzB,SAAA;AACT;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -1,18 +1,17 @@
|
|
|
1
1
|
type BaseValueType = string | number | boolean | object | Array<unknown> | null | undefined;
|
|
2
2
|
interface Params<T> {
|
|
3
3
|
value: T;
|
|
4
|
-
callback: (newValue: T, oldValue?: T) => void | Promise<void> | (() => void);
|
|
5
|
-
/** 清理函数,同 react 的 cleanup 函数 */
|
|
6
|
-
clearupFn?: (value: T | null) => void;
|
|
4
|
+
callback: (newValue: T, oldValue?: T | undefined) => void | Promise<void> | (() => void);
|
|
7
5
|
options?: {
|
|
8
6
|
equalFn?: (value1: T, value2: T) => boolean;
|
|
9
7
|
immediate?: boolean;
|
|
10
8
|
};
|
|
11
9
|
}
|
|
12
|
-
|
|
13
|
-
* 值变化时调用 callback
|
|
14
|
-
* 判断值是否变化默认使用 lodash 的 isEqual
|
|
15
|
-
* @param params { value: T; callback: (newValue: T, oldValue?: T) => void | Promise<void>; options?: { equalFn: (value1: T, value2: T) => boolean; immediate?: boolean; }
|
|
10
|
+
/** 监听值变化,
|
|
11
|
+
* - 值变化时调用 callback
|
|
12
|
+
* - 判断值是否变化默认使用 lodash 的 isEqual
|
|
13
|
+
* @param params { value: T; callback: (newValue: T, oldValue?: T) => void | Promise<void>; options?: { equalFn: (value1: T, value2: T) => boolean; immediate?: boolean; }}
|
|
14
|
+
* - 注意:如果你需要使用 useEffect 的 cleanUp 函数,可以考虑在 callback 中使用。或者使用 useEffect。
|
|
16
15
|
*/
|
|
17
16
|
export declare function useWatchValue<T extends BaseValueType>(params: Params<T>): void;
|
|
18
17
|
export {};
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { useRef, useEffect } from "react";
|
|
2
|
+
import isEqual from "../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/isEqual.es.js";
|
|
3
|
+
function useWatchValue(params) {
|
|
4
|
+
const { value, callback, options } = params;
|
|
5
|
+
const ref = useRef(void 0);
|
|
6
|
+
const initialRef = useRef(false);
|
|
7
|
+
const { equalFn = isEqual, immediate } = options || {};
|
|
8
|
+
const fnObj = useRef({
|
|
9
|
+
callback,
|
|
10
|
+
equalFn,
|
|
11
|
+
immediate
|
|
12
|
+
});
|
|
13
|
+
fnObj.current = {
|
|
14
|
+
callback,
|
|
15
|
+
equalFn,
|
|
16
|
+
immediate
|
|
17
|
+
};
|
|
18
|
+
useEffect(() => {
|
|
19
|
+
const {
|
|
20
|
+
callback: callbackInner,
|
|
21
|
+
equalFn: equalFnInner,
|
|
22
|
+
immediate: immediateInner
|
|
23
|
+
} = fnObj.current;
|
|
24
|
+
if (immediateInner && !initialRef.current) {
|
|
25
|
+
callbackInner(value);
|
|
26
|
+
ref.current = value;
|
|
27
|
+
}
|
|
28
|
+
if (initialRef.current === false) {
|
|
29
|
+
initialRef.current = true;
|
|
30
|
+
}
|
|
31
|
+
const isEqualValue = equalFnInner(value, ref.current);
|
|
32
|
+
if (ref.current === void 0) {
|
|
33
|
+
ref.current = value;
|
|
34
|
+
} else if (isEqualValue === false) {
|
|
35
|
+
callbackInner(value, ref.current);
|
|
36
|
+
ref.current = value;
|
|
37
|
+
}
|
|
38
|
+
}, [value]);
|
|
39
|
+
}
|
|
40
|
+
export {
|
|
41
|
+
useWatchValue
|
|
42
|
+
};
|
|
43
|
+
//# sourceMappingURL=useWatchValue.es.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useWatchValue.es.js","sources":["../../../src/hooks/useWatchValue/useWatchValue.ts"],"sourcesContent":["import { useEffect, useRef } from 'react';\nimport { isEqual } from 'lodash-es';\n\ntype BaseValueType = string | number | boolean | object | Array<unknown> | null | undefined;\n\ninterface Params<T> {\n value: T;\n callback: (newValue: T, oldValue?: T | undefined) => void | Promise<void> | (() => void);\n options?: {\n equalFn?: (value1: T, value2: T) => boolean;\n immediate?: boolean;\n };\n}\n\n/** 监听值变化,\n * - 值变化时调用 callback\n * - 判断值是否变化默认使用 lodash 的 isEqual\n * @param params { value: T; callback: (newValue: T, oldValue?: T) => void | Promise<void>; options?: { equalFn: (value1: T, value2: T) => boolean; immediate?: boolean; }}\n * - 注意:如果你需要使用 useEffect 的 cleanUp 函数,可以考虑在 callback 中使用。或者使用 useEffect。\n */\nexport function useWatchValue<T extends BaseValueType>(params: Params<T>) {\n const { value, callback, options } = params;\n const ref = useRef<T | undefined>(undefined);\n const initialRef = useRef(false);\n\n const { equalFn = isEqual, immediate } = options || {};\n const fnObj = useRef({\n callback,\n equalFn,\n immediate,\n });\n fnObj.current = {\n callback,\n equalFn,\n immediate,\n };\n\n useEffect(() => {\n const {\n callback: callbackInner,\n equalFn: equalFnInner,\n immediate: immediateInner,\n } = fnObj.current;\n if (immediateInner && !initialRef.current) {\n callbackInner(value);\n ref.current = value;\n }\n if (initialRef.current === false) {\n initialRef.current = true;\n }\n\n const isEqualValue = equalFnInner(value, ref.current);\n if (ref.current === undefined) {\n ref.current = value;\n } else if (isEqualValue === false) {\n callbackInner(value, ref.current);\n ref.current = value;\n }\n }, [value]);\n}\n"],"names":[],"mappings":";;AAoBO,SAAS,cAAuC,QAAmB;AACxE,QAAM,EAAE,OAAO,UAAU,QAAY,IAAA;AAC/B,QAAA,MAAM,OAAsB,MAAS;AACrC,QAAA,aAAa,OAAO,KAAK;AAE/B,QAAM,EAAE,UAAU,SAAS,UAAU,IAAI,WAAW,CAAC;AACrD,QAAM,QAAQ,OAAO;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,EAAA,CACD;AACD,QAAM,UAAU;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,YAAU,MAAM;AACR,UAAA;AAAA,MACJ,UAAU;AAAA,MACV,SAAS;AAAA,MACT,WAAW;AAAA,QACT,MAAM;AACN,QAAA,kBAAkB,CAAC,WAAW,SAAS;AACzC,oBAAc,KAAK;AACnB,UAAI,UAAU;AAAA,IAAA;AAEZ,QAAA,WAAW,YAAY,OAAO;AAChC,iBAAW,UAAU;AAAA,IAAA;AAGvB,UAAM,eAAe,aAAa,OAAO,IAAI,OAAO;AAChD,QAAA,IAAI,YAAY,QAAW;AAC7B,UAAI,UAAU;AAAA,IAAA,WACL,iBAAiB,OAAO;AACnB,oBAAA,OAAO,IAAI,OAAO;AAChC,UAAI,UAAU;AAAA,IAAA;AAAA,EAChB,GACC,CAAC,KAAK,CAAC;AACZ;"}
|
package/dist/index.es.js
CHANGED
|
@@ -5,7 +5,7 @@ import { VoiceAnimation } from "./components/VoiceAnimation/VoiceAnimation.es.js
|
|
|
5
5
|
import { useDivAutoScroll } from "./hooks/useDivAutoScroll.es.js";
|
|
6
6
|
import { useXunFeiSteamVoiceManager } from "./hooks/useXunFeiSteamVoiceManager.es.js";
|
|
7
7
|
import { useInitialized } from "./hooks/useInitialized.es.js";
|
|
8
|
-
import { useWatchValue } from "./hooks/useWatchValue.es.js";
|
|
8
|
+
import { useWatchValue } from "./hooks/useWatchValue/useWatchValue.es.js";
|
|
9
9
|
import { FunASRManager, getWebSocketConnectForFunASR } from "./utils/funASR/funASRManager.es.js";
|
|
10
10
|
import { XFStreamVoiceManager } from "./utils/xunFeiVoice/XFStreamVoiceManager.es.js";
|
|
11
11
|
import { RecorderManager } from "./utils/xunFeiVoice/RecorderManager/RecorderManager.es.js";
|
package/package.json
CHANGED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import { useRef, useEffect } from "react";
|
|
2
|
-
import isEqual from "../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/isEqual.es.js";
|
|
3
|
-
function useWatchValue(params) {
|
|
4
|
-
const { value, callback, clearupFn, options } = params;
|
|
5
|
-
const ref = useRef(null);
|
|
6
|
-
const initialRef = useRef(false);
|
|
7
|
-
const { equalFn = isEqual } = options || {};
|
|
8
|
-
useEffect(() => {
|
|
9
|
-
let isCallbackRun = false;
|
|
10
|
-
if ((options == null ? void 0 : options.immediate) && !initialRef.current) {
|
|
11
|
-
isCallbackRun = true;
|
|
12
|
-
callback(value, value);
|
|
13
|
-
initialRef.current = true;
|
|
14
|
-
}
|
|
15
|
-
if (ref.current === null) {
|
|
16
|
-
ref.current = value;
|
|
17
|
-
} else if (equalFn(value, ref.current) === false) {
|
|
18
|
-
isCallbackRun = true;
|
|
19
|
-
callback(value, ref.current);
|
|
20
|
-
ref.current = value;
|
|
21
|
-
}
|
|
22
|
-
return () => {
|
|
23
|
-
if (isCallbackRun && clearupFn) {
|
|
24
|
-
clearupFn(ref.current);
|
|
25
|
-
}
|
|
26
|
-
};
|
|
27
|
-
});
|
|
28
|
-
}
|
|
29
|
-
export {
|
|
30
|
-
useWatchValue
|
|
31
|
-
};
|
|
32
|
-
//# sourceMappingURL=useWatchValue.es.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useWatchValue.es.js","sources":["../../src/hooks/useWatchValue.ts"],"sourcesContent":["import { useEffect, useRef } from 'react';\nimport { isEqual } from 'lodash-es';\n\ntype BaseValueType = string | number | boolean | object | Array<unknown> | null | undefined;\n\ninterface Params<T> {\n value: T;\n callback: (newValue: T, oldValue?: T) => void | Promise<void> | (() => void);\n /** 清理函数,同 react 的 cleanup 函数 */\n clearupFn?: (value: T | null) => void;\n options?: {\n equalFn?: (value1: T, value2: T) => boolean;\n immediate?: boolean;\n };\n}\n/**监听值变化,\n * 值变化时调用 callback\n * 判断值是否变化默认使用 lodash 的 isEqual\n * @param params { value: T; callback: (newValue: T, oldValue?: T) => void | Promise<void>; options?: { equalFn: (value1: T, value2: T) => boolean; immediate?: boolean; } }\n */\nexport function useWatchValue<T extends BaseValueType>(params: Params<T>) {\n const { value, callback, clearupFn, options } = params;\n const ref = useRef<T | null>(null);\n const initialRef = useRef(false);\n\n const { equalFn = isEqual } = options || {};\n\n useEffect(() => {\n let isCallbackRun = false;\n if (options?.immediate && !initialRef.current) {\n isCallbackRun = true;\n callback(value, value);\n initialRef.current = true;\n }\n\n if (ref.current === null) {\n ref.current = value;\n } else if (equalFn(value, ref.current) === false) {\n isCallbackRun = true;\n callback(value, ref.current);\n ref.current = value;\n }\n return () => {\n if (isCallbackRun && clearupFn) {\n clearupFn(ref.current);\n }\n };\n });\n}\n"],"names":[],"mappings":";;AAoBO,SAAS,cAAuC,QAAmB;AACxE,QAAM,EAAE,OAAO,UAAU,WAAW,QAAY,IAAA;AAC1C,QAAA,MAAM,OAAiB,IAAI;AAC3B,QAAA,aAAa,OAAO,KAAK;AAE/B,QAAM,EAAE,UAAU,QAAQ,IAAI,WAAW,CAAC;AAE1C,YAAU,MAAM;AACd,QAAI,gBAAgB;AACpB,SAAI,mCAAS,cAAa,CAAC,WAAW,SAAS;AAC7B,sBAAA;AAChB,eAAS,OAAO,KAAK;AACrB,iBAAW,UAAU;AAAA,IAAA;AAGnB,QAAA,IAAI,YAAY,MAAM;AACxB,UAAI,UAAU;AAAA,IAAA,WACL,QAAQ,OAAO,IAAI,OAAO,MAAM,OAAO;AAChC,sBAAA;AACP,eAAA,OAAO,IAAI,OAAO;AAC3B,UAAI,UAAU;AAAA,IAAA;AAEhB,WAAO,MAAM;AACX,UAAI,iBAAiB,WAAW;AAC9B,kBAAU,IAAI,OAAO;AAAA,MAAA;AAAA,IAEzB;AAAA,EAAA,CACD;AACH;"}
|