1- import { useEffect , useRef } from "react" ;
1+ import { useEffect , useMemo , useRef } from "react" ;
22import { vscode } from "../vscode-api" ;
33
44/**
@@ -9,16 +9,34 @@ import { vscode } from "../vscode-api";
99 * @param options Extra optional arguments, including:
1010 * filterTelemetryOnValue: If provided, only output telemetry events when the
1111 * predicate returns true. If not provided always outputs telemetry.
12+ * debounceTimeout: If provided, will not output telemetry events for every change
13+ * but will wait until specified timeout happens with no new events ocurring.
1214 */
1315export function useTelemetryOnChange < S > (
1416 value : S ,
1517 telemetryAction : string ,
1618 options ?: {
1719 filterTelemetryOnValue ?: ( value : S ) => boolean ;
20+ debounceTimeoutMillis ?: number ;
1821 } ,
1922) {
2023 const previousValue = useRef ( value ) ;
2124 const filterTelemetryOnValue = options ?. filterTelemetryOnValue ;
25+ const debounceTimeoutMillis = options ?. debounceTimeoutMillis ;
26+
27+ const sendTelemetryFunc = useMemo < ( ) => void > ( ( ) => {
28+ if ( debounceTimeoutMillis === undefined ) {
29+ return ( ) => sendTelemetry ( telemetryAction ) ;
30+ } else {
31+ let timer : NodeJS . Timeout ;
32+ return ( ) => {
33+ clearTimeout ( timer ) ;
34+ timer = setTimeout ( ( ) => {
35+ sendTelemetry ( telemetryAction ) ;
36+ } , debounceTimeoutMillis ) ;
37+ } ;
38+ }
39+ } , [ telemetryAction , debounceTimeoutMillis ] ) ;
2240
2341 useEffect ( ( ) => {
2442 if ( value === previousValue . current ) {
@@ -30,8 +48,8 @@ export function useTelemetryOnChange<S>(
3048 return ;
3149 }
3250
33- sendTelemetry ( telemetryAction ) ;
34- } , [ telemetryAction , filterTelemetryOnValue , value , previousValue ] ) ;
51+ sendTelemetryFunc ( ) ;
52+ } , [ sendTelemetryFunc , filterTelemetryOnValue , value , previousValue ] ) ;
3553}
3654
3755export function sendTelemetry ( telemetryAction : string ) {
0 commit comments