1- import { useContext } from 'react' ;
1+ import {
2+ useContext ,
3+ useMemo ,
4+ } from 'react' ;
5+ import { isNotDefined } from '@togglecorp/fujs' ;
26import {
37 EntriesAsList ,
48 getErrorObject ,
59 LeafError ,
610 ObjectError ,
711} from '@togglecorp/toggle-form' ;
12+ import { gql } from 'urql' ;
813
14+ import Alert from '#components/Alert' ;
15+ import Button from '#components/Button' ;
916import Container from '#components/Container' ;
1017import AssetInput from '#components/domain/AssetInput' ;
1118import RadioInput from '#components/RadioInput' ;
1219import TextInput from '#components/TextInput' ;
1320import EnumsContext from '#contexts/EnumsContext' ;
1421import {
1522 ProjectAssetInputTypeEnum ,
23+ useTestAoiObjectsQuery ,
24+ useTestTaskingManagerProjectQuery ,
1625 ValidateObjectSourceTypeEnum ,
1726} from '#generated/types/graphql' ;
1827import {
28+ formatNumber ,
1929 keySelector ,
2030 labelSelector ,
2131} from '#utils/common' ;
2232
2333import { PartialValidateObjectSourceInputFields } from './schema' ;
2434
35+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
36+ const TEST_AOI_OBJECTS_QUERY = gql `
37+ query TestAoiObjects($assetId: ID, $projectId: ID, $ohsomeFilter: String) {
38+ testAoiObjects(assetId: $assetId, projectId: $projectId, ohsomeFilter: $ohsomeFilter) {
39+ ok
40+ error
41+ objectCount
42+ assetId
43+ projectId
44+ ohsomeFilter
45+ }
46+ }
47+ ` ;
48+
49+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
50+ const TEST_TASKING_MANAGER_PROJECT_QUERY = gql `
51+ query TestTaskingManagerProject($hotTmId: String, $ohsomeFilter: String) {
52+ testTaskingManagerProject(hotTmId: $hotTmId, ohsomeFilter: $ohsomeFilter) {
53+ ok
54+ error
55+ objectCount
56+ hotTmId
57+ ohsomeFilter
58+ }
59+ }
60+ ` ;
61+
2562interface Props {
2663 value : PartialValidateObjectSourceInputFields | undefined ,
2764 error : LeafError | ObjectError < PartialValidateObjectSourceInputFields > ,
@@ -43,6 +80,35 @@ function ObjectSourceInput(props: Props) {
4380
4481 const error = getErrorObject ( formError ) ;
4582
83+ const [
84+ {
85+ data : testAoiObjectsResponse ,
86+ fetching : testAoiObjectsPending ,
87+ } ,
88+ triggerTestAoiObjects ,
89+ ] = useTestAoiObjectsQuery ( {
90+ variables : {
91+ projectId,
92+ assetId : value ?. aoiGeometry ,
93+ ohsomeFilter : value ?. ohsomeFilter ,
94+ } ,
95+ pause : true ,
96+ } ) ;
97+
98+ const [
99+ {
100+ data : testTaskingManagerProjectResponse ,
101+ fetching : testTaskingManagerProjectPending ,
102+ } ,
103+ triggerTestTaskingManagerProject ,
104+ ] = useTestTaskingManagerProjectQuery ( {
105+ variables : {
106+ hotTmId : value ?. taskingManagerProjectId ,
107+ ohsomeFilter : value ?. ohsomeFilter ,
108+ } ,
109+ pause : true ,
110+ } ) ;
111+
46112 const {
47113 validateObjectSourceTypeOptions,
48114 } = useContext ( EnumsContext ) ;
@@ -53,10 +119,148 @@ function ObjectSourceInput(props: Props) {
53119 TaskingManager,
54120 } = ValidateObjectSourceTypeEnum ;
55121
122+ const headerDescription = useMemo ( ( ) => {
123+ if ( isNotDefined ( value ?. sourceType ) ) {
124+ return null ;
125+ }
126+
127+ if ( value . sourceType === AoiGeojsonFile ) {
128+ if ( isNotDefined ( testAoiObjectsResponse ) ) {
129+ return null ;
130+ }
131+
132+ const {
133+ testAoiObjects : {
134+ ok,
135+ error : testError ,
136+ objectCount,
137+ assetId,
138+ ohsomeFilter,
139+ } ,
140+ } = testAoiObjectsResponse ;
141+
142+ if ( assetId !== value . aoiGeometry || ohsomeFilter !== value . ohsomeFilter ) {
143+ return null ;
144+ }
145+
146+ return (
147+ < Alert
148+ name = "test-aoi-message"
149+ type = { ok ? 'success' : 'danger' }
150+ title = { ok
151+ ? `AOI is valid. It contains ${ formatNumber ( objectCount ) } object(s)`
152+ : 'Failed to validate AOI' }
153+ description = { testError }
154+ fullWidth
155+ withoutShadow
156+ />
157+ ) ;
158+ }
159+
160+ if ( value . sourceType === TaskingManager ) {
161+ if ( isNotDefined ( testTaskingManagerProjectResponse ) ) {
162+ return null ;
163+ }
164+
165+ const {
166+ testTaskingManagerProject : {
167+ ok,
168+ error : testError ,
169+ objectCount,
170+ hotTmId,
171+ ohsomeFilter,
172+ } ,
173+ } = testTaskingManagerProjectResponse ;
174+
175+ if ( hotTmId !== value . taskingManagerProjectId || ohsomeFilter !== value . ohsomeFilter ) {
176+ return null ;
177+ }
178+
179+ return (
180+ < Alert
181+ name = "test-tasking-manager-project-message"
182+ type = { ok ? 'success' : 'danger' }
183+ title = { ok
184+ ? `Project is valid. It contains ${ formatNumber ( objectCount ) } object(s)`
185+ : 'Failed to validate AOI' }
186+ description = { testError }
187+ fullWidth
188+ withoutShadow
189+ />
190+ ) ;
191+ }
192+
193+ return null ;
194+ } , [
195+ AoiGeojsonFile ,
196+ TaskingManager ,
197+ testAoiObjectsResponse ,
198+ testTaskingManagerProjectResponse ,
199+ value ?. sourceType ,
200+ value ?. taskingManagerProjectId ,
201+ value ?. ohsomeFilter ,
202+ value ?. aoiGeometry ,
203+ ] ) ;
204+
205+ const actions = useMemo ( ( ) => {
206+ if ( isNotDefined ( value ?. sourceType ) ) {
207+ return null ;
208+ }
209+
210+ if ( value . sourceType === AoiGeojsonFile ) {
211+ if ( isNotDefined ( value ?. aoiGeometry ) || isNotDefined ( value . ohsomeFilter ) ) {
212+ return null ;
213+ }
214+
215+ return (
216+ < Button
217+ name = { undefined }
218+ onClick = { triggerTestAoiObjects }
219+ disabled = { testAoiObjectsPending }
220+ >
221+ { testAoiObjectsPending ? 'Testing AOI on ohsome...' : 'Test AOI on ohsome' }
222+ </ Button >
223+ ) ;
224+ }
225+
226+ if ( value . sourceType === TaskingManager ) {
227+ if ( isNotDefined ( value . taskingManagerProjectId ) || isNotDefined ( value . ohsomeFilter ) ) {
228+ return null ;
229+ }
230+
231+ return (
232+ < Button
233+ name = { undefined }
234+ onClick = { triggerTestTaskingManagerProject }
235+ disabled = { testTaskingManagerProjectPending }
236+ >
237+ { testTaskingManagerProjectPending
238+ ? 'Testing Tasking Manager project AOI on ohsome...'
239+ : 'Test Tasking Manager project AOI on ohsome' }
240+ </ Button >
241+ ) ;
242+ }
243+
244+ return null ;
245+ } , [
246+ AoiGeojsonFile ,
247+ TaskingManager ,
248+ testAoiObjectsPending ,
249+ testTaskingManagerProjectPending ,
250+ triggerTestAoiObjects ,
251+ triggerTestTaskingManagerProject ,
252+ value ?. aoiGeometry ,
253+ value ?. ohsomeFilter ,
254+ value ?. sourceType ,
255+ value ?. taskingManagerProjectId ,
256+ ] ) ;
257+
56258 return (
57259 < Container
58260 heading = "Validation Object Source"
59261 headingLevel = { 4 }
262+ headerDescription = { headerDescription }
263+ footerActions = { actions }
60264 >
61265 < RadioInput
62266 label = "Source type"
0 commit comments