@@ -21,6 +21,7 @@ export const useRecordShowPagePagination = (
21
21
objectNameSingular : paramObjectNameSingular ,
22
22
objectRecordId : paramObjectRecordId ,
23
23
} = useParams ( ) ;
24
+
24
25
const navigate = useNavigate ( ) ;
25
26
const [ searchParams ] = useSearchParams ( ) ;
26
27
const viewIdQueryParam = searchParams . get ( 'view' ) ;
@@ -53,7 +54,7 @@ export const useRecordShowPagePagination = (
53
54
recordGqlFields : { id : true } ,
54
55
} ) ;
55
56
56
- const cursorFromRequest = currentRecordsPageInfo ?. endCursor ;
57
+ const currentRecordCursorFromRequest = currentRecordsPageInfo ?. endCursor ;
57
58
58
59
const [ totalCountBefore , setTotalCountBefore ] = useState < number > ( 0 ) ;
59
60
const [ totalCountAfter , setTotalCountAfter ] = useState < number > ( 0 ) ;
@@ -67,10 +68,10 @@ export const useRecordShowPagePagination = (
67
68
id : { neq : objectRecordId } ,
68
69
} ,
69
70
orderBy,
70
- cursorFilter : isNonEmptyString ( cursorFromRequest )
71
+ cursorFilter : isNonEmptyString ( currentRecordCursorFromRequest )
71
72
? {
72
73
cursorDirection : 'before' ,
73
- cursor : cursorFromRequest ,
74
+ cursor : currentRecordCursorFromRequest ,
74
75
limit : 1 ,
75
76
}
76
77
: undefined ,
@@ -90,10 +91,10 @@ export const useRecordShowPagePagination = (
90
91
} ,
91
92
fetchPolicy : 'network-only' ,
92
93
orderBy,
93
- cursorFilter : cursorFromRequest
94
+ cursorFilter : currentRecordCursorFromRequest
94
95
? {
95
96
cursorDirection : 'after' ,
96
- cursor : cursorFromRequest ,
97
+ cursor : currentRecordCursorFromRequest ,
97
98
limit : 1 ,
98
99
}
99
100
: undefined ,
@@ -109,6 +110,9 @@ export const useRecordShowPagePagination = (
109
110
const recordBefore = recordsBefore [ 0 ] ;
110
111
const recordAfter = recordsAfter [ 0 ] ;
111
112
113
+ const isFirstRecord = ! loading && ! isDefined ( recordBefore ) ;
114
+ const isLastRecord = ! loading && ! isDefined ( recordAfter ) ;
115
+
112
116
const { recordIdsInCache } = useRecordIdsFromFindManyCacheRootQuery ( {
113
117
objectNamePlural : objectMetadataItem . namePlural ,
114
118
fieldVariables : {
@@ -117,32 +121,56 @@ export const useRecordShowPagePagination = (
117
121
} ,
118
122
} ) ;
119
123
124
+ const cacheIsAvailableForNavigation =
125
+ ! loading &&
126
+ ( totalCountAfter > 0 || totalCountBefore > 0 ) &&
127
+ recordIdsInCache . length > 0 ;
128
+
129
+ const canNavigateToPreviousRecord =
130
+ ! isFirstRecord || ( isFirstRecord && cacheIsAvailableForNavigation ) ;
131
+
120
132
const navigateToPreviousRecord = ( ) => {
121
- if ( isDefined ( recordBefore ) ) {
133
+ if ( isFirstRecord ) {
134
+ if ( cacheIsAvailableForNavigation ) {
135
+ const lastRecordIdFromCache =
136
+ recordIdsInCache [ recordIdsInCache . length - 1 ] ;
137
+
138
+ navigate (
139
+ buildShowPageURL (
140
+ objectNameSingular ,
141
+ lastRecordIdFromCache ,
142
+ viewIdQueryParam ,
143
+ ) ,
144
+ ) ;
145
+ }
146
+ } else {
122
147
navigate (
123
148
buildShowPageURL ( objectNameSingular , recordBefore . id , viewIdQueryParam ) ,
124
149
) ;
125
150
}
126
- if ( ! loadingRecordBefore && ! isDefined ( recordBefore ) ) {
127
- const firstRecordId = recordIdsInCache [ recordIdsInCache . length - 1 ] ;
128
- navigate (
129
- buildShowPageURL ( objectNameSingular , firstRecordId , viewIdQueryParam ) ,
130
- ) ;
131
- }
132
151
} ;
133
152
153
+ const canNavigateToNextRecord =
154
+ ! isLastRecord || ( isLastRecord && cacheIsAvailableForNavigation ) ;
155
+
134
156
const navigateToNextRecord = ( ) => {
135
- if ( isDefined ( recordAfter ) ) {
157
+ if ( isLastRecord ) {
158
+ if ( cacheIsAvailableForNavigation ) {
159
+ const firstRecordIdFromCache = recordIdsInCache [ 0 ] ;
160
+
161
+ navigate (
162
+ buildShowPageURL (
163
+ objectNameSingular ,
164
+ firstRecordIdFromCache ,
165
+ viewIdQueryParam ,
166
+ ) ,
167
+ ) ;
168
+ }
169
+ } else {
136
170
navigate (
137
171
buildShowPageURL ( objectNameSingular , recordAfter . id , viewIdQueryParam ) ,
138
172
) ;
139
173
}
140
- if ( ! loadingRecordAfter && ! isDefined ( recordAfter ) ) {
141
- const lastRecordId = recordIdsInCache [ 0 ] ;
142
- navigate (
143
- buildShowPageURL ( objectNameSingular , lastRecordId , viewIdQueryParam ) ,
144
- ) ;
145
- }
146
174
} ;
147
175
148
176
const navigateToIndexView = ( ) => {
@@ -162,7 +190,7 @@ export const useRecordShowPagePagination = (
162
190
163
191
const objectLabel = capitalize ( objectMetadataItem . labelPlural ) ;
164
192
165
- const totalCount = Math . max ( 1 , totalCountBefore , totalCountAfter ) ;
193
+ const totalCount = 1 + Math . max ( totalCountBefore , totalCountAfter ) ;
166
194
167
195
const viewNameWithCount = rankFoundInView
168
196
? `${ rankInView + 1 } of ${ totalCount } in ${ objectLabel } `
@@ -174,5 +202,7 @@ export const useRecordShowPagePagination = (
174
202
navigateToPreviousRecord,
175
203
navigateToNextRecord,
176
204
navigateToIndexView,
205
+ canNavigateToNextRecord,
206
+ canNavigateToPreviousRecord,
177
207
} ;
178
208
} ;
0 commit comments