import { ButtonContainer } from '@/components/button-container'; import { Button } from '@/components/ui/button'; import { useAppParams } from '@/hooks/use-app-params'; import { handleError } from '@/integrations/trpc/react'; import { zodResolver } from '@hookform/resolvers/zod'; import { useNavigate } from '@tanstack/react-router'; import { useForm } from 'react-hook-form'; import { toast } from 'sonner'; import type { z } from 'zod'; import { zShareDashboard } from '@openpanel/validation'; import { Input } from '@/components/ui/input'; import { Tooltiper } from '@/components/ui/tooltip'; import { useTRPC } from '@/integrations/trpc/react'; import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; import { CheckCircle2, Copy, ExternalLink, TrashIcon } from 'lucide-react'; import { useState } from 'react'; import { popModal } from '.'; import { ModalContent, ModalHeader } from './Modal/Container'; const validator = zShareDashboard; type IForm = z.infer; export default function ShareDashboardModal({ dashboardId, }: { dashboardId: string; }) { const { projectId, organizationId } = useAppParams(); const navigate = useNavigate(); const [copied, setCopied] = useState(false); const trpc = useTRPC(); const queryClient = useQueryClient(); // Fetch current share status const shareQuery = useQuery( trpc.share.dashboard.queryOptions({ dashboardId, }), ); const existingShare = shareQuery.data; const isShared = existingShare?.public ?? false; const shareUrl = existingShare?.id ? `${window.location.origin}/share/dashboard/${existingShare.id}` : ''; const { register, handleSubmit, watch } = useForm({ resolver: zodResolver(validator), defaultValues: { public: true, password: existingShare?.password ? '••••••••' : '', projectId, organizationId, dashboardId, }, }); const password = watch('password'); const mutation = useMutation( trpc.share.createDashboard.mutationOptions({ onError: handleError, onSuccess(res) { queryClient.invalidateQueries(trpc.share.dashboard.pathFilter()); toast('Success', { description: `Your dashboard is now ${ res.public ? 'public' : 'private' }`, action: res.public ? { label: 'View', onClick: () => navigate({ to: '/share/dashboard/$shareId', params: { shareId: res.id, }, }), } : undefined, }); popModal(); }, }), ); const handleCopyLink = () => { navigator.clipboard.writeText(shareUrl); setCopied(true); setTimeout(() => setCopied(false), 2000); toast('Link copied to clipboard'); }; const handleMakePrivate = () => { mutation.mutate({ public: false, password: null, projectId, organizationId, dashboardId, }); }; return ( {isShared && (
Currently shared
)}
{ mutation.mutate({ ...values, // Only send password if it's not the placeholder password: values.password === '••••••••' ? null : values.password || null, }); })} >
); }