@inertiajs/core 2.2.0 → 2.2.2

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/index.js CHANGED
@@ -750,6 +750,11 @@ var History = class {
750
750
  this.replaceState(this.current);
751
751
  }
752
752
  }
753
+ clearInitialState(key) {
754
+ if (this.initialState && this.initialState[key] !== void 0) {
755
+ delete this.initialState[key];
756
+ }
757
+ }
753
758
  hasAnyState() {
754
759
  return !!this.getAllState();
755
760
  }
@@ -879,6 +884,7 @@ var InitialVisit = class {
879
884
  static clearRememberedStateOnReload() {
880
885
  if (navigationType.isReload()) {
881
886
  history.deleteState(history.rememberedState);
887
+ history.clearInitialState(history.rememberedState);
882
888
  }
883
889
  }
884
890
  static handleBackForward() {
@@ -2421,8 +2427,26 @@ var useInfiniteScrollData = (options) => {
2421
2427
  loading: false,
2422
2428
  previousPage,
2423
2429
  nextPage,
2424
- lastLoadedPage
2430
+ lastLoadedPage,
2431
+ requestCount: 0
2425
2432
  };
2433
+ const getRememberKey = () => `inertia:infinite-scroll-data:${options.getPropName()}`;
2434
+ const rememberedState = router.restore(getRememberKey());
2435
+ if (rememberedState && typeof rememberedState === "object") {
2436
+ state.previousPage = rememberedState.previousPage;
2437
+ state.nextPage = rememberedState.nextPage;
2438
+ state.lastLoadedPage = rememberedState.lastLoadedPage;
2439
+ state.requestCount = rememberedState.requestCount || 0;
2440
+ }
2441
+ const removeEventListener = router.on("success", () => {
2442
+ const scrollProp = getScrollPropFromCurrentPage();
2443
+ if (scrollProp.reset) {
2444
+ state.previousPage = scrollProp.previousPage;
2445
+ state.nextPage = scrollProp.nextPage;
2446
+ state.lastLoadedPage = scrollProp.currentPage;
2447
+ state.requestCount = 0;
2448
+ }
2449
+ });
2426
2450
  const getScrollPropKeyForSide = (side) => {
2427
2451
  return side === "next" ? "nextPage" : "previousPage";
2428
2452
  };
@@ -2435,8 +2459,19 @@ var useInfiniteScrollData = (options) => {
2435
2459
  const paginationProp = getScrollPropKeyForSide(side);
2436
2460
  state.lastLoadedPage = scrollProp.currentPage;
2437
2461
  state[paginationProp] = scrollProp[paginationProp];
2462
+ state.requestCount += 1;
2463
+ router.remember(
2464
+ {
2465
+ previousPage: state.previousPage,
2466
+ nextPage: state.nextPage,
2467
+ lastLoadedPage: state.lastLoadedPage,
2468
+ requestCount: state.requestCount
2469
+ },
2470
+ getRememberKey()
2471
+ );
2438
2472
  };
2439
2473
  const getPageName = () => getScrollPropFromCurrentPage().pageName;
2474
+ const getRequestCount = () => state.requestCount;
2440
2475
  const fetchPage = (side, reloadOptions = {}) => {
2441
2476
  const page2 = findPageToLoad(side);
2442
2477
  if (state.loading || page2 === null) {
@@ -2480,10 +2515,12 @@ var useInfiniteScrollData = (options) => {
2480
2515
  return {
2481
2516
  getLastLoadedPage,
2482
2517
  getPageName,
2518
+ getRequestCount,
2483
2519
  hasPrevious,
2484
2520
  hasNext,
2485
2521
  fetchNext,
2486
- fetchPrevious
2522
+ fetchPrevious,
2523
+ removeEventListener
2487
2524
  };
2488
2525
  };
2489
2526
 
@@ -2526,11 +2563,13 @@ var useInfiniteScrollElementManager = (options) => {
2526
2563
  itemsMutationObserver = new MutationObserver((mutations) => {
2527
2564
  mutations.forEach((mutation) => {
2528
2565
  mutation.addedNodes.forEach((node) => {
2529
- if (node.nodeType === Node.ELEMENT_NODE) {
2530
- addedElements.add(node);
2566
+ if (node.nodeType !== Node.ELEMENT_NODE) {
2567
+ return;
2531
2568
  }
2569
+ addedElements.add(node);
2532
2570
  });
2533
2571
  });
2572
+ rememberElementsDebounced();
2534
2573
  });
2535
2574
  itemsMutationObserver.observe(options.getItemsElement(), { childList: true });
2536
2575
  itemsObserver = intersectionObservers.new(
@@ -2593,13 +2632,73 @@ var useInfiniteScrollElementManager = (options) => {
2593
2632
  )
2594
2633
  );
2595
2634
  };
2635
+ let hasRestoredElements = false;
2596
2636
  const processServerLoadedElements = (loadedPage) => {
2637
+ if (!hasRestoredElements) {
2638
+ hasRestoredElements = true;
2639
+ if (restoreElements()) {
2640
+ return;
2641
+ }
2642
+ }
2597
2643
  findUntaggedElements(options.getItemsElement()).forEach((element) => {
2598
2644
  if (elementIsUntagged(element)) {
2599
2645
  element.dataset[INFINITE_SCROLL_PAGE_KEY] = loadedPage?.toString() || "1";
2600
2646
  }
2601
2647
  itemsObserver.observe(element);
2602
2648
  });
2649
+ rememberElements();
2650
+ };
2651
+ const getElementsRememberKey = () => `inertia:infinite-scroll-elements:${options.getPropName()}`;
2652
+ const rememberElements = () => {
2653
+ const pageElementRange = {};
2654
+ const childNodes = options.getItemsElement().childNodes;
2655
+ for (let index = 0; index < childNodes.length; index++) {
2656
+ const node = childNodes[index];
2657
+ if (node.nodeType !== Node.ELEMENT_NODE) {
2658
+ continue;
2659
+ }
2660
+ const page2 = getPageFromElement(node);
2661
+ if (typeof page2 === "undefined") {
2662
+ continue;
2663
+ }
2664
+ if (!(page2 in pageElementRange)) {
2665
+ pageElementRange[page2] = { from: index, to: index };
2666
+ } else {
2667
+ pageElementRange[page2].to = index;
2668
+ }
2669
+ }
2670
+ router.remember(pageElementRange, getElementsRememberKey());
2671
+ };
2672
+ const rememberElementsDebounced = debounce(rememberElements, 250);
2673
+ const restoreElements = () => {
2674
+ const pageElementRange = router.restore(getElementsRememberKey());
2675
+ if (!pageElementRange || typeof pageElementRange !== "object") {
2676
+ return false;
2677
+ }
2678
+ const childNodes = options.getItemsElement().childNodes;
2679
+ for (let index = 0; index < childNodes.length; index++) {
2680
+ const node = childNodes[index];
2681
+ if (node.nodeType !== Node.ELEMENT_NODE) {
2682
+ continue;
2683
+ }
2684
+ const element = node;
2685
+ let elementPage;
2686
+ for (const [page2, range] of Object.entries(pageElementRange)) {
2687
+ if (index >= range.from && index <= range.to) {
2688
+ elementPage = page2;
2689
+ break;
2690
+ }
2691
+ }
2692
+ if (elementPage) {
2693
+ element.dataset[INFINITE_SCROLL_PAGE_KEY] = elementPage;
2694
+ } else if (!elementIsUntagged(element)) {
2695
+ continue;
2696
+ } else {
2697
+ element.dataset[INFINITE_SCROLL_IGNORE_KEY] = "true";
2698
+ }
2699
+ itemsObserver.observe(element);
2700
+ }
2701
+ return true;
2603
2702
  };
2604
2703
  return {
2605
2704
  setupObservers,