File size: 2,816 Bytes
11f4e50 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 | import { createSlice, createAsyncThunk, PayloadAction } from '@reduxjs/toolkit';
import { projectsAPI } from '../services/api';
interface Project {
_id: string;
name: string;
defaultPlatform: string;
defaultFormat: string;
videos: any[];
createdAt: string;
}
interface ProjectsState {
items: Project[];
current: Project | null;
loading: boolean;
error: string | null;
}
const initialState: ProjectsState = {
items: [],
current: null,
loading: false,
error: null,
};
export const fetchProjects = createAsyncThunk('projects/fetchAll', async (_, { rejectWithValue }) => {
try {
const response = await projectsAPI.list();
return response.data;
} catch (error: any) {
return rejectWithValue(error.response?.data?.error || 'Failed to fetch projects.');
}
});
export const fetchProject = createAsyncThunk('projects/fetchOne', async (id: string, { rejectWithValue }) => {
try {
const response = await projectsAPI.get(id);
return response.data;
} catch (error: any) {
return rejectWithValue(error.response?.data?.error || 'Failed to fetch project.');
}
});
export const createProject = createAsyncThunk(
'projects/create',
async (data: { name: string; defaultPlatform: string; defaultFormat: string }, { rejectWithValue }) => {
try {
const response = await projectsAPI.create(data);
return response.data;
} catch (error: any) {
return rejectWithValue(error.response?.data?.error || 'Failed to create project.');
}
}
);
const projectsSlice = createSlice({
name: 'projects',
initialState,
reducers: {
clearCurrent(state) {
state.current = null;
},
},
extraReducers: (builder) => {
builder
.addCase(fetchProjects.pending, (state) => { state.loading = true; state.error = null; })
.addCase(fetchProjects.fulfilled, (state, action: PayloadAction<Project[]>) => {
state.loading = false;
state.items = action.payload;
})
.addCase(fetchProjects.rejected, (state, action) => {
state.loading = false;
state.error = action.payload as string;
})
.addCase(fetchProject.fulfilled, (state, action: PayloadAction<Project>) => {
state.current = action.payload;
})
.addCase(createProject.fulfilled, (state, action: PayloadAction<Project>) => {
state.items.unshift(action.payload);
});
},
});
export const { clearCurrent } = projectsSlice.actions;
export default projectsSlice.reducer;
|