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 { 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
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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) => {
|
||||||
|
|||||||
@@ -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,
|
||||||
})
|
})
|
||||||
|
|
||||||
// ❗старая запись, с новыми версиями не работает
|
// ❗старая запись, с новыми версиями не работает
|
||||||
|
|||||||
@@ -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 = (
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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'
|
||||||
|
|
||||||
|
|||||||
@@ -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 =
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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'))
|
||||||
|
|||||||
@@ -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> = []
|
||||||
|
|||||||
Reference in New Issue
Block a user