vuepouch.js 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. var init = function () {
  2. var bindings = this.$options.pouchdb
  3. ensureRef(this)
  4. for (var key in bindings) {
  5. bind(this, key, bindings[key])
  6. }
  7. }
  8. function ensureRef(vm) {
  9. if (!vm.$pouchdbRefs) {
  10. vm.$pouchdbRefs = Object.create(null)
  11. }
  12. }
  13. function defineReactive(vm, key, val) {
  14. if (key in vm) {
  15. vm[key] = val
  16. } else {
  17. Vue.util.defineReactive(vm, key, val)
  18. }
  19. }
  20. function bind(vm, key, source) {
  21. var array = []
  22. defineReactive(vm, key, array)
  23. var localDB = new PouchDB(source.localdb)
  24. var remoteDB = new PouchDB(source.remoteURL)
  25. vm.$pouchdbRefs[key] = localDB
  26. vm.$pouchdbRefs[key].push = function(data){
  27. var uuid = new Date().toISOString()
  28. data['_id'] = uuid
  29. vm[key][uuid] = data
  30. return new Promise(function (resolve, reject) {
  31. localDB.put(data).then(function (doc) {
  32. data['_rev'] = doc.rev
  33. resolve(data)
  34. }).catch(function (err) {
  35. data = Object.create(null)
  36. reject(err)
  37. })
  38. })
  39. }
  40. vm.$pouchdbRefs[key].update = function(data){
  41. var uuid = data['_id']
  42. vm[key][uuid] = data
  43. return new Promise(function (resolve, reject) {
  44. localDB.put(data).then(function (doc) {
  45. data['_rev'] = doc.rev
  46. resolve(doc)
  47. }).catch(function (err) {
  48. reject(err)
  49. })
  50. })
  51. }
  52. vm.$pouchdbRefs[key].delete = function(data){
  53. var id = data['_id']
  54. var rev = data['_rev']
  55. return new Promise(function (resolve, reject) {
  56. localDB.remove(id, rev).then(function (doc) {
  57. // check for connection
  58. remoteDB.info().catch(function(err){
  59. Vue.delete(vm[key], id)
  60. })
  61. resolve(doc)
  62. }).catch(function (err) {
  63. reject(err)
  64. })
  65. })
  66. }
  67. localDB.sync(remoteDB, {
  68. live: true,
  69. retry: true
  70. }).on('change', function (change) {
  71. var docs = change.change.docs
  72. console.log("change")
  73. docs.forEach(function (doc) {
  74. var uuid = doc['_id']
  75. if ((uuid in vm[key])) {
  76. if (doc['_deleted']) {
  77. Vue.delete(vm[key], uuid)
  78. return
  79. }
  80. vm[key][uuid] = doc
  81. } else {
  82. var obj = vm[key]
  83. Vue.set(obj, uuid, doc)
  84. }
  85. })
  86. })
  87. localDB.allDocs({
  88. include_docs: true,
  89. descending: true
  90. }).then(function (doc) {
  91. var objs = {}
  92. doc.rows.forEach(function(d){
  93. objs[d.id] = d.doc
  94. })
  95. defineReactive(vm, key, objs)
  96. }).catch(function (err) {
  97. })
  98. }
  99. var PouchMixin = {
  100. init: init, // making it usable with vuejs 1.x.x
  101. beforeCreate: init
  102. }
  103. function install(Vue) {
  104. Vue.mixin(PouchMixin)
  105. }
  106. // auto install
  107. if (typeof window !== 'undefined' && window.Vue) {
  108. install(window.Vue)
  109. }
  110. module.exports = install