Implement missing API endpoints

This commit is contained in:
gpt-engineer-app[bot]
2025-10-11 15:20:47 +00:00
parent c732180bce
commit 7977924690
4 changed files with 239 additions and 0 deletions

61
src/hooks/useAnalytics.ts Normal file
View 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
View 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,
};
};