| 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; | |