README / client /src /hooks /useSupabaseData.ts
firoruheqo4's picture
Upload 139 files
926b211 verified
Raw
History Blame Contribute Delete
2.2 kB
import { useState, useEffect } from 'react';
import { supabase } from '@/lib/supabaseClient';
import type { Project } from '@/types/project';
export function useSupabaseData() {
const [projects, setProjects] = useState<Project[]>([]);
const [loading, setLoading] = useState(true);
const [error, setError] = useState<string | null>(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<Project>[]) => {
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,
};
}