@inertiajs/react 2.1.11 → 2.2.1

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
@@ -737,6 +737,248 @@ var Head = function({ children, title }) {
737
737
  };
738
738
  var Head_default = Head;
739
739
 
740
+ // src/InfiniteScroll.ts
741
+ import {
742
+ getScrollableParent,
743
+ useInfiniteScroll
744
+ } from "@inertiajs/core";
745
+ import React3, {
746
+ createElement as createElement4,
747
+ forwardRef as forwardRef2,
748
+ useCallback as useCallback2,
749
+ useEffect as useEffect7,
750
+ useImperativeHandle as useImperativeHandle2,
751
+ useMemo as useMemo6,
752
+ useRef as useRef3,
753
+ useState as useState6
754
+ } from "react";
755
+ var resolveHTMLElement = (value, fallback) => {
756
+ if (!value) {
757
+ return fallback;
758
+ }
759
+ if (value && typeof value === "object" && "current" in value) {
760
+ return value.current;
761
+ }
762
+ if (typeof value === "string") {
763
+ return document.querySelector(value);
764
+ }
765
+ return fallback;
766
+ };
767
+ var renderSlot = (slotContent, slotProps, fallback = null) => {
768
+ if (!slotContent) {
769
+ return fallback;
770
+ }
771
+ return typeof slotContent === "function" ? slotContent(slotProps) : slotContent;
772
+ };
773
+ var InfiniteScroll = forwardRef2(
774
+ ({
775
+ data,
776
+ buffer = 0,
777
+ as = "div",
778
+ manual = false,
779
+ manualAfter = 0,
780
+ preserveUrl = false,
781
+ reverse = false,
782
+ autoScroll,
783
+ children,
784
+ startElement,
785
+ endElement,
786
+ itemsElement,
787
+ previous,
788
+ next,
789
+ loading,
790
+ onlyNext = false,
791
+ onlyPrevious = false,
792
+ ...props
793
+ }, ref) => {
794
+ const [startElementFromRef, setStartElementFromRef] = useState6(null);
795
+ const startElementRef = useCallback2((node) => setStartElementFromRef(node), []);
796
+ const [endElementFromRef, setEndElementFromRef] = useState6(null);
797
+ const endElementRef = useCallback2((node) => setEndElementFromRef(node), []);
798
+ const [itemsElementFromRef, setItemsElementFromRef] = useState6(null);
799
+ const itemsElementRef = useCallback2((node) => setItemsElementFromRef(node), []);
800
+ const [loadingPrevious, setLoadingPrevious] = useState6(false);
801
+ const [loadingNext, setLoadingNext] = useState6(false);
802
+ const [requestCount, setRequestCount] = useState6(0);
803
+ const [resolvedStartElement, setResolvedStartElement] = useState6(null);
804
+ const [resolvedEndElement, setResolvedEndElement] = useState6(null);
805
+ const [resolvedItemsElement, setResolvedItemsElement] = useState6(null);
806
+ useEffect7(() => {
807
+ const element = startElement ? resolveHTMLElement(startElement, startElementFromRef) : startElementFromRef;
808
+ setResolvedStartElement(element);
809
+ }, [startElement, startElementFromRef]);
810
+ useEffect7(() => {
811
+ const element = endElement ? resolveHTMLElement(endElement, endElementFromRef) : endElementFromRef;
812
+ setResolvedEndElement(element);
813
+ }, [endElement, endElementFromRef]);
814
+ useEffect7(() => {
815
+ const element = itemsElement ? resolveHTMLElement(itemsElement, itemsElementFromRef) : itemsElementFromRef;
816
+ setResolvedItemsElement(element);
817
+ }, [itemsElement, itemsElementFromRef]);
818
+ const scrollableParent = useMemo6(() => getScrollableParent(resolvedItemsElement), [resolvedItemsElement]);
819
+ const callbackPropsRef = useRef3({
820
+ buffer,
821
+ onlyNext,
822
+ onlyPrevious,
823
+ reverse,
824
+ preserveUrl
825
+ });
826
+ callbackPropsRef.current = {
827
+ buffer,
828
+ onlyNext,
829
+ onlyPrevious,
830
+ reverse,
831
+ preserveUrl
832
+ };
833
+ const [infiniteScroll, setInfiniteScroll] = useState6(null);
834
+ const dataManager = useMemo6(() => infiniteScroll?.dataManager, [infiniteScroll]);
835
+ const elementManager = useMemo6(() => infiniteScroll?.elementManager, [infiniteScroll]);
836
+ const scrollToBottom = useCallback2(() => {
837
+ if (scrollableParent) {
838
+ scrollableParent.scrollTo({
839
+ top: scrollableParent.scrollHeight,
840
+ behavior: "instant"
841
+ });
842
+ } else {
843
+ window.scrollTo({
844
+ top: document.body.scrollHeight,
845
+ behavior: "instant"
846
+ });
847
+ }
848
+ }, [scrollableParent]);
849
+ useEffect7(() => {
850
+ if (!resolvedItemsElement) {
851
+ return;
852
+ }
853
+ const infiniteScrollInstance = useInfiniteScroll({
854
+ // Data
855
+ getPropName: () => data,
856
+ inReverseMode: () => callbackPropsRef.current.reverse,
857
+ shouldFetchNext: () => !callbackPropsRef.current.onlyPrevious,
858
+ shouldFetchPrevious: () => !callbackPropsRef.current.onlyNext,
859
+ shouldPreserveUrl: () => callbackPropsRef.current.preserveUrl,
860
+ // Elements
861
+ getTriggerMargin: () => callbackPropsRef.current.buffer,
862
+ getStartElement: () => resolvedStartElement,
863
+ getEndElement: () => resolvedEndElement,
864
+ getItemsElement: () => resolvedItemsElement,
865
+ getScrollableParent: () => scrollableParent,
866
+ // Callbacks
867
+ onBeforePreviousRequest: () => setLoadingPrevious(true),
868
+ onBeforeNextRequest: () => setLoadingNext(true),
869
+ onCompletePreviousRequest: () => {
870
+ setLoadingPrevious(false);
871
+ setRequestCount(infiniteScrollInstance.dataManager.getRequestCount());
872
+ },
873
+ onCompleteNextRequest: () => {
874
+ setLoadingNext(false);
875
+ setRequestCount(infiniteScrollInstance.dataManager.getRequestCount());
876
+ }
877
+ });
878
+ setInfiniteScroll(infiniteScrollInstance);
879
+ const { dataManager: dataManager2, elementManager: elementManager2 } = infiniteScrollInstance;
880
+ setRequestCount(dataManager2.getRequestCount());
881
+ elementManager2.setupObservers();
882
+ elementManager2.processServerLoadedElements(dataManager2.getLastLoadedPage());
883
+ if (autoLoad) {
884
+ elementManager2.enableTriggers();
885
+ }
886
+ return () => {
887
+ elementManager2.flushAll();
888
+ setInfiniteScroll(null);
889
+ };
890
+ }, [data, resolvedItemsElement, resolvedStartElement, resolvedEndElement, scrollableParent]);
891
+ const manualMode = useMemo6(
892
+ () => manual || manualAfter > 0 && requestCount >= manualAfter,
893
+ [manual, manualAfter, requestCount]
894
+ );
895
+ const autoLoad = useMemo6(() => !manualMode, [manualMode]);
896
+ useEffect7(() => {
897
+ autoLoad ? elementManager?.enableTriggers() : elementManager?.disableTriggers();
898
+ }, [autoLoad, onlyNext, onlyPrevious, resolvedStartElement, resolvedEndElement]);
899
+ useEffect7(() => {
900
+ const shouldAutoScroll = autoScroll !== void 0 ? autoScroll : reverse;
901
+ if (shouldAutoScroll) {
902
+ scrollToBottom();
903
+ }
904
+ }, [scrollableParent]);
905
+ useImperativeHandle2(
906
+ ref,
907
+ () => ({
908
+ fetchNext: dataManager?.fetchNext || (() => {
909
+ }),
910
+ fetchPrevious: dataManager?.fetchPrevious || (() => {
911
+ }),
912
+ hasPrevious: dataManager?.hasPrevious || (() => false),
913
+ hasNext: dataManager?.hasNext || (() => false)
914
+ }),
915
+ [dataManager]
916
+ );
917
+ const headerAutoMode = autoLoad && !onlyNext;
918
+ const footerAutoMode = autoLoad && !onlyPrevious;
919
+ const sharedExposed = {
920
+ loadingPrevious,
921
+ loadingNext,
922
+ hasPrevious: dataManager?.hasPrevious() ?? false,
923
+ hasNext: dataManager?.hasNext() ?? false
924
+ };
925
+ const exposedPrevious = {
926
+ loading: loadingPrevious,
927
+ fetch: dataManager?.fetchPrevious ?? (() => {
928
+ }),
929
+ autoMode: headerAutoMode,
930
+ manualMode: !headerAutoMode,
931
+ hasMore: dataManager?.hasPrevious() ?? false,
932
+ ...sharedExposed
933
+ };
934
+ const exposedNext = {
935
+ loading: loadingNext,
936
+ fetch: dataManager?.fetchNext ?? (() => {
937
+ }),
938
+ autoMode: footerAutoMode,
939
+ manualMode: !footerAutoMode,
940
+ hasMore: dataManager?.hasNext() ?? false,
941
+ ...sharedExposed
942
+ };
943
+ const exposedSlot = {
944
+ loading: loadingPrevious || loadingNext,
945
+ loadingPrevious,
946
+ loadingNext
947
+ };
948
+ const renderElements = [];
949
+ if (!startElement) {
950
+ renderElements.push(
951
+ createElement4(
952
+ "div",
953
+ { ref: startElementRef },
954
+ // Render previous slot or fallback to loading indicator
955
+ renderSlot(previous, exposedPrevious, loadingPrevious ? renderSlot(loading, exposedPrevious) : null)
956
+ )
957
+ );
958
+ }
959
+ renderElements.push(
960
+ createElement4(
961
+ as,
962
+ { ...props, ref: itemsElementRef },
963
+ typeof children === "function" ? children(exposedSlot) : children
964
+ )
965
+ );
966
+ if (!endElement) {
967
+ renderElements.push(
968
+ createElement4(
969
+ "div",
970
+ { ref: endElementRef },
971
+ // Render next slot or fallback to loading indicator
972
+ renderSlot(next, exposedNext, loadingNext ? renderSlot(loading, exposedNext) : null)
973
+ )
974
+ );
975
+ }
976
+ return createElement4(React3.Fragment, {}, ...reverse ? [...renderElements].reverse() : renderElements);
977
+ }
978
+ );
979
+ InfiniteScroll.displayName = "InertiaInfiniteScroll";
980
+ var InfiniteScroll_default = InfiniteScroll;
981
+
740
982
  // src/Link.ts
741
983
  import {
742
984
  isUrlMethodPair as isUrlMethodPair2,
@@ -745,9 +987,9 @@ import {
745
987
  shouldIntercept,
746
988
  shouldNavigate
747
989
  } from "@inertiajs/core";
748
- import { createElement as createElement4, forwardRef as forwardRef2, useEffect as useEffect7, useMemo as useMemo6, useRef as useRef3, useState as useState6 } from "react";
990
+ import { createElement as createElement5, forwardRef as forwardRef3, useEffect as useEffect8, useMemo as useMemo7, useRef as useRef4, useState as useState7 } from "react";
749
991
  var noop2 = () => void 0;
750
- var Link = forwardRef2(
992
+ var Link = forwardRef3(
751
993
  ({
752
994
  children,
753
995
  as = "a",
@@ -778,24 +1020,24 @@ var Link = forwardRef2(
778
1020
  cacheTags = [],
779
1021
  ...props
780
1022
  }, ref) => {
781
- const [inFlightCount, setInFlightCount] = useState6(0);
782
- const hoverTimeout = useRef3(null);
783
- const _method = useMemo6(() => {
1023
+ const [inFlightCount, setInFlightCount] = useState7(0);
1024
+ const hoverTimeout = useRef4(null);
1025
+ const _method = useMemo7(() => {
784
1026
  return isUrlMethodPair2(href) ? href.method : method.toLowerCase();
785
1027
  }, [href, method]);
786
- const _as = useMemo6(() => {
1028
+ const _as = useMemo7(() => {
787
1029
  if (typeof as !== "string" || as.toLowerCase() !== "a") {
788
1030
  return as;
789
1031
  }
790
1032
  return _method !== "get" ? "button" : as.toLowerCase();
791
1033
  }, [as, _method]);
792
- const mergeDataArray = useMemo6(
1034
+ const mergeDataArray = useMemo7(
793
1035
  () => mergeDataIntoQueryString2(_method, isUrlMethodPair2(href) ? href.url : href, data, queryStringArrayFormat),
794
1036
  [href, _method, data, queryStringArrayFormat]
795
1037
  );
796
- const url = useMemo6(() => mergeDataArray[0], [mergeDataArray]);
797
- const _data = useMemo6(() => mergeDataArray[1], [mergeDataArray]);
798
- const baseParams = useMemo6(
1038
+ const url = useMemo7(() => mergeDataArray[0], [mergeDataArray]);
1039
+ const _data = useMemo7(() => mergeDataArray[1], [mergeDataArray]);
1040
+ const baseParams = useMemo7(
799
1041
  () => ({
800
1042
  data: _data,
801
1043
  method: _method,
@@ -809,7 +1051,7 @@ var Link = forwardRef2(
809
1051
  }),
810
1052
  [_data, _method, preserveScroll, preserveState, replace, only, except, headers, async]
811
1053
  );
812
- const visitParams = useMemo6(
1054
+ const visitParams = useMemo7(
813
1055
  () => ({
814
1056
  ...baseParams,
815
1057
  onCancelToken,
@@ -829,7 +1071,7 @@ var Link = forwardRef2(
829
1071
  }),
830
1072
  [baseParams, onCancelToken, onBefore, onStart, onProgress, onFinish, onCancel, onSuccess, onError]
831
1073
  );
832
- const prefetchModes = useMemo6(
1074
+ const prefetchModes = useMemo7(
833
1075
  () => {
834
1076
  if (prefetch === true) {
835
1077
  return ["hover"];
@@ -844,7 +1086,7 @@ var Link = forwardRef2(
844
1086
  },
845
1087
  Array.isArray(prefetch) ? prefetch : [prefetch]
846
1088
  );
847
- const cacheForValue = useMemo6(() => {
1089
+ const cacheForValue = useMemo7(() => {
848
1090
  if (cacheFor !== 0) {
849
1091
  return cacheFor;
850
1092
  }
@@ -853,7 +1095,7 @@ var Link = forwardRef2(
853
1095
  }
854
1096
  return 3e4;
855
1097
  }, [cacheFor, prefetchModes]);
856
- const doPrefetch = useMemo6(() => {
1098
+ const doPrefetch = useMemo7(() => {
857
1099
  return () => {
858
1100
  router6.prefetch(
859
1101
  url,
@@ -866,12 +1108,12 @@ var Link = forwardRef2(
866
1108
  );
867
1109
  };
868
1110
  }, [url, baseParams, onPrefetching, onPrefetched, cacheForValue, cacheTags]);
869
- useEffect7(() => {
1111
+ useEffect8(() => {
870
1112
  return () => {
871
1113
  clearTimeout(hoverTimeout.current);
872
1114
  };
873
1115
  }, []);
874
- useEffect7(() => {
1116
+ useEffect8(() => {
875
1117
  if (prefetchModes.includes("mount")) {
876
1118
  setTimeout(() => doPrefetch());
877
1119
  }
@@ -926,7 +1168,7 @@ var Link = forwardRef2(
926
1168
  }
927
1169
  }
928
1170
  };
929
- const elProps = useMemo6(() => {
1171
+ const elProps = useMemo7(() => {
930
1172
  if (_as === "button") {
931
1173
  return { type: "button" };
932
1174
  }
@@ -935,7 +1177,7 @@ var Link = forwardRef2(
935
1177
  }
936
1178
  return {};
937
1179
  }, [_as, url]);
938
- return createElement4(
1180
+ return createElement5(
939
1181
  _as,
940
1182
  {
941
1183
  ...props,
@@ -961,18 +1203,18 @@ var Link_default = Link;
961
1203
 
962
1204
  // src/usePoll.ts
963
1205
  import { router as router7 } from "@inertiajs/core";
964
- import { useEffect as useEffect8, useRef as useRef4 } from "react";
1206
+ import { useEffect as useEffect9, useRef as useRef5 } from "react";
965
1207
  function usePoll(interval, requestOptions = {}, options = {
966
1208
  keepAlive: false,
967
1209
  autoStart: true
968
1210
  }) {
969
- const pollRef = useRef4(
1211
+ const pollRef = useRef5(
970
1212
  router7.poll(interval, requestOptions, {
971
1213
  ...options,
972
1214
  autoStart: false
973
1215
  })
974
1216
  );
975
- useEffect8(() => {
1217
+ useEffect9(() => {
976
1218
  if (options.autoStart ?? true) {
977
1219
  pollRef.current.start();
978
1220
  }
@@ -986,14 +1228,14 @@ function usePoll(interval, requestOptions = {}, options = {
986
1228
 
987
1229
  // src/usePrefetch.ts
988
1230
  import { router as router8 } from "@inertiajs/core";
989
- import { useEffect as useEffect9, useState as useState7 } from "react";
1231
+ import { useEffect as useEffect10, useState as useState8 } from "react";
990
1232
  function usePrefetch(options = {}) {
991
1233
  const cached = typeof window === "undefined" ? null : router8.getCached(window.location.pathname, options);
992
1234
  const inFlight = typeof window === "undefined" ? null : router8.getPrefetching(window.location.pathname, options);
993
- const [lastUpdatedAt, setLastUpdatedAt] = useState7(cached?.staleTimestamp || null);
994
- const [isPrefetching, setIsPrefetching] = useState7(inFlight !== null);
995
- const [isPrefetched, setIsPrefetched] = useState7(cached !== null);
996
- useEffect9(() => {
1235
+ const [lastUpdatedAt, setLastUpdatedAt] = useState8(cached?.staleTimestamp || null);
1236
+ const [isPrefetching, setIsPrefetching] = useState8(inFlight !== null);
1237
+ const [isPrefetched, setIsPrefetched] = useState8(cached !== null);
1238
+ useEffect10(() => {
997
1239
  const onPrefetchingListener = router8.on("prefetching", (e) => {
998
1240
  if (e.detail.visit.url.pathname === window.location.pathname) {
999
1241
  setIsPrefetching(true);
@@ -1021,16 +1263,16 @@ function usePrefetch(options = {}) {
1021
1263
 
1022
1264
  // src/WhenVisible.ts
1023
1265
  import { router as router9 } from "@inertiajs/core";
1024
- import { createElement as createElement5, useCallback as useCallback2, useEffect as useEffect10, useRef as useRef5, useState as useState8 } from "react";
1266
+ import { createElement as createElement6, useCallback as useCallback3, useEffect as useEffect11, useRef as useRef6, useState as useState9 } from "react";
1025
1267
  var WhenVisible = ({ children, data, params, buffer, as, always, fallback }) => {
1026
1268
  always = always ?? false;
1027
1269
  as = as ?? "div";
1028
1270
  fallback = fallback ?? null;
1029
- const [loaded, setLoaded] = useState8(false);
1030
- const hasFetched = useRef5(false);
1031
- const fetching = useRef5(false);
1032
- const ref = useRef5(null);
1033
- const getReloadParams = useCallback2(() => {
1271
+ const [loaded, setLoaded] = useState9(false);
1272
+ const hasFetched = useRef6(false);
1273
+ const fetching = useRef6(false);
1274
+ const ref = useRef6(null);
1275
+ const getReloadParams = useCallback3(() => {
1034
1276
  if (data) {
1035
1277
  return {
1036
1278
  only: Array.isArray(data) ? data : [data]
@@ -1041,7 +1283,7 @@ var WhenVisible = ({ children, data, params, buffer, as, always, fallback }) =>
1041
1283
  }
1042
1284
  return params;
1043
1285
  }, [params, data]);
1044
- useEffect10(() => {
1286
+ useEffect11(() => {
1045
1287
  if (!ref.current) {
1046
1288
  return;
1047
1289
  }
@@ -1087,7 +1329,7 @@ var WhenVisible = ({ children, data, params, buffer, as, always, fallback }) =>
1087
1329
  const resolveChildren = () => typeof children === "function" ? children() : children;
1088
1330
  const resolveFallback = () => typeof fallback === "function" ? fallback() : fallback;
1089
1331
  if (always || !loaded) {
1090
- return createElement5(
1332
+ return createElement6(
1091
1333
  as,
1092
1334
  {
1093
1335
  props: null,
@@ -1108,6 +1350,7 @@ export {
1108
1350
  Deferred_default as Deferred,
1109
1351
  Form_default as Form,
1110
1352
  Head_default as Head,
1353
+ InfiniteScroll_default as InfiniteScroll,
1111
1354
  Link_default as Link,
1112
1355
  WhenVisible_default as WhenVisible,
1113
1356
  createInertiaApp,