index.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. const Plugin = require('@uppy/core/lib/Plugin')
  2. const { Provider } = require('@uppy/server-utils')
  3. const ProviderViews = require('@uppy/provider-views')
  4. const { h } = require('preact')
  5. module.exports = class GoogleDrive extends Plugin {
  6. constructor (uppy, opts) {
  7. super(uppy, opts)
  8. this.type = 'acquirer'
  9. this.id = this.opts.id || 'GoogleDrive'
  10. this.title = 'Google Drive'
  11. this.icon = () =>
  12. <svg aria-hidden="true" class="UppyIcon UppyModalTab-icon" width="28" height="28" viewBox="0 0 16 16">
  13. <path d="M2.955 14.93l2.667-4.62H16l-2.667 4.62H2.955zm2.378-4.62l-2.666 4.62L0 10.31l5.19-8.99 2.666 4.62-2.523 4.37zm10.523-.25h-5.333l-5.19-8.99h5.334l5.19 8.99z" />
  14. </svg>
  15. this[this.id] = new Provider(uppy, {
  16. serverUrl: this.opts.serverUrl,
  17. provider: 'drive',
  18. authProvider: 'google'
  19. })
  20. this.files = []
  21. this.onAuth = this.onAuth.bind(this)
  22. this.render = this.render.bind(this)
  23. // set default options
  24. const defaultOptions = {}
  25. // merge default options with the ones set by user
  26. this.opts = Object.assign({}, defaultOptions, opts)
  27. this.opts.serverPattern = opts.serverPattern || opts.serverUrl
  28. }
  29. install () {
  30. this.view = new ProviderViews(this)
  31. // Set default state for Google Drive
  32. this.setPluginState({
  33. authenticated: false,
  34. files: [],
  35. folders: [],
  36. directories: [],
  37. activeRow: -1,
  38. filterInput: '',
  39. isSearchVisible: false
  40. })
  41. const target = this.opts.target
  42. if (target) {
  43. this.mount(target, this)
  44. }
  45. }
  46. uninstall () {
  47. this.view.tearDown()
  48. this.unmount()
  49. }
  50. onAuth (authenticated) {
  51. this.setPluginState({ authenticated })
  52. if (authenticated) {
  53. this.view.getFolder('root')
  54. }
  55. }
  56. getUsername (data) {
  57. for (const item of data.items) {
  58. if (item.userPermission.role === 'owner') {
  59. for (const owner of item.owners) {
  60. if (owner.isAuthenticatedUser) {
  61. return owner.emailAddress
  62. }
  63. }
  64. }
  65. }
  66. }
  67. isFolder (item) {
  68. return item.mimeType === 'application/vnd.google-apps.folder'
  69. }
  70. getItemData (item) {
  71. return Object.assign({}, item, {size: parseFloat(item.fileSize)})
  72. }
  73. getItemIcon (item) {
  74. return <img src={item.iconLink} />
  75. }
  76. getItemSubList (item) {
  77. return item.items.filter((i) => {
  78. return this.isFolder(i) || !i.mimeType.startsWith('application/vnd.google')
  79. })
  80. }
  81. getItemName (item) {
  82. return item.title ? item.title : '/'
  83. }
  84. getMimeType (item) {
  85. return item.mimeType
  86. }
  87. getItemId (item) {
  88. return item.id
  89. }
  90. getItemRequestPath (item) {
  91. return this.getItemId(item)
  92. }
  93. getItemModifiedDate (item) {
  94. return item.modifiedByMeDate
  95. }
  96. getItemThumbnailUrl (item) {
  97. return `${this.opts.serverUrl}/${this.GoogleDrive.id}/thumbnail/${this.getItemRequestPath(item)}`
  98. }
  99. render (state) {
  100. return this.view.render(state)
  101. }
  102. }