UNPKG

react-native-app-data-sharing

Version:

This React Native package facilitates seamless and secure data sharing between applications on the same device.

197 lines (186 loc) 7.84 kB
"use strict"; import { NativeModules, Platform } from 'react-native'; import { ErrorCode } from './DataSharingTypes'; import { normalizeOptions } from './NormalizeOptionsUtils.ios'; const LINKING_ERROR = `The package 'react-native-app-data-sharing' doesn't seem to be linked. Make sure: \n\n` + Platform.select({ ios: "- You have run 'pod install'\n", default: '' }) + '- You rebuilt the app after installing the package\n' + '- You are not using Expo Go\n'; const Data = NativeModules.Data ? NativeModules.Data : new Proxy({}, { get() { throw new Error(LINKING_ERROR); } }); const IS_ANDROID = Platform.OS === 'android'; /** * Handles an error by checking its type and logging an appropriate message. * If the error is of type `ErrorType`, it logs the error code and message, * then throws a new error with the same information. If the error is not of type * `ErrorType`, it throws a generic error indicating an unknown error occurred. * * @param error - The error to be handled, which can be of any type. * @throws Will throw an error with a specific message based on the error code * if the error is of type `ErrorType`, or a generic unknown error message otherwise. */ const handleError = error => { if (isErrorType(error)) { switch (error.code) { case ErrorCode.VALUE_ERROR: console.error(`${ErrorCode.VALUE_ERROR}: ${error.message}`); throw new Error(`${ErrorCode.VALUE_ERROR}: ${error.message}`); case ErrorCode.KEY_ERROR: console.error(`${ErrorCode.KEY_ERROR}: ${error.message}`); throw new Error(`${ErrorCode.KEY_ERROR}: ${error.message}`); case ErrorCode.SAVE_ERROR: console.error(`${ErrorCode.SAVE_ERROR}: ${error.message}`); throw new Error(`${ErrorCode.SAVE_ERROR}: ${error.message}`); case ErrorCode.UPDATE_ERROR: console.error(`${ErrorCode.UPDATE_ERROR}: ${error.message}`); throw new Error(`${ErrorCode.UPDATE_ERROR}: ${error.message}`); case ErrorCode.DELETE_ERROR: console.error(`${ErrorCode.DELETE_ERROR}: ${error.message}`); throw new Error(`${ErrorCode.DELETE_ERROR}: ${error.message}`); case ErrorCode.CLEAR_ERROR: console.error(`${ErrorCode.CLEAR_ERROR}: ${error.message}`); throw new Error(`${ErrorCode.CLEAR_ERROR}: ${error.message}`); case ErrorCode.NO_DATA_FOUND_ERROR: console.error(`${ErrorCode.NO_DATA_FOUND_ERROR}: ${error.message}`); throw new Error(`${ErrorCode.NO_DATA_FOUND_ERROR}: ${error.message}`); case ErrorCode.ACTION_ERROR: console.error(`${ErrorCode.ACTION_ERROR}: ${error.message}`); throw new Error(`${ErrorCode.ACTION_ERROR}: ${error.message}`); case ErrorCode.UNEXPECTED_ERROR: console.error(`${ErrorCode.UNEXPECTED_ERROR}: ${error.message}`); throw new Error(`${ErrorCode.UNEXPECTED_ERROR}: ${error.message}`); } } else { throw new Error('An unknown error occurred.'); } }; /** * Checks if an error is of type `ErrorType`. * @param error - The error to be checked * @returns `true` if the error is of type `ErrorType`, `false` otherwise */ function isErrorType(error) { return typeof error === 'object' && error !== null && 'code' in error && 'message' in error; } /** * Saves a key-value pair to the shared storage. * * @param key - The key to be saved * @param value - The value to be saved * @param options - An optional object containing configuration options * @returns A promise that resolves to an empty value if the data was saved successfully, * or rejects with an error if the data could not be saved. */ export const saveData = async (key, value, options) => { try { const platformOptions = IS_ANDROID ? options?.android : normalizeOptions(options?.ios); const result = await Data.saveSharedData(platformOptions, key.toLowerCase(), value); return Promise.resolve(result); } catch (e) { return handleError(e); } }; /** * Initializes the shared storage with the provided authorities. * * @param authorities - An object containing configuration options for the shared storage, * with keys for Android and iOS platforms. * @returns A promise that resolves to an empty value if the store was initialized successfully, * or rejects with an error if the store could not be initialized. */ export const initializeStore = authorities => { const { android, ios } = authorities || {}; const storeParams = IS_ANDROID ? [android] : [ios?.accessGroup, ios?.serviceName]; return Data.initializeStore(...storeParams); }; /** * Retrieves a value from the shared storage. * * @param key - The key of the data to be retrieved. * @param options - An optional object containing configuration options. * @returns A promise that resolves to the value stored under the key, * or rejects with an error if the value could not be retrieved. */ export const getData = async (key, options) => { try { const platformOptions = IS_ANDROID ? options?.android : normalizeOptions(options?.ios); const result = await Data.getSharedData(platformOptions, key.toLowerCase()); return Promise.resolve(result); } catch (e) { return handleError(e); } }; /** * Retrieves all key-value pairs from the shared storage. * * @param options - An optional object containing configuration options. * @returns A promise that resolves to an object with keys as strings and values as strings, * or rejects with an error if the data could not be retrieved, or is undefined if no data is found. */ export const getAllSyncData = async options => { try { const platformOptions = IS_ANDROID ? options?.android : normalizeOptions(options?.ios); const result = Data.getAllSharedData(platformOptions); return Promise.resolve(result); } catch (e) { return handleError(e); } }; /** * Updates a key-value pair in the shared storage. * * @param key - The key of the data to be updated. * @param value - The new value for the key. * @param options - An optional object containing configuration options. * @returns A promise that resolves to an empty value if the data was updated successfully, * or rejects with an error if the data could not be updated. */ export const updateData = async (key, value, options) => { try { const platformOptions = IS_ANDROID ? options?.android : normalizeOptions(options?.ios); const result = await Data.updateSharedData(platformOptions, key.toLowerCase(), value); return Promise.resolve(result); } catch (e) { return handleError(e); } }; /** * Deletes a key-value pair from the shared storage. * * @param key - The key of the data to be deleted. * @param options - An optional object containing configuration options. * @returns A promise that resolves to an empty value if the data was deleted successfully, * or rejects with an error if the data could not be deleted. */ export const deleteData = async (key, options) => { try { const platformOptions = IS_ANDROID ? options?.android : normalizeOptions(options?.ios); const result = await Data.deleteSharedData(platformOptions, key.toLowerCase()); return Promise.resolve(result); } catch (e) { return handleError(e); } }; /** * Clears all data from the shared storage. * * @param options - An optional object containing configuration options. * @returns A promise that resolves to an empty value if the data was cleared successfully, * or rejects with an error if the data could not be cleared. */ export const clearData = async options => { try { const platformOptions = IS_ANDROID ? options?.android : normalizeOptions(options?.ios); const result = await Data.clearSharedData(platformOptions); return Promise.resolve(result); } catch (e) { return handleError(e); } }; //# sourceMappingURL=DataSharing.js.map