{"version":3,"file":"use-wheel.mjs","sources":["../../../../../../../packages/components/virtual-list/src/hooks/use-wheel.ts"],"sourcesContent":["import { rAF, cAF } from '@sgui-plus/utils/raf'\r\nimport { isFF } from '../utils'\r\nimport { HORIZONTAL, VERTICAL } from '../defaults'\r\n\r\nimport type { ComputedRef } from 'vue'\r\nimport type { LayoutDirection } from '../types'\r\n\r\nconst LayoutKeys = {\r\n  [HORIZONTAL]: 'deltaX',\r\n  [VERTICAL]: 'deltaY',\r\n}\r\n\r\ninterface ListWheelState {\r\n  atStartEdge: ComputedRef<boolean> // exclusive to reachEnd\r\n  atEndEdge: ComputedRef<boolean>\r\n  layout: ComputedRef<LayoutDirection>\r\n}\r\n\r\ntype ListWheelHandler = (offset: number) => void\r\n\r\nconst useWheel = (\r\n  { atEndEdge, atStartEdge, layout }: ListWheelState,\r\n  onWheelDelta: ListWheelHandler\r\n) => {\r\n  let frameHandle: number\r\n  let offset = 0\r\n\r\n  // let scrollLock = false\r\n  // let lockHandle = null\r\n\r\n  // const lockScroll = () => {\r\n  //   clearTimeout(lockHandle)\r\n  //   scrollLock = true\r\n  //   lockHandle = setTimeout(() => scrollLock = false, 50)\r\n  // }\r\n\r\n  const hasReachedEdge = (offset: number) => {\r\n    const edgeReached =\r\n      (offset < 0 && atStartEdge.value) || (offset > 0 && atEndEdge.value)\r\n\r\n    return edgeReached\r\n  }\r\n\r\n  const onWheel = (e: WheelEvent) => {\r\n    cAF(frameHandle)\r\n\r\n    const newOffset = e[LayoutKeys[layout.value]]\r\n\r\n    if (hasReachedEdge(offset) && hasReachedEdge(offset + newOffset)) return\r\n\r\n    offset += newOffset\r\n\r\n    if (!isFF) {\r\n      e.preventDefault()\r\n    }\r\n\r\n    frameHandle = rAF(() => {\r\n      onWheelDelta(offset)\r\n      offset = 0\r\n    })\r\n  }\r\n\r\n  return {\r\n    hasReachedEdge,\r\n    onWheel,\r\n  }\r\n}\r\n\r\nexport default useWheel\r\n"],"names":[],"mappings":";;;;AAGA,MAAM,UAAU,GAAG;AACnB,EAAE,CAAC,UAAU,GAAG,QAAQ;AACxB,EAAE,CAAC,QAAQ,GAAG,QAAQ;AACtB,CAAC,CAAC;AACG,MAAC,QAAQ,GAAG,CAAC,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,YAAY,KAAK;AACvE,EAAE,IAAI,WAAW,CAAC;AAClB,EAAE,IAAI,MAAM,GAAG,CAAC,CAAC;AACjB,EAAE,MAAM,cAAc,GAAG,CAAC,OAAO,KAAK;AACtC,IAAI,MAAM,WAAW,GAAG,OAAO,GAAG,CAAC,IAAI,WAAW,CAAC,KAAK,IAAI,OAAO,GAAG,CAAC,IAAI,SAAS,CAAC,KAAK,CAAC;AAC3F,IAAI,OAAO,WAAW,CAAC;AACvB,GAAG,CAAC;AACJ,EAAE,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK;AACzB,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC;AACrB,IAAI,MAAM,SAAS,GAAG,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;AAClD,IAAI,IAAI,cAAc,CAAC,MAAM,CAAC,IAAI,cAAc,CAAC,MAAM,GAAG,SAAS,CAAC;AACpE,MAAM,OAAO;AACb,IAAI,MAAM,IAAI,SAAS,CAAC;AACxB,IAAI,IAAI,CAAC,IAAI,EAAE;AACf,MAAM,CAAC,CAAC,cAAc,EAAE,CAAC;AACzB,KAAK;AACL,IAAI,WAAW,GAAG,GAAG,CAAC,MAAM;AAC5B,MAAM,YAAY,CAAC,MAAM,CAAC,CAAC;AAC3B,MAAM,MAAM,GAAG,CAAC,CAAC;AACjB,KAAK,CAAC,CAAC;AACP,GAAG,CAAC;AACJ,EAAE,OAAO;AACT,IAAI,cAAc;AAClB,IAAI,OAAO;AACX,GAAG,CAAC;AACJ;;;;"}