@nypl/web-reader 4.2.0 → 4.3.0

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/esm/index.js CHANGED
@@ -35625,7 +35625,23 @@ function getTheme3(colorMode = "day") {
35625
35625
 
35626
35626
  // src/ui/ToggleButton.tsx
35627
35627
  function ToggleButton(props) {
35628
- const _a = props, { children, colorMode, icon, iconFill, label, value } = _a, rest = __objRest(_a, ["children", "colorMode", "icon", "iconFill", "label", "value"]);
35628
+ const _a = props, {
35629
+ children,
35630
+ colorMode,
35631
+ icon,
35632
+ iconFill,
35633
+ label,
35634
+ value,
35635
+ isChecked
35636
+ } = _a, rest = __objRest(_a, [
35637
+ "children",
35638
+ "colorMode",
35639
+ "icon",
35640
+ "iconFill",
35641
+ "label",
35642
+ "value",
35643
+ "isChecked"
35644
+ ]);
35629
35645
  const { getInputProps, getCheckboxProps } = useRadio(props);
35630
35646
  const input = getInputProps();
35631
35647
  const checkbox = getCheckboxProps();
@@ -40480,81 +40496,10 @@ function LoadingSkeleton({
40480
40496
  }));
40481
40497
  }
40482
40498
 
40483
- // src/PdfReader/index.tsx
40499
+ // src/PdfReader/lib.ts
40484
40500
  var IFRAME_WRAPPER_ID = "iframe-wrapper";
40485
40501
  var SCALE_STEP = 0.1;
40486
40502
  var START_QUERY = "start";
40487
- function pdfReducer(state2, action) {
40488
- switch (action.type) {
40489
- case "ARGS_CHANGED": {
40490
- return {
40491
- state: "ACTIVE",
40492
- settings: DEFAULT_SETTINGS,
40493
- resourceIndex: 0,
40494
- resource: null,
40495
- pageNumber: 1,
40496
- numPages: null,
40497
- scale: 1,
40498
- pdfWidth: 0,
40499
- pdfHeight: 0,
40500
- pageHeight: void 0,
40501
- pageWidth: void 0,
40502
- atStart: true,
40503
- atEnd: false
40504
- };
40505
- }
40506
- case "SET_CURRENT_RESOURCE":
40507
- return __spreadProps(__spreadValues({}, state2), {
40508
- resource: null,
40509
- resourceIndex: action.index,
40510
- pageNumber: action.shouldNavigateToEnd ? -1 : 1,
40511
- numPages: null
40512
- });
40513
- case "RESOURCE_FETCH_SUCCESS":
40514
- return __spreadProps(__spreadValues({}, state2), {
40515
- resource: action.resource
40516
- });
40517
- case "PDF_PARSED":
40518
- return __spreadProps(__spreadValues({}, state2), {
40519
- numPages: action.numPages,
40520
- pageNumber: state2.pageNumber === -1 ? action.numPages : state2.pageNumber
40521
- });
40522
- case "NAVIGATE_PAGE":
40523
- return __spreadProps(__spreadValues({}, state2), {
40524
- pageNumber: action.pageNum
40525
- });
40526
- case "SET_SCROLL":
40527
- if (state2.state !== "ACTIVE") {
40528
- return handleInvalidTransition(state2, action);
40529
- }
40530
- return __spreadProps(__spreadValues({}, state2), {
40531
- settings: __spreadProps(__spreadValues({}, state2.settings), {
40532
- isScrolling: action.isScrolling
40533
- })
40534
- });
40535
- case "SET_SCALE":
40536
- return __spreadProps(__spreadValues({}, state2), {
40537
- scale: action.scale
40538
- });
40539
- case "PAGE_LOAD_SUCCESS":
40540
- return __spreadProps(__spreadValues({}, state2), {
40541
- pdfWidth: action.width,
40542
- pdfHeight: action.height,
40543
- pageWidth: action.width,
40544
- pageHeight: action.height
40545
- });
40546
- case "RESIZE_PAGE":
40547
- return __spreadProps(__spreadValues({}, state2), {
40548
- pageWidth: action.width,
40549
- pageHeight: action.height
40550
- });
40551
- case "BOOK_BOUNDARY_CHANGED":
40552
- return __spreadProps(__spreadValues({}, state2), {
40553
- atStart: action.atStart,
40554
- atEnd: action.atEnd
40555
- });
40556
- }
40557
- }
40558
40503
  var getResourceUrl = (index, readingOrder) => {
40559
40504
  if (!readingOrder || !readingOrder.length) {
40560
40505
  throw new Error("A manifest has been returned, but has no reading order");
@@ -40565,19 +40510,197 @@ var loadResource = (resourceUrl, proxyUrl) => __async(void 0, null, function* ()
40565
40510
  const url = proxyUrl ? `${proxyUrl}${encodeURIComponent(resourceUrl)}` : resourceUrl;
40566
40511
  const response = yield fetch(url, { mode: "cors" });
40567
40512
  const array = new Uint8Array(yield response.arrayBuffer());
40568
- console.log("proxied", url, response);
40569
40513
  if (!response.ok) {
40570
40514
  throw new Error("Response not Ok for URL: " + url);
40571
40515
  }
40572
40516
  return array;
40573
40517
  });
40574
- var getStartPage = (resourceUrl) => {
40575
- const params = new URL(resourceUrl).searchParams;
40518
+ function getIndexFromHref(href, manifest) {
40519
+ var _a;
40520
+ const input = new URL(href);
40521
+ const index = (_a = manifest == null ? void 0 : manifest.readingOrder) == null ? void 0 : _a.findIndex((link2) => {
40522
+ return doHrefsMatch(link2.href, input);
40523
+ });
40524
+ if (index < 0) {
40525
+ throw new Error(`Cannot find resource in readingOrder: ${href}`);
40526
+ }
40527
+ return index;
40528
+ }
40529
+ function doHrefsMatch(href1, href2) {
40530
+ const input1 = new URL(href1);
40531
+ const input2 = new URL(href2);
40532
+ return input1.pathname === input2.pathname && input1.hostname === input2.hostname && input1.protocol === input2.protocol;
40533
+ }
40534
+ var getStartPageFromHref = (href) => {
40535
+ const params = new URL(href).searchParams;
40576
40536
  const startPage = params.get(START_QUERY);
40577
- return startPage ? parseInt(startPage) : 1;
40537
+ return startPage ? parseInt(startPage) : void 0;
40578
40538
  };
40539
+ var getPageNumberFromHref = (href) => {
40540
+ const hash4 = new URL(href).hash;
40541
+ try {
40542
+ const strPageNumber = hash4.replace("#page=", "");
40543
+ if (!strPageNumber || strPageNumber === "NaN")
40544
+ return void 0;
40545
+ const pageNumber = parseInt(strPageNumber);
40546
+ return pageNumber;
40547
+ } catch (e) {
40548
+ console.warn(`Failed to parse page number from hash ${hash4}`);
40549
+ return void 0;
40550
+ }
40551
+ };
40552
+
40553
+ // src/PdfReader/reducer.ts
40554
+ function makePdfReducer(args) {
40555
+ if (!args)
40556
+ return (state2, _action) => state2;
40557
+ const { manifest } = args;
40558
+ return function reducer(state2, action) {
40559
+ var _a, _b, _c;
40560
+ if (state2.state !== "ACTIVE" && action.type !== "ARGS_CHANGED") {
40561
+ return handleInvalidTransition(state2, action);
40562
+ }
40563
+ function goToLocation(index, page = 1) {
40564
+ const shouldResetResource = state2.resourceIndex !== index;
40565
+ const href = manifest.readingOrder[index].href;
40566
+ const startPage = getStartPageFromHref(href);
40567
+ const isNavigatingToEnd = page === -1;
40568
+ const requestedPageIsBeforeStartPage = startPage && page < startPage;
40569
+ const pageNumberToNavigateTo = !isNavigatingToEnd && requestedPageIsBeforeStartPage ? startPage : page;
40570
+ const newState = __spreadProps(__spreadValues({}, state2), {
40571
+ resourceIndex: index,
40572
+ pageNumber: pageNumberToNavigateTo
40573
+ });
40574
+ if (shouldResetResource) {
40575
+ return __spreadProps(__spreadValues({}, newState), {
40576
+ resource: null,
40577
+ numPages: null,
40578
+ rendered: false,
40579
+ pageHeight: void 0,
40580
+ pageWidth: void 0,
40581
+ pdfHeight: 0,
40582
+ pdfWidth: 0
40583
+ });
40584
+ }
40585
+ return newState;
40586
+ }
40587
+ switch (action.type) {
40588
+ case "ARGS_CHANGED": {
40589
+ return {
40590
+ state: "ACTIVE",
40591
+ settings: DEFAULT_SETTINGS,
40592
+ resourceIndex: 0,
40593
+ resource: null,
40594
+ pageNumber: 1,
40595
+ numPages: null,
40596
+ scale: 1,
40597
+ pdfWidth: 0,
40598
+ pdfHeight: 0,
40599
+ pageHeight: void 0,
40600
+ pageWidth: void 0,
40601
+ atStart: true,
40602
+ atEnd: false,
40603
+ rendered: false
40604
+ };
40605
+ }
40606
+ case "GO_FORWARD": {
40607
+ if ((_a = state2.settings) == null ? void 0 : _a.isScrolling) {
40608
+ const atEndOfBook2 = state2.resourceIndex === args.manifest.readingOrder.length - 1;
40609
+ if (atEndOfBook2)
40610
+ return state2;
40611
+ return goToLocation(state2.resourceIndex + 1);
40612
+ }
40613
+ if (!state2.numPages)
40614
+ return state2;
40615
+ const atEndOfResource = state2.pageNumber === state2.numPages;
40616
+ const atEndOfBook = state2.resourceIndex === args.manifest.readingOrder.length - 1;
40617
+ if (atEndOfResource) {
40618
+ if (atEndOfBook)
40619
+ return state2;
40620
+ return goToLocation(state2.resourceIndex + 1);
40621
+ }
40622
+ return goToLocation(state2.resourceIndex, state2.pageNumber + 1);
40623
+ }
40624
+ case "GO_BACKWARD": {
40625
+ if ((_b = state2.settings) == null ? void 0 : _b.isScrolling) {
40626
+ const atStartOfBook2 = state2.resourceIndex === 0;
40627
+ if (atStartOfBook2)
40628
+ return state2;
40629
+ return goToLocation(state2.resourceIndex - 1);
40630
+ }
40631
+ if (!state2.numPages)
40632
+ return state2;
40633
+ const atStartOfResource = isStartOfResource(state2.pageNumber, args.manifest.readingOrder[state2.resourceIndex].href);
40634
+ const atStartOfBook = state2.resourceIndex === 0;
40635
+ if (atStartOfResource) {
40636
+ if (atStartOfBook)
40637
+ return state2;
40638
+ return __spreadValues({}, goToLocation(state2.resourceIndex - 1, -1));
40639
+ }
40640
+ return goToLocation(state2.resourceIndex, state2.pageNumber - 1);
40641
+ }
40642
+ case "GO_TO_HREF": {
40643
+ const resourceIndex = getIndexFromHref(action.href, args.manifest);
40644
+ const startPage = getStartPageFromHref(action.href);
40645
+ const pageNumber = getPageNumberFromHref(action.href);
40646
+ const page = (_c = pageNumber != null ? pageNumber : startPage) != null ? _c : 1;
40647
+ return goToLocation(resourceIndex, page);
40648
+ }
40649
+ case "RESOURCE_FETCH_SUCCESS":
40650
+ return __spreadProps(__spreadValues({}, state2), {
40651
+ resource: action.resource
40652
+ });
40653
+ case "PDF_PARSED":
40654
+ return __spreadProps(__spreadValues({}, state2), {
40655
+ numPages: action.numPages,
40656
+ pageNumber: state2.pageNumber === -1 ? action.numPages : state2.pageNumber
40657
+ });
40658
+ case "SET_SCROLL":
40659
+ if (state2.state !== "ACTIVE") {
40660
+ return handleInvalidTransition(state2, action);
40661
+ }
40662
+ return __spreadProps(__spreadValues({}, state2), {
40663
+ settings: __spreadProps(__spreadValues({}, state2.settings), {
40664
+ isScrolling: action.isScrolling
40665
+ })
40666
+ });
40667
+ case "SET_SCALE":
40668
+ return __spreadProps(__spreadValues({}, state2), {
40669
+ scale: action.scale
40670
+ });
40671
+ case "PAGE_LOAD_SUCCESS":
40672
+ return __spreadProps(__spreadValues({}, state2), {
40673
+ rendered: true,
40674
+ pdfWidth: action.width,
40675
+ pdfHeight: action.height,
40676
+ pageWidth: action.width,
40677
+ pageHeight: action.height
40678
+ });
40679
+ case "RESIZE_PAGE":
40680
+ return __spreadProps(__spreadValues({}, state2), {
40681
+ pageWidth: action.width,
40682
+ pageHeight: action.height
40683
+ });
40684
+ case "BOOK_BOUNDARY_CHANGED":
40685
+ return __spreadProps(__spreadValues({}, state2), {
40686
+ atStart: action.atStart,
40687
+ atEnd: action.atEnd
40688
+ });
40689
+ }
40690
+ };
40691
+ }
40692
+ function handleInvalidTransition(state2, action) {
40693
+ console.trace(`Inavlid state transition attempted: ${state2} with ${action.type}`);
40694
+ return state2;
40695
+ }
40696
+ function isStartOfResource(pageNumber, resourceHref) {
40697
+ const startPage = getStartPageFromHref(resourceHref);
40698
+ return pageNumber === (startPage != null ? startPage : 1);
40699
+ }
40700
+
40701
+ // src/PdfReader/index.tsx
40579
40702
  function usePdfReader(args) {
40580
- var _a;
40703
+ var _a, _b, _c, _d;
40581
40704
  if (args == null ? void 0 : args.pdfWorkerSrc) {
40582
40705
  pdfjs4.GlobalWorkerOptions.workerSrc = args.pdfWorkerSrc;
40583
40706
  }
@@ -40591,7 +40714,7 @@ function usePdfReader(args) {
40591
40714
  height = DEFAULT_HEIGHT,
40592
40715
  growWhenScrolling = DEFAULT_SHOULD_GROW_WHEN_SCROLLING
40593
40716
  } = args != null ? args : {};
40594
- const [state2, dispatch] = React71.useReducer(pdfReducer, {
40717
+ const [state2, dispatch] = React71.useReducer(makePdfReducer(args), {
40595
40718
  state: "INACTIVE",
40596
40719
  resourceIndex: 0,
40597
40720
  resource: null,
@@ -40604,11 +40727,11 @@ function usePdfReader(args) {
40604
40727
  pageWidth: void 0,
40605
40728
  atStart: true,
40606
40729
  atEnd: false,
40607
- settings: void 0
40730
+ settings: void 0,
40731
+ rendered: false
40608
40732
  });
40609
40733
  const isFetching = !state2.resource;
40610
40734
  const isParsed = typeof state2.numPages === "number";
40611
- const isSinglePDF = manifest && (manifest == null ? void 0 : manifest.readingOrder.length) === 1;
40612
40735
  const [containerRef, containerSize] = useMeasure();
40613
40736
  React71.useEffect(() => {
40614
40737
  if (!webpubManifestUrl || !manifest) {
@@ -40661,96 +40784,43 @@ function usePdfReader(args) {
40661
40784
  resizePage(state2.pdfWidth, state2.pdfHeight, containerSize);
40662
40785
  }, [containerSize, state2.pdfWidth, state2.pdfHeight, resizePage]);
40663
40786
  React71.useEffect(() => {
40664
- var _a2;
40665
- if (!manifest || state2.state !== "ACTIVE")
40666
- return;
40667
- if (isSinglePDF && state2.settings.isScrolling) {
40668
- dispatch({
40669
- type: "BOOK_BOUNDARY_CHANGED",
40670
- atStart: true,
40671
- atEnd: true
40672
- });
40673
- } else {
40674
- const isFirstResource = state2.resourceIndex === 0;
40675
- const isResourceStart = isFirstResource && state2.pageNumber === 1;
40676
- const isLastResource = state2.resourceIndex === ((_a2 = manifest == null ? void 0 : manifest.readingOrder) == null ? void 0 : _a2.length) - 1;
40677
- const isResourceEnd = isLastResource && state2.pageNumber === state2.numPages || state2.settings.isScrolling && isLastResource;
40678
- dispatch({
40679
- type: "BOOK_BOUNDARY_CHANGED",
40680
- atStart: isResourceStart,
40681
- atEnd: isResourceEnd
40682
- });
40683
- }
40787
+ var _a2, _b2, _c2;
40788
+ const isScrolling = (_a2 = state2.settings) == null ? void 0 : _a2.isScrolling;
40789
+ const isFirstResource = state2.resourceIndex === 0;
40790
+ const isFirstResourceStart = isFirstResource && state2.pageNumber === 1;
40791
+ const showPrevButton = isScrolling ? !isFirstResource : !isFirstResourceStart;
40792
+ const isLastResource = state2.resourceIndex === ((_c2 = (_b2 = manifest == null ? void 0 : manifest.readingOrder) == null ? void 0 : _b2.length) != null ? _c2 : 1) - 1;
40793
+ const isLastResourceEnd = isLastResource && state2.pageNumber === state2.numPages;
40794
+ const showNextButton = isScrolling ? !isLastResource : !isLastResourceEnd;
40795
+ dispatch({
40796
+ type: "BOOK_BOUNDARY_CHANGED",
40797
+ atStart: !showPrevButton,
40798
+ atEnd: !showNextButton
40799
+ });
40684
40800
  }, [
40685
- manifest,
40686
- state2.state,
40687
- state2.settings,
40688
- state2.numPages,
40801
+ (_a = manifest == null ? void 0 : manifest.readingOrder) == null ? void 0 : _a.length,
40689
40802
  state2.pageNumber,
40690
40803
  state2.resourceIndex,
40691
- isSinglePDF
40804
+ (_b = state2.settings) == null ? void 0 : _b.isScrolling,
40805
+ state2.numPages
40692
40806
  ]);
40693
- const goForward = React71.useCallback(() => __async(this, null, function* () {
40807
+ React71.useEffect(() => {
40694
40808
  var _a2;
40695
- if (!state2.numPages)
40809
+ if (!((_a2 = state2.settings) == null ? void 0 : _a2.isScrolling))
40696
40810
  return;
40697
- if (state2.state !== "ACTIVE")
40811
+ if (!state2.rendered)
40698
40812
  return;
40699
- if (state2.pageNumber < state2.numPages && !state2.settings.isScrolling) {
40700
- dispatch({
40701
- type: "NAVIGATE_PAGE",
40702
- pageNum: state2.pageNumber + 1
40703
- });
40704
- } else if (manifest && manifest.readingOrder && state2.resourceIndex < ((_a2 = manifest == null ? void 0 : manifest.readingOrder) == null ? void 0 : _a2.length) - 1) {
40705
- const nextIndex = state2.resourceIndex + 1;
40706
- dispatch({
40707
- type: "SET_CURRENT_RESOURCE",
40708
- index: nextIndex,
40709
- shouldNavigateToEnd: false
40710
- });
40711
- if (manifest == null ? void 0 : manifest.readingOrder[nextIndex]) {
40712
- const pageNum = getStartPage(manifest == null ? void 0 : manifest.readingOrder[nextIndex].href);
40713
- dispatch({
40714
- type: "NAVIGATE_PAGE",
40715
- pageNum
40716
- });
40717
- }
40718
- }
40719
- }), [
40720
- state2.state,
40721
- manifest,
40722
- state2.settings,
40723
- state2.numPages,
40724
- state2.pageNumber,
40725
- state2.resourceIndex
40726
- ]);
40813
+ process.nextTick(() => {
40814
+ const page = document.querySelector(`[data-page-number="${state2.pageNumber}"]`);
40815
+ page == null ? void 0 : page.scrollIntoView();
40816
+ });
40817
+ }, [state2.pageNumber, (_c = state2.settings) == null ? void 0 : _c.isScrolling, state2.rendered]);
40818
+ const goForward = React71.useCallback(() => __async(this, null, function* () {
40819
+ dispatch({ type: "GO_FORWARD" });
40820
+ }), []);
40727
40821
  const goBackward = React71.useCallback(() => __async(this, null, function* () {
40728
- if (!isParsed)
40729
- return;
40730
- if (state2.state !== "ACTIVE")
40731
- return;
40732
- const startPage = (manifest == null ? void 0 : manifest.readingOrder) && (manifest == null ? void 0 : manifest.readingOrder[state2.resourceIndex]) ? getStartPage(manifest == null ? void 0 : manifest.readingOrder[state2.resourceIndex].href) : 1;
40733
- if (state2.pageNumber > startPage && !state2.settings.isScrolling) {
40734
- dispatch({
40735
- type: "NAVIGATE_PAGE",
40736
- pageNum: state2.pageNumber - 1
40737
- });
40738
- } else if ((manifest == null ? void 0 : manifest.readingOrder) && state2.resourceIndex > 0) {
40739
- const nextIndex = state2.resourceIndex - 1;
40740
- dispatch({
40741
- type: "SET_CURRENT_RESOURCE",
40742
- index: nextIndex,
40743
- shouldNavigateToEnd: !state2.settings.isScrolling
40744
- });
40745
- }
40746
- }), [
40747
- manifest,
40748
- isParsed,
40749
- state2.state,
40750
- state2.settings,
40751
- state2.pageNumber,
40752
- state2.resourceIndex
40753
- ]);
40822
+ dispatch({ type: "GO_BACKWARD" });
40823
+ }), []);
40754
40824
  const setScroll = React71.useCallback((val) => __async(this, null, function* () {
40755
40825
  const isScrolling = val === "scrolling";
40756
40826
  dispatch({ type: "SET_SCROLL", isScrolling });
@@ -40768,30 +40838,8 @@ function usePdfReader(args) {
40768
40838
  });
40769
40839
  }), [state2.scale]);
40770
40840
  const goToPage = React71.useCallback((href) => __async(this, null, function* () {
40771
- const getIndexFromHref = (href2) => {
40772
- var _a2;
40773
- const index = (_a2 = manifest == null ? void 0 : manifest.readingOrder) == null ? void 0 : _a2.findIndex((link2) => {
40774
- return link2.href === href2;
40775
- });
40776
- if (index < 0) {
40777
- throw new Error("Cannot find resource in readingOrder");
40778
- }
40779
- return index;
40780
- };
40781
- const resourceIndex = getIndexFromHref(href);
40782
- dispatch({
40783
- type: "SET_CURRENT_RESOURCE",
40784
- index: resourceIndex,
40785
- shouldNavigateToEnd: false
40786
- });
40787
- if ((manifest == null ? void 0 : manifest.readingOrder) && (manifest == null ? void 0 : manifest.readingOrder[resourceIndex])) {
40788
- const startPage = getStartPage(manifest == null ? void 0 : manifest.readingOrder[resourceIndex].href);
40789
- dispatch({
40790
- type: "NAVIGATE_PAGE",
40791
- pageNum: startPage
40792
- });
40793
- }
40794
- }), [manifest == null ? void 0 : manifest.readingOrder]);
40841
+ dispatch({ type: "GO_TO_HREF", href });
40842
+ }), []);
40795
40843
  if (!webpubManifestUrl || !manifest)
40796
40844
  return null;
40797
40845
  if (state2.state === "INACTIVE" || isFetching) {
@@ -40825,7 +40873,7 @@ function usePdfReader(args) {
40825
40873
  resizePage(page.width, page.height, containerSize);
40826
40874
  }
40827
40875
  }
40828
- const shouldGrow = ((_a = state2.settings) == null ? void 0 : _a.isScrolling) && growWhenScrolling;
40876
+ const shouldGrow = ((_d = state2.settings) == null ? void 0 : _d.isScrolling) && growWhenScrolling;
40829
40877
  const finalHeight = shouldGrow ? "initial" : height;
40830
40878
  return {
40831
40879
  type: "PDF",
@@ -40877,10 +40925,6 @@ function usePdfReader(args) {
40877
40925
  }
40878
40926
  };
40879
40927
  }
40880
- function handleInvalidTransition(state2, action) {
40881
- console.trace(`Inavlid state transition attempted: ${state2} with ${action.type}`);
40882
- return state2;
40883
- }
40884
40928
 
40885
40929
  // src/HtmlReader/index.tsx
40886
40930
  import React79 from "react";
@@ -41919,9 +41963,9 @@ function useHtmlReader(args) {
41919
41963
  const numResources = manifest.readingOrder.length;
41920
41964
  const isFirstResource = resourceIndex === 0;
41921
41965
  const isLastResource = resourceIndex === numResources - 1;
41922
- const isStartOfResource = state2.location.locations.position === 1;
41966
+ const isStartOfResource2 = state2.location.locations.position === 1;
41923
41967
  const isEndOfResource = state2.location.locations.remainingPositions === 0;
41924
- const atStart = isFirstResource && isStartOfResource;
41968
+ const atStart = isFirstResource && isStartOfResource2;
41925
41969
  const atEnd = isLastResource && isEndOfResource;
41926
41970
  return {
41927
41971
  type: "HTML",
@@ -42030,6 +42074,44 @@ function useWebReader(args) {
42030
42074
  throw new Error(`No reader was initialized for the webpub with url: ${webpubManifestUrl} and type: ${readerType}.`);
42031
42075
  }
42032
42076
 
42077
+ // src/PdfReader/addTocToManifest.tsx
42078
+ function addTocToManifest(manifest, getResource, pdfWorkerSrc) {
42079
+ return __async(this, null, function* () {
42080
+ const pdfUrl = manifest.readingOrder[0].href;
42081
+ const pdfData = yield getResource(pdfUrl);
42082
+ try {
42083
+ pdfjs4.GlobalWorkerOptions.workerSrc = pdfWorkerSrc;
42084
+ const pdf = yield pdfjs4.getDocument(pdfData).promise;
42085
+ const outline5 = yield pdf.getOutline();
42086
+ const tocPromises = outline5.map((chapter) => __async(this, null, function* () {
42087
+ const dest = chapter.dest;
42088
+ if (dest && dest.length > 0) {
42089
+ const ref = dest[0];
42090
+ const pageIndex = yield pdf.getPageIndex(ref);
42091
+ if (typeof pageIndex !== "number")
42092
+ return void 0;
42093
+ if (pageIndex) {
42094
+ const link2 = {
42095
+ title: chapter.title,
42096
+ href: `${pdfUrl}#page=${pageIndex + 1}`,
42097
+ children: []
42098
+ };
42099
+ return link2;
42100
+ }
42101
+ }
42102
+ return void 0;
42103
+ }));
42104
+ const toc = (yield Promise.all(tocPromises)).filter((item) => !!item);
42105
+ if (toc.length > 0) {
42106
+ manifest.toc = toc;
42107
+ }
42108
+ } catch (e) {
42109
+ console.error(e);
42110
+ }
42111
+ return manifest;
42112
+ });
42113
+ }
42114
+
42033
42115
  // src/index.tsx
42034
42116
  var WebReaderWithoutBoundary = (_a) => {
42035
42117
  var _b = _a, {
@@ -42070,6 +42152,7 @@ export {
42070
42152
  LOCAL_STORAGE_SETTINGS_KEY,
42071
42153
  ReadiumWebpubContext,
42072
42154
  WebReaderWithoutBoundary,
42155
+ addTocToManifest,
42073
42156
  clearWebReaderLocalStorage,
42074
42157
  src_default as default,
42075
42158
  getTheme3 as getTheme,