diff --git a/src/app/(main)/teams/[teamId]/TeamSettings.tsx b/src/app/(main)/teams/[teamId]/TeamSettings.tsx index e854c127e..0184b3db6 100644 --- a/src/app/(main)/teams/[teamId]/TeamSettings.tsx +++ b/src/app/(main)/teams/[teamId]/TeamSettings.tsx @@ -9,6 +9,7 @@ import { TeamsMemberAddButton } from '../TeamsMemberAddButton'; import { TeamEditForm } from './TeamEditForm'; import { TeamManage } from './TeamManage'; import { TeamMembersDataTable } from './TeamMembersDataTable'; +import { TeamTwoFactorSettings } from './TeamTwoFactorSettings'; export function TeamSettings({ teamId }: { teamId: string }) { const team: any = useTeam(); @@ -45,6 +46,11 @@ export function TeamSettings({ teamId }: { teamId: string }) { + {isAdmin && ( + + + + )} {isTeamOwner && ( diff --git a/src/app/(main)/teams/[teamId]/TeamTwoFactorSettings.tsx b/src/app/(main)/teams/[teamId]/TeamTwoFactorSettings.tsx new file mode 100644 index 000000000..b5005af5f --- /dev/null +++ b/src/app/(main)/teams/[teamId]/TeamTwoFactorSettings.tsx @@ -0,0 +1,50 @@ +'use client'; +import { Column, Row, Switch, Text, Tooltip, TooltipTrigger } from '@umami/react-zen'; +import { useMessages, useUpdateQuery, useTwoFactorStatusQuery } from '@/components/hooks'; +import { useApi } from '@/components/hooks/useApi'; +import { useQuery, useQueryClient } from '@tanstack/react-query'; + +export function TeamTwoFactorSettings({ teamId }: { teamId: string }) { + const { t, labels, messages } = useMessages(); + const { get } = useApi(); + const queryClient = useQueryClient(); + + const { data: globalStatus } = useTwoFactorStatusQuery(true); + const isGlobalRequired = globalStatus?.requiredReason === 'global'; + + const { data: teamData } = useQuery({ + queryKey: ['team', teamId], + queryFn: () => get(`/teams/${teamId}`), + }); + + const { mutateAsync: setTeamRequired } = useUpdateQuery(`/admin/teams/${teamId}/2fa`); + + const twoFactorRequired = !!(teamData as any)?.twoFactorRequired; + + const handleToggle = async (value: boolean) => { + await setTeamRequired({ required: value }); + queryClient.invalidateQueries({ queryKey: ['team', teamId] }); + }; + + return ( + + {t(labels.twoFactorAuth)} + + + + + {t(labels.twoFactorRequireTeam)} + + {t(labels.twoFactorGlobalActiveTooltip)} + + + + {t(messages.twoFactorRequireTeamDescription)} + + + ); +}