import { useEffect, useState } from 'react'; import { PeerMetadata, useBridgeMutation, useBridgeSubscription } from '@sd/client'; import { Dialog, Select, SelectOption, UseDialogProps, dialogManager, forms, useDialog } from '@sd/ui'; import { getSpacedropState, subscribeSpacedropState } from '../hooks/useSpacedropState'; const { Input, useZodForm, z } = forms; export function SpacedropUI() { useEffect(() => subscribeSpacedropState(() => { dialogManager.create((dp) => ); }) ); useBridgeSubscription(['p2p.events'], { onData(data) { if (data.type === 'SpacedropRequest') { dialogManager.create((dp) => ( )); } } }); return null; } function SpacedropDialog(props: UseDialogProps) { const [[discoveredPeers], setDiscoveredPeer] = useState([new Map()]); const form = useZodForm({ // We aren't using this but it's required for the Dialog :( schema: z.object({ target_peer: z.string() }) }); useBridgeSubscription(['p2p.events'], { onData(data) { if (data.type === 'DiscoveredPeer') { setDiscoveredPeer([discoveredPeers.set(data.peer_id, data.metadata)]); } } }); const doSpacedrop = useBridgeMutation('p2p.spacedrop'); return ( doSpacedrop.mutateAsync({ file_path: getSpacedropState().droppedFiles, peer_id: data.target_peer }) } >
); } function SpacedropRequestDialog( props: { dropId: string; name: string; peerId: string } & UseDialogProps ) { const form = useZodForm({ // We aren't using this but it's required for the Dialog :( schema: z.object({ file_path: z.string() }) }); const acceptSpacedrop = useBridgeMutation('p2p.acceptSpacedrop'); // TODO: Automatically close this after 60 seconds cause the Spacedrop would have expired return ( acceptSpacedrop.mutateAsync([props.dropId, data.file_path])} onCancelled={() => acceptSpacedrop.mutate([props.dropId, null])} >

File Name: {props.name}

Peer Id: {props.peerId}

); }