import type { CameraRoll as MediaLibrary } from '@react-native-camera-roll/camera-roll'; import type Clipboard from '@react-native-clipboard/clipboard'; import type * as DocumentPicker from '@react-native-documents/picker'; import type * as Audio from 'react-native-audio-recorder-player'; import type CreateThumbnail from 'react-native-create-thumbnail'; import type FileAccess from 'react-native-file-access'; import { Dirs } from 'react-native-file-access'; import type ImagePicker from 'react-native-image-picker'; import type { Nullable } from '../types'; export type Unsubscribe = () => void | undefined; export type FileType = { uri: string; size: number; name: string; type: string; width?: number; height?: number; }; export interface VideoProps { source: { uri: string } | number; resizeMode?: 'cover' | 'contain' | 'stretch' | undefined; onLoad?: () => void | undefined; } export interface VideoThumbnailOptions { url: string; timeMills?: number; quality?: number; } export interface OpenResult { onFailed?: (error: Error) => void; } export interface OpenMediaLibraryOptions extends OpenResult { selectionLimit?: number; mediaType?: 'photo' | 'video' | 'all'; } export interface OpenCameraOptions extends OpenResult { cameraType?: 'front' | 'back'; mediaType?: 'photo' | 'video' | 'all'; } export type OpenDocumentOptions = OpenResult; export interface SaveFileOptions { fileUrl: string; fileName: string; fileType?: string | null; basePath?: string | undefined; } export interface RecordAudioOptions extends OpenResult { url?: string; audio: Audio.AudioSet; onPosition?: (position: number) => void; onFinished?: ({ result, path, error, }: { result: boolean; path?: string; error?: any; }) => void; } export interface PlayAudioOptions extends OpenResult { url: string; opt?: Record; onPlay?: ({ isMuted, isFinished, currentPosition, duration, }: { isMuted?: boolean; isFinished: boolean; currentPosition: number; duration: number; }) => void; onFile?: (path: string) => void; } export type ClipboardServiceOption = { clipboard: typeof Clipboard; }; /** * Clipboard service interface. * * Users can implement the interface by themselves. */ export interface ClipboardService { setString(text: string): void; getString(): Promise; } // export interface FileService {} // export interface AudioService {} export type MediaServiceOptions = { videoModule: any; videoThumbnail: typeof CreateThumbnail; imagePickerModule: typeof ImagePicker; documentPickerModule: typeof DocumentPicker; mediaLibraryModule: typeof MediaLibrary; fsModule: typeof FileAccess; audioModule: typeof Audio; rootDirName?: string; }; /** * Media service interface. * * Users can implement the interface by themselves. */ export interface MediaService { /** * @deprecated 2025-11-07 * This method is deprecated and will be removed in the future. * Please use the new method to get the video component. * @param props */ getVideoComponent(props: VideoProps & Props): React.ReactElement; getVideoThumbnail( options: VideoThumbnailOptions ): Promise; openMediaLibrary( options?: OpenMediaLibraryOptions ): Promise[]>; openCamera(options?: OpenCameraOptions): Promise>; openDocument(options?: OpenDocumentOptions): Promise>; /** * **NOTE**: On iOS, You can access the downloaded files by providing options below to info.plist * - Supports opening documents in place * - Application supports iTunes file sharing * @param options save file options. */ save(options: SaveFileOptions): Promise>; saveFromUrl({ remoteUrl, localPath, }: { remoteUrl: string; localPath: string; }): Promise; saveFromLocal({ targetPath, localPath, }: { targetPath: string; localPath: string; }): Promise; saveToAlbum(localPath: string): Promise; startRecordAudio(options: RecordAudioOptions): Promise; stopRecordAudio(): Promise<{ pos: number; path: string } | undefined>; playAudio(options: PlayAudioOptions): Promise; stopAudio(): Promise; getRootDir(): string; createDir(subDir: string): Promise; deleteDir(subDir: string): Promise; deleteCustomDir(dir: string): Promise; isDir(subDir: string): Promise; isExistedDir(subDir: string): Promise; isExistedFile(file: string): Promise; getDirs(): typeof Dirs; } // export interface ImageService {} // export interface NetworkService {} /** * Local storage service interface. * * Users can implement the interface by themselves. */ export interface LocalStorageService { getAllKeys(): Promise; getItem(key: string): Promise; setItem(key: string, value: string): Promise; removeItem(key: string): Promise; } export type DirCacheServiceOption = { media: MediaService; }; /** * directory service interface. * * Users can implement the interface by themselves. */ export interface DirCacheService { init(useId: string): void; unInit(): void; getRootDir(): string; getUserDir(): string; getMessageDir(): string; getConversationDir(convId: string): string; getFileDir(convId: string, file: string): string; isExistedUserDir(): Promise; isExistedMessageDir(): Promise; isExistedConversationDir(convId: string): Promise; isExistedFile(file: string): Promise; createUserDir(): Promise; createMessageDir(): Promise; createConversationDir(convId: string): Promise; deleteUserDir(): Promise; deleteMessageDir(): Promise; deleteConversationDir(convId: string): Promise; }