import { Button } from "@/src/components/ui/button"; import { Label } from "@/src/components/ui/label"; import { Popover, PopoverContent, PopoverTrigger, } from "@/src/components/ui/popover"; import { usePostHogClientCapture } from "@/src/features/posthog-analytics/usePostHogClientCapture"; import { useHasProjectAccess } from "@/src/features/rbac/utils/checkProjectAccess"; import { api } from "@/src/utils/api"; import { copyTextToClipboard } from "@/src/utils/clipboard"; import { CheckIcon, Globe, Link, Share2 } from "lucide-react"; import { useState } from "react"; export const PublishTraceSwitch = (props: { traceId: string; projectId: string; isPublic: boolean; size?: "icon" | "icon-xs"; }) => { const capture = usePostHogClientCapture(); const hasAccess = useHasProjectAccess({ projectId: props.projectId, scope: "objects:publish", }); const utils = api.useUtils(); const mut = api.traces.publish.useMutation({ onSuccess: () => utils.traces.invalidate(), }); return ( { mut.mutate({ projectId: props.projectId, traceId: props.traceId, public: val, }); capture("trace_detail:publish_button_click"); }} isLoading={mut.isPending} disabled={!hasAccess} /> ); }; export const PublishSessionSwitch = (props: { sessionId: string; projectId: string; isPublic: boolean; size?: "icon" | "icon-xs"; }) => { const capture = usePostHogClientCapture(); const hasAccess = useHasProjectAccess({ projectId: props.projectId, scope: "objects:publish", }); const utils = api.useUtils(); const mut = api.sessions.publish.useMutation({ onSuccess: () => utils.sessions.invalidate(), }); return ( { mut.mutate({ projectId: props.projectId, sessionId: props.sessionId, public: val, }); capture("session_detail:publish_button_click"); }} isLoading={mut.isPending} disabled={!hasAccess} /> ); }; const Base = (props: { id: string; itemName: string; onChange: (value: boolean) => void; isLoading: boolean; isPublic: boolean; disabled?: boolean; size?: "icon" | "icon-xs"; }) => { const [isCopied, setIsCopied] = useState(false); const copyUrl = () => { setIsCopied(true); void copyTextToClipboard(window.location.href); setTimeout(() => setIsCopied(false), 2500); }; const handleOnClick = () => { if (props.isLoading) return; props.onChange(!props.isPublic); }; return (
{props.isPublic ? ( <> This {props.itemName} is public. Anyone with the link can view this {props.itemName}.
) : ( <> This {props.itemName} is private. Only authorized project members can view this {props.itemName}.
)}
); };