| 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);
|
| }
|
| };
|
|
|
|
|
| const replaceAllProjects = async (newProjects: Partial<Project>[]) => {
|
| try {
|
| setLoading(true);
|
| setError(null);
|
|
|
|
|
| const { error: deleteError } = await supabase
|
| .from('projects')
|
| .delete()
|
| .neq('id', 0);
|
|
|
| if (deleteError) {
|
| throw deleteError;
|
| }
|
|
|
|
|
| if (newProjects.length > 0) {
|
| const { error: insertError } = await supabase
|
| .from('projects')
|
| .insert(newProjects);
|
|
|
| if (insertError) {
|
| throw insertError;
|
| }
|
| }
|
|
|
|
|
| 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,
|
| };
|
| } |