diff --git a/src/model/common.ts b/src/model/common.ts index b025c2c..75444ff 100644 --- a/src/model/common.ts +++ b/src/model/common.ts @@ -2,4 +2,9 @@ export interface Request{ id: number; text: string; files: File[]; +} + +export interface Response{ + test: string; + files: File[]; } \ No newline at end of file diff --git a/src/store/slices/slice.ts b/src/store/slices/slice.ts index 8b13789..ccb6e37 100644 --- a/src/store/slices/slice.ts +++ b/src/store/slices/slice.ts @@ -1 +1,62 @@ +import {Request, Response} from '../../model/common'; +import {createAsyncThunk, createSlice, PayloadAction} from '@reduxjs/toolkit'; +import {createRequest} from '../../services/service'; +interface RequestState { + files: File[]; + text: string; + loading: boolean; + error: string | null; +} + +const initialState: RequestState = { + files: [], + text: '', + loading: false, + error: null, +}; + +export const request = createAsyncThunk( + 'request/create', + async (data: Request, {rejectWithValue}) => { + try{ + const response = await createRequest(data); + return response; + } catch(error: any){ + if(error.response?.data?.detail){ + return rejectWithValue(error.response.data.detail); + } else { + return rejectWithValue(error instanceof Error ? error.message : "Ошибка создания запроса"); + } + } + } +) + +export const requestSlice = createSlice({ + name:'requests', + initialState, + reducers: { + clearRequestError(state){ + state.error = null; + } + }, + extraReducers: (builder) => { + builder.addCase(request.pending, (state) => { + state.loading = true; + state.error = null; + }) + builder.addCase(request.fulfilled, (state, action: PayloadAction) => { + state.loading = false; + state.error = null; + state.files = action.payload.files; + }) + builder.addCase(request.rejected, (state, action) => { + state.loading = false; + state.error = (action.payload as string) || action.error.message || "Неизвестная ошибка"; + }) + } +}) + +export const {clearRequestError} = requestSlice.actions; + +export default requestSlice.reducer; \ No newline at end of file diff --git a/src/store/store.ts b/src/store/store.ts index eeddde9..a801666 100644 --- a/src/store/store.ts +++ b/src/store/store.ts @@ -1,9 +1,9 @@ import { configureStore } from '@reduxjs/toolkit' -//import requestReducer from './slices/slice' +import requestReducer from './slices/slice' export const store = configureStore({ reducer: { - //request: requestReducer + request: requestReducer } });