You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

69 lines
1.5 KiB
JavaScript

import React, { createContext, useContext, useState } from 'react';
import axios from 'axios';
const DataContext = createContext();
export function useReportData() {
const context = useContext(DataContext);
if (!context) {
throw new Error('useReportData must be used within DataProvider');
}
return context;
}
export function DataProvider({ children }) {
const [reportData, setReportData] = useState(null);
const [isLoading, setIsLoading] = useState(false);
const [error, setError] = useState(null);
const fetchData = async (apiEndpoint) => {
if (!apiEndpoint || apiEndpoint.trim() === '') {
setError('API endpoint URL is required');
return;
}
setIsLoading(true);
setError(null);
try {
const response = await axios.get(apiEndpoint);
setReportData(response.data);
setError(null);
} catch (err) {
console.error('Error fetching report data:', err);
setError(err.response?.data?.message || err.message || 'Failed to fetch data');
setReportData(null);
} finally {
setIsLoading(false);
}
};
const setData = (data) => {
setReportData(data);
setError(null);
};
const clearData = () => {
setReportData(null);
setError(null);
setIsLoading(false);
};
const value = {
reportData,
isLoading,
error,
fetchData,
setData,
clearData
};
return (
<DataContext.Provider value={value}>
{children}
</DataContext.Provider>
);
}
export default DataContext;