mirror of
https://github.com/ershisan99/it-incubator-todolist-ts-17-live-2024-08-17.git
synced 2025-12-16 12:33:29 +00:00
chore: refactor store to use reducerPath instead of arbitrary names
chore: refactor app reducer to export selectors
This commit is contained in:
@@ -4,7 +4,11 @@ import { TodolistsList } from 'features/TodolistsList/TodolistsList'
|
||||
import { ErrorSnackbar } from 'components/ErrorSnackbar/ErrorSnackbar'
|
||||
import { useDispatch, useSelector } from 'react-redux'
|
||||
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 { Login } from 'features/Login/Login'
|
||||
import { logoutTC } from 'features/Login/auth-reducer'
|
||||
@@ -25,12 +29,8 @@ type Props = {
|
||||
}
|
||||
|
||||
function App({ demo = false }: Props) {
|
||||
const status = useSelector<AppRootState, RequestStatus>(
|
||||
(state) => state.app.status
|
||||
)
|
||||
const isInitialized = useSelector<AppRootState, boolean>(
|
||||
(state) => state.app.isInitialized
|
||||
)
|
||||
const status = useSelector(selectAppStatus)
|
||||
const isInitialized = useSelector(selectAppInitialized)
|
||||
const isLoggedIn = useSelector<AppRootState, boolean>(
|
||||
(state) => state.auth.isLoggedIn
|
||||
)
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import {
|
||||
appReducer,
|
||||
appSlice,
|
||||
InitialState,
|
||||
setAppError,
|
||||
setAppStatus,
|
||||
@@ -7,6 +7,8 @@ import {
|
||||
|
||||
let startState: InitialState
|
||||
|
||||
const appReducer = appSlice.reducer
|
||||
|
||||
beforeEach(() => {
|
||||
startState = {
|
||||
error: null,
|
||||
|
||||
@@ -20,7 +20,7 @@ const initialState: InitialState = {
|
||||
isInitialized: false,
|
||||
}
|
||||
|
||||
const appSlice = createSlice({
|
||||
export const appSlice = createSlice({
|
||||
name: 'app',
|
||||
initialState,
|
||||
reducers: {
|
||||
@@ -34,11 +34,16 @@ const appSlice = createSlice({
|
||||
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 { selectAppStatus, selectAppInitialized, selectAppError } =
|
||||
appSlice.selectors
|
||||
|
||||
export const initializeAppTC = (): AppThunk => (dispatch) => {
|
||||
authAPI.me().then((res) => {
|
||||
|
||||
@@ -1,16 +1,16 @@
|
||||
import { tasksReducer } from 'features/TodolistsList/tasks-reducer'
|
||||
import { todolistsReducer } from 'features/TodolistsList/todolists-reducer'
|
||||
import { tasksSlice } from 'features/TodolistsList/tasks-reducer'
|
||||
import { todolistsSlice } from 'features/TodolistsList/todolists-reducer'
|
||||
import { combineReducers } from 'redux'
|
||||
import { ThunkAction, ThunkDispatch } from 'redux-thunk'
|
||||
import { appReducer } from './app-reducer'
|
||||
import { authReducer } from 'features/Login/auth-reducer'
|
||||
import { appSlice } from './app-reducer'
|
||||
import { authSlice } from 'features/Login/auth-reducer'
|
||||
import { configureStore, UnknownAction } from '@reduxjs/toolkit'
|
||||
|
||||
const rootReducer = combineReducers({
|
||||
tasks: tasksReducer,
|
||||
todolists: todolistsReducer,
|
||||
app: appReducer,
|
||||
auth: authReducer,
|
||||
[appSlice.reducerPath]: appSlice.reducer,
|
||||
[tasksSlice.reducerPath]: tasksSlice.reducer,
|
||||
[todolistsSlice.reducerPath]: todolistsSlice.reducer,
|
||||
[authSlice.reducerPath]: authSlice.reducer,
|
||||
})
|
||||
|
||||
// ❗старая запись, с новыми версиями не работает
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
import React from 'react'
|
||||
import { useDispatch, useSelector } from 'react-redux'
|
||||
import { AppRootState } from 'app/store'
|
||||
import { setAppError } from 'app/app-reducer'
|
||||
import { selectAppError, setAppError } from 'app/app-reducer'
|
||||
import { AlertProps, Snackbar } from '@mui/material'
|
||||
import MuiAlert from '@mui/material/Alert'
|
||||
|
||||
@@ -19,9 +18,7 @@ const Alert = React.forwardRef<HTMLDivElement, AlertProps>(
|
||||
)
|
||||
|
||||
export function ErrorSnackbar() {
|
||||
const error = useSelector<AppRootState, string | null>(
|
||||
(state) => state.app.error
|
||||
)
|
||||
const error = useSelector(selectAppError)
|
||||
const dispatch = useDispatch()
|
||||
|
||||
const handleClose = (
|
||||
|
||||
@@ -15,7 +15,7 @@ const initialState: InitialState = {
|
||||
isLoggedIn: false,
|
||||
}
|
||||
|
||||
const authSlice = createSlice({
|
||||
export const authSlice = createSlice({
|
||||
name: 'auth',
|
||||
initialState,
|
||||
reducers: {
|
||||
@@ -25,8 +25,6 @@ const authSlice = createSlice({
|
||||
},
|
||||
})
|
||||
|
||||
export const authReducer = authSlice.reducer
|
||||
|
||||
export const { setIsLoggedIn } = authSlice.actions
|
||||
|
||||
// thunks
|
||||
|
||||
@@ -2,11 +2,11 @@ import {
|
||||
addTask,
|
||||
removeTask,
|
||||
setTasks,
|
||||
tasksReducer,
|
||||
tasksSlice,
|
||||
TasksState,
|
||||
updateTask,
|
||||
} from './tasks-reducer'
|
||||
|
||||
const tasksReducer = tasksSlice.reducer
|
||||
import { addTodolist, removeTodolist, setTodolists } from './todolists-reducer'
|
||||
import { TaskPriorities, TaskStatuses } from 'api/todolists-api'
|
||||
|
||||
|
||||
@@ -33,7 +33,7 @@ export type TasksState = {
|
||||
|
||||
const initialState: TasksState = {}
|
||||
|
||||
const tasksSlice = createSlice({
|
||||
export const tasksSlice = createSlice({
|
||||
name: 'tasks',
|
||||
initialState,
|
||||
reducers: {
|
||||
@@ -92,8 +92,6 @@ const tasksSlice = createSlice({
|
||||
},
|
||||
})
|
||||
|
||||
export const tasksReducer = tasksSlice.reducer
|
||||
|
||||
export const { removeTask, setTasks, updateTask, addTask } = tasksSlice.actions
|
||||
|
||||
export const fetchTasksTC =
|
||||
|
||||
@@ -3,11 +3,11 @@ import {
|
||||
changeTodolistEntityStatus,
|
||||
changeTodolistFilter,
|
||||
changeTodolistTitle,
|
||||
todolistsSlice,
|
||||
FilterValues,
|
||||
removeTodolist,
|
||||
setTodolists,
|
||||
TodolistDomain,
|
||||
todolistsReducer,
|
||||
} from './todolists-reducer'
|
||||
import { v1 } from 'uuid'
|
||||
import { Todolist } from 'api/todolists-api'
|
||||
@@ -16,6 +16,7 @@ import { RequestStatus } from 'app/app-reducer'
|
||||
let todolistId1: string
|
||||
let todolistId2: string
|
||||
let startState: Array<TodolistDomain> = []
|
||||
const todolistsReducer = todolistsSlice.reducer
|
||||
|
||||
beforeEach(() => {
|
||||
todolistId1 = v1()
|
||||
|
||||
@@ -12,7 +12,7 @@ export type TodolistDomain = Todolist & {
|
||||
|
||||
const initialState: Array<TodolistDomain> = []
|
||||
|
||||
const todolistsSlice = createSlice({
|
||||
export const todolistsSlice = createSlice({
|
||||
name: 'todolists',
|
||||
initialState,
|
||||
reducers: {
|
||||
@@ -72,8 +72,6 @@ export const {
|
||||
setTodolists,
|
||||
} = todolistsSlice.actions
|
||||
|
||||
export const todolistsReducer = todolistsSlice.reducer
|
||||
|
||||
export const fetchTodolistsTC = (): AppThunk => {
|
||||
return (dispatch) => {
|
||||
dispatch(setAppStatus('loading'))
|
||||
|
||||
@@ -1,11 +1,14 @@
|
||||
import {
|
||||
addTodolist,
|
||||
TodolistDomain,
|
||||
todolistsReducer,
|
||||
todolistsSlice,
|
||||
} from './todolists-reducer'
|
||||
import { tasksReducer, TasksState } from './tasks-reducer'
|
||||
import { tasksSlice, TasksState } from './tasks-reducer'
|
||||
import { Todolist } from 'api/todolists-api'
|
||||
|
||||
const todolistsReducer = todolistsSlice.reducer
|
||||
const tasksReducer = tasksSlice.reducer
|
||||
|
||||
test('ids should be equals', () => {
|
||||
const startTasksState: TasksState = {}
|
||||
const startTodolistsState: Array<TodolistDomain> = []
|
||||
|
||||
Reference in New Issue
Block a user