chore: refactor store to use reducerPath instead of arbitrary names

chore: refactor app reducer to export selectors
This commit is contained in:
2024-08-17 20:26:48 +02:00
parent 08365ee037
commit fdd25b79d7
11 changed files with 40 additions and 38 deletions

View File

@@ -4,7 +4,11 @@ import { TodolistsList } from 'features/TodolistsList/TodolistsList'
import { ErrorSnackbar } from 'components/ErrorSnackbar/ErrorSnackbar' import { ErrorSnackbar } from 'components/ErrorSnackbar/ErrorSnackbar'
import { useDispatch, useSelector } from 'react-redux' import { useDispatch, useSelector } from 'react-redux'
import { AppRootState } from './store' import { AppRootState } from './store'
import { initializeAppTC, RequestStatus } from './app-reducer' import {
initializeAppTC,
selectAppInitialized,
selectAppStatus,
} from './app-reducer'
import { BrowserRouter, Route, Routes } from 'react-router-dom' import { BrowserRouter, Route, Routes } from 'react-router-dom'
import { Login } from 'features/Login/Login' import { Login } from 'features/Login/Login'
import { logoutTC } from 'features/Login/auth-reducer' import { logoutTC } from 'features/Login/auth-reducer'
@@ -25,12 +29,8 @@ type Props = {
} }
function App({ demo = false }: Props) { function App({ demo = false }: Props) {
const status = useSelector<AppRootState, RequestStatus>( const status = useSelector(selectAppStatus)
(state) => state.app.status const isInitialized = useSelector(selectAppInitialized)
)
const isInitialized = useSelector<AppRootState, boolean>(
(state) => state.app.isInitialized
)
const isLoggedIn = useSelector<AppRootState, boolean>( const isLoggedIn = useSelector<AppRootState, boolean>(
(state) => state.auth.isLoggedIn (state) => state.auth.isLoggedIn
) )

View File

@@ -1,5 +1,5 @@
import { import {
appReducer, appSlice,
InitialState, InitialState,
setAppError, setAppError,
setAppStatus, setAppStatus,
@@ -7,6 +7,8 @@ import {
let startState: InitialState let startState: InitialState
const appReducer = appSlice.reducer
beforeEach(() => { beforeEach(() => {
startState = { startState = {
error: null, error: null,

View File

@@ -20,7 +20,7 @@ const initialState: InitialState = {
isInitialized: false, isInitialized: false,
} }
const appSlice = createSlice({ export const appSlice = createSlice({
name: 'app', name: 'app',
initialState, initialState,
reducers: { reducers: {
@@ -34,11 +34,16 @@ const appSlice = createSlice({
state.isInitialized = action.payload state.isInitialized = action.payload
}, },
}, },
selectors: {
selectAppError: (state) => state.error,
selectAppStatus: (state) => state.status,
selectAppInitialized: (state) => state.isInitialized,
},
}) })
export const appReducer = appSlice.reducer
export const { setAppInitialized, setAppStatus, setAppError } = appSlice.actions export const { setAppInitialized, setAppStatus, setAppError } = appSlice.actions
export const { selectAppStatus, selectAppInitialized, selectAppError } =
appSlice.selectors
export const initializeAppTC = (): AppThunk => (dispatch) => { export const initializeAppTC = (): AppThunk => (dispatch) => {
authAPI.me().then((res) => { authAPI.me().then((res) => {

View File

@@ -1,16 +1,16 @@
import { tasksReducer } from 'features/TodolistsList/tasks-reducer' import { tasksSlice } from 'features/TodolistsList/tasks-reducer'
import { todolistsReducer } from 'features/TodolistsList/todolists-reducer' import { todolistsSlice } from 'features/TodolistsList/todolists-reducer'
import { combineReducers } from 'redux' import { combineReducers } from 'redux'
import { ThunkAction, ThunkDispatch } from 'redux-thunk' import { ThunkAction, ThunkDispatch } from 'redux-thunk'
import { appReducer } from './app-reducer' import { appSlice } from './app-reducer'
import { authReducer } from 'features/Login/auth-reducer' import { authSlice } from 'features/Login/auth-reducer'
import { configureStore, UnknownAction } from '@reduxjs/toolkit' import { configureStore, UnknownAction } from '@reduxjs/toolkit'
const rootReducer = combineReducers({ const rootReducer = combineReducers({
tasks: tasksReducer, [appSlice.reducerPath]: appSlice.reducer,
todolists: todolistsReducer, [tasksSlice.reducerPath]: tasksSlice.reducer,
app: appReducer, [todolistsSlice.reducerPath]: todolistsSlice.reducer,
auth: authReducer, [authSlice.reducerPath]: authSlice.reducer,
}) })
// ❗старая запись, с новыми версиями не работает // ❗старая запись, с новыми версиями не работает

View File

@@ -1,7 +1,6 @@
import React from 'react' import React from 'react'
import { useDispatch, useSelector } from 'react-redux' import { useDispatch, useSelector } from 'react-redux'
import { AppRootState } from 'app/store' import { selectAppError, setAppError } from 'app/app-reducer'
import { setAppError } from 'app/app-reducer'
import { AlertProps, Snackbar } from '@mui/material' import { AlertProps, Snackbar } from '@mui/material'
import MuiAlert from '@mui/material/Alert' import MuiAlert from '@mui/material/Alert'
@@ -19,9 +18,7 @@ const Alert = React.forwardRef<HTMLDivElement, AlertProps>(
) )
export function ErrorSnackbar() { export function ErrorSnackbar() {
const error = useSelector<AppRootState, string | null>( const error = useSelector(selectAppError)
(state) => state.app.error
)
const dispatch = useDispatch() const dispatch = useDispatch()
const handleClose = ( const handleClose = (

View File

@@ -15,7 +15,7 @@ const initialState: InitialState = {
isLoggedIn: false, isLoggedIn: false,
} }
const authSlice = createSlice({ export const authSlice = createSlice({
name: 'auth', name: 'auth',
initialState, initialState,
reducers: { reducers: {
@@ -25,8 +25,6 @@ const authSlice = createSlice({
}, },
}) })
export const authReducer = authSlice.reducer
export const { setIsLoggedIn } = authSlice.actions export const { setIsLoggedIn } = authSlice.actions
// thunks // thunks

View File

@@ -2,11 +2,11 @@ import {
addTask, addTask,
removeTask, removeTask,
setTasks, setTasks,
tasksReducer, tasksSlice,
TasksState, TasksState,
updateTask, updateTask,
} from './tasks-reducer' } from './tasks-reducer'
const tasksReducer = tasksSlice.reducer
import { addTodolist, removeTodolist, setTodolists } from './todolists-reducer' import { addTodolist, removeTodolist, setTodolists } from './todolists-reducer'
import { TaskPriorities, TaskStatuses } from 'api/todolists-api' import { TaskPriorities, TaskStatuses } from 'api/todolists-api'

View File

@@ -33,7 +33,7 @@ export type TasksState = {
const initialState: TasksState = {} const initialState: TasksState = {}
const tasksSlice = createSlice({ export const tasksSlice = createSlice({
name: 'tasks', name: 'tasks',
initialState, initialState,
reducers: { reducers: {
@@ -92,8 +92,6 @@ const tasksSlice = createSlice({
}, },
}) })
export const tasksReducer = tasksSlice.reducer
export const { removeTask, setTasks, updateTask, addTask } = tasksSlice.actions export const { removeTask, setTasks, updateTask, addTask } = tasksSlice.actions
export const fetchTasksTC = export const fetchTasksTC =

View File

@@ -3,11 +3,11 @@ import {
changeTodolistEntityStatus, changeTodolistEntityStatus,
changeTodolistFilter, changeTodolistFilter,
changeTodolistTitle, changeTodolistTitle,
todolistsSlice,
FilterValues, FilterValues,
removeTodolist, removeTodolist,
setTodolists, setTodolists,
TodolistDomain, TodolistDomain,
todolistsReducer,
} from './todolists-reducer' } from './todolists-reducer'
import { v1 } from 'uuid' import { v1 } from 'uuid'
import { Todolist } from 'api/todolists-api' import { Todolist } from 'api/todolists-api'
@@ -16,6 +16,7 @@ import { RequestStatus } from 'app/app-reducer'
let todolistId1: string let todolistId1: string
let todolistId2: string let todolistId2: string
let startState: Array<TodolistDomain> = [] let startState: Array<TodolistDomain> = []
const todolistsReducer = todolistsSlice.reducer
beforeEach(() => { beforeEach(() => {
todolistId1 = v1() todolistId1 = v1()

View File

@@ -12,7 +12,7 @@ export type TodolistDomain = Todolist & {
const initialState: Array<TodolistDomain> = [] const initialState: Array<TodolistDomain> = []
const todolistsSlice = createSlice({ export const todolistsSlice = createSlice({
name: 'todolists', name: 'todolists',
initialState, initialState,
reducers: { reducers: {
@@ -72,8 +72,6 @@ export const {
setTodolists, setTodolists,
} = todolistsSlice.actions } = todolistsSlice.actions
export const todolistsReducer = todolistsSlice.reducer
export const fetchTodolistsTC = (): AppThunk => { export const fetchTodolistsTC = (): AppThunk => {
return (dispatch) => { return (dispatch) => {
dispatch(setAppStatus('loading')) dispatch(setAppStatus('loading'))

View File

@@ -1,11 +1,14 @@
import { import {
addTodolist, addTodolist,
TodolistDomain, TodolistDomain,
todolistsReducer, todolistsSlice,
} from './todolists-reducer' } from './todolists-reducer'
import { tasksReducer, TasksState } from './tasks-reducer' import { tasksSlice, TasksState } from './tasks-reducer'
import { Todolist } from 'api/todolists-api' import { Todolist } from 'api/todolists-api'
const todolistsReducer = todolistsSlice.reducer
const tasksReducer = tasksSlice.reducer
test('ids should be equals', () => { test('ids should be equals', () => {
const startTasksState: TasksState = {} const startTasksState: TasksState = {}
const startTodolistsState: Array<TodolistDomain> = [] const startTodolistsState: Array<TodolistDomain> = []