@@ -51,6 +51,16 @@ import {
5151 useModuleTemplatesQuery ,
5252} from './kymaModulesQueries' ;
5353import { findModuleStatus } from './support' ;
54+ import {
55+ checkIfAssociatedResourceLeft ,
56+ deleteAssociatedResources ,
57+ deleteCrResources ,
58+ fetchResourceCounts ,
59+ generateAssociatedResourcesUrls ,
60+ getAssociatedResources ,
61+ getCRResource ,
62+ handleItemClick ,
63+ } from './deleteModulesHelpers' ;
5464import { UnmanagedModuleInfo } from './components/UnmanagedModuleInfo' ;
5565import { useDelete } from 'shared/hooks/BackendAPI/useMutation' ;
5666
@@ -78,7 +88,7 @@ export default function KymaModulesList({
7888 const setLayoutColumn = useSetRecoilState ( columnLayoutState ) ;
7989 const setIsFormOpen = useSetRecoilState ( isFormOpenState ) ;
8090 const { clusterUrl, namespaceUrl } = useUrl ( ) ;
81- const fetch = useSingleGet ( ) ;
91+ const fetchFn = useSingleGet ( ) ;
8292 const getScope = useGetScope ( ) ;
8393 const navigate = useNavigate ( ) ;
8494 const deleteResourceMutation = useDelete ( ) ;
@@ -393,150 +403,47 @@ export default function KymaModulesList({
393403 ) ;
394404 } ;
395405
396- const getAssociatedResources = ( ) => {
397- if ( ! chosenModuleIndex ) {
398- return [ ] ;
399- }
400- const selectedModule = selectedModules [ chosenModuleIndex ] ;
401- const moduleChannel =
402- selectedModule ?. channel || kymaResource ?. spec ?. channel ;
403- const moduleVersion =
404- selectedModule ?. version ||
405- findModuleStatus ( kymaResource , selectedModule ?. name ) ?. version ;
406-
407- const module = findModuleTemplate (
408- selectedModule ?. name ,
409- moduleChannel ,
410- moduleVersion ,
411- ) ;
412- return module ?. spec ?. associatedResources || [ ] ;
413- } ;
414-
415- const getCRResource = ( ) => {
416- if ( ! chosenModuleIndex ) {
417- return [ ] ;
418- }
419- const selectedModule = selectedModules [ chosenModuleIndex ] ;
420- const moduleChannel =
421- selectedModule ?. channel || kymaResource ?. spec ?. channel ;
422- const moduleVersion =
423- selectedModule ?. version ||
424- findModuleStatus ( kymaResource , selectedModule ?. name ) ?. version ;
425-
426- const module = findModuleTemplate (
427- selectedModule ?. name ,
428- moduleChannel ,
429- moduleVersion ,
430- ) ;
431-
432- const resource = { } ;
433- if ( module . spec . data ) {
434- resource . group = module . spec . data . apiVersion . split ( '/' ) [ 0 ] ;
435- resource . version = module . spec . data . apiVersion . split ( '/' ) [ 1 ] ;
436- resource . kind = module . spec . data . kind ;
437- }
438- return resource ? [ resource ] : [ ] ;
439- } ;
440-
441- const handleItemClick = async ( kind , group , version ) => {
442- const isNamespaced = await getScope ( group , version , kind ) ;
443- const path = `${ pluralize ( kind . toLowerCase ( ) ) } ` ;
444- const link = isNamespaced
445- ? namespaceUrl ( path , { namespace : '-all-' } )
446- : clusterUrl ( path ) ;
447-
448- navigate ( link ) ;
449- } ;
450-
451- const getResources = async ( kind , group , version ) => {
452- const url =
453- group === 'v1'
454- ? '/api/v1'
455- : `/apis/${ group } /${ version } /${ pluralize ( kind . toLowerCase ( ) ) } ` ;
456-
457- try {
458- const response = await fetch ( url ) ;
459- const json = await response . json ( ) ;
460- return json . items ;
461- } catch ( e ) {
462- console . warn ( e ) ;
463- return 'Error' ;
464- }
465- } ;
466-
467- const getUrlsByNamespace = resources => {
468- return resources . reduce ( ( urls , resource ) => {
469- const url = `/apis/${ resource . apiVersion } /namespaces/${
470- resource . metadata . namespace
471- } /${ pluralize ( resource . kind . toLowerCase ( ) ) } `;
472-
473- if ( ! urls . includes ( url ) ) {
474- urls . push ( url ) ;
475- }
476- return urls ;
477- } , [ ] ) ;
478- } ;
479-
480- const generateAssociatedResourcesUrls = async resources => {
481- const allUrls = [ ] ;
482-
483- for ( const resource of resources ) {
484- const isNamespaced = await getScope (
485- resource . group ,
486- resource . version ,
487- resource . kind ,
488- ) ;
489- let resources ,
490- urls = [ ] ;
491- if ( isNamespaced ) {
492- resources = await getResources (
493- resource . kind ,
494- resource . group ,
495- resource . version ,
496- ) ;
497- urls = getUrlsByNamespace ( resources ) ;
498- } else {
499- urls = [
500- resource . group === 'v1'
501- ? '/api/v1'
502- : `/apis/${ resource . group } /${ resource . version } /${ pluralize (
503- resource . kind . toLowerCase ( ) ,
504- ) } `,
505- ] ;
506- }
507-
508- allUrls . push ( ...urls ) ;
509- }
510-
511- return allUrls ;
512- } ;
513-
514- const fetchResourceCounts = async resources => {
515- const counts = { } ;
516- for ( const resource of resources ) {
517- const resources = await getResources (
518- resource . kind ,
519- resource . group ,
520- resource . version ,
521- ) ;
522- counts [ `${ resource . kind } -${ resource . group } -${ resource . version } ` ] =
523- resources . length ;
524- }
525- return counts ;
526- } ;
527-
528406 const [ resourceCounts , setResourceCounts ] = useState ( { } ) ;
529407 const [ forceDeleteUrls , setForceDeleteUrls ] = useState ( [ ] ) ;
530408 const [ crUrls , setCrUrls ] = useState ( [ ] ) ;
531409 const [ allowForceDelete , setAllowForceDelete ] = useState ( false ) ;
410+ const [ associatedResourceLeft , setAssociatedResourceLeft ] = useState ( false ) ;
532411
533412 useEffect ( ( ) => {
534413 const fetchCounts = async ( ) => {
535- const resources = getAssociatedResources ( ) ;
414+ const resources = getAssociatedResources (
415+ chosenModuleIndex ,
416+ findModuleTemplate ,
417+ selectedModules ,
418+ kymaResource ,
419+ ) ;
420+
536421 const counts = await fetchResourceCounts ( resources ) ;
537- const urls = await generateAssociatedResourcesUrls ( resources ) ;
538- const crUResources = getCRResource ( ) ;
539- const crUrl = await generateAssociatedResourcesUrls ( crUResources ) ;
422+
423+ const urls = await generateAssociatedResourcesUrls (
424+ resources ,
425+ fetchFn ,
426+ clusterUrl ,
427+ getScope ,
428+ namespaceUrl ,
429+ navigate ,
430+ ) ;
431+
432+ const crUResources = getCRResource (
433+ chosenModuleIndex ,
434+ findModuleTemplate ,
435+ selectedModules ,
436+ kymaResource ,
437+ ) ;
438+
439+ const crUrl = await generateAssociatedResourcesUrls (
440+ crUResources ,
441+ fetchFn ,
442+ clusterUrl ,
443+ getScope ,
444+ namespaceUrl ,
445+ navigate ,
446+ ) ;
540447
541448 setResourceCounts ( counts ) ;
542449 setForceDeleteUrls ( urls ) ;
@@ -547,56 +454,30 @@ export default function KymaModulesList({
547454 // eslint-disable-next-line react-hooks/exhaustive-deps
548455 } , [ chosenModuleIndex ] ) ;
549456
550- const checkIfAssociatedResourceLeft = ( ) => {
551- const resources = getAssociatedResources ( ) ;
552- for ( const resource of resources ) {
553- if (
554- resourceCounts [
555- `${ resource . kind } -${ resource . group } -${ resource . version } `
556- ] > 0
557- ) {
558- return true ;
559- }
560- }
561- return false ;
562- } ;
457+ useEffect ( ( ) => {
458+ const resourcesLeft = checkIfAssociatedResourceLeft (
459+ resourceCounts ,
460+ chosenModuleIndex ,
461+ findModuleTemplate ,
462+ selectedModules ,
463+ kymaResource ,
464+ ) ;
563465
564- const deleteAssociatedResources = async ( ) => {
565- try {
566- await Promise . all (
567- forceDeleteUrls . map ( async url => {
568- return await deleteResourceMutation ( url ) ;
569- } ) ,
570- ) ;
571- } catch ( e ) {
572- console . warn ( e ) ;
573- return 'Error while deleting Associated Resources' ;
574- }
575- } ;
466+ setAssociatedResourceLeft ( resourcesLeft ) ;
576467
577- const deleteCrResources = async ( ) => {
578- try {
579- await Promise . all (
580- crUrls . map ( async url => {
581- return await deleteResourceMutation ( url ) ;
582- } ) ,
583- ) ;
584- } catch ( e ) {
585- console . warn ( e ) ;
586- return 'Error while deleting Custom Resource' ;
587- }
588- } ;
468+ // eslint-disable-next-line react-hooks/exhaustive-deps
469+ } , [ resourceCounts ] ) ;
589470
590471 return (
591472 < React . Fragment key = "modules-list" >
592473 { ! detailsOpen &&
593474 createPortal (
594475 < DeleteMessageBox
595476 disableDeleteButton = {
596- checkIfAssociatedResourceLeft ( ) ? ! allowForceDelete : false
477+ associatedResourceLeft ? ! allowForceDelete : false
597478 }
598479 customDeleteText = {
599- checkIfAssociatedResourceLeft ( ) && allowForceDelete
480+ associatedResourceLeft && allowForceDelete
600481 ? 'common.buttons.force-delete'
601482 : null
602483 }
@@ -611,7 +492,12 @@ export default function KymaModulesList({
611492 name : selectedModules [ chosenModuleIndex ] ?. name ,
612493 } ) }
613494 </ Text >
614- { getAssociatedResources ( ) . length > 0 && (
495+ { getAssociatedResources (
496+ chosenModuleIndex ,
497+ findModuleTemplate ,
498+ selectedModules ,
499+ kymaResource ,
500+ ) . length > 0 && (
615501 < >
616502 < MessageStrip design = "Critical" hideCloseButton >
617503 { t ( 'kyma-modules.associated-resources-warning' ) }
@@ -621,7 +507,12 @@ export default function KymaModulesList({
621507 mode = "None"
622508 separators = "All"
623509 >
624- { getAssociatedResources ( ) . map ( assResource => {
510+ { getAssociatedResources (
511+ chosenModuleIndex ,
512+ findModuleTemplate ,
513+ selectedModules ,
514+ kymaResource ,
515+ ) . map ( assResource => {
625516 const resourceCount =
626517 resourceCounts [
627518 `${ assResource . kind } -${ assResource . group } -${ assResource . version } `
@@ -635,6 +526,10 @@ export default function KymaModulesList({
635526 assResource . kind ,
636527 assResource . group ,
637528 assResource . version ,
529+ clusterUrl ,
530+ getScope ,
531+ namespaceUrl ,
532+ navigate ,
638533 ) ;
639534 } }
640535 type = "Active"
@@ -649,7 +544,7 @@ export default function KymaModulesList({
649544 ) ;
650545 } ) }
651546 </ List >
652- { checkIfAssociatedResourceLeft ( ) && (
547+ { associatedResourceLeft && (
653548 < CheckBox
654549 checked = { allowForceDelete }
655550 onChange = { ( ) =>
@@ -666,7 +561,10 @@ export default function KymaModulesList({
666561 resourceTitle = { selectedModules [ chosenModuleIndex ] ?. name }
667562 deleteFn = { ( ) => {
668563 if ( allowForceDelete && forceDeleteUrls . length > 0 ) {
669- deleteAssociatedResources ( ) ;
564+ deleteAssociatedResources (
565+ deleteResourceMutation ,
566+ forceDeleteUrls ,
567+ ) ;
670568 }
671569 selectedModules . splice ( chosenModuleIndex , 1 ) ;
672570 setKymaResourceState ( {
@@ -679,7 +577,7 @@ export default function KymaModulesList({
679577 handleModuleUninstall ( ) ;
680578 setInitialUnchangedResource ( cloneDeep ( kymaResourceState ) ) ;
681579 if ( allowForceDelete && forceDeleteUrls . length > 0 ) {
682- deleteCrResources ( ) ;
580+ deleteCrResources ( deleteResourceMutation , crUrls ) ;
683581 }
684582 } }
685583 /> ,
0 commit comments