Skip to content

Commit 1b0d3e4

Browse files
milan-wd-koppenhagen
authored andcommitted
fix: add event listener guard
1 parent 97aaa0a commit 1b0d3e4

File tree

3 files changed

+29
-30
lines changed

3 files changed

+29
-30
lines changed

packages/components/src/components/tab-item/model.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ export type DBTabItemProps = GlobalProps &
4949

5050
export type DBTabItemDefaultState = {
5151
_selected: boolean;
52+
_listenerAdded: boolean;
5253
};
5354

5455
export type DBTabItemState = DBTabItemDefaultState &

packages/components/src/components/tab-item/tab-item.lite.tsx

Lines changed: 11 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ export default function DBTabItem(props: DBTabItemProps) {
4545
_selected: false,
4646
_name: undefined,
4747
initialized: false,
48+
_listenerAdded: false,
4849
handleNameAttribute: () => {
4950
if (_ref) {
5051
const setAttribute = _ref.setAttribute;
@@ -62,17 +63,6 @@ export default function DBTabItem(props: DBTabItemProps) {
6263
props.onChange(event);
6364
}
6465

65-
if (_ref.checked && !state._selected) {
66-
useTarget({
67-
stencil: () => {
68-
state._selected = getBooleanAsString(true);
69-
},
70-
default: () => {
71-
state._selected = true;
72-
}
73-
});
74-
}
75-
7666
useTarget({
7767
angular: () =>
7868
handleFrameworkEventAngular(state, event, 'checked'),
@@ -92,12 +82,15 @@ export default function DBTabItem(props: DBTabItemProps) {
9282
state.initialized = false;
9383

9484
// deselect this tab when another tab in tablist is selected
95-
_ref.closest('[role=tablist]')?.addEventListener(
96-
'change',
97-
setSelectedOnChange
98-
);
85+
if (!state._listenerAdded) {
86+
_ref.closest('[role=tablist]')?.addEventListener(
87+
'change',
88+
setSelectedOnChange
89+
);
90+
state._listenerAdded = true;
91+
}
9992

100-
if (props.active) {
93+
if (props.active || _ref.checked) {
10194
useTarget({
10295
stencil: () => {
10396
state._selected = getBooleanAsString(true);
@@ -118,11 +111,12 @@ export default function DBTabItem(props: DBTabItemProps) {
118111
}, [props.name]);
119112

120113
onUnMount(() => {
121-
if (state.initialized && _ref) {
114+
if (state._listenerAdded && _ref) {
122115
_ref.closest('[role=tablist]')?.removeEventListener(
123116
'change',
124117
setSelectedOnChange
125118
);
119+
state._listenerAdded = false;
126120
}
127121
});
128122

packages/components/src/components/tabs/tabs.spec.tsx

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8,23 +8,27 @@ import { DBTabItem } from '../tab-item';
88
import { DBTabList } from '../tab-list';
99
import { DBTabPanel } from '../tab-panel';
1010

11-
let tabIndex: number;
11+
let tabIndex: number | undefined;
12+
let comp: any;
1213

13-
const comp: any = (
14-
<DBTabs onIndexChange={(index: number) => (tabIndex = index)}>
15-
<DBTabList>
16-
<DBTabItem data-testid="test">Test 1</DBTabItem>
17-
<DBTabItem data-testid="test2">Test 2</DBTabItem>
18-
<DBTabItem>Test 3</DBTabItem>
19-
</DBTabList>
14+
test.beforeEach(() => {
15+
tabIndex = undefined;
16+
comp = (
17+
<DBTabs onIndexChange={(index: number) => (tabIndex = index)}>
18+
<DBTabList>
19+
<DBTabItem data-testid="test">Test 1</DBTabItem>
20+
<DBTabItem data-testid="test2">Test 2</DBTabItem>
21+
<DBTabItem>Test 3</DBTabItem>
22+
</DBTabList>
2023

21-
<DBTabPanel>TestPanel 1</DBTabPanel>
24+
<DBTabPanel>TestPanel 1</DBTabPanel>
2225

23-
<DBTabPanel>TestPanel 2</DBTabPanel>
26+
<DBTabPanel>TestPanel 2</DBTabPanel>
2427

25-
<DBTabPanel>TestPanel 3</DBTabPanel>
26-
</DBTabs>
27-
);
28+
<DBTabPanel>TestPanel 3</DBTabPanel>
29+
</DBTabs>
30+
);
31+
});
2832

2933
const testComponent = () => {
3034
test('should contain text', async ({ mount }) => {

0 commit comments

Comments
 (0)