ghost-listmonk-connector/ui/hooks/useSons.ts
troneras 1fd7dad8e4 # This is a combination of 2 commits.
# This is the 1st commit message:

first commit

# This is the commit message #2:

fixed cache
2024-08-21 02:08:01 +02:00

75 lines
No EOL
2.4 KiB
TypeScript

// src/hooks/useSons.ts
import { useState, useEffect, useCallback } from 'react';
import { apiClient } from '@/lib/api-client';
import { Son } from '@/lib/types';
export function useSons() {
const [sons, setSons] = useState<Son[]>([]);
const [loading, setLoading] = useState(true);
const [error, setError] = useState<Error | null>(null);
const fetchSons = useCallback(async () => {
setLoading(true);
try {
const response = await apiClient.get<Son[]>('/sons');
setSons(response.data);
setError(null);
} catch (err) {
setError(err instanceof Error ? err : new Error('An error occurred'));
} finally {
setLoading(false);
}
}, []);
const createSon = useCallback(async (sonData: Omit<Son, 'id' | 'created_at' | 'updated_at'>) => {
setLoading(true);
try {
const response = await apiClient.post<Son>('/sons', sonData);
setSons(prevSons => [...prevSons, response.data]);
setError(null);
return response.data;
} catch (err) {
setError(err instanceof Error ? err : new Error('An error occurred'));
throw err;
} finally {
setLoading(false);
}
}, []);
const updateSon = useCallback(async (id: string, sonData: Partial<Son>) => {
setLoading(true);
try {
const response = await apiClient.put<Son>(`/sons/${id}`, sonData);
setSons(prevSons => prevSons.map(son => son.id === id ? response.data : son));
setError(null);
return response.data;
} catch (err) {
setError(err instanceof Error ? err : new Error('An error occurred'));
throw err;
} finally {
setLoading(false);
}
}, []);
const deleteSon = useCallback(async (id: string) => {
setLoading(true);
try {
await apiClient.delete(`/sons/${id}`);
setSons(prevSons => prevSons.filter(son => son.id !== id));
setError(null);
} catch (err) {
setError(err instanceof Error ? err : new Error('An error occurred'));
throw err;
} finally {
setLoading(false);
}
}, []);
useEffect(() => {
fetchSons();
}, [fetchSons]);
return { sons, loading, error, fetchSons, createSon, updateSon, deleteSon };
}