1+ /* eslint-disable camelcase */
12import URI from 'urijs' ;
23import { get } from 'lodash' ;
4+ import { createSelector } from 'reselect' ;
35import {
46 selectAPIResponse ,
57 selectAPIStatus ,
@@ -17,8 +19,12 @@ import {
1719 JOB_API_KEY ,
1820} from './JobWizardConstants' ;
1921
22+ /** Stable fallbacks so useSelector does not see a new reference every run */
23+ const EMPTY_ARRAY = [ ] ;
24+ const EMPTY_OBJECT = { } ;
25+
2026export const selectRerunJobInvocationResponse = state =>
21- selectAPIResponse ( state , JOB_API_KEY ) || { } ;
27+ selectAPIResponse ( state , JOB_API_KEY ) || EMPTY_OBJECT ;
2228
2329export const selectRerunJobInvocationStatus = state =>
2430 selectAPIStatus ( state , JOB_API_KEY ) ;
@@ -27,19 +33,26 @@ export const selectJobTemplatesStatus = state =>
2733 selectAPIStatus ( state , JOB_TEMPLATES ) ;
2834
2935export const filterJobTemplates = templates =>
30- templates ?. filter ( template => ! template . snippet ) || [ ] ;
36+ templates ?. filter ( template => ! template . snippet ) || EMPTY_ARRAY ;
37+
38+ const selectJobTemplatesResults = state =>
39+ selectAPIResponse ( state , JOB_TEMPLATES ) ?. results ;
3140
32- export const selectJobTemplates = state =>
33- filterJobTemplates ( selectAPIResponse ( state , JOB_TEMPLATES ) ?. results ) ;
41+ export const selectJobTemplates = createSelector (
42+ [ selectJobTemplatesResults ] ,
43+ results => filterJobTemplates ( results )
44+ ) ;
3445
3546export const selectJobTemplatesSearch = state =>
3647 selectAPIResponse ( state , JOB_TEMPLATES ) ?. search ;
3748
3849export const selectJobCategoriesResponse = state =>
39- selectAPIResponse ( state , JOB_CATEGORIES ) || { } ;
50+ selectAPIResponse ( state , JOB_CATEGORIES ) || EMPTY_OBJECT ;
4051
41- export const selectJobCategories = state =>
42- selectJobCategoriesResponse ( state ) . job_categories || [ ] ;
52+ export const selectJobCategories = state => {
53+ const { job_categories : jobCategories } = selectJobCategoriesResponse ( state ) ;
54+ return jobCategories || EMPTY_ARRAY ;
55+ } ;
4356
4457export const selectWithKatello = state =>
4558 selectJobCategoriesResponse ( state ) . with_katello || false ;
@@ -58,7 +71,7 @@ export const selectJobCategoriesMissingPermissions = state => {
5871 'data' ,
5972 'error' ,
6073 'missing_permissions' ,
61- ] ) || [ ]
74+ ] ) || EMPTY_ARRAY
6275 ) ;
6376} ;
6477
@@ -75,29 +88,32 @@ export const selectEffectiveUser = state =>
7588 selectAPIResponse ( state , JOB_TEMPLATE ) . effective_user ;
7689
7790export const selectAdvancedTemplateInputs = state =>
78- selectAPIResponse ( state , JOB_TEMPLATE ) . advanced_template_inputs || [ ] ;
91+ selectAPIResponse ( state , JOB_TEMPLATE ) ?. advanced_template_inputs ||
92+ EMPTY_ARRAY ;
7993
8094export const selectTemplateInputs = state =>
81- selectAPIResponse ( state , JOB_TEMPLATE ) . template_inputs || [ ] ;
95+ selectAPIResponse ( state , JOB_TEMPLATE ) ? .template_inputs || EMPTY_ARRAY ;
8296
8397export const selectHostsResponse = state => selectAPIResponse ( state , HOSTS_API ) ;
8498
8599export const selectHostCount = state =>
86100 selectHostsResponse ( state ) . subtotal || 0 ;
87101
88- export const selectHosts = state => {
89- const hosts = selectHostsResponse ( state ) . results || [ ] ;
102+ const selectHostsResults = state => selectHostsResponse ( state ) . results ;
103+
104+ export const selectHosts = createSelector ( [ selectHostsResults ] , results => {
105+ const hosts = results || EMPTY_ARRAY ;
90106 return hosts . map ( host => ( {
91107 name : host . name ,
92108 display_name : host . display_name ,
93109 } ) ) ;
94- } ;
110+ } ) ;
95111
96112export const selectHostsMissingPermissions = state => {
97113 const hostsResponse = selectHostsResponse ( state ) ;
98114 return (
99115 get ( hostsResponse , [ 'response' , 'data' , 'error' , 'missing_permissions' ] ) ||
100- [ ]
116+ EMPTY_ARRAY
101117 ) ;
102118} ;
103119
@@ -115,6 +131,6 @@ export const selectIsSubmitting = state =>
115131 selectAPIStatus ( state , JOB_INVOCATION ) === STATUS . RESOLVED ;
116132
117133export const selectRouterSearch = state => {
118- const { search } = selectRouterLocation ( state ) ;
134+ const { search } = selectRouterLocation ( state ) || { } ;
119135 return URI . parseQuery ( search ) ;
120136} ;
0 commit comments