import { useState, useEffect, useCallback } from 'react'; import apiService from '../services/apiService'; import { ApiError } from '../services/apiService'; // Define interfaces locally to avoid import issues export interface UserDetails { user_id: string; full_name: string; email: string; user_image?: string; roles: string[]; permissions: Record; last_login?: string; enabled: boolean; creation: string; modified: string; language: string; } interface DocTypeRecord { name: string; creation: string; modified: string; modified_by: string; owner: string; docstatus: number; [key: string]: any; } export interface DocTypeRecordsResponse { records: DocTypeRecord[]; total_count: number; limit: number; offset: number; has_more: boolean; doctype: string; } export interface DashboardStats { total_users: number; total_customers: number; total_items: number; total_orders: number; recent_activities: RecentActivity[]; } export interface NumberCards { total_assets: number; work_orders_open: number; work_orders_in_progress: number; work_orders_completed: number; } interface RecentActivity { type: string; name: string; title: string; creation: string; } interface KycRecord { name: string; kyc_status: string; kyc_type: string; creation: string; modified: string; } export interface KycDetailsResponse { records: KycRecord[]; summary: { total: number; pending: number; approved: number; }; } // Generic API hook export function useApi( apiCall: () => Promise, dependencies: any[] = [] ) { const [data, setData] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const fetchData = useCallback(async () => { try { setLoading(true); setError(null); const result = await apiCall(); setData(result); } catch (err) { if (err instanceof ApiError) { setError(err.message); } else { setError(err instanceof Error ? err.message : 'Unknown error'); } } finally { setLoading(false); } }, dependencies); useEffect(() => { fetchData(); }, [fetchData]); const refetch = useCallback(() => { fetchData(); }, [fetchData]); return { data, loading, error, refetch }; } // Specific API hooks export function useUserDetails(userId?: string) { return useApi( () => apiService.getUserDetails(userId), [userId] ); } export function useDashboardStats() { return useApi(() => apiService.getDashboardStats()); } export function useNumberCards() { return useApi(() => apiService.getNumberCards()); } export function useDashboardChart(chartName: string, filters?: Record) { return useApi( () => apiService.getDashboardChartData(chartName, filters), [chartName, JSON.stringify(filters || {})] ); } export function useChartsList(publicOnly: boolean = true) { return useApi(() => apiService.listDashboardCharts(publicOnly), [publicOnly]); } export function useKycDetails() { return useApi(() => apiService.getKycDetails()); } export function useDoctypeRecords( doctype: string, filters?: Record, fields?: string[], limit: number = 20, offset: number = 0 ) { return useApi( () => apiService.getDoctypeRecords(doctype, filters, fields, limit, offset), [doctype, JSON.stringify(filters), JSON.stringify(fields), limit, offset] ); } // Authentication hook export function useAuth() { const [isAuthenticated, setIsAuthenticated] = useState( apiService.isAuthenticated() ); const login = async (credentials: { email: string; password: string }) => { try { const response = await apiService.login(credentials); // Check if we have any valid response data if (response && response.message) { // Set session ID if available if (response.message.sid) { apiService.setSessionId(response.message.sid); } setIsAuthenticated(true); return response; } throw new Error('Login failed'); } catch (error) { setIsAuthenticated(false); throw error; } }; const logout = async () => { try { await apiService.logout(); } finally { apiService.setSessionId(''); setIsAuthenticated(false); } }; return { isAuthenticated, login, logout }; }