Spaces:
Running
Running
| import { useState, useEffect } from 'react'; | |
| import axios from 'axios'; | |
| import { useNavigate } from 'react-router-dom'; | |
| export const useDashboardLogic = (user) => { | |
| const navigate = useNavigate(); | |
| const [projects, setProjects] = useState([]); | |
| const [allProjects, setAllProjects] = useState([]); | |
| const [loading, setLoading] = useState(true); | |
| const [aiGenerating, setAiGenerating] = useState(false); | |
| const [searchTerm, setSearchTerm] = useState(''); | |
| const API_URL = import.meta.env.VITE_API_URL; | |
| useEffect(() => { | |
| if (user) { | |
| fetchProjects(); | |
| } else { | |
| setLoading(false); | |
| } | |
| }, [user]); | |
| const fetchProjects = async () => { | |
| try { | |
| console.log('[Dashboard] Fetching projects for user:', user.id, 'at URL:', `${API_URL}/graphs/user/${user.id}`); | |
| const res = await axios.get(`${API_URL}/graphs/user/${user.id}`); | |
| console.log('[Dashboard] Projects loaded successfully:', res.data); | |
| setAllProjects(res.data); | |
| setProjects(res.data); | |
| } catch (err) { | |
| console.error('[Dashboard] Error fetching projects:', err); | |
| } finally { | |
| setLoading(false); | |
| } | |
| }; | |
| const handleCreateProject = async (title, templateKey = null) => { | |
| if (!title || !user) return; | |
| try { | |
| const res = await axios.post(`${API_URL}/graphs`, { | |
| userId: user.id, | |
| title, | |
| description: 'New strategy path...', | |
| templateKey | |
| }); | |
| navigate(`/canvas/${res.data.id}`); | |
| } catch (err) { | |
| const msg = err.response?.data?.message; | |
| if (err.response?.status === 400 && msg) { | |
| alert(msg); | |
| if (msg.toLowerCase().includes('canvas') || msg.toLowerCase().includes('limit')) { | |
| navigate('/subscription'); | |
| } | |
| } else { | |
| console.error('Error creating project', err); | |
| } | |
| } | |
| }; | |
| const handleCreateProjectWithAI = async (goal) => { | |
| if (!goal || !user) return; | |
| setAiGenerating(true); | |
| try { | |
| const res = await axios.post(`${API_URL}/AI/generate-goal`, { | |
| userId: user.id, | |
| goal | |
| }); | |
| navigate(`/canvas/${res.data.id}`); | |
| return res.data; | |
| } catch (err) { | |
| const msg = err.response?.data?.message; | |
| if (msg) { | |
| alert(msg); | |
| if (err.response?.status === 403 && msg.toLowerCase().includes('daily')) { | |
| navigate('/subscription'); | |
| } else if ((err.response?.status === 400) && (msg.toLowerCase().includes('canvas') || msg.toLowerCase().includes('limit'))) { | |
| navigate('/subscription'); | |
| } | |
| } else { | |
| console.error('Error creating project with AI', err); | |
| } | |
| throw err; | |
| } finally { | |
| setAiGenerating(false); | |
| } | |
| }; | |
| const handleDeleteProject = async (id) => { | |
| try { | |
| await axios.delete(`${API_URL}/graphs/${id}`); | |
| setProjects(projects.filter(p => p.id !== id)); | |
| setAllProjects(allProjects.filter(p => p.id !== id)); | |
| } catch (err) { | |
| console.error('Error deleting project', err); | |
| } | |
| }; | |
| const filteredProjects = projects.filter(p => | |
| p.title.toLowerCase().includes(searchTerm.toLowerCase()) | |
| ); | |
| // Count only owned projects (not shared ones) for limit checking | |
| const ownedCount = allProjects.filter(p => !p.isShared).length; | |
| return { | |
| projects: filteredProjects, | |
| loading, | |
| aiGenerating, | |
| searchTerm, | |
| setSearchTerm, | |
| handleCreateProject, | |
| handleCreateProjectWithAI, | |
| handleDeleteProject, | |
| ownedCount | |
| }; | |
| }; | |