11import { ReloadOptions , router } from '@inertiajs/core'
22import { createElement , ReactNode , useCallback , useEffect , useRef , useState } from 'react'
3+ import usePage from './usePage'
34
45interface WhenVisibleProps {
56 children : ReactNode | ( ( ) => ReactNode )
@@ -17,9 +18,25 @@ const WhenVisible = ({ children, data, params, buffer, as, always, fallback }: W
1718 fallback = fallback ?? null
1819
1920 const [ loaded , setLoaded ] = useState ( false )
20- const hasFetched = useRef < boolean > ( false )
2121 const fetching = useRef < boolean > ( false )
2222 const ref = useRef < HTMLDivElement > ( null )
23+ const observer = useRef < IntersectionObserver | null > ( null )
24+
25+ const page = usePage ( )
26+
27+ useEffect ( ( ) => {
28+ if ( Array . isArray ( data ) ) {
29+ // For arrays, reset loaded if any prop becomes undefined
30+ if ( data . some ( ( key ) => page . props [ key ] === undefined ) ) {
31+ setLoaded ( false )
32+ }
33+ } else if ( data ) {
34+ // For single prop, reset loaded if prop becomes undefined
35+ if ( page . props [ data ] === undefined ) {
36+ setLoaded ( false )
37+ }
38+ }
39+ } , [ data , ...( Array . isArray ( data ) ? data . map ( ( key ) => page . props [ key ] ) : [ page . props [ data ! ] ] ) ] )
2340
2441 const getReloadParams = useCallback < ( ) => Partial < ReloadOptions > > ( ( ) => {
2542 if ( data ) {
@@ -35,26 +52,23 @@ const WhenVisible = ({ children, data, params, buffer, as, always, fallback }: W
3552 return params
3653 } , [ params , data ] )
3754
38- useEffect ( ( ) => {
39- if ( ! ref . current ) {
40- return
41- }
55+ const registerObserver = ( ) => {
56+ observer . current ?. disconnect ( )
4257
43- const observer = new IntersectionObserver (
58+ observer . current = new IntersectionObserver (
4459 ( entries ) => {
4560 if ( ! entries [ 0 ] . isIntersecting ) {
4661 return
4762 }
4863
49- if ( ! always && hasFetched . current ) {
50- observer . disconnect ( )
64+ if ( fetching . current ) {
65+ return
5166 }
5267
53- if ( fetching . current ) {
68+ if ( ! always && loaded ) {
5469 return
5570 }
5671
57- hasFetched . current = true
5872 fetching . current = true
5973
6074 const reloadParams = getReloadParams ( )
@@ -71,7 +85,7 @@ const WhenVisible = ({ children, data, params, buffer, as, always, fallback }: W
7185 reloadParams . onFinish ?.( e )
7286
7387 if ( ! always ) {
74- observer . disconnect ( )
88+ observer . current ?. disconnect ( )
7589 }
7690 } ,
7791 } )
@@ -81,12 +95,20 @@ const WhenVisible = ({ children, data, params, buffer, as, always, fallback }: W
8195 } ,
8296 )
8397
84- observer . observe ( ref . current )
98+ observer . current . observe ( ref . current ! )
99+ }
100+
101+ useEffect ( ( ) => {
102+ if ( ! ref . current ) {
103+ return
104+ }
105+
106+ registerObserver ( )
85107
86108 return ( ) => {
87- observer . disconnect ( )
109+ observer . current ?. disconnect ( )
88110 }
89- } , [ ref , getReloadParams , buffer ] )
111+ } , [ loaded , ref , getReloadParams , buffer ] )
90112
91113 const resolveChildren = ( ) => ( typeof children === 'function' ? children ( ) : children )
92114 const resolveFallback = ( ) => ( typeof fallback === 'function' ? fallback ( ) : fallback )
0 commit comments