import { useEffect } from "react"; import { Button } from "@/components/ui/button"; import { Label } from "@/components/ui/label"; 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"; import { useDeepLink } from "@/contexts/DeepLinkContext"; // @ts-ignore import supabaseLogoLight from "../../assets/supabase/supabase-logo-wordmark--light.svg"; // @ts-ignore import supabaseLogoDark from "../../assets/supabase/supabase-logo-wordmark--dark.svg"; // @ts-ignore import connectSupabaseDark from "../../assets/supabase/connect-supabase-dark.svg"; // @ts-ignore import connectSupabaseLight from "../../assets/supabase/connect-supabase-light.svg"; import { ExternalLink } from "lucide-react"; import { useTheme } from "@/contexts/ThemeContext"; export function SupabaseConnector({ appId }: { appId: number }) { const { settings, refreshSettings } = useSettings(); const { app, refreshApp } = useLoadApp(appId); const { lastDeepLink } = useDeepLink(); const { isDarkMode } = useTheme(); useEffect(() => { const handleDeepLink = async () => { if (lastDeepLink?.type === "supabase-oauth-return") { await refreshSettings(); await refreshApp(); } }; handleDeepLink(); }, [lastDeepLink]); 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 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: " + error); } }; 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 (

Integrations

{ if (settings?.isTestMode) { await IpcClient.getInstance().fakeHandleSupabaseConnect({ appId, fakeProjectId: "fake-project-id", }); } else { await IpcClient.getInstance().openExternalUrl( "https://supabase-oauth.dyad.sh/api/connect-supabase/login", ); } }} src={isDarkMode ? connectSupabaseDark : connectSupabaseLight} alt="Connect to Supabase" className="w-full h-10 min-h-8 min-w-20 cursor-pointer" data-testid="connect-supabase-button" // className="h-10" />
); }