import React, { type JSX, useCallback } from 'react'; import Link from 'next/link'; import { pathUtils } from '@growi/core/dist/utils'; import { useTranslation } from 'next-i18next'; import urljoin from 'url-join'; import { useGrowiAppIdForGrowiCloud, useGrowiCloudUri, } from '~/stores-universal/context'; import styles from './AdminNavigation.module.scss'; const moduleClass = styles['admin-navigation']; // eslint-disable-next-line react/prop-types const MenuLabel = ({ menu }: { menu: string }) => { const { t } = useTranslation(['admin', 'commons']); switch (menu) { /* eslint-disable no-multi-spaces, max-len */ case 'app': return ( <> settings {t('headers.app_settings', { ns: 'commons' })} > ); case 'security': return ( <> shield {t('security_settings.security_settings')} > ); case 'markdown': return ( <> note {t('markdown_settings.markdown_settings')} > ); case 'customize': return ( <> construction {t('customize_settings.customize_settings')} > ); case 'importer': return ( <> cloud_upload {t('importer_management.import_data')} > ); case 'export': return ( <> cloud_download {t('export_management.export_archive_data')} > ); case 'data-transfer': return ( <> flight {t('g2g_data_transfer.data_transfer', { ns: 'commons' })} > ); case 'notification': return ( <> notifications {t('external_notification.external_notification')} > ); case 'slack-integration': return ( <> shuffle {t('slack_integration.slack_integration')} > ); case 'slack-integration-legacy': return ( <> shuffle {t('slack_integration_legacy.slack_integration_legacy')} > ); case 'users': return ( <> person {t('user_management.user_management')} > ); case 'user-groups': return ( <> group {t('user_group_management.user_group_management')} > ); case 'audit-log': return ( <> feed {t('audit_log_management.audit_log')} > ); case 'plugins': return ( <> extension {t('plugins.plugins')} > ); // Temporarily hiding // case 'ai-integration': return ( // <>{/* TODO: unify sizing of growi-custom-icons so that simplify code -- 2024.10.09 Yuki Takei */} // // growi_ai // // {t('ai_integration.ai_integration')} // > // ); case 'search': return ( <> search {t('full_text_search_management.full_text_search_management')} > ); case 'cloud': return ( <> share {t('cloud_setting_management.to_cloud_settings')}{' '} > ); default: return ( <> home {t('wiki_management_homepage')} > ); /* eslint-enable no-multi-spaces, max-len */ } }; type MenuLinkProps = { menu: string; isListGroupItems: boolean; isRoot?: boolean; isActive?: boolean; }; const MenuLink = ({ menu, isRoot, isListGroupItems, isActive, }: MenuLinkProps) => { const pageTransitionClassName = isListGroupItems ? 'list-group-item list-group-item-action rounded border-0' : 'dropdown-item px-3 py-2'; const href = isRoot ? '/admin' : urljoin('/admin', menu); return ( ); }; export const AdminNavigation = (): JSX.Element => { const pathname = window.location.pathname; const { data: growiCloudUri } = useGrowiCloudUri(); const { data: growiAppIdForGrowiCloud } = useGrowiAppIdForGrowiCloud(); const isActiveMenu = useCallback( (path: string | string[]) => { const paths = Array.isArray(path) ? path : [path]; return paths.some((path) => { const basisPath = pathUtils.normalizePath(urljoin('/admin', path)); const basisParentPath = pathUtils.addTrailingSlash(basisPath); return pathname === basisPath || pathname.startsWith(basisParentPath); }); }, [pathname], ); const getListGroupItemOrDropdownItemList = useCallback( (isListGroupItems: boolean) => { return ( <> {/* eslint-disable no-multi-spaces */} {/* Temporarily hiding */} {/* */} {growiCloudUri != null && growiAppIdForGrowiCloud != null && ( )} {/* eslint-enable no-multi-spaces */} > ); }, [growiAppIdForGrowiCloud, growiCloudUri, isActiveMenu, pathname], ); return ( {/* List group */} {getListGroupItemOrDropdownItemList(true)} {/* Dropdown */} {/* eslint-disable no-multi-spaces */} {pathname === '/admin' && } {isActiveMenu('/app') && } {isActiveMenu('/security') && } {isActiveMenu('/markdown') && } {isActiveMenu('/customize') && } {isActiveMenu('/importer') && } {isActiveMenu('/export') && } {isActiveMenu(['/notification', '/global-notification']) && ( )} {isActiveMenu('/slack-integration') && ( )} {isActiveMenu('/users') && } {isActiveMenu(['/user-groups', 'user-group-detail']) && ( )} {isActiveMenu('/search') && } {isActiveMenu('/audit-log') && } {isActiveMenu('/plugins') && } {isActiveMenu('/data-transfer') && ( )} {/* Temporarily hiding */} {/* {isActiveMenu('/ai-integration') && } */} {/* eslint-enable no-multi-spaces */} {getListGroupItemOrDropdownItemList(false)} ); };