- Updated project data fetching logic in the project drawer and related components to ensure the drawer opens only after successful data retrieval. - Added detailed logging for successful and failed fetch attempts to improve debugging and user feedback. - Introduced error handling to maintain user experience by allowing the drawer to open even if data fetching fails, displaying an error state. - Refactored project list and project view components to optimize search functionality and improve loading states. - Removed deprecated components related to task management to streamline the project view.
89 lines
2.8 KiB
TypeScript
89 lines
2.8 KiB
TypeScript
import { projectsApiService } from '@/api/projects/projects.api.service';
|
|
import { IProjectViewModel } from '@/types/project/projectViewModel.types';
|
|
import { createAsyncThunk, createSlice } from '@reduxjs/toolkit';
|
|
|
|
interface IProjectDrawerState {
|
|
isProjectDrawerOpen: boolean;
|
|
projectId: string | null;
|
|
projectLoading: boolean;
|
|
project: IProjectViewModel | null;
|
|
}
|
|
|
|
const initialState: IProjectDrawerState = {
|
|
isProjectDrawerOpen: false,
|
|
projectId: null,
|
|
projectLoading: false,
|
|
project: null,
|
|
};
|
|
|
|
export const fetchProjectData = createAsyncThunk(
|
|
'project/fetchProjectData',
|
|
async (projectId: string, { rejectWithValue, dispatch }) => {
|
|
try {
|
|
if (!projectId) {
|
|
throw new Error('Project ID is required');
|
|
}
|
|
|
|
console.log(`Fetching project data for ID: ${projectId}`);
|
|
const response = await projectsApiService.getProject(projectId);
|
|
|
|
if (!response) {
|
|
throw new Error('No response received from API');
|
|
}
|
|
|
|
if (!response.done) {
|
|
throw new Error(response.message || 'API request failed');
|
|
}
|
|
|
|
if (!response.body) {
|
|
throw new Error('No project data in response body');
|
|
}
|
|
|
|
console.log(`Successfully fetched project data:`, response.body);
|
|
return response.body;
|
|
} catch (error) {
|
|
const errorMessage = error instanceof Error ? error.message : 'Failed to fetch project';
|
|
console.error(`Error fetching project data for ID ${projectId}:`, error);
|
|
return rejectWithValue(errorMessage);
|
|
}
|
|
}
|
|
);
|
|
|
|
const projectDrawerSlice = createSlice({
|
|
name: 'projectDrawer',
|
|
initialState,
|
|
reducers: {
|
|
toggleProjectDrawer: state => {
|
|
state.isProjectDrawerOpen = !state.isProjectDrawerOpen;
|
|
},
|
|
setProjectId: (state, action) => {
|
|
state.projectId = action.payload;
|
|
},
|
|
setProjectData: (state, action) => {
|
|
state.project = action.payload;
|
|
},
|
|
},
|
|
extraReducers: builder => {
|
|
builder
|
|
.addCase(fetchProjectData.pending, state => {
|
|
console.log('Starting project data fetch...');
|
|
state.projectLoading = true;
|
|
state.project = null; // Clear existing data while loading
|
|
})
|
|
.addCase(fetchProjectData.fulfilled, (state, action) => {
|
|
console.log('Project data fetch completed successfully:', action.payload);
|
|
state.project = action.payload;
|
|
state.projectLoading = false;
|
|
})
|
|
.addCase(fetchProjectData.rejected, (state, action) => {
|
|
console.error('Project data fetch failed:', action.payload);
|
|
state.projectLoading = false;
|
|
state.project = null;
|
|
// You could add an error field to the state if needed for UI feedback
|
|
});
|
|
},
|
|
});
|
|
|
|
export const { toggleProjectDrawer, setProjectId, setProjectData } = projectDrawerSlice.actions;
|
|
export default projectDrawerSlice.reducer;
|