"use client"; import { invoke } from "@tauri-apps/api/core"; import { useCallback, useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; import { GoPlus } from "react-icons/go"; import { toast } from "sonner"; import { CreateGroupDialog } from "@/components/create-group-dialog"; 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, ProfileGroup } from "@/types"; import { RippleButton } from "./ui/ripple"; interface GroupAssignmentDialogProps { isOpen: boolean; onClose: () => void; selectedProfiles: string[]; onAssignmentComplete: () => void; profiles?: BrowserProfile[]; } export function GroupAssignmentDialog({ isOpen, onClose, selectedProfiles, onAssignmentComplete, profiles = [], }: GroupAssignmentDialogProps) { 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 [createDialogOpen, setCreateDialogOpen] = useState(false); const loadGroups = useCallback(async () => { setIsLoading(true); setError(null); try { const groupList = await invoke("get_profile_groups"); setGroups(groupList); } catch (err) { console.error("Failed to load groups:", err); setError( err instanceof Error ? err.message : t("groupManagement.loadFailed"), ); } finally { setIsLoading(false); } }, [t]); const handleAssign = useCallback(async () => { setIsAssigning(true); setError(null); try { await invoke("assign_profiles_to_group", { profileIds: selectedProfiles, groupId: selectedGroupId, }); const groupName = selectedGroupId ? groups.find((g) => g.id === selectedGroupId)?.name || t("groups.unknownGroup") : t("groups.noGroup"); toast.success( t("groups.assignSuccess", { count: selectedProfiles.length, group: groupName, }), ); onAssignmentComplete(); onClose(); } catch (err) { console.error("Failed to assign profiles to group:", err); const errorMessage = err instanceof Error ? err.message : t("groupAssignment.failedFallback"); setError(errorMessage); toast.error(errorMessage); } finally { setIsAssigning(false); } }, [ selectedProfiles, selectedGroupId, groups, onAssignmentComplete, onClose, t, ]); useEffect(() => { if (isOpen) { void loadGroups(); setSelectedGroupId(null); setError(null); } }, [isOpen, loadGroups]); return ( {t("groupAssignment.title")} {selectedProfiles.length === 1 ? t("groupAssignment.description_one", { count: selectedProfiles.length, }) : t("groupAssignment.description_other", { count: selectedProfiles.length, })}
    {selectedProfiles.map((profileId) => { // Find the profile name for display const profile = profiles.find( (p: BrowserProfile) => p.id === profileId, ); const displayName = profile ? profile.name : profileId; return (
  • • {displayName}
  • ); })}
{ setCreateDialogOpen(true); }} > {" "} {t("groupManagement.createGroup")}
{isLoading ? (
{t("groupManagement.loading")}
) : ( )}
{error && (
{error}
)}
{t("common.buttons.cancel")} void handleAssign()} disabled={isLoading} > {t("groupAssignment.assignButton")}
{ setCreateDialogOpen(false); }} onGroupCreated={(group) => { setGroups((prev) => [...prev, group]); setSelectedGroupId(group.id); setCreateDialogOpen(false); }} />
); }