all files / model/ FileManager.js

35.48% Statements 11/31
20% Branches 2/10
28.57% Functions 2/7
36.67% Lines 11/30
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79                        206× 206× 206× 206×     206× 937×     206×                                                                                         161× 161×   854× 854×              
import forEach from '../util/forEach'
import map from '../util/map'
 
/*
  Storage for files such as images and other assets.
 
  This accumulates files created or loaded during a session
  so that it is possible to pick up a file after undo+redo.
*/
class FileManager {
 
  constructor(editorSession, extensions, context) {
    this.editorSession = editorSession
    this.extensions = extensions
    this.proxies = {}
    this.context = context
 
    // adapt all existing files
    forEach(editorSession.getDocument().getNodes(), (node) => {
      Iif (node._isFileNode) this.storeFile(node)
    })
 
    this.editorSession.onUpdate('document', this._onDocumentChange, this)
  }
 
  dispose() {
    this.editorSession.off(this)
  }
 
  storeFile(fileNode) {
    let proxy = this.proxies[fileNode.id]
    // don't adapt the file if we already have it
    if (!proxy) {
      proxy = this.createFileProxy(fileNode)
      if (proxy) {
        this.proxies[fileNode.id] = proxy
      }
    }
    fileNode.proxy = proxy
    return proxy
  }
 
  createFileProxy(fileNode) { // eslint-disable-line
    let context = this.context
    for (var i = 0; i < this.extensions.length; i++) {
      let ExtClass = this.extensions[i]
      if (ExtClass.match(fileNode, context)) {
        return new ExtClass(fileNode, context)
      }
    }
    console.error('No file adapter found for ', fileNode)
  }
 
  getProxy(fileNode) {
    return this.proxies[fileNode.id]
  }
 
  sync() {
    // Note: potentially this could be a bi-directional sync
    // ATM, we only consider upload
    let promises = map(this.proxies, (proxy) => {
      return proxy.sync()
    })
    return Promise.all(promises)
  }
 
  _onDocumentChange(change) {
    let doc = this.editorSession.getDocument()
    forEach(change.created, (nodeData) => {
      // we would need the real node to support inheritance
      let node = doc.get(nodeData.id)
      Iif (node._isFileNode) {
        this.storeFile(node)
      }
    })
  }
}
 
export default FileManager