use-simple-camera
Version:
Production-ready React Hooks for Camera, Video Recording, QR/Barcode Scanning, Motion Detection, and Audio Analysis. Zero dependencies, fully typed, and easy to use.
62 lines (61 loc) • 1.89 kB
TypeScript
export type CameraErrorType = "PERMISSION_DENIED" | "NO_DEVICE_FOUND" | "CONSTRAINT_ERROR" | "UNKNOWN_ERROR" | "BROWSER_NOT_SUPPORTED";
export interface CameraError {
type: CameraErrorType;
message: string;
originalError?: Error;
}
export type CameraFacingMode = "user" | "environment";
export type CameraPreset = "SD" | "HD" | "FHD" | "4K" | "Instagram";
export interface UseCameraConfig {
autoStart?: boolean;
defaultConstraints?: MediaStreamConstraints;
mock?: boolean;
autoRetry?: boolean;
debug?: boolean;
}
export interface CameraState {
isStreaming: boolean;
error: CameraError | null;
stream: MediaStream | null;
}
export interface CameraControls {
zoom: number;
minZoom: number;
maxZoom: number;
setZoom: (value: number) => Promise<void>;
flash: boolean;
hasFlash: boolean;
setFlash: (enabled: boolean) => Promise<void>;
pan: number;
tilt: number;
setPan: (value: number) => Promise<void>;
setTilt: (value: number) => Promise<void>;
focusMode: "auto" | "manual" | "continuous" | "none";
setFocusMode: (mode: "auto" | "manual" | "continuous") => Promise<void>;
focusDistance: number;
setFocusDistance: (value: number) => Promise<void>;
supports: {
zoom: boolean;
flash: boolean;
pan: boolean;
tilt: boolean;
focusMode: boolean;
focusDistance: boolean;
};
}
export interface VideoRecorderOptions {
mimeType?: string;
timeLimitMs?: number;
onRecordingStart?: () => void;
onRecordingStop?: (blob: Blob) => void;
}
export interface DecoderOptions {
onDetect: (code: string) => void;
formats?: string[];
}
export interface MotionDetectionOptions {
sensitivity?: number;
intervalMs?: number;
onMotion?: () => void;
}
export type FilterType = "none" | "grayscale" | "sepia" | "contrast" | "blur";