/claim #10283 --------- Co-authored-by: Félix Malfait <felix@twenty.com> Co-authored-by: Félix Malfait <felix.malfait@gmail.com>
115 lines
4.4 KiB
TypeScript
115 lines
4.4 KiB
TypeScript
import { AdvancedSettingsWrapper } from '@/settings/components/AdvancedSettingsWrapper';
|
|
import { SettingsNavigationDrawerItem } from '@/settings/components/SettingsNavigationDrawerItem';
|
|
import {
|
|
SettingsNavigationItem,
|
|
SettingsNavigationSection,
|
|
useSettingsNavigationItems,
|
|
} from '@/settings/hooks/useSettingsNavigationItems';
|
|
import { NavigationDrawerItemGroup } from '@/ui/navigation/navigation-drawer/components/NavigationDrawerItemGroup';
|
|
import { NavigationDrawerSection } from '@/ui/navigation/navigation-drawer/components/NavigationDrawerSection';
|
|
import { NavigationDrawerSectionTitle } from '@/ui/navigation/navigation-drawer/components/NavigationDrawerSectionTitle';
|
|
import { getNavigationSubItemLeftAdornment } from '@/ui/navigation/navigation-drawer/utils/getNavigationSubItemLeftAdornment';
|
|
import { matchPath, resolvePath, useLocation } from 'react-router-dom';
|
|
import { getSettingsPath } from '~/utils/navigation/getSettingsPath';
|
|
|
|
export const SettingsNavigationDrawerItems = () => {
|
|
const settingsNavigationItems: SettingsNavigationSection[] =
|
|
useSettingsNavigationItems();
|
|
|
|
const currentPathName = useLocation().pathname;
|
|
|
|
const getSelectedIndexForSubItems = (subItems: SettingsNavigationItem[]) => {
|
|
return subItems.findIndex((subItem) => {
|
|
const href = subItem.path ? getSettingsPath(subItem.path) : '';
|
|
const pathName = resolvePath(href).pathname;
|
|
|
|
return matchPath(
|
|
{
|
|
path: pathName,
|
|
end: subItem.matchSubPages === false,
|
|
},
|
|
currentPathName,
|
|
);
|
|
});
|
|
};
|
|
|
|
return (
|
|
<>
|
|
{settingsNavigationItems.map((section) => {
|
|
const allItemsHidden = section.items.every((item) => item.isHidden);
|
|
if (allItemsHidden) {
|
|
return null;
|
|
}
|
|
|
|
return (
|
|
<NavigationDrawerSection key={section.label}>
|
|
{section.isAdvanced ? (
|
|
<AdvancedSettingsWrapper hideIcon>
|
|
<NavigationDrawerSectionTitle label={section.label} />
|
|
</AdvancedSettingsWrapper>
|
|
) : (
|
|
<NavigationDrawerSectionTitle label={section.label} />
|
|
)}
|
|
{section.items.map((item, index) => {
|
|
const subItems = item.subItems;
|
|
if (Array.isArray(subItems) && subItems.length > 0) {
|
|
const selectedSubItemIndex =
|
|
getSelectedIndexForSubItems(subItems);
|
|
|
|
return (
|
|
<NavigationDrawerItemGroup
|
|
key={item.path || `group-${index}`}
|
|
>
|
|
<SettingsNavigationDrawerItem
|
|
item={item}
|
|
subItemState={
|
|
item.indentationLevel
|
|
? getNavigationSubItemLeftAdornment({
|
|
arrayLength: section.items.length,
|
|
index,
|
|
selectedIndex: selectedSubItemIndex,
|
|
})
|
|
: undefined
|
|
}
|
|
/>
|
|
{subItems.map((subItem, subIndex) => (
|
|
<SettingsNavigationDrawerItem
|
|
key={subItem.path || `subitem-${subIndex}`}
|
|
item={subItem}
|
|
subItemState={
|
|
subItem.indentationLevel
|
|
? getNavigationSubItemLeftAdornment({
|
|
arrayLength: subItems.length,
|
|
index: subIndex,
|
|
selectedIndex: selectedSubItemIndex,
|
|
})
|
|
: undefined
|
|
}
|
|
/>
|
|
))}
|
|
</NavigationDrawerItemGroup>
|
|
);
|
|
}
|
|
return (
|
|
<SettingsNavigationDrawerItem
|
|
key={item.path || `item-${index}`}
|
|
item={item}
|
|
subItemState={
|
|
item.indentationLevel
|
|
? getNavigationSubItemLeftAdornment({
|
|
arrayLength: section.items.length,
|
|
index,
|
|
selectedIndex: index,
|
|
})
|
|
: undefined
|
|
}
|
|
/>
|
|
);
|
|
})}
|
|
</NavigationDrawerSection>
|
|
);
|
|
})}
|
|
</>
|
|
);
|
|
};
|