diff --git a/types/react-native-fetch-blob/index.d.ts b/types/react-native-fetch-blob/index.d.ts new file mode 100644 index 0000000000..3e281c523d --- /dev/null +++ b/types/react-native-fetch-blob/index.d.ts @@ -0,0 +1,621 @@ +// Type definitions for react-native-fetch-blob 0.10 +// Project: https://github.com/wkh237/react-native-fetch-blob#readme +// Definitions by: MNB +// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped + +export const RNFetchBlob: RNFetchBlobStatic; +export type RNFetchBlob = RNFetchBlobStatic; +export default RNFetchBlob; + +interface RNFetchBlobStatic { + fetch(method: Methods, url: string, headers?: { [key: string]: string }, body?: any + | null): StatefulPromise; + base64: { encode(input: string): string; decode(input: string): string }; + android: AndroidApi; + ios: IOSApi; + config(options: RNFetchBlobConfig): RNFetchBlobStatic; + session(name: string): RNFetchBlobSession; + fs: FS; + wrap(path: string): string; + net: Net; + polyfill: Polyfill; + // this require external module https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/oboe + JSONStream: any; +} + +interface Polyfill { + Blob: PolyfillBlob; + File: PolyfillFile; + XMLHttpRequest: PolyfillXMLHttpRequest; + ProgressEvent: PolyfillProgressEvent; + Event: PolyfillEvent; + FileReader: PolyfillFileReader; + Fetch: PolyfillFetch; +} + +declare class PolyfillFetch extends RNFetchBlobFetchPolyfill { + constructor(config: RNFetchBlobConfig); +} + +declare class RNFetchBlobFetchPolyfill { + constructor(config: RNFetchBlobConfig); + + build(): (url: string, options: RNFetchBlobConfig) => StatefulPromise; +} + +interface RNFetchBlobFetchRepsonse { + arrayBuffer(): Promise; + blob(): Promise; + json(): Promise; + rawResp(): Promise; + text(): Promise; + bodyUsed: boolean; + headers: any; + ok: boolean; + resp: FetchBlobResponse; + rnfbResp: FetchBlobResponse; + rnfbRespInfo: RNFetchBlobResponseInfo; + status: number; + type: string; +} + +/** + * RNFetchBlob response object class. + */ +interface FetchBlobResponse { + taskId: string; + /** + * get path of response temp file + * @return {string} File path of temp file. + */ + path(): string; + type: "base64" | "path" | "utf8"; + data: any; + /** + * Convert result to javascript RNFetchBlob object. + * @return {Promise} Return a promise resolves Blob object. + */ + blob(contentType: string, sliceSize: number): Promise; + /** + * Convert result to text. + * @return {string} Decoded base64 string. + */ + text(): string | Promise; + /** + * Convert result to JSON object. + * @return {object} Parsed javascript object. + */ + json(): any; + /** + * Return BASE64 string directly. + * @return {string} BASE64 string of response body. + */ + base64(): any; + /** + * Remove cahced file + * @return {Promise} + */ + flush(): void; + respInfo: RNFetchBlobResponseInfo; + session(name: string): RNFetchBlobSession | null; + /** + * Read file content with given encoding, if the response does not contains + * a file path, show warning message + * @param {String} encode Encode type, should be one of `base64`, `ascrii`, `utf8`. + */ + readFile(encode: Encoding): Promise | null; + /** + * Start read stream from cached file + * @param {String} encode Encode type, should be one of `base64`, `ascrii`, `utf8`. + */ + readStream(encode: Encoding): RNFetchBlobStream | null; +} + +interface PolyfillFileReader extends EventTarget { + isRNFBPolyFill: boolean; + onloadstart(e: Event): void; + onprogress(e: Event): void; + onload(e: Event): void; + onabort(e: Event): void; + onerror(e: Event): void; + onloadend(e: Event): void; + + abort(): void; + readAsArrayBuffer(b: PolyfillBlob): void; + readAsBinaryString(b: PolyfillBlob): void; + readAsText(b: PolyfillBlob, label?: string): void; + readAsDataURL(b: PolyfillBlob): void; + + readyState: number; + result: number; +} + +declare namespace PolyfillFileReader { + const EMPTY: number; + const LOADING: number; + const DONE: number; +} + +declare class PolyfillEvent { +} + +interface PolyfillProgressEvent extends EventTarget { + lengthComputable: boolean; + loaded: number; + total: number; +} + +declare class PolyfillBlob extends EventTarget { + /** + * RNFetchBlob Blob polyfill, create a Blob directly from file path, BASE64 + * encoded data, and string. The conversion is done implicitly according to + * given `mime`. However, the blob creation is asynchronously, to register + * event `onCreated` is need to ensure the Blob is creadted. + * + * @param data Content of Blob object + * @param cType Content type settings of Blob object, `text/plain` by default + * @param {boolean} defer When this argument set to `true`, blob constructor will not invoke blob created event automatically. + */ + constructor(data: any, cType: any, defer: boolean); + + /** + * Since Blob content will asynchronously write to a file during creation, + * use this method to register an event handler for Blob initialized event. + * @param {(b:Blob) => void} fn An event handler invoked when Blob created + * @return {Blob} The Blob object instance itself + */ + onCreated(fn: () => void): PolyfillBlob; + + markAsDerived(): void; + + /** + * Get file reference of the Blob object. + * @return {string} Blob file reference which can be consumed by RNFetchBlob fs + */ + getRNFetchBlobRef(): string; + + /** + * Create a Blob object which is sliced from current object + * @param {number} start Start byte number + * @param {number} end End byte number + * @param {string} contentType Optional, content type of new Blob object + * @return {Blob} + */ + slice(start?: number, end?: number, contentType?: string): PolyfillBlob; + + /** + * Read data of the Blob object, this is not standard method. + * @param {string} encoding Read data with encoding + * @return {Promise} + */ + readBlob(encoding: string): Promise; + + /** + * Release the resource of the Blob object. + * @nonstandard + * @return {Promise} + */ + close(): Promise; +} + +declare namespace PolyfillBlob { + function clearCache(): void; + + function build(data: any, cType: any): Promise; + + function setLog(level: number): void; +} + +declare class PolyfillFile extends PolyfillBlob { +} + +interface PolyfillXMLHttpRequest extends PolyfillXMLHttpRequestEventTarget { + upload: PolyfillXMLHttpRequestEventTarget; + readonly UNSENT: number; + readonly OPENED: number; + readonly HEADERS_RECEIVED: number; + readonly LOADING: number; + readonly DONE: number; + + /** + * XMLHttpRequest.open, always async, user and password not supported. When + * this method invoked, headers should becomes empty again. + * @param {string} method Request method + * @param {string} url Request URL + * @param {boolean} async Always async + * @param user NOT SUPPORTED + * @param password NOT SUPPORTED + */ + open(method: string, url: string, async: true, user: any, password: any): void; + + /** + * Invoke this function to send HTTP request, and set body. + * @param body Body in RNfetchblob flavor + */ + send(body: any): void; + + overrideMimeType(mime: string): void; + + setRequestHeader(name: string, value: string): void; + + abort(): void; + + getResponseHeader(field: string): string | null; + + getAllResponseHeaders(): string | null; + + onreadystatechange(e: Event): void; + readyState: number; + status: number; + statusText: string; + response: any; + responseText: any; + responseURL: string; + responseHeaders: any; + timeout: number; + responseType: string; +} + +declare namespace PolyfillXMLHttpRequest { + const binaryContentTypes: string[]; + const UNSENT: number; + const OPENED: number; + const HEADERS_RECEIVED: number; + const LOADING: number; + const DONE: number; + + function setLog(level: number): void; + + function addBinaryContentType(substr: string): void; + + function removeBinaryContentType(): void; +} + +interface PolyfillXMLHttpRequestEventTarget extends EventTarget { + onabort(e: Event): void; + onerror(e: Event): void; + onload(e: Event): void; + onloadstart(e: Event): void; + onprogress(e: Event): void; + ontimeout(e: Event): void; + onloadend(e: Event): void; +} + +interface Net { + /** + * Get cookie according to the given url. + * @param {string} domain Domain of the cookies to be removed, remove all + * @return {Promise>} Cookies of a specific domain. + */ + getCookies(domain: string): Promise; + + /** + * Remove cookies for a specific domain + * @param {?string} domain Domain of the cookies to be removed, remove all + * cookies when this is null. + * @return {Promise} + */ + removeCookies(domain?: string): Promise; +} + +interface FS { + RNFetchBlobSession: RNFetchBlobSession; + + /** + * Remove file at path. + * @param {string} path:string Path of target file. + * @return {Promise} + */ + unlink(path: string): Promise; + + /** + * Create a directory. + * @param {string} path Path of directory to be created + * @return {Promise} + */ + mkdir(path: string): Promise; + + /** + * Get a file cache session + * @param {string} name Stream ID + * @return {RNFetchBlobSession} + */ + session(name: string): RNFetchBlobSession; + + ls(path: string): Promise; + + /** + * Create file stream from file at `path`. + * @param {string} path The file path. + * @param {string} encoding Data encoding, should be one of `base64`, `utf8`, `ascii` + * @param {boolean} bufferSize Size of stream buffer. + * @return {RNFetchBlobStream} RNFetchBlobStream stream instance. + */ + readStream(path: string, encoding: Encoding, bufferSize?: number, tick?: number): Promise; + + mv(path: string, dest: string): Promise; + + cp(path: string, dest: string): Promise; + + /** + * Create write stream to a file. + * @param {string} path Target path of file stream. + * @param {string} encoding Encoding of input data. + * @param {boolean} append A flag represent if data append to existing ones. + * @return {Promise<{}>} A promise resolves a `WriteStream` object. + */ + writeStream(path: string, encoding: Encoding, append?: boolean): Promise; + + /** + * Write data to file. + * @param {string} path Path of the file. + * @param {string | number[]} data Data to write to the file. + * @param {string} encoding Encoding of data (Optional). + * @return {Promise} + */ + writeFile(path: string, data: string | number[], encoding?: Encoding): Promise; + + appendFile(path: string, data: string | number[], encoding?: Encoding): Promise; + + /** + * Wrapper method of readStream. + * @param {string} path Path of the file. + * @param {'base64' | 'utf8' | 'ascii'} encoding Encoding of read stream. + * @return {Promise | string>} + */ + readFile(path: string, encoding: Encoding, bufferSize?: number): Promise; + /** + * Check if file exists and if it is a folder. + * @param {string} path Path to check + * @return {Promise} + */ + exists(path: string): Promise; + + createFile(path: string, data: string, encoding: Encoding): Promise; + + isDir(path: string): Promise; + + /** + * Show statistic data of a path. + * @param {string} path Target path + * @return {RNFetchBlobFile} + */ + stat(path: string): Promise; + + lstat(path: string): Promise; + + /** + * Android only method, request media scanner to scan the file. + * @param {Array>} pairs Array contains Key value pairs with key `path` and `mime`. + * @return {Promise} + */ + scanFile(pairs: Array<{ [key: string]: string }>): Promise; + + dirs: Dirs; + + slice(src: string, dest: string, start: number, end: number): Promise; + asset(path: string): string; + df(): Promise<{ free: number, total: number }>; +} + +interface Dirs { + DocumentDir: string; + CacheDir: string; + PictureDir: string; + MusicDir: string; + MovieDir: string; + DownloadDir: string; + DCIMDir: string; + SDCardDir: string; + MainBundleDir: string; +} + +interface RNFetchBlobWriteStream { + id: string; + encoding: string; + append: boolean; + + write(data: string): Promise; + close(): void; +} + +interface RNFetchBlobReadStream { + path: string; + encoding: Encoding; + bufferSize?: number; + closed: boolean; + tick: number; + + open(): void; + + onData(fn: (chunk: string | number[]) => void): void; + + onError(fn: (err: any) => void): void; + + onEnd(fn: () => void): void; +} + +type Encoding = "utf8" | "ascii" | "base64"; + +/* tslint:disable-next-line interface-name*/ +interface IOSApi { + /** + * Open a file in {@link https://developer.apple.com/reference/uikit/uidocumentinteractioncontroller UIDocumentInteractionController}, + * this is the default document viewer of iOS, supports several kinds of files. On Android, there's an similar method {@link android.actionViewIntent}. + * @param path This is a required field, the path to the document. The path should NOT contains any scheme prefix. + */ + previewDocument(path: string): void; + + /** + * Show options menu for interact with the file. + * @param path This is a required field, the path to the document. The path should NOT contains any scheme prefix. + */ + openDocument(path: string): void; +} + +interface AndroidApi { + /** + * When sending an ACTION_VIEW intent with given file path and MIME type, system will try to open an + * App to handle the file. For example, open Gallery app to view an image, or install APK. + * @param path Path of the file to be opened. + * @param mime Basically system will open an app according to this MIME type. + */ + actionViewIntent(path: string, mime: string): Promise; +} + +type Methods = "POST" | "GET" | "DELETE" | "PUT" | "post" | "get" | "delete" | "put"; + +/** + * A declare class inherits Promise, it has extra method like progress, uploadProgress, + * and cancel which can help managing an asynchronous task's state. + */ +interface StatefulPromise extends Promise { + /** + * Cancel the request when invoke this method. + */ + cancel(cb?: (reason: any) => void): StatefulPromise; + + /** + * Add an event listener which triggers when data receiving from server. + */ + progress(callback: (received: number, total: number) => void): StatefulPromise; + + /** + * Add an event listener with custom configuration + */ + progress(config: { count?: number, interval?: number }, callback: (received: number, total: number) => void): StatefulPromise; + + /** + * Add an event listener with custom configuration. + */ + uploadProgress(callback: (sent: number, total: number) => void): StatefulPromise; + + /** + * Add an event listener with custom configuration + */ + uploadProgress(config: { count?: number, interval?: number }, callback: (sent: number, total: number) => void): StatefulPromise; + + /** + * An IOS only API, when IOS app turns into background network tasks will be terminated after ~180 seconds, + * in order to handle these expired tasks, you can register an event handler, which will be called after the + * app become active. + */ + expire(callback: () => void): StatefulPromise; +} + +declare class RNFetchBlobSession { + constructor(name: string, list: string[]); + + add(path: string): RNFetchBlobSession; + + remove(path: string): RNFetchBlobSession; + + dispose(): Promise; + + list(): string[]; + + name: string; + + static getSession(name: string): any; + + static setSession(name: string): void; + + static removeSession(name: string): void; +} + +/** + * A set of configurations that will be injected into a fetch method, with the following properties. + */ +interface RNFetchBlobConfig { + /** + * When this property is true, the downloaded data will overwrite the existing file. (true by default) + */ + overwrite?: boolean; + + /** + * Set timeout of the request (in milliseconds). + */ + timeout?: number; + + /** + * Set this property to true to display a network indicator on status bar, this feature is only supported on IOS. + */ + indicator?: boolean; + + /** + * Set this property to true will allow the request create connection with server have self-signed SSL + * certification. This is not recommended to use in production. + */ + trusty?: boolean; + + /** + * Set this property to true will makes response data of the fetch stored in a temp file, by default the temp + * file will stored in App's own root folder with file name template RNFetchBlob_tmp${timestamp}. + */ + fileCache?: boolean; + + /** + * Set this property to change temp file extension that created by fetch response data. + */ + appendExt?: string; + + /** + * When this property has value, fetch API will try to store response data in the path ignoring fileCache and + * appendExt property. + */ + path?: string; + + session?: string; + + addAndroidDownloads?: AddAndroidDownloads; +} + +interface AddAndroidDownloads { + /** + * download file using Android download manager or not. + */ + useDownloadManager?: boolean; + /** + * title of the file + */ + title?: string; + /** + * File description of the file. + */ + description?: string; + /** + * The destination which the file will be downloaded, it SHOULD be a location on external storage (DCIMDir). + */ + path?: string; + /** + * MIME type of the file. By default is text/plain + */ + mime?: string; + /** + * A boolean value, see Officail Document + * (https://developer.android.com/reference/android/app/DownloadManager.html#addCompletedDownload(java.lang.String, java.lang.String, boolean, java.lang.String, java.lang.String, long, boolean)) + */ + mediaScannable?: boolean; + /** + * A boolean value decide whether show a notification when download complete. + */ + notification?: boolean; +} + +interface RNFetchBlobResponseInfo { + taskId: string; + state: number; + headers: any; + status: number; + respType: "text" | "blob" | "" | "json"; + rnfbEncode: "path" | "base64" | "ascii" | "utf8"; +} + +interface RNFetchBlobStream { + onData(): void; + onError(): void; + onEnd(): void; +} + +declare class RNFetchBlobFile { +} diff --git a/types/react-native-fetch-blob/react-native-fetch-blob-tests.ts b/types/react-native-fetch-blob/react-native-fetch-blob-tests.ts new file mode 100644 index 0000000000..d276a0a7ab --- /dev/null +++ b/types/react-native-fetch-blob/react-native-fetch-blob-tests.ts @@ -0,0 +1,378 @@ +import {RNFetchBlob} from "react-native-fetch-blob"; + +let BASE64_IMAGE_STRING = 'some base64 image'; +let PATH_TO_THE_FILE = '/some/path.png'; + +// Download example: Fetch files that need authorization token +RNFetchBlob + .fetch('GET', 'http://www.example.com/images/img1.png', {Authorization: 'Bearer access-token...'}) + .then(res => { + let base64Str = res.base64(); + let text = res.text(); + let json = res.json(); + }); + +// Download to storage directly +RNFetchBlob + .config({ + // add this option that makes response data to be stored as a file, + // this is much more performant. + fileCache: true, + }) + .fetch('GET', 'http://www.example.com/file/example.zip', { + // some headers .. + }) + .then((res) => { + // the temp file path + console.log('The file saved to ', res.path()); + }); + +// Set Temp File Extension +RNFetchBlob + .config({ + fileCache: true, + // by adding this option, the temp files will have a file extension + appendExt: 'png' + }) + .fetch('GET', 'http://www.example.com/file/example.zip', { + // some headers .. + }) + .then((res) => { + // the temp file path with file extension `png` + console.log('The file saved to ', res.path()); + // Beware that when using a file path as Image source on Android, + // you must prepend "file://"" before the file path + // imageView = + }); + +// Use Specific File Path +let dirs = RNFetchBlob.fs.dirs; +RNFetchBlob + .config({ + // response data will be saved to this path if it has access right. + path: dirs.DocumentDir + '/path-to-file.anything' + }) + .fetch('GET', 'http://www.example.com/file/example.zip', { + // some headers .. + }) + .then((res) => { + // the path should be dirs.DocumentDir + 'path-to-file.anything' + console.log('The file saved to ', res.path()); + }); + +// Upload example : Dropbox files-upload API +RNFetchBlob.fetch('POST', 'https://content.dropboxapi.com/2/files/upload', { + Authorization: "Bearer access-token...", + 'Dropbox-API-Arg': JSON.stringify({ + path: '/img-from-react-native.png', + mode: 'add', + autorename: true, + mute: false + }), + 'Content-Type': 'application/octet-stream', + // here's the body you're going to send, should be a BASE64 encoded string + // (you can use "base64"(refer to the library 'mathiasbynens/base64') APIs to make one). + // The data will be converted to "byte array"(say, blob) before request sent. +}, BASE64_IMAGE_STRING) + .then((res) => { + console.log(res.text()); + }) + .catch((err) => { + // error handling .. + }); + +// Upload a file from storage +RNFetchBlob.fetch('POST', 'https://content.dropboxapi.com/2/files/upload', { + // dropbox upload headers + Authorization: "Bearer access-token...", + 'Dropbox-API-Arg': JSON.stringify({ + path: '/img-from-react-native.png', + mode: 'add', + autorename: true, + mute: false + }), + 'Content-Type': 'application/octet-stream', + // Change BASE64 encoded data to a file path with prefix `RNFetchBlob-file://`. + // Or simply wrap the file path with RNFetchBlob.wrap(). +}, RNFetchBlob.wrap(PATH_TO_THE_FILE)) + .then((res) => { + console.log(res.text()); + }) + .catch((err) => { + // error handling .. + }); + +// Multipart/form-data example: Post form data with file and data +RNFetchBlob.fetch('POST', 'http://www.example.com/upload-form', { + Authorization: "Bearer access-token", + otherHeader: "foo", + 'Content-Type': 'multipart/form-data', +}, [ + // element with property `filename` will be transformed into `file` in form data + {name: 'avatar', filename: 'avatar.png', data: BASE64_IMAGE_STRING}, + // custom content type + {name: 'avatar-png', filename: 'avatar-png.png', type: 'image/png', data: BASE64_IMAGE_STRING}, + // part file from storage + {name: 'avatar-foo', filename: 'avatar-foo.png', type: 'image/foo', data: RNFetchBlob.wrap(PATH_TO_THE_FILE)}, + // elements without property `filename` will be sent as plain text + {name: 'name', data: 'user'}, + { + name: 'info', data: JSON.stringify({ + mail: 'example@example.com', + tel: '12345678' + }) + }, +]).then((resp) => { + // ... +}).catch((err) => { + // ... +}); + +RNFetchBlob.fetch('POST', 'http://www.example.com/upload-form', { + Authorization: "Bearer access-token", + otherHeader: "foo", + // this is required, otherwise it won't be process as a multipart/form-data request + 'Content-Type': 'multipart/form-data', +}, [ + // append field data from file path + { + name: 'avatar', + filename: 'avatar.png', + // Change BASE64 encoded data to a file path with prefix `RNFetchBlob-file://`. + // Or simply wrap the file path with RNFetchBlob.wrap(). + data: RNFetchBlob.wrap(PATH_TO_THE_FILE) + }, + { + name: 'ringtone', + filename: 'ring.mp3', + // use custom MIME type + type: 'application/mp3', + // upload a file from asset is also possible in version >= 0.6.2 + data: RNFetchBlob.wrap(RNFetchBlob.fs.asset('default-ringtone.mp3')) + }, + // elements without property `filename` will be sent as plain text + {name: 'name', data: 'user'}, + { + name: 'info', data: JSON.stringify({ + mail: 'example@example.com', + tel: '12345678' + }) + }, +]).then((resp) => { + // ... +}).catch((err) => { + // ... +}); + +// Upload/Download progress +RNFetchBlob.fetch('POST', 'http://www.example.com/upload', { + // ... some headers, + 'Content-Type': 'octet-stream' +}, BASE64_IMAGE_STRING) +// listen to upload progress event + .uploadProgress((written, total) => { + console.log('uploaded', written / total); + }) + // listen to download progress event + .progress((received, total) => { + console.log('progress', received / total); + }) + .then((resp) => { + // ... + }) + .catch((err) => { + // ... + }); + +RNFetchBlob.fetch('POST', 'http://www.example.com/upload', { + // ... some headers, + 'Content-Type': 'octet-stream' +}, BASE64_IMAGE_STRING) +// listen to upload progress event, emit every 250ms + .uploadProgress({interval: 250}, (written, total) => { + console.log('uploaded', written / total); + }) + // listen to download progress event, every 10% + .progress({count: 10}, (received, total) => { + console.log('progress', received / total); + }) + .then((resp) => { + // ... + }) + .catch((err) => { + // ... + }); + +// Cancel Request +let task = RNFetchBlob.fetch('GET', 'http://example.com/file/1'); +task.then(() => { +}) +// handle request cancelled rejection + .catch((err) => { + console.log(err); + }); +// cancel the request, the callback function is optional +task.cancel((err: any) => { +}); + +// Media Scanner +RNFetchBlob + .config({ + // DCIMDir is in external storage + path: dirs.DCIMDir + '/music.mp3' + }) + .fetch('GET', 'http://example.com/music.mp3') + .then((res) => RNFetchBlob.fs.scanFile([{path: res.path(), mime: 'audio/mpeg'}])) + .then(() => { + // scan file success + }) + .catch((err) => { + // scan file error + }); + +// Download Manager +RNFetchBlob + .config({ + addAndroidDownloads: { + useDownloadManager: true, // <-- this is the only thing required + // Optional, override notification setting (default to true) + notification: false, + // Optional, but recommended since android DownloadManager will fail when + // the url does not contains a file extension, by default the mime type will be text/plain + mime: 'text/plain', + description: 'File downloaded by download manager.' + } + }) + .fetch('GET', 'http://example.com/file/somefile') + .then((resp) => { + // the path of downloaded file + resp.path(); + }); + +RNFetchBlob.config({ + fileCache: true, + // android only options, these options be a no-op on IOS + addAndroidDownloads: { + // Show notification when response data transmitted + notification: true, + // Title of download notification + title: 'Great ! Download Success ! :O ', + // File description (not notification description) + description: 'An image file.', + mime: 'image/png', + // Make the file scannable by media scanner + mediaScannable: true, + } +}) + .fetch('GET', 'http://example.com/image1.png'); + +const android = RNFetchBlob.android; + +// Open Downloaded File with Intent +RNFetchBlob.config({ + addAndroidDownloads: { + useDownloadManager: true, + title: 'awesome.apk', + description: 'An APK that will be installed', + mime: 'application/vnd.android.package-archive', + mediaScannable: true, + notification: true, + } +}) + .fetch('GET', `http://www.example.com/awesome.apk`) + .then((res) => { + android.actionViewIntent(res.path(), 'application/vnd.android.package-archive'); + // Or show an image in image viewer + android.actionViewIntent(res.path(), 'image/png'); + }); + +// File Stream +let data = ''; +RNFetchBlob.fs.readStream( + // file path + PATH_TO_THE_FILE, + // encoding, should be one of `base64`, `utf8`, `ascii` + 'base64', + // (optional) buffer size, default to 4096 (4095 for BASE64 encoded data) + // when reading file in BASE64 encoding, buffer size must be multiples of 3. + 4095) + .then((ifstream) => { + ifstream.open(); + ifstream.onData((chunk) => { + // when encoding is `ascii`, chunk will be an array contains numbers + // otherwise it will be a string + data += chunk; + }); + ifstream.onError((err) => { + console.log('oops', err); + }); + ifstream.onEnd(() => { + // { + ofstream.write('foo'); + ofstream.write('bar'); + ofstream.close(); + }); + +// Cache File Management +// remove file using RNFetchblobResponse.flush() object method +RNFetchBlob + .config({fileCache: true}) + .fetch('GET', 'http://example.com/download/file') + .then((res) => { + // remove cached file from storage + res.flush(); + }); + +// remove file by specifying a path +RNFetchBlob.fs + .unlink('some-file-path') + .then(() => { + // ... + }); + +RNFetchBlob.config({ + fileCache: true +}) + .fetch('GET', 'http://example.com/download/file') + .then((res) => { + // set session of a response + res.session('foo'); + }); + +RNFetchBlob.config({ + // you can also set session beforehand + session: 'foo', + fileCache: true +}) + .fetch('GET', 'http://example.com/download/file') + .then((res) => { + // ... + }); + +// or put an existing file path to the session +RNFetchBlob.session('foo').add('some-file-path'); +// remove a file path from the session +RNFetchBlob.session('foo').remove('some-file-path'); +// list paths of a session +RNFetchBlob.session('foo').list(); +// remove all files in a session +RNFetchBlob.session('foo').dispose().then(() => { +}); + +// Transfer Encoding +RNFetchBlob.fetch('POST', 'http://example.com/upload', {'Transfer-Encoding': 'Chunked'}, 'bodyData'); + +// Self-Signed SSL Server +RNFetchBlob.config({ + trusty: true +}); diff --git a/types/react-native-fetch-blob/tsconfig.json b/types/react-native-fetch-blob/tsconfig.json new file mode 100644 index 0000000000..18538dfe6c --- /dev/null +++ b/types/react-native-fetch-blob/tsconfig.json @@ -0,0 +1,22 @@ +{ + "compilerOptions": { + "module": "commonjs", + "lib": [ + "es6", "dom" + ], + "noImplicitAny": true, + "noImplicitThis": true, + "strictNullChecks": true, + "baseUrl": "../", + "typeRoots": [ + "../" + ], + "types": [], + "noEmit": true, + "forceConsistentCasingInFileNames": true +}, + "files": [ + "index.d.ts", + "react-native-fetch-blob-tests.ts" + ] +} diff --git a/types/react-native-fetch-blob/tslint.json b/types/react-native-fetch-blob/tslint.json new file mode 100644 index 0000000000..377cc837d4 --- /dev/null +++ b/types/react-native-fetch-blob/tslint.json @@ -0,0 +1 @@ +{ "extends": "../tslint.json" }