import { createSlice, PayloadAction } from '@reduxjs/toolkit'; interface UIState { sidebarOpen: boolean; sidebarCollapsed: boolean; searchOpen: boolean; filterPanelOpen: boolean; createTodoDialogOpen: boolean; editTodoDialogOpen: boolean; deleteTodoDialogOpen: boolean; batchActionsOpen: boolean; settingsDialogOpen: boolean; aiChatOpen: boolean; importDialogOpen: boolean; currentEditingTodo: string | null; currentDeletingTodos: string[]; notifications: Array<{ id: string; message: string; type: 'info' | 'success' | 'warning' | 'error'; timestamp: number; read: boolean; }>; isOnline: boolean; lastSync: string | null; } const initialState: UIState = { sidebarOpen: true, sidebarCollapsed: false, searchOpen: false, filterPanelOpen: false, createTodoDialogOpen: false, editTodoDialogOpen: false, deleteTodoDialogOpen: false, batchActionsOpen: false, settingsDialogOpen: false, aiChatOpen: false, importDialogOpen: false, currentEditingTodo: null, currentDeletingTodos: [], notifications: [], isOnline: true, lastSync: null, }; const uiSlice = createSlice({ name: 'ui', initialState, reducers: { toggleSidebar: (state) => { state.sidebarOpen = !state.sidebarOpen; }, setSidebarOpen: (state, action: PayloadAction) => { state.sidebarOpen = action.payload; }, toggleSidebarCollapsed: (state) => { state.sidebarCollapsed = !state.sidebarCollapsed; }, setSidebarCollapsed: (state, action: PayloadAction) => { state.sidebarCollapsed = action.payload; }, setSearchOpen: (state, action: PayloadAction) => { state.searchOpen = action.payload; }, setFilterPanelOpen: (state, action: PayloadAction) => { state.filterPanelOpen = action.payload; }, setCreateTodoDialogOpen: (state, action: PayloadAction) => { state.createTodoDialogOpen = action.payload; }, setEditTodoDialogOpen: (state, action: PayloadAction) => { state.editTodoDialogOpen = action.payload; }, setDeleteTodoDialogOpen: (state, action: PayloadAction) => { state.deleteTodoDialogOpen = action.payload; }, setBatchActionsOpen: (state, action: PayloadAction) => { state.batchActionsOpen = action.payload; }, setSettingsDialogOpen: (state, action: PayloadAction) => { state.settingsDialogOpen = action.payload; }, setAiChatOpen: (state, action: PayloadAction) => { state.aiChatOpen = action.payload; }, setImportDialogOpen: (state, action: PayloadAction) => { state.importDialogOpen = action.payload; }, setCurrentEditingTodo: (state, action: PayloadAction) => { state.currentEditingTodo = action.payload; }, setCurrentDeletingTodos: (state, action: PayloadAction) => { state.currentDeletingTodos = action.payload; }, addNotification: (state, action: PayloadAction>) => { const notification = { ...action.payload, id: Date.now().toString(), timestamp: Date.now(), read: false, }; state.notifications.unshift(notification); }, markNotificationAsRead: (state, action: PayloadAction) => { const notification = state.notifications.find(n => n.id === action.payload); if (notification) { notification.read = true; } }, markAllNotificationsAsRead: (state) => { state.notifications.forEach(n => n.read = true); }, removeNotification: (state, action: PayloadAction) => { state.notifications = state.notifications.filter(n => n.id !== action.payload); }, clearNotifications: (state) => { state.notifications = []; }, setOnlineStatus: (state, action: PayloadAction) => { state.isOnline = action.payload; }, setLastSync: (state, action: PayloadAction) => { state.lastSync = action.payload; }, closeAllDialogs: (state) => { state.createTodoDialogOpen = false; state.editTodoDialogOpen = false; state.deleteTodoDialogOpen = false; state.settingsDialogOpen = false; state.aiChatOpen = false; state.importDialogOpen = false; state.filterPanelOpen = false; state.searchOpen = false; state.batchActionsOpen = false; state.currentEditingTodo = null; state.currentDeletingTodos = []; }, }, }); export const { toggleSidebar, setSidebarOpen, toggleSidebarCollapsed, setSidebarCollapsed, setSearchOpen, setFilterPanelOpen, setCreateTodoDialogOpen, setEditTodoDialogOpen, setDeleteTodoDialogOpen, setBatchActionsOpen, setSettingsDialogOpen, setAiChatOpen, setImportDialogOpen, setCurrentEditingTodo, setCurrentDeletingTodos, addNotification, markNotificationAsRead, markAllNotificationsAsRead, removeNotification, clearNotifications, setOnlineStatus, setLastSync, closeAllDialogs, } = uiSlice.actions; export default uiSlice.reducer;