import { useEffect, useState } from "react"; import { featureEnabled } from "../../domainContext"; import { ShareMode, toShareMode } from "../../lib/shareMode"; import type { components } from "../../reflector-api"; type GetTranscript = components["schemas"]["GetTranscript"]; type GetTranscriptTopic = components["schemas"]["GetTranscriptTopic"]; type UpdateTranscript = components["schemas"]["UpdateTranscript"]; import { Box, Flex, IconButton, Text, Dialog, Portal, CloseButton, Select, createListCollection, } from "@chakra-ui/react"; import { LuShare2 } from "react-icons/lu"; import { useTranscriptUpdate } from "../../lib/apiHooks"; import ShareLink from "./shareLink"; import ShareCopy from "./shareCopy"; import ShareZulip from "./shareZulip"; import { useAuth } from "../../lib/AuthProvider"; type ShareAndPrivacyProps = { finalSummaryRef: any; transcriptResponse: GetTranscript; topicsResponse: GetTranscriptTopic[]; }; type ShareOption = { value: ShareMode; label: string }; const shareOptionsData = [ { label: "Private", value: toShareMode("private") }, { label: "Secure", value: toShareMode("semi-private") }, { label: "Public", value: toShareMode("public") }, ]; const shareOptions = createListCollection({ items: shareOptionsData, }); export default function ShareAndPrivacy(props: ShareAndPrivacyProps) { const [showModal, setShowModal] = useState(false); const [isOwner, setIsOwner] = useState(false); const [shareMode, setShareMode] = useState( shareOptionsData.find( (option) => option.value === props.transcriptResponse.share_mode, ) || shareOptionsData[0], ); const [shareLoading, setShareLoading] = useState(false); const requireLogin = featureEnabled("requireLogin"); const updateTranscriptMutation = useTranscriptUpdate(); const updateShareMode = async (selectedValue: string) => { const selectedOption = shareOptionsData.find( (option) => option.value === selectedValue, ); if (!selectedOption) return; setShareLoading(true); const requestBody: UpdateTranscript = { share_mode: selectedValue as "public" | "semi-private" | "private", }; try { const updatedTranscript = await updateTranscriptMutation.mutateAsync({ params: { path: { transcript_id: props.transcriptResponse.id }, }, body: requestBody, }); setShareMode( shareOptionsData.find( (option) => option.value === updatedTranscript.share_mode, ) || shareOptionsData[0], ); } catch (err) { console.error("Failed to update share mode:", err); } finally { setShareLoading(false); } }; const auth = useAuth(); const userId = auth.status === "authenticated" ? auth.user?.id : null; useEffect(() => { setIsOwner(!!(requireLogin && userId === props.transcriptResponse.user_id)); }, [userId, props.transcriptResponse.user_id]); return ( <> setShowModal(true)} aria-label="Share" size="sm" variant="subtle" > setShowModal(e.open)} size="lg" > Share {requireLogin && ( Share mode {shareMode.value === "private" && "This transcript is private and can only be accessed by you."} {shareMode.value === "semi-private" && "This transcript is secure. Only authenticated users can access it."} {shareMode.value === "public" && "This transcript is public. Everyone can access it."} {isOwner && ( updateShareMode(e.value[0])} disabled={shareLoading} collection={shareOptions} lazyMount={true} > {shareMode.label} {shareOptions.items.map((option) => ( {option.label} ))} )} )} Share options {requireLogin && ( )} ); }