Skip to content

Commit

Permalink
[Discover] Move actions to utils
Browse files Browse the repository at this point in the history
  • Loading branch information
jughosta committed Mar 4, 2025
1 parent ef0a8ab commit b6ae8da
Show file tree
Hide file tree
Showing 2 changed files with 62 additions and 21 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import { htmlIdGenerator, EuiFlexGroup, EuiFlexItem } from '@elastic/eui';
import { TabsBar } from '../tabs_bar';
import { getTabAttributes } from '../../utils/get_tab_attributes';
import { getTabMenuActions } from '../../utils/get_tab_menu_actions';
import { addTab, removeTab, selectTab } from '../../utils/manage_tabs';
import { TabItem } from '../../types';

export interface TabbedContentProps {
Expand Down Expand Up @@ -59,39 +60,21 @@ export const TabbedContent: React.FC<TabbedContentProps> = ({

const onSelect = useCallback(
(item: TabItem) => {
changeState((prevState) => ({
...prevState,
selectedItem: item,
}));
changeState((prevState) => selectTab(prevState, item));
},
[changeState]
);

const onClose = useCallback(
(item: TabItem) => {
changeState((prevState) => {
const nextItems = prevState.items.filter((prevItem) => prevItem.id !== item.id);
// TODO: better selection logic
const nextSelectedItem = nextItems.length ? nextItems[nextItems.length - 1] : null;

return {
items: nextItems,
selectedItem:
prevState.selectedItem?.id !== item.id ? prevState.selectedItem : nextSelectedItem,
};
});
changeState((prevState) => removeTab(prevState, item));
},
[changeState]
);

const onAdd = useCallback(() => {
const newItem = createItem();
changeState((prevState) => {
return {
items: [...prevState.items, newItem],
selectedItem: newItem,
};
});
changeState((prevState) => addTab(prevState, newItem));
}, [changeState, createItem]);

const getTabMenuItems = useMemo(() => {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the "Elastic License
* 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side
* Public License v 1"; you may not use this file except in compliance with, at
* your election, the "Elastic License 2.0", the "GNU Affero General Public
* License v3.0 only", or the "Server Side Public License, v 1".
*/

import type { TabItem } from '../types';

interface TabsState {
items: TabItem[];
selectedItem: TabItem | null;
}

export const addTab = ({ items }: TabsState, item: TabItem): TabsState => {
return {
items: [...items, item],
selectedItem: item,
};
};

export const removeTab = ({ items, selectedItem }: TabsState, item: TabItem): TabsState => {
const itemIndex = items.findIndex((i) => i.id === item.id);

if (itemIndex === -1) {
return {
items,
selectedItem,
};
}

const nextItems = [...items];
nextItems.splice(itemIndex, 1);

if (selectedItem?.id !== item.id) {
return {
items: nextItems,
selectedItem,
};
}

const nextSelectedIndex = itemIndex === items.length - 1 ? itemIndex - 1 : itemIndex;
const nextSelectedItem = nextItems[nextSelectedIndex] || null;

return {
items: nextItems,
selectedItem: nextSelectedItem,
};
};

export const selectTab = ({ items, selectedItem }: TabsState, item: TabItem): TabsState => {
return {
items,
selectedItem: items.find((i) => i.id === item.id) || selectedItem,
};
};

0 comments on commit b6ae8da

Please sign in to comment.