tabsSlice.ts
1.47 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
import { createSlice, PayloadAction } from '@reduxjs/toolkit'
export interface Tab {
id: string
title: string
path: string
closable: boolean
}
interface TabsState {
tabs: Tab[]
activeId: string | null
}
const initialState: TabsState = {
tabs: [{ id: 'main', title: '主页', path: '/', closable: false }],
activeId: 'main',
}
const tabsSlice = createSlice({
name: 'tabs',
initialState,
reducers: {
openTab(state, action: PayloadAction<Tab>) {
const existing = state.tabs.find(t => t.id === action.payload.id)
if (existing) {
existing.path = action.payload.path
} else {
state.tabs.push(action.payload)
}
state.activeId = action.payload.id
},
closeTab(state, action: PayloadAction<string>) {
const idx = state.tabs.findIndex(t => t.id === action.payload)
if (idx === -1) return
state.tabs.splice(idx, 1)
if (state.activeId === action.payload) {
const newIdx = Math.min(idx, state.tabs.length - 1)
state.activeId = state.tabs[newIdx]?.id ?? null
}
},
activateTab(state, action: PayloadAction<string>) {
state.activeId = action.payload
},
updateTabPath(state, action: PayloadAction<{ id: string; path: string }>) {
const tab = state.tabs.find(t => t.id === action.payload.id)
if (tab) tab.path = action.payload.path
},
},
})
export const { openTab, closeTab, activateTab, updateTabPath } = tabsSlice.actions
export default tabsSlice.reducer