Skip to content

Commit fa3f33f

Browse files
committed
Center intercept list item text regardless of icons
This ensures that in most cases they don't jump around when adding a spinner etc. There is still a jump if the content is wider than the item (ellipsised) since we then expand into the spacer as required.
1 parent d266388 commit fa3f33f

File tree

1 file changed

+57
-26
lines changed

1 file changed

+57
-26
lines changed

src/components/intercept/config/intercept-target-list.tsx

Lines changed: 57 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ const TargetList = styled.ul`
4343
justify-content: center;
4444
`;
4545

46-
const Target = styled.li`
46+
const TargetItem = styled.li`
4747
margin-bottom: -10px;
4848
padding: 10px;
4949
@@ -90,6 +90,13 @@ const TargetText = styled.span<{ ellipseDirection: 'left' | 'right' }>`
9090
: ''}
9191
`;
9292

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+
93100
type TargetItem = {
94101
id: string,
95102
title: string,
@@ -125,31 +132,55 @@ export class InterceptionTargetList extends React.Component<{
125132

126133
return <ListScrollContainer className={className}>
127134
<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+
) }
152143
</TargetList>
153144
</ListScrollContainer>;
154145
}
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

Comments
 (0)