{"version":3,"sources":["../../src/use-text-selection/index.ts"],"sourcesContent":["import { useRef } from 'react'\nimport { useEventListener } from '../use-event-listener'\nimport { useSafeState } from '../use-safe-state'\n\nimport type { MutableRefObject } from 'react'\n\nexport interface UseTextSelectionReturns {\n  /**\n   * A React Ref object that holds the current Selection object.\n   */\n  selectionRef: MutableRefObject<Selection | null>\n  /**\n   * The selected text.\n   */\n  text: string\n  /**\n   * The DOMRect objects for each selected range.\n   */\n  rects: DOMRect[]\n  /**\n   * The Range objects for each selected range.\n   */\n  ranges: Range[]\n}\n\n/**\n * A React Hook that helps to get the selection state of the document.\n */\nexport function useTextSelection(): UseTextSelectionReturns {\n  const selectionRef = useRef<Selection | null>(null)\n  const [selectionState, setSelectionState] = useSafeState({\n    text: '',\n    rects: [] as DOMRect[],\n    ranges: [] as Range[],\n  })\n\n  useEventListener(\n    () => document,\n    'selectionchange',\n    () => {\n      selectionRef.current = window.getSelection()\n\n      const text = selectionRef.current?.toString() ?? ''\n      const ranges = selectionRef.current ? getRangesFromSelection(selectionRef.current) : []\n      const rects = ranges.map((range) => range.getBoundingClientRect())\n\n      setSelectionState({ text, rects, ranges })\n    },\n  )\n\n  return {\n    selectionRef,\n    ...selectionState,\n  }\n}\n\nfunction getRangesFromSelection(selection: Selection) {\n  const rangeCount = selection.rangeCount ?? 0\n  return Array.from({ length: rangeCount }, (_, i) => selection.getRangeAt(i))\n}\n"],"names":["useTextSelection","selectionRef","useRef","useSafeState","text","rects","ranges","selectionState","setSelectionState","useEventListener","document","current","window","getSelection","toString","getRangesFromSelection","map","range","getBoundingClientRect","selection","rangeCount","Array","from","length","_","i","getRangeAt"],"mappings":";;;;+BA4BgBA;;;eAAAA;;;qBA5BO;gCACU;4BACJ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0BtB,SAASA;IACd,IAAMC,eAAeC,IAAAA,aAAM,EAAmB;IAC9C,IAA4CC,iCAAAA,IAAAA,0BAAY,EAAC;QACvDC,MAAM;QACNC,OAAO,EAAE;QACTC,QAAQ,EAAE;IACZ,QAJOC,iBAAqCJ,kBAArBK,oBAAqBL;IAM5CM,IAAAA,kCAAgB,EACd;eAAMC;OACN,mBACA;YAGeT;QAFbA,aAAaU,OAAO,GAAGC,OAAOC,YAAY;YAE7BZ;QAAb,IAAMG,OAAOH,CAAAA,kCAAAA,wBAAAA,aAAaU,OAAO,cAApBV,4CAAAA,sBAAsBa,QAAQ,gBAA9Bb,4CAAAA,iCAAoC;QACjD,IAAMK,SAASL,aAAaU,OAAO,GAAGI,uBAAuBd,aAAaU,OAAO,IAAI,EAAE;QACvF,IAAMN,QAAQC,OAAOU,GAAG,CAAC,SAACC;mBAAUA,MAAMC,qBAAqB;;QAE/DV,kBAAkB;YAAEJ,MAAAA;YAAMC,OAAAA;YAAOC,QAAAA;QAAO;IAC1C;IAGF,OAAO;QACLL,cAAAA;OACGM;AAEP;AAEA,SAASQ,uBAAuBI,SAAoB;QAC/BA;IAAnB,IAAMC,aAAaD,CAAAA,wBAAAA,UAAUC,UAAU,cAApBD,mCAAAA,wBAAwB;IAC3C,OAAOE,MAAMC,IAAI,CAAC;QAAEC,QAAQH;IAAW,GAAG,SAACI,GAAGC;eAAMN,UAAUO,UAAU,CAACD;;AAC3E"}