1
- import { useOn } from '@sa/hooks' ;
1
+ import { useEmit , useOn } from '@sa/hooks' ;
2
2
3
3
import { useRoute , useRouter } from '@/features/router' ;
4
4
import {
5
5
addTab ,
6
+ changeTabLabel ,
6
7
selectActiveTabId ,
7
8
selectTabs ,
8
9
setActiveFirstLevelMenuKey ,
@@ -17,34 +18,36 @@ import { useThemeSettings } from '../theme';
17
18
import { filterTabsById , filterTabsByIds , getFixedTabs , getTabByRoute , isTabInTabs } from './shared' ;
18
19
import { TabEvent } from './tabEnum' ;
19
20
20
- export function useTabActions ( ) {
21
+ export function useUpdateTabs ( ) {
21
22
const dispatch = useAppDispatch ( ) ;
22
23
23
- const tabs = useAppSelector ( selectTabs ) ;
24
+ /**
25
+ * 更新标签页
26
+ *
27
+ * @param newTabs
28
+ */
29
+ function updateTabs ( newTabs : App . Global . Tab [ ] ) {
30
+ dispatch ( setTabs ( newTabs ) ) ;
31
+ }
24
32
25
- const _route = useRoute ( ) ;
33
+ return updateTabs ;
34
+ }
26
35
27
- const isInit = useRef ( false ) ;
36
+ export function useTabActions ( ) {
37
+ const dispatch = useAppDispatch ( ) ;
38
+
39
+ const tabs = useAppSelector ( selectTabs ) ;
28
40
29
41
const _fixedTabs = getFixedTabs ( tabs ) ;
30
42
31
- const _tabIds = tabs . map ( tab => tab . id ) ;
43
+ const updateTabs = useUpdateTabs ( ) ;
32
44
33
- const themeSettings = useThemeSettings ( ) ;
45
+ const _tabIds = tabs . map ( tab => tab . id ) ;
34
46
35
47
const { navigate } = useRouter ( ) ;
36
48
37
49
const activeTabId = useAppSelector ( selectActiveTabId ) ;
38
50
39
- /**
40
- * 更新标签页
41
- *
42
- * @param newTabs
43
- */
44
- function updateTabs ( newTabs : App . Global . Tab [ ] ) {
45
- dispatch ( setTabs ( newTabs ) ) ;
46
- }
47
-
48
51
/**
49
52
* 切换激活的标签页
50
53
*
@@ -127,46 +130,6 @@ export function useTabActions() {
127
130
_clearTabs ( excludes ) ;
128
131
}
129
132
130
- function _initTabs ( ) {
131
- const storageTabs = localStg . get ( 'globalTabs' ) ;
132
-
133
- if ( themeSettings . tab . cache && storageTabs ) {
134
- // const tabs = extractTabsByAllRoutes(router.getAllRouteNames(), storageTabs);
135
- // dispatch(setTabs(tabs));
136
- updateTabs ( storageTabs ) ;
137
- return storageTabs ;
138
- }
139
-
140
- return [ ] ;
141
- }
142
-
143
- function _cacheTabs ( ) {
144
- if ( ! themeSettings . tab . cache ) return ;
145
-
146
- localStg . set ( 'globalTabs' , tabs ) ;
147
- }
148
-
149
- function _addTab ( route : Router . Route ) {
150
- const tab = getTabByRoute ( route ) ;
151
-
152
- if ( ! isInit . current ) {
153
- isInit . current = true ;
154
-
155
- const initTabs = _initTabs ( ) ;
156
-
157
- if ( ! initTabs || initTabs . length === 0 || ( initTabs . length > 0 && ! isTabInTabs ( tab . id , initTabs ) ) ) {
158
- dispatch ( addTab ( tab ) ) ;
159
- }
160
- } else if ( ! isTabInTabs ( tab . id , tabs ) ) {
161
- dispatch ( addTab ( tab ) ) ;
162
- }
163
-
164
- dispatch ( setActiveTabId ( tab . id ) ) ;
165
-
166
- const firstLevelRouteName = getActiveFirstLevelMenuKey ( route ) ;
167
- dispatch ( setActiveFirstLevelMenuKey ( firstLevelRouteName ) ) ;
168
- }
169
-
170
133
/**
171
134
* 删除标签页
172
135
*
@@ -192,6 +155,10 @@ export function useTabActions() {
192
155
}
193
156
}
194
157
158
+ function removeActiveTab ( ) {
159
+ removeTabById ( activeTabId ) ;
160
+ }
161
+
195
162
/**
196
163
* 判断标签页是否保留
197
164
*
@@ -202,18 +169,6 @@ export function useTabActions() {
202
169
return _fixedTabs . some ( tab => tab . id === tabId ) ;
203
170
}
204
171
205
- useEffect ( ( ) => {
206
- _addTab ( _route ) ;
207
- } , [ _route . fullPath ] ) ;
208
-
209
- useEventListener (
210
- 'beforeunload' ,
211
- ( ) => {
212
- _cacheTabs ( ) ;
213
- } ,
214
- { target : window }
215
- ) ;
216
-
217
172
useOn ( TabEvent . UPDATE_TABS , ( eventName : TabEvent , id : string ) => {
218
173
// 清除左侧标签页
219
174
if ( eventName === TabEvent . CLEAR_LEFT_TABS ) return _clearLeftTabs ( id ) ;
@@ -236,8 +191,143 @@ export function useTabActions() {
236
191
dispatch,
237
192
isTabRetain,
238
193
navigate,
194
+ removeActiveTab,
239
195
removeTabById,
240
- tabs,
241
- themeSettings
196
+ tabs
197
+ } ;
198
+ }
199
+
200
+ export function useTabController ( ) {
201
+ const emit = useEmit ( ) ;
202
+
203
+ function _operateTab ( eventName : TabEvent , id ?: string ) {
204
+ emit ( TabEvent . UPDATE_TABS , eventName , id ) ;
205
+ }
206
+
207
+ function clearLeftTabs ( id : string ) {
208
+ _operateTab ( TabEvent . CLEAR_LEFT_TABS , id ) ;
209
+ }
210
+
211
+ function clearRightTabs ( id : string ) {
212
+ _operateTab ( TabEvent . CLEAR_RIGHT_TABS , id ) ;
213
+ }
214
+
215
+ function closeCurrentTab ( id : string ) {
216
+ _operateTab ( TabEvent . CLOSE_CURRENT , id ) ;
217
+ }
218
+
219
+ function closeOtherTabs ( id : string ) {
220
+ _operateTab ( TabEvent . CLOSE_OTHER , id ) ;
221
+ }
222
+
223
+ function closeAllTabs ( ) {
224
+ _operateTab ( TabEvent . CLOSE_ALL ) ;
225
+ }
226
+
227
+ return {
228
+ clearLeftTabs,
229
+ clearRightTabs,
230
+ closeAllTabs,
231
+ closeCurrentTab,
232
+ closeOtherTabs
233
+ } ;
234
+ }
235
+
236
+ export function useTabManager ( ) {
237
+ const isInit = useRef ( false ) ;
238
+
239
+ const themeSettings = useThemeSettings ( ) ;
240
+
241
+ const tabs = useAppSelector ( selectTabs ) ;
242
+
243
+ const dispatch = useAppDispatch ( ) ;
244
+
245
+ const _route = useRoute ( ) ;
246
+
247
+ const updateTabs = useUpdateTabs ( ) ;
248
+
249
+ function _initTabs ( ) {
250
+ const storageTabs = localStg . get ( 'globalTabs' ) ;
251
+
252
+ if ( themeSettings . tab . cache && storageTabs ) {
253
+ // const tabs = extractTabsByAllRoutes(router.getAllRouteNames(), storageTabs);
254
+ // dispatch(setTabs(tabs));
255
+ updateTabs ( storageTabs ) ;
256
+ return storageTabs ;
257
+ }
258
+
259
+ return [ ] ;
260
+ }
261
+
262
+ function _cacheTabs ( ) {
263
+ if ( ! themeSettings . tab . cache ) return ;
264
+
265
+ localStg . set ( 'globalTabs' , tabs ) ;
266
+ }
267
+
268
+ function _addTab ( route : Router . Route ) {
269
+ const tab = getTabByRoute ( route ) ;
270
+
271
+ if ( ! isInit . current ) {
272
+ isInit . current = true ;
273
+
274
+ const initTabs = _initTabs ( ) ;
275
+
276
+ if ( ! initTabs || initTabs . length === 0 || ( initTabs . length > 0 && ! isTabInTabs ( tab . id , initTabs ) ) ) {
277
+ dispatch ( addTab ( tab ) ) ;
278
+ }
279
+ } else if ( ! isTabInTabs ( tab . id , tabs ) ) {
280
+ dispatch ( addTab ( tab ) ) ;
281
+ }
282
+
283
+ dispatch ( setActiveTabId ( tab . id ) ) ;
284
+
285
+ const firstLevelRouteName = getActiveFirstLevelMenuKey ( route ) ;
286
+ dispatch ( setActiveFirstLevelMenuKey ( firstLevelRouteName ) ) ;
287
+ }
288
+
289
+ useEffect ( ( ) => {
290
+ _addTab ( _route ) ;
291
+ } , [ _route . fullPath ] ) ;
292
+
293
+ useEventListener (
294
+ 'beforeunload' ,
295
+ ( ) => {
296
+ _cacheTabs ( ) ;
297
+ } ,
298
+ { target : window }
299
+ ) ;
300
+ }
301
+
302
+ export function useTabLabel ( ) {
303
+ const dispatch = useAppDispatch ( ) ;
304
+
305
+ const activeTabId = useAppSelector ( selectActiveTabId ) ;
306
+
307
+ const tabs = useAppSelector ( selectTabs ) ;
308
+
309
+ function setTabLabel ( label : string , tabId ?: string ) {
310
+ const id = tabId || activeTabId ;
311
+
312
+ const tab = tabs . findIndex ( item => item . id === id ) ;
313
+
314
+ if ( tab < 0 ) return ;
315
+
316
+ dispatch ( changeTabLabel ( { index : tab , label } ) ) ;
317
+ }
318
+
319
+ function resetTabLabel ( tabId ?: string ) {
320
+ const id = tabId || activeTabId ;
321
+
322
+ const tab = tabs . findIndex ( item => item . id === id ) ;
323
+
324
+ if ( tab < 0 ) return ;
325
+
326
+ dispatch ( changeTabLabel ( { index : tab } ) ) ;
327
+ }
328
+
329
+ return {
330
+ resetTabLabel,
331
+ setTabLabel
242
332
} ;
243
333
}
0 commit comments