import { useState } from "react"; import { useMutation, useQuery } from "@tanstack/react-query"; import { Button } from "@/components/ui/button"; import { IpcClient } from "@/ipc/ipc_client"; import { showSuccess } from "@/lib/toast"; import { Smartphone, TabletSmartphone, Loader2, ExternalLink, Copy, } from "lucide-react"; import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, } from "@/components/ui/dialog"; import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from "@/components/ui/card"; interface CapacitorControlsProps { appId: number; } type CapacitorStatus = "idle" | "syncing" | "opening"; export function CapacitorControls({ appId }: CapacitorControlsProps) { const [errorDialogOpen, setErrorDialogOpen] = useState(false); const [errorDetails, setErrorDetails] = useState<{ title: string; message: string; } | null>(null); const [iosStatus, setIosStatus] = useState("idle"); const [androidStatus, setAndroidStatus] = useState("idle"); // Check if Capacitor is installed const { data: isCapacitor, isLoading } = useQuery({ queryKey: ["is-capacitor", appId], queryFn: () => IpcClient.getInstance().isCapacitor({ appId }), enabled: appId !== undefined && appId !== null, }); const showErrorDialog = (title: string, error: unknown) => { const errorMessage = error instanceof Error ? error.message : String(error); setErrorDetails({ title, message: errorMessage }); setErrorDialogOpen(true); }; // Sync and open iOS mutation const syncAndOpenIosMutation = useMutation({ mutationFn: async () => { setIosStatus("syncing"); // First sync await IpcClient.getInstance().syncCapacitor({ appId }); setIosStatus("opening"); // Then open iOS await IpcClient.getInstance().openIos({ appId }); }, onSuccess: () => { setIosStatus("idle"); showSuccess("Synced and opened iOS project in Xcode"); }, onError: (error) => { setIosStatus("idle"); showErrorDialog("Failed to sync and open iOS project", error); }, }); // Sync and open Android mutation const syncAndOpenAndroidMutation = useMutation({ mutationFn: async () => { setAndroidStatus("syncing"); // First sync await IpcClient.getInstance().syncCapacitor({ appId }); setAndroidStatus("opening"); // Then open Android await IpcClient.getInstance().openAndroid({ appId }); }, onSuccess: () => { setAndroidStatus("idle"); showSuccess("Synced and opened Android project in Android Studio"); }, onError: (error) => { setAndroidStatus("idle"); showErrorDialog("Failed to sync and open Android project", error); }, }); // Helper function to get button text based on status const getIosButtonText = () => { switch (iosStatus) { case "syncing": return { main: "Syncing...", sub: "Building app" }; case "opening": return { main: "Opening...", sub: "Launching Xcode" }; default: return { main: "Sync & Open iOS", sub: "Xcode" }; } }; const getAndroidButtonText = () => { switch (androidStatus) { case "syncing": return { main: "Syncing...", sub: "Building app" }; case "opening": return { main: "Opening...", sub: "Launching Android Studio" }; default: return { main: "Sync & Open Android", sub: "Android Studio" }; } }; // Don't render anything if loading or if Capacitor is not installed if (isLoading || !isCapacitor) { return null; } const iosButtonText = getIosButtonText(); const androidButtonText = getAndroidButtonText(); return ( <> Mobile Development Sync and open your Capacitor mobile projects
{/* Error Dialog */} {errorDetails?.title} An error occurred while running the Capacitor command. See details below: {errorDetails && (
                  {errorDetails.message}
                
)}
); }