Files
worklenz/worklenz-frontend/src/features/project/project-drawer.slice.ts
chamikaJ b0253135e5 feat(project-drawer): enhance project data fetching and error handling
- 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.
2025-07-07 17:07:45 +05:30

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;