director-ai / client /src /store /projectsSlice.ts
algorembrant's picture
Upload 79 files
11f4e50 verified
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;