tabsSlice.ts 1.47 KB
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