Move to React

Add .gitignore

Removed node_modules from previous commit

Fix task modes

Fix task modes

Fix task modes

Remove node_modules

Update basic task modal

Add notes functionality

Improve UI

Setup views

Add scopes

Fix projects layout

Restructure

Fix rest of the UI issues

Cleanup old views

Add .env to .gitignore
This commit is contained in:
Chris Veleris 2024-10-05 21:11:53 +03:00
parent d06e124e5b
commit dfcb97a355
125 changed files with 18516 additions and 1134 deletions

View file

@ -0,0 +1,55 @@
// src/hooks/useFetch.ts
import { useState, useEffect } from 'react';
interface UseFetchResult<T> {
data: T | null;
loading: boolean;
error: string | null;
}
const useFetch = <T,>(url: string, options?: RequestInit): UseFetchResult<T> => {
const [data, setData] = useState<T | null>(null);
const [loading, setLoading] = useState<boolean>(true);
const [error, setError] = useState<string | null>(null);
useEffect(() => {
let isMounted = true; // To prevent setting state on unmounted component
const controller = new AbortController(); // To handle component unmounting
const fetchData = async () => {
setLoading(true);
setError(null);
try {
const response = await fetch(url, { ...options, signal: controller.signal });
if (!response.ok) {
const errorData = await response.json();
throw new Error(errorData.error || 'Failed to fetch data.');
}
const result: T = await response.json();
if (isMounted) {
setData(result);
}
} catch (err: any) {
if (isMounted) {
if (err.name !== 'AbortError') {
setError(err.message);
}
}
} finally {
if (isMounted) setLoading(false);
}
};
fetchData();
// Cleanup function to abort fetch on unmount
return () => {
isMounted = false;
controller.abort();
};
}, [url, JSON.stringify(options)]); // Note: Be cautious with dependencies
return { data, loading, error };
};
export default useFetch;