@@ -43,7 +43,7 @@ const TargetList = styled.ul`
43
43
justify-content: center;
44
44
` ;
45
45
46
- const Target = styled . li `
46
+ const TargetItem = styled . li `
47
47
margin-bottom: -10px;
48
48
padding: 10px;
49
49
@@ -90,6 +90,13 @@ const TargetText = styled.span<{ ellipseDirection: 'left' | 'right' }>`
90
90
: '' }
91
91
` ;
92
92
93
+ // Spacer - used to consistently center align the name despite the icons appearing
94
+ // on the left e.g. on activating/active.
95
+ const IconSpacer = styled . div `
96
+ flex-basis: 25px;
97
+ flex-shrink: 999;
98
+ ` ;
99
+
93
100
type TargetItem = {
94
101
id : string ,
95
102
title : string ,
@@ -125,31 +132,55 @@ export class InterceptionTargetList extends React.Component<{
125
132
126
133
return < ListScrollContainer className = { className } >
127
134
< TargetList >
128
- { _ . map ( targets , ( target : TargetItem ) => < Target key = { target . id } >
129
- < TargetButton
130
- title = { target . title }
131
- state = { target . status }
132
- disabled = { target . status !== 'available' }
133
- onClick = { target . status === 'available'
134
- ? ( ) => interceptTarget ( target . id )
135
- : _ . noop
136
- }
137
- >
138
- {
139
- target . status === 'activating'
140
- ? < Icon icon = { [ 'fas' , 'spinner' ] } spin />
141
- : target . status === 'active'
142
- ? < Icon icon = { [ 'fas' , 'check' ] } />
143
- : target . icon
144
- ? target . icon
145
- : null
146
- }
147
- < TargetText ellipseDirection = { ellipseDirection } >
148
- { target . content }
149
- </ TargetText >
150
- </ TargetButton >
151
- </ Target > ) }
135
+ { _ . map ( targets , ( target ) =>
136
+ < Target
137
+ key = { target . id }
138
+ target = { target }
139
+ interceptTarget = { interceptTarget }
140
+ ellipseDirection = { ellipseDirection }
141
+ />
142
+ ) }
152
143
</ TargetList >
153
144
</ ListScrollContainer > ;
154
145
}
155
- }
146
+ }
147
+
148
+ const Target = ( props : {
149
+ target : TargetItem ,
150
+ interceptTarget : ( id : string ) => void ,
151
+ ellipseDirection : 'left' | 'right'
152
+ } ) => {
153
+ const {
154
+ target,
155
+ interceptTarget,
156
+ ellipseDirection
157
+ } = props ;
158
+
159
+ const icon = target . status === 'activating'
160
+ ? < Icon icon = { [ 'fas' , 'spinner' ] } spin />
161
+ : target . status === 'active'
162
+ ? < Icon icon = { [ 'fas' , 'check' ] } />
163
+ : target . icon
164
+ ? target . icon
165
+ : null ;
166
+
167
+ return < TargetItem >
168
+ < TargetButton
169
+ title = { target . title }
170
+ state = { target . status }
171
+ disabled = { target . status !== 'available' }
172
+ onClick = { target . status === 'available'
173
+ ? ( ) => interceptTarget ( target . id )
174
+ : _ . noop
175
+ }
176
+ >
177
+ { icon }
178
+
179
+ < TargetText ellipseDirection = { ellipseDirection } >
180
+ { target . content }
181
+ </ TargetText >
182
+
183
+ { icon !== null ? < IconSpacer /> : null }
184
+ </ TargetButton >
185
+ </ TargetItem > ;
186
+ } ;
0 commit comments