Librechat-Mobile/feature/files/CLAUDE.md

2.1 KiB

feature:files

Screen

FilesScreen -- sealed interface FilesRoute : NavKey with single route Files (@Serializable data object). Lists uploaded files with upload and delete actions.

ViewModel

FilesViewModel depends on FileRepository and application Context (for content resolver).

State

FilesUiState: files: List<FileObject>, isLoading, isRefreshing, isUploading, error

Operations

Action Method Notes
Load loadFiles() FileRepository.getFiles()
Refresh refresh() Same endpoint, sets isRefreshing
Upload uploadFile(uri) Reads bytes via ContentResolver, gets filename from OpenableColumns.DISPLAY_NAME, calls FileRepository.uploadFile(bytes, filename, mimeType)
Delete deleteFile(fileId) FileRepository.deleteFiles(listOf(fileId)), removes from local list

Upload Flow

  1. User picks file via SAF (ActivityResultContracts.GetContent)
  2. ContentResolver reads bytes and resolves filename + MIME type
  3. Multipart upload via FilesApi in :core:network
  4. New file prepended to list on success

Image Viewing

  • FullscreenImageViewer (in feature:chat/components/) provides pinch-to-zoom and pan
  • Image URLs: /api/files/download/:userId/:file_id for server files
  • Loaded via Coil AsyncImage with placeholder and error states

Data Layer

  • FileRepository in :core:data wraps FilesApi from :core:network
  • API endpoints: GET /api/files (list), POST /api/files (upload, multipart), DELETE /api/files (batch delete)

Spec Notes (not yet implemented)

  • Multi-select mode for bulk deletion
  • File preview on tap (non-image files)

File Type Filtering

  • FileTypeFilterBar — horizontal FilterChip row: All, Images, Documents, Audio, Video
  • Filters by MIME type prefix in FilesViewModel

Upload Progress

  • UploadProgressCard — animated card with filename, LinearProgressIndicator, cancel button
  • Replaces the old fullscreen CircularProgressIndicator overlay
  • FilesViewModel tracks uploadProgress and uploadFilename in state
  • Cancel via stored upload Job reference