Implement missing API endpoints
This commit is contained in:
61
src/hooks/useAnalytics.ts
Normal file
61
src/hooks/useAnalytics.ts
Normal file
@@ -0,0 +1,61 @@
|
||||
import { useState, useEffect } from 'react';
|
||||
import { adminApi } from '@/services/adminApi';
|
||||
import { useToast } from '@/hooks/use-toast';
|
||||
|
||||
interface AnalyticsOverview {
|
||||
totalUsers: number;
|
||||
totalRevenue: number;
|
||||
totalBookings: number;
|
||||
activeEstablishments: number;
|
||||
topDestinations: Array<{
|
||||
id: string;
|
||||
name: string;
|
||||
visits: number;
|
||||
}>;
|
||||
revenueByCategory: Array<{
|
||||
category: string;
|
||||
revenue: number;
|
||||
}>;
|
||||
userGrowth: Array<{
|
||||
date: string;
|
||||
users: number;
|
||||
}>;
|
||||
conversionRate: number;
|
||||
}
|
||||
|
||||
export const useAnalytics = (period: string = 'month') => {
|
||||
const [analytics, setAnalytics] = useState<AnalyticsOverview | null>(null);
|
||||
const [loading, setLoading] = useState(true);
|
||||
const [error, setError] = useState<string | null>(null);
|
||||
const { toast } = useToast();
|
||||
|
||||
const loadAnalytics = async () => {
|
||||
setLoading(true);
|
||||
setError(null);
|
||||
try {
|
||||
const data = await adminApi.getAnalyticsOverview(period);
|
||||
setAnalytics(data as AnalyticsOverview);
|
||||
} catch (err) {
|
||||
const errorMessage = err instanceof Error ? err.message : 'Error al cargar analytics';
|
||||
setError(errorMessage);
|
||||
toast({
|
||||
title: 'Error',
|
||||
description: errorMessage,
|
||||
variant: 'destructive',
|
||||
});
|
||||
} finally {
|
||||
setLoading(false);
|
||||
}
|
||||
};
|
||||
|
||||
useEffect(() => {
|
||||
loadAnalytics();
|
||||
}, [period]);
|
||||
|
||||
return {
|
||||
analytics,
|
||||
loading,
|
||||
error,
|
||||
refetch: loadAnalytics,
|
||||
};
|
||||
};
|
||||
81
src/hooks/useSearch.ts
Normal file
81
src/hooks/useSearch.ts
Normal file
@@ -0,0 +1,81 @@
|
||||
import { useState, useCallback } from 'react';
|
||||
import { adminApi } from '@/services/adminApi';
|
||||
import { useToast } from '@/hooks/use-toast';
|
||||
|
||||
interface SearchFilters {
|
||||
category?: string;
|
||||
type?: string;
|
||||
minRating?: number;
|
||||
verified?: boolean;
|
||||
}
|
||||
|
||||
export const useSearch = () => {
|
||||
const [searching, setSearching] = useState(false);
|
||||
const [results, setResults] = useState<any[]>([]);
|
||||
const { toast } = useToast();
|
||||
|
||||
const searchPlaces = useCallback(async (query: string, filters?: SearchFilters) => {
|
||||
if (!query.trim()) {
|
||||
setResults([]);
|
||||
return;
|
||||
}
|
||||
|
||||
setSearching(true);
|
||||
try {
|
||||
const response = await adminApi.searchPlaces(query, {
|
||||
category: filters?.category,
|
||||
minRating: filters?.minRating,
|
||||
});
|
||||
setResults(response as any);
|
||||
} catch (error) {
|
||||
console.error('Error searching places:', error);
|
||||
toast({
|
||||
title: 'Error de búsqueda',
|
||||
description: error instanceof Error ? error.message : 'No se pudo realizar la búsqueda',
|
||||
variant: 'destructive',
|
||||
});
|
||||
setResults([]);
|
||||
} finally {
|
||||
setSearching(false);
|
||||
}
|
||||
}, [toast]);
|
||||
|
||||
const searchEstablishments = useCallback(async (query: string, filters?: SearchFilters) => {
|
||||
if (!query.trim()) {
|
||||
setResults([]);
|
||||
return;
|
||||
}
|
||||
|
||||
setSearching(true);
|
||||
try {
|
||||
const response = await adminApi.searchEstablishments(query, {
|
||||
type: filters?.type,
|
||||
minRating: filters?.minRating,
|
||||
verified: filters?.verified,
|
||||
});
|
||||
setResults(response as any);
|
||||
} catch (error) {
|
||||
console.error('Error searching establishments:', error);
|
||||
toast({
|
||||
title: 'Error de búsqueda',
|
||||
description: error instanceof Error ? error.message : 'No se pudo realizar la búsqueda',
|
||||
variant: 'destructive',
|
||||
});
|
||||
setResults([]);
|
||||
} finally {
|
||||
setSearching(false);
|
||||
}
|
||||
}, [toast]);
|
||||
|
||||
const clearResults = useCallback(() => {
|
||||
setResults([]);
|
||||
}, []);
|
||||
|
||||
return {
|
||||
searching,
|
||||
results,
|
||||
searchPlaces,
|
||||
searchEstablishments,
|
||||
clearResults,
|
||||
};
|
||||
};
|
||||
Reference in New Issue
Block a user