UNPKG

@scrolia/react

Version:

A headless scrollbar component

1 lines 8.75 kB
{"version":3,"file":"thumb.mjs","names":["pointerOffset: number","startPos: StartPos","e: PointerEvent","_pointerOffset: number","_total: number","_view: number","delta: number","ratio: number","scrollTo: number","result: OnDragMoveResult | undefined","final: number","event: React.PointerEvent<HTMLDivElement>"],"sources":["../../src/hooks/thumb.ts"],"sourcesContent":["import type * as React from \"react\";\n\nimport type { Axis, OnDragMoveResult, Plugin } from \"#/@types/options\";\n\nimport { useScrollCore } from \"#/contexts/scrollcore\";\nimport { tryPlugin } from \"#/functions/plugin\";\n\ntype StartPos = {\n viewOffset: number;\n pointerOffset: number;\n};\n\ntype HandleOnPointerDownOptions = {\n axis: Axis;\n event: React.PointerEvent<HTMLDivElement>;\n disabled: boolean;\n page: boolean;\n plugins: Plugin[];\n contentRef: React.RefObject<HTMLElement | null>;\n hvTrack: boolean;\n hvThumb: boolean;\n total: React.RefObject<number>;\n view: React.RefObject<number>;\n viewOffset: React.RefObject<number>;\n};\n\nconst handleOnPointerDown = ({\n axis,\n event,\n disabled,\n page,\n plugins,\n contentRef,\n hvTrack,\n hvThumb,\n total,\n view,\n viewOffset,\n}: HandleOnPointerDownOptions): void => {\n event.preventDefault();\n\n const pointerOffset: number = axis === \"x\" ? event.clientX : event.clientY;\n\n const startPos: StartPos = {\n viewOffset: viewOffset.current,\n pointerOffset,\n };\n\n for (const plugin of plugins) {\n if (!plugin.onDragStart) continue;\n\n tryPlugin(plugin, plugin.onDragStart, {\n axis,\n isDisabled: disabled,\n isPage: page,\n isDefined: hvTrack && hvThumb,\n total: total.current,\n view: view.current,\n viewOffset: viewOffset.current,\n pointerOffset,\n });\n }\n\n const handlePointerMove = (e: PointerEvent): void => {\n const _pointerOffset: number = axis === \"x\" ? e.clientX : e.clientY;\n\n const _total: number = total.current;\n const _view: number = view.current;\n\n const delta: number = _pointerOffset - startPos.pointerOffset;\n const ratio: number = _view / _total;\n\n const scrollTo: number = startPos.viewOffset + delta / ratio;\n\n let result: OnDragMoveResult | undefined;\n\n for (const plugin of plugins) {\n if (!plugin.onDragMove) continue;\n\n result =\n tryPlugin(plugin, plugin.onDragMove, {\n axis,\n isDisabled: disabled,\n isPage: page,\n isDefined: hvTrack && hvThumb,\n total: _total,\n view: _view,\n viewOffset: viewOffset.current,\n pointerOffset: _pointerOffset,\n viewOffsetInit: startPos.viewOffset,\n pointerOffsetInit: startPos.pointerOffset,\n delta,\n ratio,\n scrollTo: result?.scrollTo ?? scrollTo,\n }) ?? result;\n }\n\n let final: number;\n\n if (result?.scrollTo) {\n final = result.scrollTo;\n } else {\n final = scrollTo;\n }\n\n if (page) {\n window.scrollTo({\n ...(axis === \"x\"\n ? {\n left: final,\n }\n : {\n top: final,\n }),\n behavior: \"instant\",\n });\n } else if (contentRef.current) {\n contentRef.current.scrollTo({\n ...(axis === \"x\"\n ? {\n left: final,\n }\n : {\n top: final,\n }),\n behavior: \"instant\",\n });\n }\n };\n\n const handlePointerUp = (e: PointerEvent): void => {\n for (const plugin of plugins) {\n if (!plugin.onDragEnd) continue;\n\n tryPlugin(plugin, plugin.onDragEnd, {\n axis,\n isDisabled: disabled,\n isPage: page,\n isDefined: hvTrack && hvThumb,\n total: total.current,\n view: view.current,\n viewOffset: viewOffset.current,\n pointerOffset: axis === \"x\" ? e.clientX : e.clientY,\n viewOffsetInit: startPos.viewOffset,\n pointerOffsetInit: startPos.pointerOffset,\n });\n }\n\n window.removeEventListener(\"pointermove\", handlePointerMove);\n window.removeEventListener(\"pointerup\", handlePointerUp);\n };\n\n window.addEventListener(\"pointermove\", handlePointerMove);\n window.addEventListener(\"pointerup\", handlePointerUp);\n};\n\n/** Hook for thumb logic. */\nconst useThumbXHandler = () => {\n const {\n options: { disabled, page, plugins },\n contentRef,\n x: { hvTrack, hvThumb, total, view, viewOffset },\n } = useScrollCore();\n\n const onPointerDown = (event: React.PointerEvent<HTMLDivElement>): void => {\n handleOnPointerDown({\n axis: \"x\",\n event,\n disabled,\n page,\n plugins,\n contentRef,\n hvTrack,\n hvThumb,\n total,\n view,\n viewOffset,\n });\n };\n\n return {\n onPointerDown,\n };\n};\n\n/** Hook for thumb logic. */\nconst useThumbYHandler = () => {\n const {\n options: { disabled, page, plugins },\n contentRef,\n y: { hvTrack, hvThumb, total, view, viewOffset },\n } = useScrollCore();\n\n const onPointerDown = (event: React.PointerEvent<HTMLDivElement>): void => {\n handleOnPointerDown({\n axis: \"y\",\n event,\n disabled,\n page,\n plugins,\n contentRef,\n hvTrack,\n hvThumb,\n total,\n view,\n viewOffset,\n });\n };\n\n return {\n onPointerDown,\n };\n};\n\n/** Result of the `useThumbXHandler` hook. */\ntype ThumbXHandler = ReturnType<typeof useThumbXHandler>;\n\n/** Result of the `useThumbYHandler` hook. */\ntype ThumbYHandler = ReturnType<typeof useThumbYHandler>;\n\nexport type { ThumbXHandler, ThumbYHandler };\nexport { useThumbXHandler, useThumbYHandler };\n"],"mappings":"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"}