>(new Set());
// Toggle visibility function
const toggleItemVisibility = (itemId: string) => {
const wasHidden = hiddenItems.has(itemId);
setHiddenItems(prev => {
const newSet = new Set(prev);
if (newSet.has(itemId)) {
newSet.delete(itemId);
} else {
newSet.add(itemId);
}
return newSet;
});
// If hiding an expanded item, collapse it
if (!wasHidden && expandedItems.has(itemId)) {
setExpandedItems(prev => {
const newSet = new Set(prev);
newSet.delete(itemId);
return newSet;
});
}
};
// Delete item function
const deleteItem = (itemId: string) => {
const itemsToDelete = [itemId, ...getAllChildrenIds(itemId, logData)];
setDeletedItems(prev => {
const newSet = new Set(prev);
itemsToDelete.forEach(id => newSet.add(id));
return newSet;
});
setHiddenItems(prev => {
const newSet = new Set(prev);
itemsToDelete.forEach(id => newSet.delete(id));
return newSet;
});
setExpandedItems(prev => {
const newSet = new Set(prev);
itemsToDelete.forEach(id => newSet.delete(id));
return newSet;
});
};
// Create actions for each item
const createActions = (itemId: string, isDirectlyHidden: boolean, isIndirectlyHiddenItem: boolean, isHovered: boolean) => {
const visibilityButton = (
);
const deleteButton = (
);
return (
{isHovered && deleteButton}
{visibilityButton}
);
};
// Process log data with actions and visibility states
const processedLogData = useMemo(() => {
return logData
.filter(item => !deletedItems.has(item.id))
.map(item => {
const isDirectlyHidden = hiddenItems.has(item.id);
const isIndirectlyHiddenItem = isIndirectlyHidden(item.id, hiddenItems, logData);
const isItemHidden = isDirectlyHidden || isIndirectlyHiddenItem;
const isHovered = hoveredId === item.id;
return {
...item,
actions: createActions(item.id, isDirectlyHidden, isIndirectlyHiddenItem, isHovered),
disable: isItemHidden,
isSelectable: !isItemHidden,
};
});
}, [logData, deletedItems, hiddenItems, hoveredId]);
return (
);
```