'use client' import { useState } from 'react' import { useTranslations } from 'next-intl' import { Users, Plus, Settings, ChevronRight, Crown, Shield, Eye, Loader2 } from 'lucide-react' import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@nextsparkjs/core/components/ui/card' import { Button } from '@nextsparkjs/core/components/ui/button' import { Badge } from '@nextsparkjs/core/components/ui/badge' import { Avatar, AvatarFallback, AvatarImage } from '@nextsparkjs/core/components/ui/avatar' import { Separator } from '@nextsparkjs/core/components/ui/separator' import { useTeamContext } from '@nextsparkjs/core/contexts/TeamContext' import { useTeamsConfig } from '@nextsparkjs/core/hooks/useTeamsConfig' import { TeamMembersList } from '@nextsparkjs/core/components/teams/TeamMembersList' import { TeamPendingInvitations } from '@nextsparkjs/core/components/teams/TeamPendingInvitations' import { CreateTeamDialog } from '@nextsparkjs/core/components/teams/CreateTeamDialog' import { InlineEditableField } from '@nextsparkjs/core/components/teams/InlineEditableField' import { sel } from '@nextsparkjs/core/selectors' import { TeamRole } from '@nextsparkjs/core/lib/teams/types' import { getTemplateOrDefaultClient } from '@nextsparkjs/registries/template-registry.client' // Role icons map - core roles only, custom roles use fallback const roleIconsMap: Record = { owner: Crown, admin: Shield, member: null, viewer: Eye, } // Role colors map - core roles only, custom roles use fallback const roleColorsMap: Record = { owner: 'destructive', admin: 'default', member: 'secondary', viewer: 'outline', } // Type-safe helpers - fallback handles any custom theme roles const getRoleIcon = (role: TeamRole) => roleIconsMap[role] ?? Eye const getRoleColor = (role: TeamRole) => roleColorsMap[role] ?? 'outline' function TeamsSettingsPage() { const t = useTranslations('settings') const tTeams = useTranslations('teams') const { userTeams, currentTeam, isLoading } = useTeamContext() const { mode, canCreate, canSwitch } = useTeamsConfig() const [selectedTeamId, setSelectedTeamId] = useState(null) const [showCreateDialog, setShowCreateDialog] = useState(false) // In single-user mode, hide the teams settings page content // since there's only one team and no collaboration features const isSingleUserMode = mode === 'single-user' // Find selected team membership const selectedMembership = selectedTeamId ? userTeams.find(m => m.team.id === selectedTeamId) : null if (isLoading) { return (
{tTeams('messages.loading')}
) } return ( <>
{/* Header */}

{t('teams.title')}

{t('teams.description')}

{/* Single-user mode: show simplified view */} {isSingleUserMode && currentTeam && (
{t('teams.singleUserDescription', { fallback: 'Your personal workspace.' })}
{currentTeam.name.slice(0, 2).toUpperCase()}
{currentTeam.name}
{currentTeam.slug}
)} {/* Teams List Card - only show if not single-user mode */} {!isSingleUserMode && (
{/* Only show Create Team button if mode allows it */} {canCreate && ( )}
{t('teams.yourTeamsDescription')}
{userTeams.length === 0 ? (
{t('teams.noTeams')}
) : ( userTeams.map((membership) => { const team = membership.team const role = membership.role as TeamRole const RoleIcon = getRoleIcon(role) const isSelected = selectedTeamId === team.id return ( ) }) )}
)} {/* Selected Team Details - only show if not single-user mode */} {!isSingleUserMode && selectedMembership && (
{/* Team Info */}

{selectedMembership.team.slug}

{tTeams(`roles.${selectedMembership.role}`)}
{/* Team Members */} {/* Pending Invitations */}
)}
{/* Create Team Dialog - only render if mode allows team creation */} {canCreate && ( )} ) } export default getTemplateOrDefaultClient('app/dashboard/settings/teams/page.tsx', TeamsSettingsPage)