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