import { PROXY_CONNECTION_STATUS, TProxyConnectionStatus } from '@common/constants' import { Switch } from '@renderer/components/ui/switch' import { useToast } from '@renderer/components/ui/use-toast' import { useEffect, useState } from 'react' import PublicAddress from './PublicAddress' import { cn } from '@renderer/lib/utils' export default function Proxy(): JSX.Element { const { toast } = useToast() const [status, setStatus] = useState(PROXY_CONNECTION_STATUS.DISCONNECTED) const [publicAddress, setPublicAddress] = useState('') useEffect(() => { const init = async () => { const [currentStatus, publicAddress] = await Promise.all([ window.api.proxy.currentStatus(), window.api.proxy.publicAddress() ]) setStatus(currentStatus) setPublicAddress(publicAddress ?? '') } init() const listener = (_, status: TProxyConnectionStatus) => { setStatus(status) } window.api.proxy.onStatusChange(listener) return () => { window.api.proxy.removeStatusChangeListener(listener) } }, []) const connectProxy = async () => { if (status === PROXY_CONNECTION_STATUS.CONNECTED) return try { const result = await window.api.proxy.connect() if (!result.success) { toast({ description: result.errorMessage ?? 'Failed to connect to the proxy', variant: 'destructive' }) return } setPublicAddress(result.publicAddress) } catch (error) { toast({ description: (error as Error).message, variant: 'destructive' }) } } const disconnectProxy = async () => { await window.api.proxy.disconnect() setPublicAddress('') } return (
Connect to proxy
{status === PROXY_CONNECTION_STATUS.CONNECTED ? 'Connected' : status === PROXY_CONNECTION_STATUS.CONNECTING ? 'Connecting...' : 'Disconnected'}
Expose your local relay to the internet
{ if (checked) { connectProxy() } else { disconnectProxy() } }} title={ status === PROXY_CONNECTION_STATUS.CONNECTED ? 'Disconnect from proxy' : 'Connect to proxy' } />
) }