import { useContext, useMemo } from 'react' import { ChatContext } from '../contexts/chat_context' import { Client } from '../utils' import { UploadUri } from '../utils/upload_uri' import { availableFeatures, useFeatures } from './use_features' export interface FileForUploadClient { uri: string name: string type: string // Should be a MIME type } export const useUploadClient = () => { const { session, onUnauthorizedResponse } = useContext(ChatContext) const { featureEnabled } = useFeatures() const videoModerationEnabled = featureEnabled(availableFeatures.video_moderation) const uri = useMemo(() => new UploadUri({ session }), [session]) const api = useMemo( () => new UploadClient({ version: '2025-05-16', // not really needed, but required by the Client constructor root: uri.baseUrl, defaultHeaders: uri.headers, onUnauthorizedResponse, videoModerationEnabled, }), [uri, onUnauthorizedResponse, videoModerationEnabled] ) return api } class UploadClient extends Client { private videoModerationEnabled: boolean constructor({ videoModerationEnabled, ...rest }: ConstructorParameters[0] & { videoModerationEnabled: boolean }) { super(rest) this.videoModerationEnabled = videoModerationEnabled } async uploadFile(file: FileForUploadClient): Promise { const formData = new FormData() formData.append('file', { uri: file.uri, name: file.name, type: file.type, }) const headers: RequestInit['headers'] = { ...this.headers } delete headers['Content-Type'] if (this.videoModerationEnabled && file.type.startsWith('video/')) { headers['X-PCO-Moderate-Video'] = 'true' } const response = await fetch(`${this.root}/v2/files`, { method: 'POST', headers, body: formData, }) if (response.status === 403) { const errorBody = await response.json().catch(() => null) if (errorBody?.detail === 'Image was flagged') { return Promise.reject({ code: 'image_flagged' }) } return this.handleNotOk(response) } if (!response.ok) { return this.handleNotOk(response) } const jsonResponse = await response.json() return jsonResponse.data[0] } } interface UploadedResource { id: string type: string attributes: { organization_id: string person_id: string md5: string created_at: string expires_at: string source_ip: string name: string content_type: string file_size: number location: string } }