import AsyncStorage from '@react-native-async-storage/async-storage' import { Linking as RNLinking } from 'react-native' import { AudioAdapter } from './audio' import { ClipboardAdapter } from './clipboard' import { DocumentPickerAdapter } from './document_picker' import { HapticAdapter } from './haptic' import { ImagePickerAdapter } from './image_picker' import { LinkingAdapter } from './linking' import { LogAdapter } from './log' import { MenuAdapter } from './menu' import { StorageAdapter } from './storage_adapter' import { VideoAdapter } from './video' type ChatConfigurations = { clipboard: ClipboardAdapter audio: AudioAdapter video: VideoAdapter imagePicker: ImagePickerAdapter documentPicker?: DocumentPickerAdapter log?: LogAdapter linking?: LinkingAdapter haptic?: HapticAdapter menu?: MenuAdapter } export class ChatAdapters { static configure(configurations: ChatConfigurations) { Clipboard = configurations.clipboard Audio = configurations.audio Video = configurations.video ImagePicker = configurations.imagePicker DocumentPicker = configurations.documentPicker || new DocumentPickerAdapter() Log = configurations.log || new LogAdapter() Linking = configurations.linking || new LinkingAdapter(RNLinking) Haptic = configurations.haptic || new HapticAdapter() Menu = configurations.menu || new MenuAdapter() } } const methodMissing = () => { console.warn('ChatAdapters.configure() must be called before using any adapters') } export let Clipboard: ClipboardAdapter = new ClipboardAdapter({ getStringAsync: async () => { methodMissing() return '' }, setStringAsync: async (_: string) => methodMissing(), }) export let Audio: AudioAdapter = new AudioAdapter({ useAudio: (_: string) => { methodMissing() return {} as any }, }) export let Video: VideoAdapter = new VideoAdapter({ Player: Object.assign( () => { methodMissing() return null }, { $$typeof: Symbol.for('react.forward_ref') } ), }) export let ImagePicker: ImagePickerAdapter = new ImagePickerAdapter({ openCameraAsync: async () => { methodMissing() return { canceled: true, assets: null } }, openImageLibraryAsync: async () => { methodMissing() return { canceled: true, assets: null } }, }) export let DocumentPicker: DocumentPickerAdapter = new DocumentPickerAdapter() export let Log: LogAdapter = new LogAdapter() export let Linking: LinkingAdapter = new LinkingAdapter(RNLinking) export let Haptic: HapticAdapter = new HapticAdapter() export let Menu: MenuAdapter = new MenuAdapter() export let Storage = new StorageAdapter({ getItem: AsyncStorage.getItem, setItem: AsyncStorage.setItem, removeItem: AsyncStorage.removeItem, })