import { useEffect, useCallback } from "react"; import { useStore } from "../state/store.tsx"; import { setProjects, setLoading, setError, setMessage, } from "../state/actions.ts"; import { scanAllDirectories, sortProjects } from "../scanner/index.ts"; import type { GitforestConfig } from "../types/index.ts"; import { errorToString } from "../utils/errors.ts"; export function useProjects(config: GitforestConfig) { const { state, dispatch } = useStore(); const { sortBy, sortDirection } = state; const loadProjects = useCallback(async () => { dispatch(setLoading(true)); dispatch(setError(null)); try { const projects = await scanAllDirectories(config); const sorted = sortProjects(projects, sortBy, sortDirection); dispatch(setProjects(sorted)); dispatch(setMessage(`Found ${projects.length} projects`)); } catch (error) { dispatch(setError(errorToString(error))); } finally { dispatch(setLoading(false)); } }, [config, dispatch, sortBy, sortDirection]); // Load on mount useEffect(() => { loadProjects(); }, []); // Re-sort when sort changes useEffect(() => { if (state.projects.length > 0 && !state.isLoading) { const sorted = sortProjects(state.projects, sortBy, sortDirection); dispatch(setProjects(sorted)); } }, [sortBy, sortDirection]); return { loadProjects }; }