import { useState, useEffect } from 'react'; import { supabase } from '@/lib/supabaseClient'; import type { Project } from '@/types/project'; export function useSupabaseData() { const [projects, setProjects] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); // 加载项目数据 const loadProjects = async () => { try { setLoading(true); setError(null); const { data, error: fetchError } = await supabase .from('projects') .select('*') .order('created_at', { ascending: false }); if (fetchError) { throw fetchError; } setProjects(data || []); } catch (err) { console.error('加载项目数据失败:', err); setError(err instanceof Error ? err.message : '加载失败'); setProjects([]); } finally { setLoading(false); } }; // 批量替换项目数据(Excel上传) const replaceAllProjects = async (newProjects: Partial[]) => { try { setLoading(true); setError(null); // 1. 删除所有现有数据 const { error: deleteError } = await supabase .from('projects') .delete() .neq('id', 0); // 删除所有记录 if (deleteError) { throw deleteError; } // 2. 插入新数据 if (newProjects.length > 0) { const { error: insertError } = await supabase .from('projects') .insert(newProjects); if (insertError) { throw insertError; } } // 3. 重新加载数据 await loadProjects(); return { success: true }; } catch (err) { console.error('替换项目数据失败:', err); setError(err instanceof Error ? err.message : '替换失败'); return { success: false, error: err }; } finally { setLoading(false); } }; // 初始加载 useEffect(() => { loadProjects(); }, []); return { projects, loading, error, refresh: loadProjects, replaceAllProjects, }; }