Rocket.Chat.ReactNative icon indicating copy to clipboard operation
Rocket.Chat.ReactNative copied to clipboard

feature: Implement Download Caching for Chat Attachments

Open JASIM0021 opened this issue 3 months ago • 3 comments

Feature Description

  • Implement a caching system for chat attachment downloads that stores files locally after first download, allowing subsequent access to use cached versions instead of re-downloading. This will significantly improve user experience by reducing download times, saving data usage, and eliminating redundant downloads for the same file.

poc:-

https://github.com/user-attachments/assets/4e5d2f2e-fc7c-404a-96ac-92db54558df4

Motivation and Use Case

Current Problem:

  • Users must wait for full download every time they access an attachment (PDF, images, documents, etc.)
  • Multiple downloads occur for the same file if accessed multiple times
  • Unnecessary data usage and battery drain
  • Poor user experience with slow file access in chat

Use Cases:

  • Frequent Reference: Users accessing the same important documents multiple times during a work session
  • Offline Access: Users wanting to quickly access previously viewed files without internet
  • Data Conservation: Users on limited data plans wanting to avoid repeated downloads
  • Quick Review: Users rapidly switching between different attachments in a conversation

Implementation Ideas

Based on the current implementation provided: export const fileDownload = async ( url: string, attachment?: IAttachment, fileName?: string ): Promise<string> => { let path = ${FileSystem.documentDirectory}; if (fileName) { path = ${path}${sanitizeFileName(fileName)}; } if (attachment?.title) { path = ${path}${sanitizeFileName(attachment.title)}`; }

// Check if file exists in cache first using existing cache system const cache = await getMediaCache({ type: 'other' as const, mimeType: attachment?.format, urlToCache: url });

if (cache?.exists) { return cache.uri; // Return cached file URI if exists }

// Create download options for media file const option = { messageId: url, type: 'other' as const, downloadUrl: url };

// Download file if not cached const uri = await downloadMediaFile(option); return uri; };`

profile Qwen3-Coder 12:47 am Feature Request: Implement Download Caching for Chat Attachments Feature Description Implement a caching system for chat attachment downloads that stores files locally after first download, allowing subsequent access to use cached versions instead of re-downloading. This will significantly improve user experience by reducing download times, saving data usage, and eliminating redundant downloads for the same file.

Motivation and Use Case Current Problem:

Users must wait for full download every time they access an attachment (PDF, images, documents, etc.) Multiple downloads occur for the same file if accessed multiple times Unnecessary data usage and battery drain Poor user experience with slow file access in chat Use Cases:

Frequent Reference: Users accessing the same important documents multiple times during a work session Offline Access: Users wanting to quickly access previously viewed files without internet Data Conservation: Users on limited data plans wanting to avoid repeated downloads Quick Review: Users rapidly switching between different attachments in a conversation Implementation Ideas Based on the current implementation provided:

export const fileDownload = async (
 url: string, 
 attachment?: IAttachment, 
 fileName?:  string
): Promise<string> => {
 let path = `${FileSystem.documentDirectory}`;
 if (fileName) {
   path = `${path}${sanitizeFileName(fileName)}`;
 }
 if (attachment?.title) {
   path = `${path}${sanitizeFileName(attachment.title)}`;
 }

 // Check if file exists in cache first using existing cache system
 const cache = await getMediaCache({ 
   type: 'other' as const, 
   mimeType: attachment?.format, 
   urlToCache: url 
 });

 if (cache?.exists) {
   return cache.uri; // Return cached file URI if exists
 }
 
 // Create download options for media file
 const option = {
   messageId: url,
   type: 'other' as const,
   downloadUrl: url
 };

 // Download file if not cached
 const uri = await downloadMediaFile(option);
 return uri;
};

Key Implementation Benefits:

  • Leverages existing cache system: Uses the existing getMediaCache function for consistency
  • Simple cache check: Checks if file exists before initiating download
  • Integrates with existing download logic: Uses downloadMediaFile for actual download
  • Maintains backward compatibility: Works with existing attachment handling
  • Efficient: Only downloads when necessary, returns cached version otherwise

Is this feature available in the API or web version?

Available in API

Rocket.Chat Server Version

NA

Rocket.Chat App Version

4.66.0

Device Name

POCO M2 Pro

OS Version

Android

Additional Context

This feature will particularly benefit users who:

  • Work with document-heavy conversations
  • Have limited internet connectivity
  • Need quick access to frequently referenced files
  • Want to conserve mobile data usage

JASIM0021 avatar Oct 15 '25 19:10 JASIM0021