116 lines
3.0 KiB
TypeScript
116 lines
3.0 KiB
TypeScript
import { createSlice, PayloadAction } from '@reduxjs/toolkit';
|
|
|
|
// Типы данных
|
|
interface StorState {
|
|
menu: {
|
|
activePage: string;
|
|
activeProfilePage: string;
|
|
activeGroupPage: string;
|
|
};
|
|
group: {
|
|
groupFilter: string;
|
|
};
|
|
articles: {
|
|
articleTagFilter: string[];
|
|
filterName: string;
|
|
};
|
|
contests: {
|
|
contestsTagFilter: string[];
|
|
filterName: string;
|
|
};
|
|
missions: {
|
|
missionsTagFilter: string[];
|
|
filterName: string;
|
|
};
|
|
}
|
|
|
|
// Инициализация состояния
|
|
const initialState: StorState = {
|
|
menu: {
|
|
activePage: '',
|
|
activeProfilePage: '',
|
|
activeGroupPage: '',
|
|
},
|
|
group: {
|
|
groupFilter: '',
|
|
},
|
|
articles: {
|
|
articleTagFilter: [],
|
|
filterName: '',
|
|
},
|
|
contests: {
|
|
contestsTagFilter: [],
|
|
filterName: '',
|
|
},
|
|
missions: {
|
|
missionsTagFilter: [],
|
|
filterName: '',
|
|
},
|
|
};
|
|
|
|
// Slice
|
|
const storeSlice = createSlice({
|
|
name: 'store',
|
|
initialState,
|
|
reducers: {
|
|
setMenuActivePage: (state, action: PayloadAction<string>) => {
|
|
state.menu.activePage = action.payload;
|
|
},
|
|
setMenuActiveProfilePage: (state, action: PayloadAction<string>) => {
|
|
state.menu.activeProfilePage = action.payload;
|
|
},
|
|
setMenuActiveGroupPage: (state, action: PayloadAction<string>) => {
|
|
state.menu.activeGroupPage = action.payload;
|
|
},
|
|
setGroupFilter: (state, action: PayloadAction<string>) => {
|
|
state.group.groupFilter = action.payload;
|
|
},
|
|
|
|
// ---------- ARTICLES ----------
|
|
setArticlesTagFilter: (state, action: PayloadAction<string[]>) => {
|
|
state.articles.articleTagFilter = action.payload;
|
|
},
|
|
setArticlesNameFilter: (state, action: PayloadAction<string>) => {
|
|
state.articles.filterName = action.payload;
|
|
},
|
|
|
|
// ---------- CONTESTS ----------
|
|
setContestsTagFilter: (state, action: PayloadAction<string[]>) => {
|
|
state.contests.contestsTagFilter = action.payload;
|
|
},
|
|
setContestsNameFilter: (state, action: PayloadAction<string>) => {
|
|
state.contests.filterName = action.payload;
|
|
},
|
|
|
|
// ---------- MISSIONS ----------
|
|
setMissionsTagFilter: (state, action: PayloadAction<string[]>) => {
|
|
state.missions.missionsTagFilter = action.payload;
|
|
},
|
|
setMissionsNameFilter: (state, action: PayloadAction<string>) => {
|
|
state.missions.filterName = action.payload;
|
|
},
|
|
},
|
|
});
|
|
|
|
export const {
|
|
// menu
|
|
setMenuActivePage,
|
|
setMenuActiveProfilePage,
|
|
setMenuActiveGroupPage,
|
|
setGroupFilter,
|
|
|
|
// articles
|
|
setArticlesTagFilter,
|
|
setArticlesNameFilter,
|
|
|
|
// contests
|
|
setContestsTagFilter,
|
|
setContestsNameFilter,
|
|
|
|
// missions
|
|
setMissionsTagFilter,
|
|
setMissionsNameFilter,
|
|
} = storeSlice.actions;
|
|
|
|
export const storeReducer = storeSlice.reducer;
|