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) => { 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) => { state.current = action.payload; }) .addCase(createProject.fulfilled, (state, action: PayloadAction) => { state.items.unshift(action.payload); }); }, }); export const { clearCurrent } = projectsSlice.actions; export default projectsSlice.reducer;