import axios from 'axios'; import { API_BASE_URL } from '@/config'; import apiClient from '@/lib/api/axios-instance'; import { createHeaders } from '@/lib/api'; export interface TimeLog { id: number; workDate: string; startTime: string; endTime: string; comments: string; createdBy: string; updatedBy: string; createdDate: string; updatedDate: string; remainingHr: number; taskId: number; hrsSpent: number; } export interface TimeLogCreateRequest { id?: number; workDate: string; startTime: string; endTime: string; comments: string; createdBy: string; updatedBy: string; createdDate?: string; updatedDate?: string; remainingHr: number; taskId: number; hrsSpent: number; } export interface TimeLogUpdateRequest extends TimeLogCreateRequest { id: number; } export interface PaginatedResponse { data: T[]; pageNumber: number; pageSize: number; totalCount: number; totalPages: number; } // Helper to create a safe TimeLog object with default values for null/undefined fields const createSafeTimeLog = (data: any): TimeLog => { return { id: data.id || 0, workDate: data.workDate || new Date().toISOString(), startTime: data.startTime || '00:00', endTime: data.endTime || '00:00', comments: data.comments || '', createdBy: data.createdBy || '', updatedBy: data.updatedBy || '', createdDate: data.createdDate || new Date().toISOString(), updatedDate: data.updatedDate || new Date().toISOString(), remainingHr: data.remainingHr || 0, taskId: data.taskId || 0, hrsSpent: data.hrsSpent || 0, }; }; class TimeLogApi { private baseUrl = `/api/TimeLog`; async getAll(): Promise { try { console.log('TimeLogApi: Fetching all time logs from', this.baseUrl); const response = await apiClient.get(this.baseUrl); console.log('TimeLogApi: Response status', response.status); if (!response.data) { console.warn('TimeLogApi: No data in response'); return []; } if (!Array.isArray(response.data)) { console.warn('TimeLogApi: Response is not an array', response.data); return []; } // Map each item to ensure it has all required fields return response.data.map(item => createSafeTimeLog(item)); } catch (error) { console.error('Error fetching time logs:', error); // Return empty array instead of throwing to prevent UI crashes return []; } } async getById(id: number): Promise { try { const response = await apiClient.get(`${this.baseUrl}/${id}`); if (response.data) { return createSafeTimeLog(response.data); } return null; } catch (error) { console.error(`Error fetching time log ${id}:`, error); return null; } } async getTimeLogByTaskID(taskId: number): Promise { try { console.log(`TimeLogApi: Fetching time logs for task ${taskId}`); const response = await apiClient.get(`${this.baseUrl}/GetTimeLogByTaskID?taskId=${taskId}`); console.log(`TimeLogApi: Response status for task ${taskId} time logs`, response.status); if (!response.data) { console.warn(`TimeLogApi: No time logs found for task ${taskId}`); return []; } if (!Array.isArray(response.data)) { console.warn(`TimeLogApi: Response is not an array for task ${taskId}`, response.data); return []; } // Map each item to ensure it has all required fields return response.data.map((item: any) => createSafeTimeLog(item)); } catch (error) { console.error(`Error fetching time logs for task ${taskId}:`, error); // Return empty array instead of throwing to prevent UI crashes return []; } } async getTimeLogByIssueID(issueId: number): Promise { try { console.log(`TimeLogApi: Fetching time logs for issue ${issueId}`); const response = await apiClient.get(`${this.baseUrl}/by-issue/${issueId}`); console.log(`TimeLogApi: Response status for issue ${issueId} time logs`, response.status); if (!response.data) { console.warn(`TimeLogApi: No time logs found for issue ${issueId}`); return []; } if (!Array.isArray(response.data)) { console.warn(`TimeLogApi: Response is not an array for issue ${issueId}`, response.data); return []; } // Map each item to ensure it has all required fields return response.data.map((item: any) => createSafeTimeLog(item)); } catch (error) { console.error(`Error fetching time logs for issue ${issueId}:`, error); // Return empty array instead of throwing to prevent UI crashes return []; } } async create(timeLog: TimeLogCreateRequest): Promise { try { // Remove id if it's 0, undefined, or null const timeLogData = { ...timeLog }; if (timeLogData.id === 0 || timeLogData.id === undefined || timeLogData.id === null) { delete timeLogData.id; } // Format the workDate if it's a string without time part if (timeLogData.workDate && typeof timeLogData.workDate === 'string') { if (!timeLogData.workDate.includes('T')) { timeLogData.workDate = timeLogData.workDate + 'T00:00:00.000Z'; } } console.log('TimeLogApi: Creating time log with data', timeLogData); const response = await apiClient.post(this.baseUrl, timeLogData); console.log('TimeLogApi: Create response status', response.status); return createSafeTimeLog(response.data); } catch (error) { console.error('Error creating time log:', error); throw error; } } async update(id: number, timeLog: TimeLogUpdateRequest): Promise { try { const timeLogData = { ...timeLog }; // Format the workDate if it's a string without time part if (timeLogData.workDate && typeof timeLogData.workDate === 'string') { if (!timeLogData.workDate.includes('T')) { timeLogData.workDate = timeLogData.workDate + 'T00:00:00.000Z'; } } console.log(`TimeLogApi: Updating time log ${id} with data`, timeLogData); const response = await apiClient.put(`${this.baseUrl}/${id}`, timeLogData); console.log(`TimeLogApi: Update response status for time log ${id}`, response.status); return createSafeTimeLog(response.data); } catch (error) { console.error(`Error updating time log ${id}:`, error); throw error; } } async delete(id: number): Promise { try { console.log(`TimeLogApi: Deleting time log ${id}`); await apiClient.delete(`${this.baseUrl}/${id}`); console.log(`TimeLogApi: Time log ${id} deleted successfully`); } catch (error) { console.error(`Error deleting time log ${id}:`, error); throw error; } } async getPaginated(pageNumber: number = 1, pageSize: number = 10): Promise> { try { console.log(`TimeLogApi: Fetching paginated time logs (page ${pageNumber}, size ${pageSize})`); const response = await apiClient.get(`${this.baseUrl}/paginated`, { params: { pageNumber, pageSize } }); console.log('TimeLogApi: Paginated response status', response.status); if (!response.data) { console.warn('TimeLogApi: No data in paginated response'); return { data: [], pageNumber: 1, pageSize: pageSize, totalCount: 0, totalPages: 0 }; } // Map each item to ensure it has all required fields const safeData = response.data.data.map((item: any) => createSafeTimeLog(item)); return { data: safeData, pageNumber: response.data.pageNumber, pageSize: response.data.pageSize, totalCount: response.data.totalCount, totalPages: response.data.totalPages }; } catch (error) { console.error('Error fetching paginated time logs:', error); // Return empty paginated response instead of throwing to prevent UI crashes return { data: [], pageNumber: 1, pageSize: pageSize, totalCount: 0, totalPages: 0 }; } } } export const timeLogApi = new TimeLogApi();