1
- import { useEffect , useState } from 'react' ;
1
+ import { useQuery } from '@tanstack/ react-query ' ;
2
2
import { useParams } from 'next/navigation' ;
3
3
import { match , P } from 'ts-pattern' ;
4
4
import { useSetAtom } from 'jotai' ;
5
+ import { useEffect } from 'react' ;
5
6
6
7
import isString from 'lodash/isString' ;
7
8
import flatMap from 'lodash/flatMap' ;
@@ -10,171 +11,161 @@ import map from 'lodash/map';
10
11
import get from 'lodash/get' ;
11
12
12
13
import { connectivityMetricsContentConfiguration } from '@/ui/segments/explore/circuit/elements/download-panel/content-configuration' ;
14
+ import { NetworkConfigItem } from '@/ui/segments/explore/circuit/elements/download-panel/config-item' ;
15
+ import { SkeletonItem } from '@/ui/segments/explore/circuit/elements/download-panel/skeleton' ;
16
+ import { Error } from '@/ui/segments/explore/circuit/elements/download-panel/error' ;
13
17
import {
14
18
countConnectivityPaths ,
15
19
resolveCircuitConfigAndDirectory ,
16
20
updateFileCounterAtom ,
17
21
} from '@/ui/segments/explore/circuit/elements/download-panel/helpers' ;
18
- import { NetworkConfigItem } from '@/ui/segments/explore/circuit/elements/download-panel/config-item' ;
19
- import { SkeletonItem } from '@/ui/segments/explore/circuit/elements/download-panel/skeleton' ;
20
- import { Error } from '@/ui/segments/explore/circuit/elements/download-panel/error' ;
21
22
import { AssetLabel } from '@/api/entitycore/types/shared/global' ;
22
23
import { getAssetElement } from '@/api/entitycore/utils' ;
24
+ import { keyBuilder } from '@/ui/use-query-keys/data' ;
23
25
24
26
import type { ConfigItemProps } from '@/ui/segments/explore/circuit/elements/download-panel/config-item' ;
25
- import type { DirectoryListContent } from '@/api/entitycore/types/shared/global' ;
26
27
import type { WorkspaceContext } from '@/types/common' ;
27
28
import type {
28
- ICircuit ,
29
29
CircuitConnectivityMatricesConfiguration ,
30
+ ICircuit ,
30
31
} from '@/api/entitycore/types/entities/circuit' ;
31
32
32
33
const AssetDefaultPath = 'matrix_config.json' ;
33
34
34
35
export default function ConnectivityMatrices ( { circuit } : { circuit : ICircuit } ) {
35
36
const { virtualLabId, projectId } = useParams < WorkspaceContext > ( ) ;
36
- const [ connectivityMetrics , mutateConnectivityMetrics ] = useState < {
37
- directory : DirectoryListContent [ 'files' ] | null ;
38
- config : CircuitConnectivityMatricesConfiguration | null ;
39
- loading : boolean ;
40
- error ?:
41
- | {
42
- directory : string | null ;
43
- config : string | null ;
44
- }
45
- | string
46
- | null ;
47
- } > ( {
48
- directory : { } ,
49
- config : { } ,
50
- loading : false ,
51
- error : null ,
52
- } ) ;
37
+
53
38
const updateFileCounter = useSetAtom ( updateFileCounterAtom ( circuit . id ) ) ;
54
39
const assets = circuit ?. assets ;
55
40
const configAsset = getAssetElement ( {
56
41
assets,
57
42
filter : ( asset ) => asset . label === AssetLabel . circuit_connectivity_matrices ,
58
43
} ) ;
59
44
60
- useEffect ( ( ) => {
61
- const getConnectivityMetrics = async ( ) => {
62
- mutateConnectivityMetrics ( {
63
- loading : true ,
64
- directory : null ,
65
- config : null ,
66
- } ) ;
67
- if ( circuit && configAsset ?. id ) {
68
- const result =
69
- await resolveCircuitConfigAndDirectory < CircuitConnectivityMatricesConfiguration > ( {
70
- entityId : circuit . id ,
71
- assetId : configAsset . id ,
72
- assetPath : AssetDefaultPath ,
73
- context : { virtualLabId, projectId } ,
74
- } ) ;
45
+ const connectivityMetrics = useQuery ( {
46
+ queryKey : keyBuilder . circuitConfigAndDirectory ( {
47
+ entityId : circuit . id ,
48
+ assetId : configAsset ! . id ,
49
+ assetPath : AssetDefaultPath ,
50
+ context : { virtualLabId, projectId } ,
51
+ } ) ,
52
+ queryFn : ( ) =>
53
+ resolveCircuitConfigAndDirectory < CircuitConnectivityMatricesConfiguration > ( {
54
+ entityId : circuit . id ,
55
+ assetId : configAsset ! . id ,
56
+ assetPath : AssetDefaultPath ,
57
+ context : { virtualLabId, projectId } ,
58
+ } ) ,
59
+ enabled : ! ! circuit && ! ! configAsset ! . id ,
60
+ select : ( result ) => {
61
+ return {
62
+ directory : result . directory ,
63
+ config : result . config ,
64
+ connectivity_metrics : countConnectivityPaths ( result . config ) ,
65
+ error : result . error ,
66
+ } ;
67
+ } ,
68
+ } ) ;
75
69
76
- mutateConnectivityMetrics ( {
77
- directory : result . directory ,
78
- config : result . config ,
79
- error : result . error ,
80
- loading : false ,
81
- } ) ;
82
- updateFileCounter ( { connectivity_metrics : countConnectivityPaths ( result . config ) } ) ;
83
- } else {
84
- mutateConnectivityMetrics ( {
85
- directory : null ,
86
- config : null ,
87
- error : 'Could not find circuit connectivity matrices asset' ,
88
- loading : false ,
89
- } ) ;
90
- }
91
- } ;
92
- getConnectivityMetrics ( ) ;
93
- // eslint-disable-next-line react-hooks/exhaustive-deps
94
- } , [ circuit ?. id , configAsset ?. id , virtualLabId , projectId ] ) ;
70
+ useEffect ( ( ) => {
71
+ updateFileCounter ( {
72
+ connectivity_metrics : connectivityMetrics . data ?. connectivity_metrics ?? 0 ,
73
+ } ) ;
74
+ } , [ connectivityMetrics . data ?. connectivity_metrics , updateFileCounter ] ) ;
95
75
96
76
return match ( connectivityMetrics )
97
- . with ( { loading : true } , ( ) => < SkeletonItem /> )
98
- . with ( { error : P . string . select ( ) } , ( ) => {
99
- let err = '' ;
100
- if ( isString ( connectivityMetrics . error ) ) err = connectivityMetrics . error ;
101
- else if ( connectivityMetrics . error ?. directory && connectivityMetrics . error ?. config )
102
- err = 'Failed to load connectivity matrices configuration and directory assets' ;
103
- else if ( connectivityMetrics . error ?. directory ) err = connectivityMetrics . error . directory ;
104
- else if ( connectivityMetrics . error ?. config ) err = connectivityMetrics . error . config ;
105
- return (
106
- < Error
107
- icon = { null }
108
- title = "Connectivity matrices"
109
- description = { err }
110
- cls = { { container : 'text-white' } }
111
- />
112
- ) ;
113
- } )
114
- . with ( { directory : P . nullish , config : P . nonNullable } , ( ) => (
77
+ . with ( { isLoading : true } , ( ) => < SkeletonItem /> )
78
+ . with (
79
+ { data : { error : P . string . select ( 'error' ) } , error : P . select ( 'catchError' ) } ,
80
+ ( { error } ) => {
81
+ let err = '' ;
82
+ if ( isString ( connectivityMetrics . error ) ) err = connectivityMetrics . error ;
83
+ else if ( error ?. directory && error ?. config )
84
+ err = 'Failed to load connectivity matrices configuration and directory assets' ;
85
+ else if ( error ?. directory ) err = error . directory ;
86
+ else if ( error ?. config ) err = error . config ;
87
+ return (
88
+ < Error
89
+ icon = { null }
90
+ title = "Connectivity matrices"
91
+ description = { err }
92
+ cls = { { container : 'text-white' } }
93
+ />
94
+ ) ;
95
+ }
96
+ )
97
+ . with ( { data : { directory : P . nullish , config : P . nonNullable } } , ( ) => (
115
98
< Error
116
99
icon = { null }
117
100
title = "Connectivity matrices"
118
101
description = "No assets directory was found"
119
102
cls = { { container : 'text-white' } }
120
103
/>
121
104
) )
122
- . with ( { directory : P . nonNullable , config : P . nullish } , ( ) => (
105
+ . with ( { data : { directory : P . nonNullable , config : P . nullish } } , ( ) => (
123
106
< Error
124
107
icon = { null }
125
108
title = "Connectivity matrices"
126
109
description = "No configuration asset was found"
127
110
cls = { { container : 'text-white' } }
128
111
/>
129
112
) )
130
- . with ( { directory : P . nonNullable , config : P . nonNullable } , ( { directory, config } ) => {
131
- const items = flatMap ( config || { } , ( group ) =>
132
- map ( group , ( { path, description } ) => {
133
- const title = last ( path . split ( '/' ) ) ;
134
- const mimeType = last ( title ?. split ( '.' ) ) ;
135
- const asset = {
136
- ...get ( directory , path , {
137
- name : null ,
138
- size : null ,
139
- last_modified : null ,
140
- } ) ,
141
- path,
142
- } ;
113
+ . with (
114
+ {
115
+ data : {
116
+ directory : P . nonNullable . select ( 'directory' ) ,
117
+ config : P . nonNullable . select ( 'config' ) ,
118
+ } ,
119
+ } ,
120
+ ( { directory, config } ) => {
121
+ const items = flatMap ( config || { } , ( group ) =>
122
+ map ( group , ( { path, description } ) => {
123
+ const title = last ( path . split ( '/' ) ) ;
124
+ const mimeType = last ( title ?. split ( '.' ) ) ;
125
+ const asset = {
126
+ ...get ( directory , path , {
127
+ name : null ,
128
+ size : null ,
129
+ last_modified : null ,
130
+ } ) ,
131
+ path,
132
+ } ;
143
133
144
- return {
145
- asset,
146
- title,
147
- mimeType,
148
- description,
149
- subItems : null ,
150
- } ;
151
- } )
152
- ) ;
153
- const fullConfig = Object . assign ( connectivityMetricsContentConfiguration , {
154
- type : 'connectivity_metrics' ,
155
- showType : 'connectivity matrices' ,
156
- showPrefix : 'Local connectome' ,
157
- count : items . length ,
158
- items,
159
- } ) as unknown as Omit < ConfigItemProps , 'className' > ;
134
+ return {
135
+ asset,
136
+ title,
137
+ mimeType,
138
+ description,
139
+ subItems : null ,
140
+ } ;
141
+ } )
142
+ ) ;
143
+ const fullConfig = Object . assign ( connectivityMetricsContentConfiguration , {
144
+ type : 'connectivity_metrics' ,
145
+ showType : 'connectivity matrices' ,
146
+ showPrefix : 'Local connectome' ,
147
+ count : items . length ,
148
+ items,
149
+ } ) as unknown as Omit < ConfigItemProps , 'className' > ;
160
150
161
- return (
162
- < NetworkConfigItem
163
- key = { fullConfig . key }
164
- name = { fullConfig . name }
165
- description = { fullConfig . description }
166
- count = { fullConfig . count }
167
- mimeType = { fullConfig . mimeType }
168
- items = { fullConfig . items }
169
- showType = { fullConfig . showType }
170
- showPrefix = { fullConfig . showPrefix }
171
- downloadConfig = { {
172
- entityId : circuit ?. id ,
173
- assetConfigId : configAsset ?. id ! ,
174
- context : { virtualLabId, projectId } ,
175
- } }
176
- />
177
- ) ;
178
- } )
151
+ return (
152
+ < NetworkConfigItem
153
+ key = { fullConfig . key }
154
+ name = { fullConfig . name }
155
+ description = { fullConfig . description }
156
+ count = { fullConfig . count }
157
+ mimeType = { fullConfig . mimeType }
158
+ items = { fullConfig . items }
159
+ showType = { fullConfig . showType }
160
+ showPrefix = { fullConfig . showPrefix }
161
+ downloadConfig = { {
162
+ entityId : circuit ?. id ,
163
+ assetConfigId : configAsset ?. id ! ,
164
+ context : { virtualLabId, projectId } ,
165
+ } }
166
+ />
167
+ ) ;
168
+ }
169
+ )
179
170
. otherwise ( ( ) => null ) ;
180
171
}
0 commit comments