Basic Supabase OAuth integration & project-app binding

This commit is contained in:
Will Chen
2025-04-22 15:22:47 -07:00
parent 3cf93e10a0
commit ec43482d6c
22 changed files with 1469 additions and 9 deletions

110
src/hooks/useSupabase.ts Normal file
View File

@@ -0,0 +1,110 @@
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 {
const result = await ipcClient.setSupabaseAppProject(projectId, appId);
if (result.success) {
setError(null);
return result;
} else {
throw new Error("Failed to set project for app");
}
} 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 {
const result = await ipcClient.unsetSupabaseAppProject(appId);
if (result.success) {
setError(null);
return result;
} else {
throw new Error("Failed to unset project for app");
}
} 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,
};
}