mirror of
				https://github.com/lingble/chatwoot.git
				synced 2025-11-04 04:57:51 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			79 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			79 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
import { openDB } from 'idb';
 | 
						|
import { DATA_VERSION } from './version';
 | 
						|
 | 
						|
export class DataManager {
 | 
						|
  constructor(accountId) {
 | 
						|
    this.modelsToSync = ['inbox', 'label', 'team'];
 | 
						|
    this.accountId = accountId;
 | 
						|
    this.db = null;
 | 
						|
  }
 | 
						|
 | 
						|
  async initDb() {
 | 
						|
    if (this.db) return this.db;
 | 
						|
    const dbName = `cw-store-${this.accountId}`;
 | 
						|
    this.db = await openDB(`cw-store-${this.accountId}`, DATA_VERSION, {
 | 
						|
      upgrade(db) {
 | 
						|
        db.createObjectStore('cache-keys');
 | 
						|
        db.createObjectStore('inbox', { keyPath: 'id' });
 | 
						|
        db.createObjectStore('label', { keyPath: 'id' });
 | 
						|
        db.createObjectStore('team', { keyPath: 'id' });
 | 
						|
      },
 | 
						|
    });
 | 
						|
 | 
						|
    // Store the database name in LocalStorage
 | 
						|
    const dbNames = JSON.parse(localStorage.getItem('cw-idb-names') || '[]');
 | 
						|
    if (!dbNames.includes(dbName)) {
 | 
						|
      dbNames.push(dbName);
 | 
						|
      localStorage.setItem('cw-idb-names', JSON.stringify(dbNames));
 | 
						|
    }
 | 
						|
 | 
						|
    return this.db;
 | 
						|
  }
 | 
						|
 | 
						|
  validateModel(name) {
 | 
						|
    if (!name) throw new Error('Model name is not defined');
 | 
						|
    if (!this.modelsToSync.includes(name)) {
 | 
						|
      throw new Error(`Model ${name} is not defined`);
 | 
						|
    }
 | 
						|
    return true;
 | 
						|
  }
 | 
						|
 | 
						|
  async replace({ modelName, data }) {
 | 
						|
    this.validateModel(modelName);
 | 
						|
 | 
						|
    this.db.clear(modelName);
 | 
						|
    return this.push({ modelName, data });
 | 
						|
  }
 | 
						|
 | 
						|
  async push({ modelName, data }) {
 | 
						|
    this.validateModel(modelName);
 | 
						|
 | 
						|
    if (Array.isArray(data)) {
 | 
						|
      const tx = this.db.transaction(modelName, 'readwrite');
 | 
						|
      data.forEach(item => {
 | 
						|
        tx.store.add(item);
 | 
						|
      });
 | 
						|
      await tx.done;
 | 
						|
    } else {
 | 
						|
      await this.db.add(modelName, data);
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  async get({ modelName }) {
 | 
						|
    this.validateModel(modelName);
 | 
						|
    return this.db.getAll(modelName);
 | 
						|
  }
 | 
						|
 | 
						|
  async setCacheKeys(cacheKeys) {
 | 
						|
    Object.keys(cacheKeys).forEach(async modelName => {
 | 
						|
      this.db.put('cache-keys', cacheKeys[modelName], modelName);
 | 
						|
    });
 | 
						|
  }
 | 
						|
 | 
						|
  async getCacheKey(modelName) {
 | 
						|
    this.validateModel(modelName);
 | 
						|
 | 
						|
    return this.db.get('cache-keys', modelName);
 | 
						|
  }
 | 
						|
}
 |