@theoplayer/react-native-engage
Version:
Engage connector for @theoplayer/react-native
55 lines (47 loc) • 1.68 kB
text/typescript
import { Cluster, ClusterType } from '@theoplayer/react-native-engage';
import { DefaultEngageClient } from '../DefaultEngageClient';
import { MMKV } from 'react-native-mmkv';
import { DefaultCluster } from '../cluster/DefaultCluster';
const TAG: string = 'EngageStorage';
const storage = new MMKV({
id: 'engage-storage',
});
export async function readCluster(client: DefaultEngageClient, clusterType: ClusterType): Promise<Cluster> {
try {
return createCluster(client, clusterType, storage.getString(storageKeyForCluster(clusterType)));
} catch (e) {
console.warn(TAG, `Failed to retrieve cluster data from storage: ${e}`);
}
return createCluster(client, clusterType);
}
function createCluster(client: DefaultEngageClient, clusterType: ClusterType, json?: string): Cluster {
if (json) {
try {
const cluster = JSON.parse(json) as Cluster;
return new DefaultCluster(client, clusterType, cluster.entities);
} catch (e) {
console.warn(TAG, `Failed to retrieve cluster data from storage: ${e}`);
}
}
return new DefaultCluster(client, clusterType);
}
export async function storeCluster(cluster: Cluster): Promise<boolean> {
const key = storageKeyForCluster(cluster.type);
try {
const json = JSON.stringify({
...cluster,
engageClient: undefined,
});
storage.set(key, json);
return true;
} catch (e) {
console.warn(TAG, `Failed to store cluster data ${key}: ${e}`);
return false;
}
}
export async function removeCluster(type: ClusterType) {
storage.delete(storageKeyForCluster(type));
}
function storageKeyForCluster(type: ClusterType): string {
return `engage/cluster/${type}`;
}