99 lines
2.5 KiB
TypeScript
99 lines
2.5 KiB
TypeScript
import { useCallback } from "react";
|
|
import { useAtom } from "jotai";
|
|
import {
|
|
supabaseProjectsAtom,
|
|
supabaseLoadingAtom,
|
|
supabaseErrorAtom,
|
|
selectedSupabaseProjectAtom,
|
|
} from "@/atoms/supabaseAtoms";
|
|
import { IpcClient } from "@/ipc/ipc_client";
|
|
|
|
export function useSupabase() {
|
|
const [projects, setProjects] = useAtom(supabaseProjectsAtom);
|
|
const [loading, setLoading] = useAtom(supabaseLoadingAtom);
|
|
const [error, setError] = useAtom(supabaseErrorAtom);
|
|
const [selectedProject, setSelectedProject] = useAtom(
|
|
selectedSupabaseProjectAtom,
|
|
);
|
|
|
|
const ipcClient = IpcClient.getInstance();
|
|
|
|
/**
|
|
* Load Supabase projects from the API
|
|
*/
|
|
const loadProjects = useCallback(async () => {
|
|
setLoading(true);
|
|
try {
|
|
const projectList = await ipcClient.listSupabaseProjects();
|
|
setProjects(projectList);
|
|
setError(null);
|
|
} catch (error) {
|
|
console.error("Error loading Supabase projects:", error);
|
|
setError(error instanceof Error ? error : new Error(String(error)));
|
|
} finally {
|
|
setLoading(false);
|
|
}
|
|
}, [ipcClient, setProjects, setError, setLoading]);
|
|
|
|
/**
|
|
* Associate a Supabase project with an app
|
|
*/
|
|
const setAppProject = useCallback(
|
|
async (projectId: string, appId: number) => {
|
|
setLoading(true);
|
|
try {
|
|
await ipcClient.setSupabaseAppProject(projectId, appId);
|
|
setError(null);
|
|
} catch (error) {
|
|
console.error("Error setting Supabase project for app:", error);
|
|
setError(error instanceof Error ? error : new Error(String(error)));
|
|
throw error;
|
|
} finally {
|
|
setLoading(false);
|
|
}
|
|
},
|
|
[ipcClient, setError, setLoading],
|
|
);
|
|
|
|
/**
|
|
* Remove a Supabase project association from an app
|
|
*/
|
|
const unsetAppProject = useCallback(
|
|
async (appId: number) => {
|
|
setLoading(true);
|
|
try {
|
|
await ipcClient.unsetSupabaseAppProject(appId);
|
|
setError(null);
|
|
} catch (error) {
|
|
console.error("Error unsetting Supabase project for app:", error);
|
|
setError(error instanceof Error ? error : new Error(String(error)));
|
|
throw error;
|
|
} finally {
|
|
setLoading(false);
|
|
}
|
|
},
|
|
[ipcClient, setError, setLoading],
|
|
);
|
|
|
|
/**
|
|
* Select a project for current use
|
|
*/
|
|
const selectProject = useCallback(
|
|
(projectId: string | null) => {
|
|
setSelectedProject(projectId);
|
|
},
|
|
[setSelectedProject],
|
|
);
|
|
|
|
return {
|
|
projects,
|
|
loading,
|
|
error,
|
|
selectedProject,
|
|
loadProjects,
|
|
setAppProject,
|
|
unsetAppProject,
|
|
selectProject,
|
|
};
|
|
}
|