add info pannel
This commit is contained in:
@@ -34,6 +34,12 @@ interface ArticlesState {
|
||||
status: Status;
|
||||
error?: string;
|
||||
};
|
||||
fetchNewArticles: {
|
||||
articles: Article[];
|
||||
hasNextPage: boolean;
|
||||
status: Status;
|
||||
error?: string;
|
||||
};
|
||||
fetchArticleById: {
|
||||
article?: Article;
|
||||
status: Status;
|
||||
@@ -67,6 +73,12 @@ const initialState: ArticlesState = {
|
||||
status: 'idle',
|
||||
error: undefined,
|
||||
},
|
||||
fetchNewArticles: {
|
||||
articles: [],
|
||||
hasNextPage: false,
|
||||
status: 'idle',
|
||||
error: undefined,
|
||||
},
|
||||
fetchArticleById: {
|
||||
article: undefined,
|
||||
status: 'idle',
|
||||
@@ -97,13 +109,42 @@ const initialState: ArticlesState = {
|
||||
// Async Thunks
|
||||
// =====================
|
||||
|
||||
// Новые статьи
|
||||
export const fetchNewArticles = createAsyncThunk(
|
||||
'articles/fetchNewArticles',
|
||||
async (
|
||||
{
|
||||
page = 0,
|
||||
pageSize = 5,
|
||||
tags,
|
||||
}: { page?: number; pageSize?: number; tags?: string[] } = {},
|
||||
{ rejectWithValue },
|
||||
) => {
|
||||
try {
|
||||
const params: any = { page, pageSize };
|
||||
if (tags && tags.length > 0) params.tags = tags;
|
||||
|
||||
const response = await axios.get<ArticlesResponse>('/articles', {
|
||||
params,
|
||||
paramsSerializer: {
|
||||
indexes: null,
|
||||
},
|
||||
});
|
||||
|
||||
return response.data;
|
||||
} catch (err: any) {
|
||||
return rejectWithValue(err.response?.data);
|
||||
}
|
||||
},
|
||||
);
|
||||
|
||||
// Все статьи
|
||||
export const fetchArticles = createAsyncThunk(
|
||||
'articles/fetchArticles',
|
||||
async (
|
||||
{
|
||||
page = 0,
|
||||
pageSize = 10,
|
||||
pageSize = 100,
|
||||
tags,
|
||||
}: { page?: number; pageSize?: number; tags?: string[] } = {},
|
||||
{ rejectWithValue },
|
||||
@@ -259,6 +300,29 @@ const articlesSlice = createSlice({
|
||||
});
|
||||
});
|
||||
|
||||
// fetchNewArticles
|
||||
builder.addCase(fetchNewArticles.pending, (state) => {
|
||||
state.fetchNewArticles.status = 'loading';
|
||||
state.fetchNewArticles.error = undefined;
|
||||
});
|
||||
builder.addCase(
|
||||
fetchNewArticles.fulfilled,
|
||||
(state, action: PayloadAction<ArticlesResponse>) => {
|
||||
state.fetchNewArticles.status = 'successful';
|
||||
state.fetchNewArticles.articles = action.payload.articles;
|
||||
state.fetchNewArticles.hasNextPage = action.payload.hasNextPage;
|
||||
},
|
||||
);
|
||||
builder.addCase(fetchNewArticles.rejected, (state, action: any) => {
|
||||
state.fetchNewArticles.status = 'failed';
|
||||
const errors = action.payload.errors as Record<string, string[]>;
|
||||
Object.values(errors).forEach((messages) => {
|
||||
messages.forEach((msg) => {
|
||||
toastError(msg);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
// fetchMyArticles
|
||||
builder.addCase(fetchMyArticles.pending, (state) => {
|
||||
state.fetchMyArticles.status = 'loading';
|
||||
|
||||
@@ -490,7 +490,7 @@ export const fetchContestMembers = createAsyncThunk(
|
||||
{
|
||||
contestId,
|
||||
page = 0,
|
||||
pageSize = 25,
|
||||
pageSize = 100,
|
||||
}: { contestId: number; page?: number; pageSize?: number },
|
||||
{ rejectWithValue },
|
||||
) => {
|
||||
|
||||
@@ -28,6 +28,7 @@ export interface Mission {
|
||||
|
||||
interface MissionsState {
|
||||
missions: Mission[];
|
||||
newMissions: Mission[];
|
||||
currentMission: Mission | null;
|
||||
hasNextPage: boolean;
|
||||
create: {
|
||||
@@ -47,6 +48,7 @@ interface MissionsState {
|
||||
|
||||
const initialState: MissionsState = {
|
||||
missions: [],
|
||||
newMissions: [],
|
||||
currentMission: null,
|
||||
hasNextPage: false,
|
||||
create: {},
|
||||
@@ -65,6 +67,33 @@ const initialState: MissionsState = {
|
||||
// GET /missions
|
||||
export const fetchMissions = createAsyncThunk(
|
||||
'missions/fetchMissions',
|
||||
async (
|
||||
{
|
||||
page = 0,
|
||||
pageSize = 100,
|
||||
tags = [],
|
||||
}: { page?: number; pageSize?: number; tags?: string[] },
|
||||
{ rejectWithValue },
|
||||
) => {
|
||||
try {
|
||||
const params: any = { page, pageSize };
|
||||
if (tags.length) params.tags = tags;
|
||||
const response = await axios.get('/missions', {
|
||||
params,
|
||||
paramsSerializer: {
|
||||
indexes: null,
|
||||
},
|
||||
});
|
||||
return response.data; // { missions, hasNextPage }
|
||||
} catch (err: any) {
|
||||
return rejectWithValue(err.response?.data);
|
||||
}
|
||||
},
|
||||
);
|
||||
|
||||
// GET /missions
|
||||
export const fetchNewMissions = createAsyncThunk(
|
||||
'missions/fetchNewMissions',
|
||||
async (
|
||||
{
|
||||
page = 0,
|
||||
@@ -211,6 +240,42 @@ const missionsSlice = createSlice({
|
||||
},
|
||||
);
|
||||
|
||||
// ─── FETCH NEW MISSIONS ───
|
||||
builder.addCase(fetchNewMissions.pending, (state) => {
|
||||
state.statuses.fetchList = 'loading';
|
||||
state.error = null;
|
||||
});
|
||||
builder.addCase(
|
||||
fetchNewMissions.fulfilled,
|
||||
(
|
||||
state,
|
||||
action: PayloadAction<{
|
||||
missions: Mission[];
|
||||
hasNextPage: boolean;
|
||||
}>,
|
||||
) => {
|
||||
state.statuses.fetchList = 'successful';
|
||||
state.newMissions = action.payload.missions;
|
||||
state.hasNextPage = action.payload.hasNextPage;
|
||||
},
|
||||
);
|
||||
builder.addCase(
|
||||
fetchNewMissions.rejected,
|
||||
(state, action: PayloadAction<any>) => {
|
||||
state.statuses.fetchList = 'failed';
|
||||
|
||||
const errors = action.payload.errors as Record<
|
||||
string,
|
||||
string[]
|
||||
>;
|
||||
Object.values(errors).forEach((messages) => {
|
||||
messages.forEach((msg) => {
|
||||
toastError(msg);
|
||||
});
|
||||
});
|
||||
},
|
||||
);
|
||||
|
||||
// ─── FETCH MISSION BY ID ───
|
||||
builder.addCase(fetchMissionById.pending, (state) => {
|
||||
state.statuses.fetchById = 'loading';
|
||||
|
||||
@@ -197,9 +197,9 @@ export const fetchProfileMissions = createAsyncThunk(
|
||||
{
|
||||
username,
|
||||
recentPage = 0,
|
||||
recentPageSize = 15,
|
||||
recentPageSize = 100,
|
||||
authoredPage = 0,
|
||||
authoredPageSize = 25,
|
||||
authoredPageSize = 100,
|
||||
}: {
|
||||
username: string;
|
||||
recentPage?: number;
|
||||
@@ -237,7 +237,7 @@ export const fetchProfileArticles = createAsyncThunk(
|
||||
{
|
||||
username,
|
||||
page = 0,
|
||||
pageSize = 25,
|
||||
pageSize = 100,
|
||||
}: { username: string; page?: number; pageSize?: number },
|
||||
{ rejectWithValue },
|
||||
) => {
|
||||
@@ -262,11 +262,11 @@ export const fetchProfileContests = createAsyncThunk(
|
||||
{
|
||||
username,
|
||||
upcomingPage = 0,
|
||||
upcomingPageSize = 10,
|
||||
upcomingPageSize = 100,
|
||||
pastPage = 0,
|
||||
pastPageSize = 10,
|
||||
pastPageSize = 100,
|
||||
minePage = 0,
|
||||
minePageSize = 10,
|
||||
minePageSize = 100,
|
||||
}: {
|
||||
username: string;
|
||||
upcomingPage?: number;
|
||||
|
||||
Reference in New Issue
Block a user