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}.
>
)}
);
};