import { Alert } from "react-native"; import { useEffect, useState, useCallback } from "react"; interface UseAppwriteOptions> { fn: (params: P) => Promise; params?: P; skip?: boolean; } interface UseAppwriteReturn { data: T | null; loading: boolean; error: string | null; refetch: (newParams: P) => Promise; } export const useAppwrite = >({ fn, params = {} as P, skip = false, }: UseAppwriteOptions): UseAppwriteReturn => { const [data, setData] = useState(null); const [loading, setLoading] = useState(!skip); const [error, setError] = useState(null); const fetchData = useCallback( async (fetchParams: P) => { setLoading(true); setError(null); try { const result = await fn(fetchParams); setData(result); } catch (err: unknown) { const errorMessage = err instanceof Error ? err.message : "An unknown error occurred"; setError(errorMessage); Alert.alert("Error", errorMessage); } finally { setLoading(false); } }, [fn] ); useEffect(() => { if (!skip) { fetchData(params); } }, []); const refetch = async (newParams: P) => await fetchData(newParams); return { data, loading, error, refetch }; };