import { useScreenCapture, type StartRecordingOptions } from './useScreenCapture'; import { type CompositeLayout } from './useCompositeCapture'; import { type MediaTake, type MediaSessionState, type SessionSource } from '../lib/take-types'; export interface UseMultiTakeSessionOptions { /** Identifiant root pré-existant — utilisé pour reprendre une session L3. * Si absent, génère un nouveau sessionId. */ initialSessionId?: string; /** Sources déclarées (informationnel ; les vraies sources sont liées à * startScreenShare options). Si non passé, déduit a posteriori du record. */ sourcesUsed?: SessionSource[]; /** v2.2+ — Pilote useCompositeCapture (3 sources : écran + flux distant * SFU/P2P + webcam, layout split) au lieu de useScreenCapture. À fixer à * l'ouverture de la session — ne pas changer pendant un enregistrement. */ composite?: boolean; } export interface UseMultiTakeSessionReturn { videoRef: React.RefObject; webcamRef: React.RefObject; active: boolean; webcamActive: boolean; recording: boolean; paused: boolean; duration: number; error: string | null; swapped: boolean; toggleSwap: () => void; audioAnalyser: React.RefObject; cameras: MediaDeviceInfo[]; selectedCameraId: string | null; refreshCameras: () => Promise; switchCamera: (deviceId: string) => Promise; /** v2.1+ — stream composite enregistré (publication WHIP live du take). */ getRecordingStream: () => MediaStream | null; /** v2.2+ — true si un flux distant est branché (mode composite uniquement). */ hasRemote: boolean; /** v2.2+ — Branche/retire un flux distant SFU/P2P comme 3ᵉ source du * composite. No-op hors mode composite. */ setRemoteStream: (stream: MediaStream | null) => void; /** v2.2+ — Layout courant du compositeur (mode composite). */ compositeLayout: CompositeLayout; /** v2.2+ — Cycle le layout du compositeur : split → screen → sfu → webcam. */ cycleCompositeLayout: () => void; startScreenShare: ReturnType['startScreenShare']; stopScreenShare: () => void; captureFrame: ReturnType['captureFrame']; /** Démarre un nouveau take. baseId est dérivé automatiquement de la session. */ startTake: (opts?: Omit) => Promise; /** Pause le take courant (proxy useScreenCapture.pauseRecording). */ pauseRecording: () => void; /** Reprend le take courant (proxy useScreenCapture.resumeRecording). */ resumeRecording: () => void; /** Finalise le take courant et l'append à state.takes. */ stopTake: () => Promise; /** Sucre : stopTake (si recording) + startTake. */ startNewTake: (opts?: Omit) => Promise; /** Supprime un take de la liste (libère son blob URL). */ deleteTake: (takeId: string) => void; /** Réordonne les takes (drag-and-drop). */ reorderTakes: (fromIndex: number, toIndex: number) => void; /** Met à jour le titre d'un take. */ setTakeTitle: (takeId: string, title: string) => void; /** Recharge une session persistée depuis IndexedDB. Remplace les takes * courants par ceux reconstruits depuis les chunks IDB. Réinitialise * l'index de take au max+1 pour que les nouveaux takes s'enchaînent. */ restoreSession: (sessionId: string) => Promise; /** Marque la session comme finalisée dans la persistence (cesse d'apparaître * dans listOpenSessions). À appeler une fois la session livrée à l'éditeur. */ finalizeSession: () => Promise; /** Purge entièrement la session (row + chunks). À appeler sur annulation * utilisateur ou après upload réussi côté serveur. */ discardSession: () => Promise; state: MediaSessionState; } export declare function useMultiTakeSession(options?: UseMultiTakeSessionOptions): UseMultiTakeSessionReturn; //# sourceMappingURL=useMultiTakeSession.d.ts.map