diff --git a/src/app/(auth)/privacyPolicy/page.tsx b/src/app/(auth)/privacyPolicy/page.tsx index ce56e11..6be8fd0 100644 --- a/src/app/(auth)/privacyPolicy/page.tsx +++ b/src/app/(auth)/privacyPolicy/page.tsx @@ -1,7 +1,7 @@ 'use client' -import PrivacyPolicy from '@/docs/privacyPolicy.mdx' +import PrivacyPolicy from './privacyPolicy.mdx' -export default function CollectPage() { +export default function PrivacyPolicyPage() { return ( ) diff --git a/src/docs/privacyPolicy.mdx b/src/app/(auth)/privacyPolicy/privacyPolicy.mdx similarity index 95% rename from src/docs/privacyPolicy.mdx rename to src/app/(auth)/privacyPolicy/privacyPolicy.mdx index d49516d..df9de41 100644 --- a/src/docs/privacyPolicy.mdx +++ b/src/app/(auth)/privacyPolicy/privacyPolicy.mdx @@ -1,5 +1,5 @@ # 隐私政策 -神龙HTTP(以下或简称“我们”)尊重并保护用户信息,并将以高度的责任感和谨慎的态度对待这些信息。当您使用神龙HTTP提供的代理服务时,我们将根据本隐私政策来收集、处理及分享您的信息。我们希望通过本隐私政策向您清晰地说明我们如何处理您的信息。因此,我们建议您完整阅读本隐私政策,以便了解如何保护您的隐私权。如果您有任何疑问、意见或建议,可以通过神龙HTTP提供的联系方式与我们联系。本政策将帮助您了解以下内容: +神龙HTTP(以下或简称"我们")尊重并保护用户信息,并将以高度的责任感和谨慎的态度对待这些信息。当您使用神龙HTTP提供的代理服务时,我们将根据本隐私政策来收集、处理及分享您的信息。我们希望通过本隐私政策向您清晰地说明我们如何处理您的信息。因此,我们建议您完整阅读本隐私政策,以便了解如何保护您的隐私权。如果您有任何疑问、意见或建议,可以通过神龙HTTP提供的联系方式与我们联系。本政策将帮助您了解以下内容: 一、适用范围 @@ -163,4 +163,4 @@ 9.4.5 我们负责处理用户信息安全的责任部门、联络方式及投诉渠道发生变化时; -9.4.6 用户信息安全影响评估报告表明存在高风险时。 \ No newline at end of file +9.4.6 用户信息安全影响评估报告表明存在高风险时。 diff --git a/src/app/(auth)/userAgreement/page.tsx b/src/app/(auth)/userAgreement/page.tsx index 2844b87..49cc558 100644 --- a/src/app/(auth)/userAgreement/page.tsx +++ b/src/app/(auth)/userAgreement/page.tsx @@ -1,7 +1,7 @@ 'use client' -import UserAgreement from '@/docs/userAgreement.mdx' +import UserAgreement from './userAgreement.mdx' -export default function CollectPage() { +export default function UserAgreementPage() { return ( ) diff --git a/src/docs/userAgreement.mdx b/src/app/(auth)/userAgreement/userAgreement.mdx similarity index 95% rename from src/docs/userAgreement.mdx rename to src/app/(auth)/userAgreement/userAgreement.mdx index b93e9b1..996438d 100644 --- a/src/docs/userAgreement.mdx +++ b/src/app/(auth)/userAgreement/userAgreement.mdx @@ -1,5 +1,5 @@ # 用户协议 -神龙HTTP(以下或简称“我们”)尊重并保护用户信息,并将以高度的责任感和谨慎的态度对待这些信息。当您使用神龙HTTP提供的代理服务时,我们将根据本隐私政策来收集、处理及分享您的信息。我们希望通过本隐私政策向您清晰地说明我们如何处理您的信息。因此,我们建议您完整阅读本隐私政策,以便了解如何保护您的隐私权。如果您有任何疑问、意见或建议,可以通过神龙HTTP提供的联系方式与我们联系。本政策将帮助您了解以下内容: +神龙HTTP(以下或简称"我们")尊重并保护用户信息,并将以高度的责任感和谨慎的态度对待这些信息。当您使用神龙HTTP提供的代理服务时,我们将根据本隐私政策来收集、处理及分享您的信息。我们希望通过本隐私政策向您清晰地说明我们如何处理您的信息。因此,我们建议您完整阅读本隐私政策,以便了解如何保护您的隐私权。如果您有任何疑问、意见或建议,可以通过神龙HTTP提供的联系方式与我们联系。本政策将帮助您了解以下内容: 一、适用范围 @@ -163,4 +163,4 @@ 9.4.5 我们负责处理用户信息安全的责任部门、联络方式及投诉渠道发生变化时; -9.4.6 用户信息安全影响评估报告表明存在高风险时。 \ No newline at end of file +9.4.6 用户信息安全影响评估报告表明存在高风险时。 diff --git a/src/docs/android-proxy.mdx b/src/app/(home)/docs/android-proxy/page.mdx similarity index 58% rename from src/docs/android-proxy.mdx rename to src/app/(home)/docs/android-proxy/page.mdx index 1c0f725..c5389bc 100644 --- a/src/docs/android-proxy.mdx +++ b/src/app/(home)/docs/android-proxy/page.mdx @@ -4,6 +4,6 @@ 2、选择已连接的WIFI网络,点小箭头进入设置页面 -3、将代理设置为“手动”,填写主机名,端口信息,点击右上角保存 +3、将代理设置为"手动",填写主机名,端口信息,点击右上角保存 -4、打开手机浏览器搜索IP地址查询,若查询结果和设置的代理IP一致,则代理设置成功 \ No newline at end of file +4、打开手机浏览器搜索IP地址查询,若查询结果和设置的代理IP一致,则代理设置成功 diff --git a/src/docs/browser-proxy.mdx b/src/app/(home)/docs/browser-proxy/page.mdx similarity index 98% rename from src/docs/browser-proxy.mdx rename to src/app/(home)/docs/browser-proxy/page.mdx index 5848b5f..2d18fc8 100644 --- a/src/docs/browser-proxy.mdx +++ b/src/app/(home)/docs/browser-proxy/page.mdx @@ -39,4 +39,5 @@ 服务器地址: 110.123.45.67 # 替换为实际IP 端口号: 8080 # 替换为实际端口 使用范围: 当前IE浏览器 -立即生效: 是 \ No newline at end of file +立即生效: 是 +``` diff --git a/src/docs/faq-billing.mdx b/src/app/(home)/docs/faq-billing/page.mdx similarity index 100% rename from src/docs/faq-billing.mdx rename to src/app/(home)/docs/faq-billing/page.mdx diff --git a/src/docs/faq-general.mdx b/src/app/(home)/docs/faq-general/page.mdx similarity index 99% rename from src/docs/faq-general.mdx rename to src/app/(home)/docs/faq-general/page.mdx index c17475f..b0961c9 100644 --- a/src/docs/faq-general.mdx +++ b/src/app/(home)/docs/faq-general/page.mdx @@ -1,6 +1,5 @@ # 常见问题(总览) - > 本文介绍如何在Firefox中配置静态和动态代理IP ## 静态代理配置 @@ -19,3 +18,4 @@ "SOCKS主机": "45.76.123.89", "端口": "1080" } +``` diff --git a/src/docs/firefox-proxy.mdx b/src/app/(home)/docs/firefox-proxy/page.mdx similarity index 95% rename from src/docs/firefox-proxy.mdx rename to src/app/(home)/docs/firefox-proxy/page.mdx index 8a8c909..d544d12 100644 --- a/src/docs/firefox-proxy.mdx +++ b/src/app/(home)/docs/firefox-proxy/page.mdx @@ -1,4 +1,4 @@ -# Firefox 设置 HTTP/Socks5 代理 +# Firefox 设置 HTTP/Socks5 代理 Firefox 提供了多种代理设置方式,支持 HTTP/HTTPS 和 SOCKS5 协议。本教程将详细介绍各种配置方法。 @@ -25,3 +25,4 @@ Firefox 提供了多种代理设置方式,支持 HTTP/HTTPS 和 SOCKS5 协议 about:preferences#general // 或直接 about:preferences +``` diff --git a/src/docs/fixed-package.mdx b/src/app/(home)/docs/fixed-package/page.mdx similarity index 94% rename from src/docs/fixed-package.mdx rename to src/app/(home)/docs/fixed-package/page.mdx index b9478c6..a821cc6 100644 --- a/src/docs/fixed-package.mdx +++ b/src/app/(home)/docs/fixed-package/page.mdx @@ -6,4 +6,4 @@ 三、打开电脑设置中的【代理服务器配置】,输入您的套餐中的IP地址&端口号并点击保存 -四、打开游览器,输入账号&密码即可连接成功;查询本机IP地址,即可看到 \ No newline at end of file +四、打开游览器,输入账号&密码即可连接成功;查询本机IP地址,即可看到 diff --git a/src/docs/http-notes.mdx b/src/app/(home)/docs/http-notes/page.mdx similarity index 100% rename from src/docs/http-notes.mdx rename to src/app/(home)/docs/http-notes/page.mdx diff --git a/src/docs/ios-proxy.mdx b/src/app/(home)/docs/ios-proxy/page.mdx similarity index 97% rename from src/docs/ios-proxy.mdx rename to src/app/(home)/docs/ios-proxy/page.mdx index 0f649e2..0f01c4e 100644 --- a/src/docs/ios-proxy.mdx +++ b/src/app/(home)/docs/ios-proxy/page.mdx @@ -1,6 +1,9 @@ # iOS 设置代理教程 + 本教程详细指导您在 iPhone 和 iPad 上配置代理服务器的完整步骤。 -# 开始前的准备 + +## 开始前的准备 + 在开始配置前,请确保您已获得以下信息: - **代理服务器地址**(如:proxy.example.com 或 192.168.1.100) - **端口号**(如:8080、8888) @@ -21,6 +24,7 @@ 3. 默认状态为 **"关闭"** ### 第三步:选择代理模式 + 点击"配置代理",您会看到三种选项: ```yaml @@ -28,3 +32,4 @@ 关闭: 不使用代理 自动: 使用自动配置脚本(.pac文件) 手动: 手动输入代理服务器信息 +``` diff --git a/src/app/(home)/docs/mac-proxy/page.mdx b/src/app/(home)/docs/mac-proxy/page.mdx new file mode 100644 index 0000000..237dcac --- /dev/null +++ b/src/app/(home)/docs/mac-proxy/page.mdx @@ -0,0 +1,37 @@ +# macOS 设置代理教程 + +本教程详细指导您在 macOS 上配置代理服务器的完整步骤。 + +## 开始前的准备 + +在开始配置前,请确保您已获得以下信息: +- **代理服务器地址**(如:proxy.example.com 或 192.168.1.100) +- **端口号**(如:8080、8888) +- 如需认证:**用户名和密码** +- 企业网络可能需要的 **自动配置脚本 URL** + +## 📱 Wi-Fi 网络代理设置(主要方式) + +### 第一步:进入网络设置 +1. 打开 **"系统设置"** 应用 +2. 点击 **"网络"** 或 **"Wi-Fi"** +3. 确保已连接到需要设置代理的 Wi-Fi 网络 +4. 点击 **"详情"** 或 **"高级"** + +### 第二步:找到代理配置选项 +1. 在网络详细信息页面中找到 **"代理"** 选项 +2. 默认状态为 **"关闭"** + +### 第三步:选择代理模式 + +点击"配置代理",您会看到几种选项: + +```yaml +# 模式选择说明 +关闭: 不使用代理 +自动代理发现: 自动发现代理 +自动代理配置: 使用自动配置脚本(.pac文件) +网页代理(HTTP): 手动配置 HTTP 代理 +安全网页代理(HTTPS): 手动配置 HTTPS 代理 +SOCKS代理: 手动配置 SOCKS 代理 +``` diff --git a/src/docs/news-announce.mdx b/src/app/(home)/docs/news-announce/page.mdx similarity index 100% rename from src/docs/news-announce.mdx rename to src/app/(home)/docs/news-announce/page.mdx diff --git a/src/docs/news-latest.mdx b/src/app/(home)/docs/news-latest/page.mdx similarity index 90% rename from src/docs/news-latest.mdx rename to src/app/(home)/docs/news-latest/page.mdx index 8d7df81..2d6e7a3 100644 --- a/src/docs/news-latest.mdx +++ b/src/app/(home)/docs/news-latest/page.mdx @@ -2,23 +2,26 @@ 在网络通信中,代理服务器是一个重要的中间实体,充当了客户端和目标服务器之间的中转站。它既能够提供安全性和隐私保护,又能够改善网络性能和访问控制。那么,究竟代理服务器是如何工作的呢?接下来就让我们一起深入了解。 -1. 缓存和性能优化 +## 代理服务器的作用 + +1. **缓存和性能优化** + 代理服务器可以缓存已经请求过的资源,例如网页、图片和视频等,这样当其他客户端再次请求同样的资源时,代理服务器可以直接返回缓存中的副本,从而减少了向目标服务器发起请求的次数,提高了整体的访问速度和响应效率。 -2. 访问控制和过滤 +2. **访问控制和过滤** 通过代理服务器,管理员可以限制特定用户或IP地址的访问权限。代理服务器可以设置访问规则,如阻止特定的URL、域名或协议,或者需要用户进行身份验证才能访问特定资源。这对于企业内部网络安全管理和家庭网络控制都非常有用。 -3. 隐私保护和匿名访问 +3. **隐私保护和匿名访问** 代理服务器可以帮助用户隐藏真实的IP地址,提供匿名访问互联网的功能。在使用代理服务器时,用户的所有请求都会经过代理服务器转发,目标服务器无法直接获取到用户的真实身份信息,从而保护了用户的隐私。 -配置代理服务器的方法 +## 配置代理服务器的方法 -1. 客户端配置 +1. **客户端配置** 在大多数操作系统中,配置代理服务器的方法都相对简单。首先,打开网络设置选项,并找到代理服务器的设置项。根据你的需求,选择手动配置代理或者自动获取代理设置。如果你知道代理服务器的IP地址和端口号,将其填入相应的字段中即可。如果你需要身份验证或其他特殊设置,也可以在相应的位置进行配置。 -2. 代理服务器配置 +2. **代理服务器配置** 代理服务器的配置则相对复杂一些,需要一定的网络知识和技术能力。首先,选择一款适合你需求的代理服务器软件,例如常用的Squid、Nginx等。然后,根据软件的文档和指南,按照要求进行安装和基本配置。在进行详细配置时,你可以根据实际需求进行设置,如缓存大小、访问规则、安全认证等。 diff --git a/src/app/(home)/docs/official-tutorial/page.mdx b/src/app/(home)/docs/official-tutorial/page.mdx new file mode 100644 index 0000000..2792391 --- /dev/null +++ b/src/app/(home)/docs/official-tutorial/page.mdx @@ -0,0 +1,11 @@ +# 浏览器设置代理教程 + +打开IE浏览器,选择"设置",点击"Internet选项",在弹出的"局域网LAN设置"中,代理服务器的复选框打上勾,并填写从神龙HTTP获取的ip地址及端口号,点击确定,刷新浏览器,浏览器的IP就改变了。 + +1、打开IE浏览器,选择"设置"; + +2、点击"Internet选项"; + +3、弹出"Internet选项"弹窗,选择连接—局域网设置; + +4、在弹出的"局域网LAN设置"中,代理服务器的复选框打上勾,并填写从神龙HTTP代理获取的ip地址及端口。点击确定,即设置成功了。 diff --git a/src/docs/online-ip-proxy.mdx b/src/app/(home)/docs/online-ip-proxy/page.mdx similarity index 100% rename from src/docs/online-ip-proxy.mdx rename to src/app/(home)/docs/online-ip-proxy/page.mdx diff --git a/src/docs/package-operations.mdx b/src/app/(home)/docs/package-operations/page.mdx similarity index 98% rename from src/docs/package-operations.mdx rename to src/app/(home)/docs/package-operations/page.mdx index c091b9f..0ec3fbc 100644 --- a/src/docs/package-operations.mdx +++ b/src/app/(home)/docs/package-operations/page.mdx @@ -10,7 +10,7 @@ 1.进入个人中心-套餐管理页面,选择对应购买的套餐类型,点击【合并套餐】; -2.输入被合并的套餐ID,点击确定。合并成功后,被合并的包量套餐IP总量增加,合并的包量套餐变更为“用完”。 +2.输入被合并的套餐ID,点击确定。合并成功后,被合并的包量套餐IP总量增加,合并的包量套餐变更为"用完"。 三、修改时效 diff --git a/src/docs/product-cert.mdx b/src/app/(home)/docs/product-cert/page.mdx similarity index 100% rename from src/docs/product-cert.mdx rename to src/app/(home)/docs/product-cert/page.mdx diff --git a/src/docs/product-features.mdx b/src/app/(home)/docs/product-features/page.mdx similarity index 100% rename from src/docs/product-features.mdx rename to src/app/(home)/docs/product-features/page.mdx diff --git a/src/docs/product-overview.mdx b/src/app/(home)/docs/product-overview/page.mdx similarity index 100% rename from src/docs/product-overview.mdx rename to src/app/(home)/docs/product-overview/page.mdx diff --git a/src/app/(home)/docs/sidebar.tsx b/src/app/(home)/docs/sidebar.tsx index 3c6859c..e216ebc 100644 --- a/src/app/(home)/docs/sidebar.tsx +++ b/src/app/(home)/docs/sidebar.tsx @@ -1,206 +1,158 @@ 'use client' import {useState, useMemo, useCallback} from 'react' import Link from 'next/link' -import {useParams, usePathname} from 'next/navigation' +import {usePathname} from 'next/navigation' import {ChevronRight} from 'lucide-react' type Props = { collapsed?: boolean } -// 菜单结构 -const MENU_CONFIG = { - tutorials: [ - { - title: '官网教程', - sectionKey: 'official-tutorial', - items: [ - {key: 'browser-proxy', label: '浏览器设置代理教程'}, - {key: 'package-operations', label: '套餐续费、合并、修改时效、补重操作'}, - {key: 'fixed-package', label: '长效固定套餐操作手册'}, - ], - }, - { - title: '客户端教程', - sectionKey: 'client-tutorial', - items: [ - {key: 'ios-proxy', label: 'iOS设置代理教程'}, - {key: 'windows10-proxy', label: 'Windows10电脑设置代理教程'}, - {key: 'android-proxy', label: '安卓手机设置代理教程'}, - ], - }, - { - title: '操作指南', - sectionKey: 'operation-guide', - items: [ - {key: 'windows7-proxy', label: 'Windows7电脑设置代理教程'}, - {key: 'mac-proxy', label: 'MAC设置代理教程'}, - {key: 'firefox-proxy', label: '火狐浏览器设置代理'}, - {key: 'socks5-usage', label: 'Socks5代理使用教程'}, - ], - }, - ], - features: [ - { - title: '产品介绍', - sectionKey: 'product-intro', - items: [ - {key: 'product-overview', label: '产品概述'}, - {key: 'product-features', label: '产品功能'}, - ], - }, - { - title: '常见问题', - sectionKey: 'faq', - items: [ - {key: 'faq-general', label: '常见问题总览'}, - {key: 'faq-billing', label: '计费与套餐问题'}, - ], - }, - { - title: '新闻资讯', - sectionKey: 'news', - items: [ - {key: 'news-latest', label: '了解代理服务器的工作原理'}, - {key: 'news-announce', label: '公告'}, - ], - }, - ], -} +// 简化的菜单配置 - 扁平结构,支持分组 +const MENU_ITEMS = [ + { + group: '官网教程', + items: [ + {key: 'browser-proxy', label: '浏览器设置代理教程'}, + {key: 'package-operations', label: '套餐续费、合并、修改时效、补重操作'}, + {key: 'fixed-package', label: '长效固定套餐操作手册'}, + ], + }, + { + group: '客户端教程', + items: [ + {key: 'ios-proxy', label: 'iOS设置代理教程'}, + {key: 'windows10-proxy', label: 'Windows10电脑设置代理教程'}, + {key: 'android-proxy', label: '安卓手机设置代理教程'}, + ], + }, + { + group: '操作指南', + items: [ + {key: 'windows7-proxy', label: 'Windows7电脑设置代理教程'}, + {key: 'mac-proxy', label: 'MAC设置代理教程'}, + {key: 'firefox-proxy', label: '火狐浏览器设置代理'}, + {key: 'socks5-usage', label: 'Socks5代理使用教程'}, + {key: 'http-notes', label: '使用 HTTP 代理注意事项'}, + {key: 'official-tutorial', label: '浏览器设置代理教程'}, + ], + }, + { + group: '产品介绍', + items: [ + {key: 'product-overview', label: '产品概述'}, + {key: 'product-features', label: '产品功能'}, + {key: 'product-cert', label: '实名认证与证书'}, + ], + }, + { + group: '常见问题', + items: [ + {key: 'faq-general', label: '常见问题总览'}, + {key: 'faq-billing', label: '计费与套餐问题'}, + ], + }, + { + group: '新闻资讯', + items: [ + {key: 'news-latest', label: '了解代理服务器的工作原理'}, + {key: 'news-announce', label: '公告'}, + ], + }, + { + group: '其他', + items: [ + {key: 'online-ip-proxy', label: '在线 IP 代理地址'}, + ], + }, +] export default function Sidebar({collapsed = false}: Props) { - const params = useParams() const pathname = usePathname() - // 判断当前所处的 help 子模块 - const getCategory = useCallback(() => { - if (!pathname) return 'tutorials' - if (pathname.includes('/help/features')) return 'features' - if (pathname.includes('/help/tutorials')) return 'tutorials' - return 'tutorials' + // 获取当前文档 key (从 /help/{key} 路径中提取) + const getCurrentKey = useCallback(() => { + const parts = pathname?.split('/') || [] + return parts[2] || '' // /help/{key} -> key }, [pathname]) - const category = getCategory() - const MENU = category === 'features' ? MENU_CONFIG.features : MENU_CONFIG.tutorials + const currentKey = getCurrentKey() - // 获取当前 sectionKey 和 itemKey - const getCurrentKeys = useCallback(() => { - const pathParts = pathname?.split('/') || [] - let sectionKey = '' - let itemKey = '' + // 展开/收起状态 + const [expandedGroups, setExpandedGroups] = useState>({}) - if (pathParts.length >= 4) { - sectionKey = pathParts[3] - } - if (pathParts.length >= 5) { - itemKey = pathParts[4] - } - - // 如果从 params 获取 - if (!sectionKey && params?.section) { - sectionKey = String(params.section) - } - if (!itemKey && params?.key) { - itemKey = String(params.key) - } - - return {sectionKey, itemKey} - }, [pathname, params]) - - const {sectionKey: currentSectionKey, itemKey: currentItemKey} = getCurrentKeys() - - const expandedSections = useMemo(() => { - const newExpanded: Record = {} - const hasActiveSection = MENU.some(s => s.sectionKey === currentSectionKey) - - MENU.forEach((section, index) => { - if (section.sectionKey === currentSectionKey) { - newExpanded[section.title] = true - } - else if (!hasActiveSection && index === 0) { - newExpanded[section.title] = true - } - else { - newExpanded[section.title] = false + // 初始化:自动展开包含当前活跃项的分组 + const initialExpandedGroups = useMemo(() => { + const result: Record = {} + MENU_ITEMS.forEach((section, index) => { + const hasActive = section.items.some(item => item.key === currentKey) + if (hasActive || index === 0) { + result[section.group] = true } }) - - return newExpanded - }, [MENU, currentSectionKey]) - - // 使用 state 来跟踪用户的手动切换 - const [userToggles, setUserToggles] = useState>({}) - - // 合并自动展开和用户手动切换的状态 - const finalExpandedSections = useMemo(() => { - const result = {...expandedSections} - - Object.keys(userToggles).forEach((title) => { - const section = MENU.find(s => s.title === title) - if (section && section.sectionKey !== currentSectionKey) { - result[title] = userToggles[title] - } - }) - return result - }, [expandedSections, userToggles, MENU, currentSectionKey]) + }, [currentKey]) - const toggleSection = (title: string) => { - const section = MENU.find(s => s.title === title) - if (!section) return - if (section.sectionKey === currentSectionKey) { - setUserToggles(prev => ({ - ...prev, - [title]: !finalExpandedSections[title], - })) - } - else { - setUserToggles(prev => ({ - ...prev, - [title]: !prev[title], - })) - } + // 合并自动展开和用户手动切换 + const finalExpandedGroups = useMemo(() => { + return {...initialExpandedGroups, ...expandedGroups} + }, [initialExpandedGroups, expandedGroups]) + + const toggleGroup = (group: string) => { + setExpandedGroups(prev => ({ + ...prev, + [group]: !finalExpandedGroups[group], + })) } - // 构建链接地址 - const getItemHref = useCallback((sectionKey: string, itemKey: string) => { - return category === 'features' - ? `/help/features/${sectionKey}/${itemKey}` - : `/help/tutorials/${sectionKey}/${itemKey}` - }, [category]) + const getItemHref = (key: string) => `/help/${key}` return ( -