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;