"use client"; import { invoke } from "@tauri-apps/api/core"; import { useCallback, useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; import { toast } from "sonner"; import { LoadingButton } from "@/components/loading-button"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from "@/components/ui/dialog"; import { Label } from "@/components/ui/label"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import type { BrowserProfile, ExtensionGroup } from "@/types"; import { RippleButton } from "./ui/ripple"; interface ExtensionGroupAssignmentDialogProps { isOpen: boolean; onClose: () => void; selectedProfiles: string[]; onAssignmentComplete: () => void; profiles?: BrowserProfile[]; } export function ExtensionGroupAssignmentDialog({ isOpen, onClose, selectedProfiles, onAssignmentComplete, profiles = [], }: ExtensionGroupAssignmentDialogProps) { const { t } = useTranslation(); const [groups, setGroups] = useState([]); const [selectedGroupId, setSelectedGroupId] = useState(null); const [isLoading, setIsLoading] = useState(false); const [isAssigning, setIsAssigning] = useState(false); const [error, setError] = useState(null); const loadGroups = useCallback(async () => { setIsLoading(true); setError(null); try { const groupList = await invoke("list_extension_groups"); setGroups(groupList); } catch (err) { console.error("Failed to load extension groups:", err); setError( err instanceof Error ? err.message : t("extensions.loadGroupsFailed"), ); } finally { setIsLoading(false); } }, [t]); const handleAssign = useCallback(async () => { setIsAssigning(true); setError(null); try { for (const profileId of selectedProfiles) { await invoke("assign_extension_group_to_profile", { profileId, extensionGroupId: selectedGroupId, }); } toast.success(t("extensions.assignSuccess")); onAssignmentComplete(); onClose(); } catch (err) { console.error("Failed to assign extension group:", err); const errorMessage = err instanceof Error ? err.message : t("extensions.assignGroupFailed"); setError(errorMessage); toast.error(errorMessage); } finally { setIsAssigning(false); } }, [selectedProfiles, selectedGroupId, onAssignmentComplete, onClose, t]); useEffect(() => { if (isOpen) { void loadGroups(); setSelectedGroupId(null); setError(null); } }, [isOpen, loadGroups]); return ( {t("extensions.assignTitle")} {t("extensions.assignDescription", { count: selectedProfiles.length, })}
    {selectedProfiles.map((profileId) => { const profile = profiles.find( (p: BrowserProfile) => p.id === profileId, ); const displayName = profile ? profile.name : profileId; return (
  • • {displayName}
  • ); })}
{isLoading ? (
{t("common.buttons.loading")}
) : ( )}
{error && (
{error}
)}
{t("common.buttons.cancel")} void handleAssign()} disabled={isLoading} > {t("common.buttons.apply")}
); }