import { JSX, ReactNode } from "react";
import type { Selector } from "./state.types";
import { PeerStatus, TrackId, TrackWithOrigin } from "./state.types";
import { ConnectConfig, CreateConfig } from "@jellyfish-dev/ts-client-sdk";
import { DeviceManagerConfig, UseCameraAndMicrophoneResult, UseScreenShareResult, UseSetupMediaConfig, UseSetupMediaResult } from "./types";
import { Client } from "./Client";
import { ScreenShareManagerConfig } from "./ScreenShareManager";
export type JellyfishContextProviderProps = {
    children: ReactNode;
};
export type UseConnect<PeerMetadata> = (config: ConnectConfig<PeerMetadata>) => () => void;
export type CreateJellyfishClient<PeerMetadata, TrackMetadata> = {
    JellyfishContextProvider: ({ children }: JellyfishContextProviderProps) => JSX.Element;
    useConnect: () => (config: ConnectConfig<PeerMetadata>) => () => void;
    useDisconnect: () => () => void;
    useStatus: () => PeerStatus;
    useSelector: <Result>(selector: Selector<PeerMetadata, TrackMetadata, Result>) => Result;
    useTracks: () => Record<TrackId, TrackWithOrigin<PeerMetadata, TrackMetadata>>;
    useSetupMedia: (config: UseSetupMediaConfig<TrackMetadata>) => UseSetupMediaResult;
    useCamera: () => UseCameraAndMicrophoneResult<TrackMetadata>["camera"];
    useMicrophone: () => UseCameraAndMicrophoneResult<TrackMetadata>["microphone"];
    useScreenShare: () => UseScreenShareResult<TrackMetadata>;
    useClient: () => Client<PeerMetadata, TrackMetadata>;
};
/**
 * Create a client that can be used with a context.
 * Returns context provider, and two hooks to interact with the context.
 *
 * @returns ContextProvider, useSelector, useConnect
 */
export declare const create: <PeerMetadata, TrackMetadata>(config?: CreateConfig<PeerMetadata, TrackMetadata>, deviceManagerDefaultConfig?: DeviceManagerConfig, screenShareManagerDefaultConfig?: ScreenShareManagerConfig) => CreateJellyfishClient<PeerMetadata, TrackMetadata>;
//# sourceMappingURL=create.d.ts.map