51 lines
1.6 KiB
TypeScript
51 lines
1.6 KiB
TypeScript
|
|
import AsyncStorage from '@react-native-async-storage/async-storage';
|
||
|
|
import { DocumentDirectoryPath, exists, readFile, writeFile, unlink, mkdir } from 'react-native-fs';
|
||
|
|
import { Storage } from 'redux-persist';
|
||
|
|
|
||
|
|
const STORAGE_BASE_PATH = DocumentDirectoryPath + '/store/';
|
||
|
|
|
||
|
|
/** Retrieve the path of a store file for a given key */
|
||
|
|
function getFileByKey(key: string) {
|
||
|
|
return STORAGE_BASE_PATH + encodeURIComponent(key) + '.json';
|
||
|
|
}
|
||
|
|
|
||
|
|
/** Ensure that the store directory exists on the local filesystem */
|
||
|
|
async function ensureDirectoryExists() {
|
||
|
|
if (!(await exists(STORAGE_BASE_PATH))) {
|
||
|
|
await mkdir(STORAGE_BASE_PATH);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Migrates the Redux store from AsyncStorage to react-native-fs.
|
||
|
|
*/
|
||
|
|
const MigratedStorage: Storage = {
|
||
|
|
async getItem(key) {
|
||
|
|
const path = getFileByKey(key);
|
||
|
|
|
||
|
|
// GUARD: Check whether a store already exists on the filesystem
|
||
|
|
if (await exists(path)) {
|
||
|
|
// In which case, we'll read it from disk
|
||
|
|
return readFile(path);
|
||
|
|
} else {
|
||
|
|
// If not, attempt to read the previous store from AsyncStorage
|
||
|
|
const oldStore = await AsyncStorage.getItem(key);
|
||
|
|
|
||
|
|
// GUARD: If it exists, migrate it to a file on the filesystem
|
||
|
|
if (oldStore) {
|
||
|
|
await ensureDirectoryExists();
|
||
|
|
await writeFile(path, oldStore);
|
||
|
|
return oldStore;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
},
|
||
|
|
removeItem(key) {
|
||
|
|
return unlink(getFileByKey(key));
|
||
|
|
},
|
||
|
|
async setItem(key, value) {
|
||
|
|
await ensureDirectoryExists();
|
||
|
|
return writeFile(getFileByKey(key), value);
|
||
|
|
},
|
||
|
|
};
|
||
|
|
|
||
|
|
export default MigratedStorage;
|