@inertiajs/core 2.3.4 → 2.3.5

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
@@ -844,6 +844,7 @@ var CurrentPage = class {
844
844
  this.isFirstPageLoad = true;
845
845
  this.cleared = false;
846
846
  this.pendingDeferredProps = null;
847
+ this.historyQuotaExceeded = false;
847
848
  }
848
849
  init({
849
850
  initialPage,
@@ -855,6 +856,9 @@ var CurrentPage = class {
855
856
  this.swapComponent = swapComponent;
856
857
  this.resolveComponent = resolveComponent;
857
858
  this.onFlashCallback = onFlash;
859
+ eventHandler.on("historyQuotaExceeded", () => {
860
+ this.historyQuotaExceeded = true;
861
+ });
858
862
  return this;
859
863
  }
860
864
  set(page2, {
@@ -904,6 +908,10 @@ var CurrentPage = class {
904
908
  this.fireEventsFor("firstLoad");
905
909
  }
906
910
  this.isFirstPageLoad = false;
911
+ if (this.historyQuotaExceeded) {
912
+ this.historyQuotaExceeded = false;
913
+ return;
914
+ }
907
915
  return this.swap({
908
916
  component,
909
917
  page: page2,
@@ -1185,9 +1193,27 @@ var History = class {
1185
1193
  });
1186
1194
  });
1187
1195
  }
1196
+ isHistoryThrottleError(error) {
1197
+ return error instanceof Error && error.name === "SecurityError" && (error.message.includes("history.pushState") || error.message.includes("history.replaceState"));
1198
+ }
1199
+ isQuotaExceededError(error) {
1200
+ return error instanceof Error && error.name === "QuotaExceededError";
1201
+ }
1202
+ withThrottleProtection(cb) {
1203
+ return Promise.resolve().then(() => {
1204
+ try {
1205
+ return cb();
1206
+ } catch (error) {
1207
+ if (!this.isHistoryThrottleError(error)) {
1208
+ throw error;
1209
+ }
1210
+ console.error(error.message);
1211
+ }
1212
+ });
1213
+ }
1188
1214
  doReplaceState(data, url) {
1189
- return Promise.resolve().then(
1190
- () => window.history.replaceState(
1215
+ return this.withThrottleProtection(() => {
1216
+ window.history.replaceState(
1191
1217
  {
1192
1218
  ...data,
1193
1219
  scrollRegions: data.scrollRegions ?? window.history.state?.scrollRegions,
@@ -1195,11 +1221,20 @@ var History = class {
1195
1221
  },
1196
1222
  "",
1197
1223
  url
1198
- )
1199
- );
1224
+ );
1225
+ });
1200
1226
  }
1201
1227
  doPushState(data, url) {
1202
- return Promise.resolve().then(() => window.history.pushState(data, "", url));
1228
+ return this.withThrottleProtection(() => {
1229
+ try {
1230
+ window.history.pushState(data, "", url);
1231
+ } catch (error) {
1232
+ if (!this.isQuotaExceededError(error)) {
1233
+ throw error;
1234
+ }
1235
+ eventHandler.fireInternalEvent("historyQuotaExceeded", url);
1236
+ }
1237
+ });
1203
1238
  }
1204
1239
  getState(key, defaultValue) {
1205
1240
  return this.current?.[key] ?? defaultValue;
@@ -1215,8 +1250,8 @@ var History = class {
1215
1250
  delete this.initialState[key];
1216
1251
  }
1217
1252
  }
1218
- hasAnyState() {
1219
- return !!this.getAllState();
1253
+ browserHasHistoryEntry() {
1254
+ return !isServer && !!window.history.state?.page;
1220
1255
  }
1221
1256
  clear() {
1222
1257
  SessionStorage.remove(historySessionStorageKeys.key);
@@ -1346,7 +1381,7 @@ var InitialVisit = class {
1346
1381
  }
1347
1382
  }
1348
1383
  static handleBackForward() {
1349
- if (!navigationType.isBackForward() || !history.hasAnyState()) {
1384
+ if (!navigationType.isBackForward() || !history.browserHasHistoryEntry()) {
1350
1385
  return false;
1351
1386
  }
1352
1387
  const scrollRegions = history.getScrollRegions();
@@ -2225,6 +2260,9 @@ var Router = class {
2225
2260
  eventHandler.on("loadDeferredProps", (deferredProps) => {
2226
2261
  this.loadDeferredProps(deferredProps);
2227
2262
  });
2263
+ eventHandler.on("historyQuotaExceeded", (url) => {
2264
+ window.location.href = url;
2265
+ });
2228
2266
  }
2229
2267
  get(url, data = {}, options = {}) {
2230
2268
  return this.visit(url, { ...options, method: "get", data });
@@ -3452,17 +3490,11 @@ function useInfiniteScroll(options) {
3452
3490
  // After successful request, tag new server content
3453
3491
  onCompletePreviousRequest: (loadedPage) => {
3454
3492
  options.onCompletePreviousRequest();
3455
- requestAnimationFrame(() => {
3456
- elementManager.processServerLoadedElements(loadedPage);
3457
- elementManager.refreshTriggers();
3458
- }, 2);
3493
+ requestAnimationFrame(() => elementManager.processServerLoadedElements(loadedPage), 2);
3459
3494
  },
3460
3495
  onCompleteNextRequest: (loadedPage) => {
3461
3496
  options.onCompleteNextRequest();
3462
- requestAnimationFrame(() => {
3463
- elementManager.processServerLoadedElements(loadedPage);
3464
- elementManager.refreshTriggers();
3465
- }, 2);
3497
+ requestAnimationFrame(() => elementManager.processServerLoadedElements(loadedPage), 2);
3466
3498
  }
3467
3499
  });
3468
3500
  const addScrollPreservationCallbacks = (reloadOptions) => {
@@ -3495,10 +3527,12 @@ function useInfiniteScroll(options) {
3495
3527
  }
3496
3528
  originalFetchPrevious(reloadOptions);
3497
3529
  };
3530
+ const removeEventListener = router.on("success", () => requestAnimationFrame(elementManager.refreshTriggers, 2));
3498
3531
  return {
3499
3532
  dataManager,
3500
3533
  elementManager,
3501
3534
  flush: () => {
3535
+ removeEventListener();
3502
3536
  dataManager.removeEventListener();
3503
3537
  elementManager.flushAll();
3504
3538
  queryStringManager.cancel();