import { useStore } from '@nanostores/react'; import useViewport from '~/lib/hooks'; import { chatStore } from '~/lib/stores/chat'; import { netlifyConnection } from '~/lib/stores/netlify'; import { vercelConnection } from '~/lib/stores/vercel'; import { workbenchStore } from '~/lib/stores/workbench'; import { classNames } from '~/utils/classNames'; import { useEffect, useRef, useState } from 'react'; import { streamingState } from '~/lib/stores/streaming'; import { NetlifyDeploymentLink } from '~/components/chat/NetlifyDeploymentLink.client'; import { VercelDeploymentLink } from '~/components/chat/VercelDeploymentLink.client'; import { useVercelDeploy } from '~/components/deploy/VercelDeploy.client'; import { useNetlifyDeploy } from '~/components/deploy/NetlifyDeploy.client'; interface HeaderActionButtonsProps {} export function HeaderActionButtons({}: HeaderActionButtonsProps) { const showWorkbench = useStore(workbenchStore.showWorkbench); const { showChat } = useStore(chatStore); const netlifyConn = useStore(netlifyConnection); const vercelConn = useStore(vercelConnection); const [activePreviewIndex] = useState(0); const previews = useStore(workbenchStore.previews); const activePreview = previews[activePreviewIndex]; const [isDeploying, setIsDeploying] = useState(false); const [deployingTo, setDeployingTo] = useState<'netlify' | 'vercel' | null>(null); const isSmallViewport = useViewport(1024); const canHideChat = showWorkbench || !showChat; const [isDropdownOpen, setIsDropdownOpen] = useState(false); const dropdownRef = useRef(null); const isStreaming = useStore(streamingState); const { handleVercelDeploy } = useVercelDeploy(); const { handleNetlifyDeploy } = useNetlifyDeploy(); useEffect(() => { function handleClickOutside(event: MouseEvent) { if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) { setIsDropdownOpen(false); } } document.addEventListener('mousedown', handleClickOutside); return () => document.removeEventListener('mousedown', handleClickOutside); }, []); const onVercelDeploy = async () => { setIsDeploying(true); setDeployingTo('vercel'); try { await handleVercelDeploy(); } finally { setIsDeploying(false); setDeployingTo(null); } }; const onNetlifyDeploy = async () => { setIsDeploying(true); setDeployingTo('netlify'); try { await handleNetlifyDeploy(); } finally { setIsDeploying(false); setDeployingTo(null); } }; return (
{isDropdownOpen && (
)}
); } interface ButtonProps { active?: boolean; disabled?: boolean; children?: any; onClick?: VoidFunction; className?: string; } function Button({ active = false, disabled = false, children, onClick, className }: ButtonProps) { return ( ); }