import { useState, useEffect } from "react"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { SupabaseSchema } from "@/lib/schemas"; import { IpcClient } from "@/ipc/ipc_client"; import { toast } from "sonner"; import { useSettings } from "@/hooks/useSettings"; import { useSupabase } from "@/hooks/useSupabase"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from "@/components/ui/card"; import { Skeleton } from "@/components/ui/skeleton"; import { useLoadApp } from "@/hooks/useLoadApp"; const OAUTH_CLIENT_ID = "bf747de7-60bb-48a2-9015-6494e0b04983"; export function SupabaseConnector({ appId }: { appId: number }) { const [isConnecting, setIsConnecting] = useState(false); const { settings } = useSettings(); const { app, refreshApp } = useLoadApp(appId); const { projects, loading, error, loadProjects, setAppProject, unsetAppProject, } = useSupabase(); const currentProjectId = app?.supabaseProjectId; useEffect(() => { // Load projects when the component mounts and user is connected if (settings?.supabase?.accessToken) { loadProjects(); } }, [settings?.supabase?.accessToken, loadProjects]); const handleConnect = async () => { try { setIsConnecting(true); // TODO: replace this with deployed URL const result = await IpcClient.getInstance().openExternalUrl( "http://localhost:30123/connect-supabase/login" ); if (!result.success) { throw new Error(result.error || "Failed to open auth URL"); } toast.success("Successfully connected to Supabase"); } catch (error) { console.error("Failed to connect to Supabase:", error); toast.error("Failed to connect to Supabase"); } finally { setIsConnecting(false); } }; const handleProjectSelect = async (projectId: string) => { try { await setAppProject(projectId, appId); toast.success("Project connected to app successfully"); await refreshApp(); } catch (error) { toast.error("Failed to connect project to app"); } }; const handleUnsetProject = async () => { try { await unsetAppProject(appId); toast.success("Project disconnected from app successfully"); await refreshApp(); } catch (error) { console.error("Failed to disconnect project:", error); toast.error("Failed to disconnect project from app"); } }; if (settings?.supabase?.accessToken) { if (app?.supabaseProjectName) { return ( Supabase Project This app is connected to project: {app.supabaseProjectName} ); } return ( Supabase Projects Select a Supabase project to connect to this app {loading ? (
) : error ? (
Error loading projects: {error.message}
) : (
{projects.length === 0 ? (

No projects found in your Supabase account.

) : ( <>
{currentProjectId && (
This app is connected to project:{" "} {projects.find((p) => p.id === currentProjectId)?.name || currentProjectId}
)} )}
)}
); } return (

Connect to Supabase

); }