@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.esm.js CHANGED
@@ -698,6 +698,11 @@ var History = class {
698
698
  this.replaceState(this.current);
699
699
  }
700
700
  }
701
+ clearInitialState(key) {
702
+ if (this.initialState && this.initialState[key] !== void 0) {
703
+ delete this.initialState[key];
704
+ }
705
+ }
701
706
  hasAnyState() {
702
707
  return !!this.getAllState();
703
708
  }
@@ -827,6 +832,7 @@ var InitialVisit = class {
827
832
  static clearRememberedStateOnReload() {
828
833
  if (navigationType.isReload()) {
829
834
  history.deleteState(history.rememberedState);
835
+ history.clearInitialState(history.rememberedState);
830
836
  }
831
837
  }
832
838
  static handleBackForward() {
@@ -2369,8 +2375,26 @@ var useInfiniteScrollData = (options) => {
2369
2375
  loading: false,
2370
2376
  previousPage,
2371
2377
  nextPage,
2372
- lastLoadedPage
2378
+ lastLoadedPage,
2379
+ requestCount: 0
2373
2380
  };
2381
+ const getRememberKey = () => `inertia:infinite-scroll-data:${options.getPropName()}`;
2382
+ const rememberedState = router.restore(getRememberKey());
2383
+ if (rememberedState && typeof rememberedState === "object") {
2384
+ state.previousPage = rememberedState.previousPage;
2385
+ state.nextPage = rememberedState.nextPage;
2386
+ state.lastLoadedPage = rememberedState.lastLoadedPage;
2387
+ state.requestCount = rememberedState.requestCount || 0;
2388
+ }
2389
+ const removeEventListener = router.on("success", () => {
2390
+ const scrollProp = getScrollPropFromCurrentPage();
2391
+ if (scrollProp.reset) {
2392
+ state.previousPage = scrollProp.previousPage;
2393
+ state.nextPage = scrollProp.nextPage;
2394
+ state.lastLoadedPage = scrollProp.currentPage;
2395
+ state.requestCount = 0;
2396
+ }
2397
+ });
2374
2398
  const getScrollPropKeyForSide = (side) => {
2375
2399
  return side === "next" ? "nextPage" : "previousPage";
2376
2400
  };
@@ -2383,8 +2407,19 @@ var useInfiniteScrollData = (options) => {
2383
2407
  const paginationProp = getScrollPropKeyForSide(side);
2384
2408
  state.lastLoadedPage = scrollProp.currentPage;
2385
2409
  state[paginationProp] = scrollProp[paginationProp];
2410
+ state.requestCount += 1;
2411
+ router.remember(
2412
+ {
2413
+ previousPage: state.previousPage,
2414
+ nextPage: state.nextPage,
2415
+ lastLoadedPage: state.lastLoadedPage,
2416
+ requestCount: state.requestCount
2417
+ },
2418
+ getRememberKey()
2419
+ );
2386
2420
  };
2387
2421
  const getPageName = () => getScrollPropFromCurrentPage().pageName;
2422
+ const getRequestCount = () => state.requestCount;
2388
2423
  const fetchPage = (side, reloadOptions = {}) => {
2389
2424
  const page2 = findPageToLoad(side);
2390
2425
  if (state.loading || page2 === null) {
@@ -2428,10 +2463,12 @@ var useInfiniteScrollData = (options) => {
2428
2463
  return {
2429
2464
  getLastLoadedPage,
2430
2465
  getPageName,
2466
+ getRequestCount,
2431
2467
  hasPrevious,
2432
2468
  hasNext,
2433
2469
  fetchNext,
2434
- fetchPrevious
2470
+ fetchPrevious,
2471
+ removeEventListener
2435
2472
  };
2436
2473
  };
2437
2474
 
@@ -2474,11 +2511,13 @@ var useInfiniteScrollElementManager = (options) => {
2474
2511
  itemsMutationObserver = new MutationObserver((mutations) => {
2475
2512
  mutations.forEach((mutation) => {
2476
2513
  mutation.addedNodes.forEach((node) => {
2477
- if (node.nodeType === Node.ELEMENT_NODE) {
2478
- addedElements.add(node);
2514
+ if (node.nodeType !== Node.ELEMENT_NODE) {
2515
+ return;
2479
2516
  }
2517
+ addedElements.add(node);
2480
2518
  });
2481
2519
  });
2520
+ rememberElementsDebounced();
2482
2521
  });
2483
2522
  itemsMutationObserver.observe(options.getItemsElement(), { childList: true });
2484
2523
  itemsObserver = intersectionObservers.new(
@@ -2541,13 +2580,73 @@ var useInfiniteScrollElementManager = (options) => {
2541
2580
  )
2542
2581
  );
2543
2582
  };
2583
+ let hasRestoredElements = false;
2544
2584
  const processServerLoadedElements = (loadedPage) => {
2585
+ if (!hasRestoredElements) {
2586
+ hasRestoredElements = true;
2587
+ if (restoreElements()) {
2588
+ return;
2589
+ }
2590
+ }
2545
2591
  findUntaggedElements(options.getItemsElement()).forEach((element) => {
2546
2592
  if (elementIsUntagged(element)) {
2547
2593
  element.dataset[INFINITE_SCROLL_PAGE_KEY] = loadedPage?.toString() || "1";
2548
2594
  }
2549
2595
  itemsObserver.observe(element);
2550
2596
  });
2597
+ rememberElements();
2598
+ };
2599
+ const getElementsRememberKey = () => `inertia:infinite-scroll-elements:${options.getPropName()}`;
2600
+ const rememberElements = () => {
2601
+ const pageElementRange = {};
2602
+ const childNodes = options.getItemsElement().childNodes;
2603
+ for (let index = 0; index < childNodes.length; index++) {
2604
+ const node = childNodes[index];
2605
+ if (node.nodeType !== Node.ELEMENT_NODE) {
2606
+ continue;
2607
+ }
2608
+ const page2 = getPageFromElement(node);
2609
+ if (typeof page2 === "undefined") {
2610
+ continue;
2611
+ }
2612
+ if (!(page2 in pageElementRange)) {
2613
+ pageElementRange[page2] = { from: index, to: index };
2614
+ } else {
2615
+ pageElementRange[page2].to = index;
2616
+ }
2617
+ }
2618
+ router.remember(pageElementRange, getElementsRememberKey());
2619
+ };
2620
+ const rememberElementsDebounced = debounce(rememberElements, 250);
2621
+ const restoreElements = () => {
2622
+ const pageElementRange = router.restore(getElementsRememberKey());
2623
+ if (!pageElementRange || typeof pageElementRange !== "object") {
2624
+ return false;
2625
+ }
2626
+ const childNodes = options.getItemsElement().childNodes;
2627
+ for (let index = 0; index < childNodes.length; index++) {
2628
+ const node = childNodes[index];
2629
+ if (node.nodeType !== Node.ELEMENT_NODE) {
2630
+ continue;
2631
+ }
2632
+ const element = node;
2633
+ let elementPage;
2634
+ for (const [page2, range] of Object.entries(pageElementRange)) {
2635
+ if (index >= range.from && index <= range.to) {
2636
+ elementPage = page2;
2637
+ break;
2638
+ }
2639
+ }
2640
+ if (elementPage) {
2641
+ element.dataset[INFINITE_SCROLL_PAGE_KEY] = elementPage;
2642
+ } else if (!elementIsUntagged(element)) {
2643
+ continue;
2644
+ } else {
2645
+ element.dataset[INFINITE_SCROLL_IGNORE_KEY] = "true";
2646
+ }
2647
+ itemsObserver.observe(element);
2648
+ }
2649
+ return true;
2551
2650
  };
2552
2651
  return {
2553
2652
  setupObservers,