"use client"; import { useState, useEffect } from "react"; import { useDebounce } from "@calcom/lib/hooks/useDebounce"; import { useLocale } from "@calcom/lib/hooks/useLocale"; import { trpc } from "@calcom/trpc/react"; import type { RouterOutputs } from "@calcom/trpc/react"; import { Avatar } from "@calcom/ui/components/avatar"; import { Button } from "@calcom/ui/components/button"; import { Checkbox, TextField } from "@calcom/ui/components/form"; import { Sheet, SheetContent, SheetHeader, SheetTitle, SheetBody, SheetFooter, } from "@calcom/ui/components/sheet"; import { SkeletonContainer, SkeletonText } from "@calcom/ui/components/skeleton"; import { showToast } from "@calcom/ui/components/toast"; type Flag = RouterOutputs["viewer"]["features"]["list"][number]; interface AssignFeatureSheetProps { flag: Flag; open: boolean; onOpenChange: (open: boolean) => void; } export function AssignFeatureSheet({ flag, open, onOpenChange }: AssignFeatureSheetProps) { const { t } = useLocale(); const utils = trpc.useUtils(); const [searchTerm, setSearchTerm] = useState(""); const debouncedSearchTerm = useDebounce(searchTerm, 300); const { data, fetchNextPage, hasNextPage, isFetchingNextPage, isPending } = trpc.viewer.admin.getTeamsForFeature.useInfiniteQuery( { featureId: flag.slug, limit: 20, searchTerm: debouncedSearchTerm || undefined, }, { enabled: open, getNextPageParam: (lastPage) => lastPage.nextCursor, } ); const teams = data?.pages.flatMap((page) => page.teams) ?? []; useEffect(() => { if (!open) { setSearchTerm(""); } }, [open]); const assignMutation = trpc.viewer.admin.assignFeatureToTeam.useMutation({ onSuccess: () => { utils.viewer.admin.getTeamsForFeature.invalidate({ featureId: flag.slug }); showToast(t("feature_assigned_successfully"), "success"); }, onError: (err) => { showToast(err.message, "error"); }, }); const unassignMutation = trpc.viewer.admin.unassignFeatureFromTeam.useMutation({ onSuccess: () => { utils.viewer.admin.getTeamsForFeature.invalidate({ featureId: flag.slug }); showToast(t("feature_unassigned_successfully"), "success"); }, onError: (err) => { showToast(err.message, "error"); }, }); const handleToggleTeam = (teamId: number, currentlyHasFeature: boolean) => { if (currentlyHasFeature) { unassignMutation.mutate({ teamId, featureId: flag.slug, }); } else { assignMutation.mutate({ teamId, featureId: flag.slug, }); } }; const handleClose = () => { onOpenChange(false); }; const isLoading = assignMutation.isPending || unassignMutation.isPending; return ( Assign: {flag.slug}
setSearchTerm(e.target.value)} />
{isPending ? (
{[...Array(5)].map((_, i) => ( ))}
) : teams && teams.length > 0 ? ( <>
{teams.map((team) => ( ))}
{hasNextPage && (
)} ) : (

{t("no_teams_found")}

)}
); }