feat: add firearm management features
- Implemented API for fetching firearms and firearm details. - Created a new page for displaying the list of firearms with search and filter options. - Added Redux slice for managing firearms state. - Integrated Redux Persist for state persistence. - Updated routing to include firearms page. - Removed obsolete modification codes data. - Enhanced UI with responsive grid layout for firearms display. - Added utility functions for handling URL query parameters.
This commit is contained in:
@@ -0,0 +1,42 @@
|
||||
import { createSlice, PayloadAction } from "@reduxjs/toolkit"
|
||||
import { Firearm, Page } from "@/types"
|
||||
|
||||
interface FirearmsState {
|
||||
items: Firearm[]
|
||||
page: number
|
||||
size: number
|
||||
totalPages: number
|
||||
totalElements: number
|
||||
}
|
||||
|
||||
const initialState: FirearmsState = {
|
||||
items: [],
|
||||
page: 0,
|
||||
size: 12,
|
||||
totalPages: 0,
|
||||
totalElements: 0,
|
||||
}
|
||||
|
||||
const firearmsSlice = createSlice({
|
||||
name: "firearms",
|
||||
initialState,
|
||||
reducers: {
|
||||
setFirearmsPage(state, action: PayloadAction<Page<Firearm>>) {
|
||||
state.items = action.payload.items
|
||||
state.page = action.payload.page
|
||||
state.size = action.payload.size
|
||||
state.totalPages = action.payload.totalPages
|
||||
state.totalElements = action.payload.totalElements
|
||||
},
|
||||
clearFirearms(state) {
|
||||
state.items = []
|
||||
state.page = 0
|
||||
state.size = 12
|
||||
state.totalPages = 0
|
||||
state.totalElements = 0
|
||||
},
|
||||
},
|
||||
})
|
||||
|
||||
export const { setFirearmsPage, clearFirearms } = firearmsSlice.actions
|
||||
export const firearmsReducer = firearmsSlice.reducer
|
||||
@@ -0,0 +1,48 @@
|
||||
import { configureStore, combineReducers } from "@reduxjs/toolkit"
|
||||
import { useDispatch, useSelector } from "react-redux"
|
||||
import {
|
||||
persistStore,
|
||||
persistReducer,
|
||||
FLUSH,
|
||||
REHYDRATE,
|
||||
PAUSE,
|
||||
PERSIST,
|
||||
PURGE,
|
||||
REGISTER,
|
||||
} from "redux-persist"
|
||||
import createWebStorage from "redux-persist/es/storage/createWebStorage"
|
||||
import { firearmsReducer } from "./firearms-slice"
|
||||
|
||||
const storage = createWebStorage(import.meta.env.VITE_REDUX_STORAGE ?? "local")
|
||||
|
||||
const persistConfig = {
|
||||
key: "root",
|
||||
storage,
|
||||
whitelist: ["firearms"],
|
||||
}
|
||||
|
||||
const rootReducer = combineReducers({
|
||||
firearms: firearmsReducer
|
||||
})
|
||||
|
||||
const persistedReducer = persistReducer(persistConfig, rootReducer)
|
||||
|
||||
const store = configureStore({
|
||||
reducer: persistedReducer,
|
||||
middleware: (getDefaultMiddleware) =>
|
||||
getDefaultMiddleware({
|
||||
serializableCheck: {
|
||||
ignoredActions: [FLUSH, REHYDRATE, PAUSE, PERSIST, PURGE, REGISTER],
|
||||
},
|
||||
}),
|
||||
})
|
||||
|
||||
export const persistor = persistStore(store)
|
||||
|
||||
export default store
|
||||
export type RootState = ReturnType<typeof rootReducer>
|
||||
export type AppDispatch = typeof store.dispatch
|
||||
export type AppStore = typeof store
|
||||
|
||||
export const useAppDispatch = useDispatch.withTypes<AppDispatch>()
|
||||
export const useAppSelector = useSelector.withTypes<RootState>()
|
||||
Reference in New Issue
Block a user