import { useEffect, useState, useCallback } from "react"; import { useSignaling } from "../hooks/useSignaling"; import { useStore } from "../stores/useStore"; import { useProfileStore } from "../stores/useProfileStore"; import PeerList from "../components/PeerList"; import ProfileSetup from "../components/ProfileSetup"; interface SharedData { files: File[]; text: string; } /** Read shared files/text from the cache stashed by the service worker */ async function readSharedData(): Promise { const result: SharedData = { files: [], text: "" }; try { const cache = await caches.open("share-target"); // Read metadata const metaResponse = await cache.match("/share-target-meta"); if (!metaResponse) return result; const meta = await metaResponse.json(); result.text = meta.text || ""; // Read files for (let i = 0; i < (meta.count || 0); i++) { const fileResponse = await cache.match(`/share-target-file/${i}`); if (!fileResponse) continue; const blob = await fileResponse.blob(); const fileName = decodeURIComponent( fileResponse.headers.get("X-File-Name") || `fichier-${i}`, ); result.files.push(new File([blob], fileName, { type: blob.type })); } // Clean up cache await caches.delete("share-target"); } catch (err) { console.error("[share] Failed to read shared data:", err); } return result; } export default function Share() { const isSetUp = useProfileStore((s) => s.isSetUp); if (!isSetUp) { return {}} />; } return ; } function ShareConnected() { const { sendFiles, sendText } = useSignaling(); const peers = useStore((s) => s.peers); const setSelectedPeerId = useStore((s) => s.setSelectedPeerId); const [shared, setShared] = useState(null); const [sent, setSent] = useState(false); useEffect(() => { readSharedData().then(setShared); }, []); const handlePeerSelect = useCallback( (peerId: string) => { if (!shared || sent) return; setSelectedPeerId(peerId); if (shared.files.length > 0) { sendFiles(peerId, shared.files); } if (shared.text && shared.files.length === 0) { sendText(peerId, shared.text); } setSent(true); }, [shared, sent, sendFiles, sendText, setSelectedPeerId], ); const fileCount = shared?.files.length || 0; const hasText = !!shared?.text; return (
{/* Header */}

AnyDrop

{!shared ? (

Chargement...

) : sent ? (

Envoi en cours

Retour à l'accueil
) : ( <>

Envoyer à quel appareil ?

{/* What's being shared */}
{fileCount > 0 && ( 📎 {fileCount} {fileCount > 1 ? "fichiers" : "fichier"} )} {hasText && !fileCount && 💬 Texte} {hasText && fileCount > 0 && + texte}
)}
{/* Peer list — tap to send immediately */} {!sent && shared && (
{peers.length === 0 ? (
📡

En attente d'appareils...

Ouvrez AnyDrop sur l'appareil destinataire.

) : (
)}
)} {/* Footer */}
); }