-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathnav-tab.ts
More file actions
127 lines (103 loc) · 3.13 KB
/
Copy pathnav-tab.ts
File metadata and controls
127 lines (103 loc) · 3.13 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
interface TabItem {
key: string
name: string
link: string
}
interface configNavItem {
text: string
link: string
activeMatch?: string
}
type NavTabConstructor = new (
activeProductTab: string,
site: any,
themeConfig?: any
) => NavTab
class NavTab {
activeProductTab: string
site: any
themeConfig?: any
constructor(activeProductTab: string, site: any, themeConfig?: any) {
this.activeProductTab = activeProductTab
this.site = site
this.themeConfig = themeConfig
}
getConfigKey(link: any) {
return link.replace(/\/$/, '').split('/')[2]
}
getTabs(): TabItem[] {
const prefix = this.site.value.base || '/'
const { nav } = this.themeConfig
return (
(nav || []).map((item: configNavItem) => ({
key: this.getConfigKey(item.link) || item.text.toLowerCase().replace(/\s+/g, '-'),
name: item.text,
link: `${prefix}${item.link.slice(1)}`,
disabled: false
})) || []
)
}
}
class NextSdkNavTab extends NavTab {
constructor(activeProductTab: string, site: any, themeConfig?: any) {
super(activeProductTab, site, themeConfig)
}
getTabs(): TabItem[] {
return [{ key: 'guide', name: '使用文档', link: '/next-sdk/guide/' }]
}
}
class TinyVueNavTab extends NavTab {
constructor(activeProductTab: string, site: any, themeConfig?: any) {
super(activeProductTab, site, themeConfig)
}
getTabs(): TabItem[] {
return [{ key: 'guide', name: '使用文档', link: '/tiny-vue/guide/introduce' }]
}
}
class TinyEngineNavTab extends NavTab {
constructor(activeProductTab: string, site: any, themeConfig?: any) {
super(activeProductTab, site, themeConfig)
}
getTabs(): TabItem[] {
const prefix = this.site.value.base || '/'
const { engineNav } = this.themeConfig
return (
(engineNav || []).map((item: configNavItem) => ({
key: this.getConfigKey(item.link) || item.text.toLowerCase().replace(/\s+/g, '-'),
name: item.text,
link: `${prefix}${item.link.slice(1)}`,
disabled: false
})) || []
)
}
}
class GenuiSdkNavTab extends NavTab {
constructor(activeProductTab: string, site: any, themeConfig?: any) {
super(activeProductTab, site, themeConfig)
}
getTabs(): TabItem[] {
return [{ key: 'guide', name: '使用文档', link: '/genui-sdk/guide/installation' }]
}
}
const navTabClassMap: Record<string, NavTabConstructor> = {
'next-sdk': NextSdkNavTab,
'tiny-vue': TinyVueNavTab,
'tiny-engine': TinyEngineNavTab,
'genui-sdk': GenuiSdkNavTab,
}
const navPathMap: Record<string, string> = {
'next-sdk': '/next-sdk/',
'tiny-vue': '/tiny-vue/',
'tiny-engine': '/tiny-engine/',
'genui-sdk': '/genui-sdk/',
}
const NavTabFactory = (activeProductTab: string, route: any, site: any, themeConfig: any) => {
const isCurrentPath = (path: string) => route.path.includes(path)
const navPath = navPathMap[activeProductTab]
const NavTabClass = navTabClassMap[activeProductTab]
if (NavTabClass && isCurrentPath(navPath)) {
return new NavTabClass(activeProductTab, site, themeConfig)
}
return new NavTab(activeProductTab, site, themeConfig)
}
export { NavTabFactory }