import { useCallback, useEffect, useMemo, useState } from 'react'; import { isElectronMode } from '@renderer/api'; import { Badge } from '@renderer/components/ui/badge'; import { Button } from '@renderer/components/ui/button'; import { useStore } from '@renderer/store'; import { Trash2 } from 'lucide-react'; import { useShallow } from 'zustand/react/shallow'; import { CreateTeamDialog } from './dialogs/CreateTeamDialog'; import { TeamEmptyState } from './TeamEmptyState'; export const TeamListView = (): React.JSX.Element => { const electronMode = isElectronMode(); const [showCreateDialog, setShowCreateDialog] = useState(false); const { teams, teamsLoading, teamsError, fetchTeams, openTeamTab, deleteTeam } = useStore( useShallow((s) => ({ teams: s.teams, teamsLoading: s.teamsLoading, teamsError: s.teamsError, fetchTeams: s.fetchTeams, openTeamTab: s.openTeamTab, deleteTeam: s.deleteTeam, })) ); const { connectionMode, createTeam, cancelProvisioning, provisioningRuns, activeProvisioningRunId, provisioningError, } = useStore( useShallow((s) => ({ connectionMode: s.connectionMode, createTeam: s.createTeam, cancelProvisioning: s.cancelProvisioning, provisioningRuns: s.provisioningRuns, activeProvisioningRunId: s.activeProvisioningRunId, provisioningError: s.provisioningError, })) ); const activeProgress = useMemo( () => (activeProvisioningRunId ? (provisioningRuns[activeProvisioningRunId] ?? null) : null), [activeProvisioningRunId, provisioningRuns] ); const canCreate = electronMode && connectionMode === 'local'; const handleDeleteTeam = useCallback( (teamName: string, e: React.MouseEvent) => { e.stopPropagation(); const confirmed = window.confirm(`Удалить команду "${teamName}"? Это действие необратимо.`); if (!confirmed) { return; } void deleteTeam(teamName); }, [deleteTeam] ); useEffect(() => { if (!electronMode) { return; } void fetchTeams(); }, [electronMode, fetchTeams]); if (!electronMode) { return (

Teams доступен только в Electron-режиме

В browser mode доступ к локальным папкам `~/.claude/teams` недоступен.

); } const createDialogElement = ( t.teamName)} onClose={() => setShowCreateDialog(false)} onCreate={async (request) => { await createTeam(request); }} onCancelProvisioning={async (runId) => { await cancelProvisioning(runId); }} onOpenTeam={openTeamTab} /> ); const renderHeader = (): React.JSX.Element => (

Teams

{!canCreate ? (

Доступно только в local Electron-режиме.

) : null}
); if (teamsLoading) { return (
{renderHeader()}
Загружаем команды...
{createDialogElement}
); } if (teamsError) { return (
{renderHeader()}

Не удалось загрузить команды

{teamsError}

{createDialogElement}
); } if (teams.length === 0) { return (
{renderHeader()} {createDialogElement}
); } return (
{renderHeader()}
{teams.map((team) => (
openTeamTab(team.teamName)} onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); openTeamTab(team.teamName); } }} >

{team.displayName}

{team.description || 'Без описания'}

Участников: {team.memberCount} Задач: {team.taskCount}
))}
{createDialogElement}
); };