22 @license
33 Copyright (c) 2015-2026 Lablup Inc. All rights reserved.
44 */
5- import { ModelCardDrawerFragment$key } from '../__generated__/ModelCardDrawerFragment.graphql' ;
65import {
76 ModelCardV2Filter ,
87 ModelStoreListPageV2Query ,
@@ -34,6 +33,7 @@ import {
3433 BAIGraphQLPropertyFilter ,
3534 BAISelect ,
3635 type GraphQLFilter ,
36+ safeDecodeUuid ,
3737 useUpdatableState ,
3838} from 'backend.ai-ui' ;
3939import dayjs from 'dayjs' ;
@@ -43,7 +43,7 @@ import {
4343 parseAsStringLiteral ,
4444 useQueryStates ,
4545} from 'nuqs' ;
46- import React , { useDeferredValue , useEffectEvent , useState } from 'react' ;
46+ import React , { useDeferredValue , useEffectEvent } from 'react' ;
4747import { useTranslation } from 'react-i18next' ;
4848import { graphql , useFragment , useLazyLoadQuery } from 'react-relay' ;
4949
@@ -204,9 +204,7 @@ const ModelCardV2Grid: React.FC<{
204204 pageSize : number ;
205205 offset : number ;
206206 onTotalChange : ( total : number ) => void ;
207- onCardClick ?: ( id : string , frgmt : ModelCardDrawerFragment$key ) => void ;
208- selectedModelCardId ?: string | null ;
209- onSelectedModelCardFound ?: ( frgmt : ModelCardDrawerFragment$key ) => void ;
207+ onCardClick ?: ( id : string ) => void ;
210208} > = ( {
211209 projectId,
212210 filter,
@@ -218,8 +216,6 @@ const ModelCardV2Grid: React.FC<{
218216 offset,
219217 onTotalChange,
220218 onCardClick,
221- selectedModelCardId,
222- onSelectedModelCardFound,
223219} ) => {
224220 'use memo' ;
225221
@@ -246,7 +242,6 @@ const ModelCardV2Grid: React.FC<{
246242 node {
247243 id
248244 ...ModelStoreListPageV2_ModelCardV2Fragment
249- ...ModelCardDrawerFragment
250245 }
251246 }
252247 }
@@ -276,23 +271,6 @@ const ModelCardV2Grid: React.FC<{
276271 onTotalChanged ( ) ;
277272 } , [ total ] ) ;
278273
279- // When items load and a selectedModelCardId is set (e.g. after refresh),
280- // find the matching fragment and report it to the parent.
281- const onResolveSelectedModelCard = useEffectEvent ( ( ) => {
282- if ( selectedModelCardId ) {
283- const match = items . find (
284- ( edge ) => edge ?. node ?. id === selectedModelCardId ,
285- ) ;
286- if ( match ?. node ) {
287- onSelectedModelCardFound ?.( match . node ) ;
288- }
289- }
290- } ) ;
291-
292- React . useEffect ( ( ) => {
293- onResolveSelectedModelCard ( ) ;
294- } , [ selectedModelCardId , result ] ) ;
295-
296274 if ( items . length === 0 ) {
297275 return (
298276 < Empty
@@ -312,7 +290,7 @@ const ModelCardV2Grid: React.FC<{
312290 < ModelCardV2Card
313291 modelCardV2Frgmt = { item }
314292 searchKeyword = { searchKeyword }
315- onClick = { ( ) => onCardClick ?.( item . id , item ) }
293+ onClick = { ( ) => onCardClick ?.( item . id ) }
316294 />
317295 </ Col >
318296 ) ;
@@ -343,9 +321,6 @@ const ModelStoreListPageV2: React.FC = () => {
343321 queryParams . sort ,
344322 ) ;
345323
346- const [ selectedModelCard , setSelectedModelCard ] =
347- useState < ModelCardDrawerFragment$key | null > ( null ) ;
348-
349324 const filter : GraphQLFilter | undefined = queryParams . filter ?? undefined ;
350325 const deferredFilter = useDeferredValue ( filter ) ;
351326 const deferredSortField = useDeferredValue ( sortField ) ;
@@ -364,6 +339,18 @@ const ModelStoreListPageV2: React.FC = () => {
364339 const deferredLimit = useDeferredValue ( baiPaginationOption . limit ) ;
365340 const deferredOffset = useDeferredValue ( baiPaginationOption . offset ) ;
366341
342+ // Drawer data is intentionally NOT fetched as part of the main list query
343+ // — the per-card drawer fragment (readme, all presets, vfolder metadata)
344+ // is heavy, and including it via `...ModelCardDrawerFragment` on every
345+ // edge multiplies the list-page payload. `ModelCardDrawer` owns its own
346+ // query and gates the fetch on `useDeferredValue(open)` so the network
347+ // only kicks in once the drawer actually commits to opening.
348+ const selectedModelCardId = queryParams . modelCard ;
349+ const drawerOpen = ! ! selectedModelCardId ;
350+ const localSelectedModelCardId = selectedModelCardId
351+ ? safeDecodeUuid ( selectedModelCardId )
352+ : undefined ;
353+
367354 const isPendingPage =
368355 deferredLimit !== baiPaginationOption . limit ||
369356 deferredOffset !== baiPaginationOption . offset ;
@@ -481,10 +468,7 @@ const ModelStoreListPageV2: React.FC = () => {
481468 pageSize = { deferredLimit }
482469 offset = { deferredOffset }
483470 onTotalChange = { setTotal }
484- selectedModelCardId = { queryParams . modelCard }
485- onSelectedModelCardFound = { ( frgmt ) => setSelectedModelCard ( frgmt ) }
486- onCardClick = { ( id , frgmt ) => {
487- setSelectedModelCard ( frgmt ) ;
471+ onCardClick = { ( id ) => {
488472 setQueryParams ( { modelCard : id } ) ;
489473 } }
490474 />
@@ -525,10 +509,9 @@ const ModelStoreListPageV2: React.FC = () => {
525509 ) }
526510
527511 < ModelCardDrawer
528- modelCardDrawerFrgmt = { selectedModelCard }
529- open = { ! ! queryParams . modelCard && ! ! selectedModelCard }
512+ modelCardId = { localSelectedModelCardId }
513+ open = { drawerOpen }
530514 onClose = { ( ) => {
531- setSelectedModelCard ( null ) ;
532515 setQueryParams ( { modelCard : null } ) ;
533516 } }
534517 />
0 commit comments