207 lines
4.5 KiB
TypeScript
207 lines
4.5 KiB
TypeScript
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<string, {
|
|
read: boolean;
|
|
write: boolean;
|
|
create: boolean;
|
|
delete: boolean;
|
|
}>;
|
|
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<T>(
|
|
apiCall: () => Promise<T>,
|
|
dependencies: any[] = []
|
|
) {
|
|
const [data, setData] = useState<T | null>(null);
|
|
const [loading, setLoading] = useState<boolean>(true);
|
|
const [error, setError] = useState<string | null>(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<string, any>) {
|
|
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<string, any>,
|
|
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<boolean>(
|
|
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
|
|
};
|
|
}
|