submissions

This commit is contained in:
Виталий Лавшонок
2025-11-02 23:41:23 +03:00
parent 235b2c16bd
commit f6c681c038
26 changed files with 589 additions and 298 deletions

View File

@@ -11,17 +11,33 @@ export interface Submit {
contestId: number | null;
}
export interface SubmitStatus {
SubmitId: number;
State: string;
ErrorCode: string;
Message: string;
CurrentTest: number;
AmountOfTests: number;
export interface Solution {
id: number;
missionId: number;
language: string;
languageVersion: string;
sourceCode: string;
status: string;
time: string;
testerState: string;
testerErrorCode: string;
testerMessage: string;
currentTest: number;
amountOfTests: number;
}
export interface MissionSubmit {
id: number;
userId: number;
solution: Solution;
contestId: number | null;
contestName: string | null;
sourceType: string;
}
interface SubmitState {
submits: Submit[];
submitsById: Record<number, MissionSubmit[]>; // ✅ добавлено
currentSubmit?: Submit;
status: "idle" | "loading" | "successful" | "failed";
error: string | null;
@@ -30,6 +46,7 @@ interface SubmitState {
// Начальное состояние
const initialState: SubmitState = {
submits: [],
submitsById: {}, // ✅ инициализация
currentSubmit: undefined,
status: "idle",
error: null,
@@ -74,13 +91,13 @@ export const fetchSubmitById = createAsyncThunk(
}
);
// AsyncThunk: Получить свои отправки для конкретной миссии
// AsyncThunk: Получить отправки для конкретной миссии (новая структура)
export const fetchMySubmitsByMission = createAsyncThunk(
"submit/fetchMySubmitsByMission",
async (missionId: number, { rejectWithValue }) => {
try {
const response = await axios.get(`/submits/my/mission/${missionId}`);
return response.data as Submit[];
return { missionId, data: response.data as MissionSubmit[] };
} catch (err: any) {
return rejectWithValue(err.response?.data?.message || "Failed to fetch mission submits");
}
@@ -97,6 +114,9 @@ const submitSlice = createSlice({
state.status = "idle";
state.error = null;
},
clearSubmitsByMission: (state, action: PayloadAction<number>) => {
delete state.submitsById[action.payload];
},
},
extraReducers: (builder) => {
// Отправка решения
@@ -141,15 +161,18 @@ const submitSlice = createSlice({
state.error = action.payload;
});
// Получить отправки по миссии
// Получить отправки по миссии
builder.addCase(fetchMySubmitsByMission.pending, (state) => {
state.status = "loading";
state.error = null;
});
builder.addCase(fetchMySubmitsByMission.fulfilled, (state, action: PayloadAction<Submit[]>) => {
state.status = "successful";
state.submits = action.payload;
});
builder.addCase(
fetchMySubmitsByMission.fulfilled,
(state, action: PayloadAction<{ missionId: number; data: MissionSubmit[] }>) => {
state.status = "successful";
state.submitsById[action.payload.missionId] = action.payload.data;
}
);
builder.addCase(fetchMySubmitsByMission.rejected, (state, action: PayloadAction<any>) => {
state.status = "failed";
state.error = action.payload;
@@ -157,5 +180,5 @@ const submitSlice = createSlice({
},
});
export const { clearCurrentSubmit } = submitSlice.actions;
export const { clearCurrentSubmit, clearSubmitsByMission } = submitSlice.actions;
export const submitReducer = submitSlice.reducer;