Dashboard.js 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  1. /* eslint-disable import/no-extraneous-dependencies */
  2. import Uppy, { debugLogger } from '@uppy/core'
  3. import Dashboard from '@uppy/dashboard'
  4. import RemoteSources from '@uppy/remote-sources'
  5. import Webcam from '@uppy/webcam'
  6. import ScreenCapture from '@uppy/screen-capture'
  7. import GoldenRetriever from '@uppy/golden-retriever'
  8. import Tus from '@uppy/tus'
  9. import AwsS3 from '@uppy/aws-s3'
  10. import XHRUpload from '@uppy/xhr-upload'
  11. import Transloadit from '@uppy/transloadit'
  12. import Form from '@uppy/form'
  13. import ImageEditor from '@uppy/image-editor'
  14. import DropTarget from '@uppy/drop-target'
  15. import Audio from '@uppy/audio'
  16. import Compressor from '@uppy/compressor'
  17. import GoogleDrive from '@uppy/google-drive'
  18. import Webdav from '@uppy/webdav'
  19. import english from '@uppy/locales/lib/en_US.js'
  20. import GoogleDrivePicker from '@uppy/google-drive-picker'
  21. import GooglePhotosPicker from '@uppy/google-photos-picker'
  22. /* eslint-enable import/no-extraneous-dependencies */
  23. import generateSignatureIfSecret from './generateSignatureIfSecret.js'
  24. // DEV CONFIG: create a .env file in the project root directory to customize those values.
  25. const {
  26. VITE_UPLOADER: UPLOADER,
  27. VITE_COMPANION_URL: COMPANION_URL,
  28. VITE_TUS_ENDPOINT: TUS_ENDPOINT,
  29. VITE_XHR_ENDPOINT: XHR_ENDPOINT,
  30. VITE_TRANSLOADIT_KEY: TRANSLOADIT_KEY,
  31. VITE_TRANSLOADIT_SECRET: TRANSLOADIT_SECRET,
  32. VITE_TRANSLOADIT_TEMPLATE: TRANSLOADIT_TEMPLATE,
  33. VITE_TRANSLOADIT_SERVICE_URL: TRANSLOADIT_SERVICE_URL,
  34. VITE_GOOGLE_PICKER_API_KEY: GOOGLE_PICKER_API_KEY,
  35. VITE_GOOGLE_PICKER_CLIENT_ID: GOOGLE_PICKER_CLIENT_ID,
  36. VITE_GOOGLE_PICKER_APP_ID: GOOGLE_PICKER_APP_ID,
  37. } = import.meta.env
  38. const companionAllowedHosts =
  39. import.meta.env.VITE_COMPANION_ALLOWED_HOSTS &&
  40. new RegExp(import.meta.env.VITE_COMPANION_ALLOWED_HOSTS)
  41. import.meta.env.VITE_TRANSLOADIT_KEY &&= '***' // to avoid leaking secrets in screenshots.
  42. import.meta.env.VITE_TRANSLOADIT_SECRET &&= '***' // to avoid leaking secrets in screenshots.
  43. console.log(import.meta.env)
  44. // DEV CONFIG: enable or disable Golden Retriever
  45. const RESTORE = false
  46. const COMPRESS = false
  47. async function assemblyOptions() {
  48. return generateSignatureIfSecret(TRANSLOADIT_SECRET, {
  49. auth: {
  50. key: TRANSLOADIT_KEY,
  51. },
  52. // It's more secure to use a template_id and enable
  53. // Signature Authentication
  54. template_id: TRANSLOADIT_TEMPLATE,
  55. })
  56. }
  57. function getCompanionKeysParams(name) {
  58. const {
  59. [`VITE_COMPANION_${name}_KEYS_PARAMS_CREDENTIALS_NAME`]: credentialsName,
  60. [`VITE_COMPANION_${name}_KEYS_PARAMS_KEY`]: key,
  61. } = import.meta.env
  62. if (credentialsName && key) {
  63. // https://github.com/transloadit/uppy/pull/2802#issuecomment-1023093616
  64. return {
  65. companionKeysParams: {
  66. key,
  67. credentialsName,
  68. },
  69. }
  70. }
  71. return {}
  72. }
  73. // Rest is implementation! Obviously edit as necessary...
  74. export default () => {
  75. const restrictions = undefined
  76. // const restrictions = {
  77. // maxFileSize: 1 * 1000000, // 1mb
  78. // minFileSize: 1 * 1000000, // 1mb
  79. // maxTotalFileSize: 1 * 1000000, // 1mb
  80. // maxNumberOfFiles: 3,
  81. // minNumberOfFiles: 1,
  82. // allowedFileTypes: ['image/*', '.jpg', '.jpeg', '.png', '.gif'],
  83. // requiredMetaFields: ['caption'],
  84. // }
  85. const uppyDashboard = new Uppy({
  86. locale: english,
  87. logger: debugLogger,
  88. meta: {
  89. username: 'John',
  90. license: 'Creative Commons',
  91. },
  92. allowMultipleUploadBatches: false,
  93. restrictions,
  94. })
  95. .use(Dashboard, {
  96. trigger: '#pick-files',
  97. // inline: true,
  98. target: '.foo',
  99. metaFields: [
  100. { id: 'license', name: 'License', placeholder: 'specify license' },
  101. { id: 'caption', name: 'Caption', placeholder: 'add caption' },
  102. ],
  103. showProgressDetails: true,
  104. proudlyDisplayPoweredByUppy: true,
  105. note: `${JSON.stringify(restrictions)}`,
  106. })
  107. .use(GoogleDrive, {
  108. target: Dashboard,
  109. companionUrl: COMPANION_URL,
  110. companionAllowedHosts,
  111. ...getCompanionKeysParams('GOOGLE_DRIVE'),
  112. })
  113. // .use(Instagram, { target: Dashboard, companionUrl: COMPANION_URL, companionAllowedHosts })
  114. // .use(Dropbox, { target: Dashboard, companionUrl: COMPANION_URL, companionAllowedHosts })
  115. // .use(Box, { target: Dashboard, companionUrl: COMPANION_URL, companionAllowedHosts })
  116. // .use(Facebook, { target: Dashboard, companionUrl: COMPANION_URL, companionAllowedHosts })
  117. // .use(OneDrive, { target: Dashboard, companionUrl: COMPANION_URL, companionAllowedHosts })
  118. // .use(Zoom, { target: Dashboard, companionUrl: COMPANION_URL, companionAllowedHosts })
  119. // .use(Url, { target: Dashboard, companionUrl: COMPANION_URL, companionAllowedHosts })
  120. // .use(Unsplash, { target: Dashboard, companionUrl: COMPANION_URL, companionAllowedHosts })
  121. .use(GoogleDrivePicker, {
  122. target: Dashboard,
  123. companionUrl: COMPANION_URL,
  124. companionAllowedHosts,
  125. clientId: GOOGLE_PICKER_CLIENT_ID,
  126. apiKey: GOOGLE_PICKER_API_KEY,
  127. appId: GOOGLE_PICKER_APP_ID,
  128. })
  129. .use(GooglePhotosPicker, {
  130. target: Dashboard,
  131. companionUrl: COMPANION_URL,
  132. companionAllowedHosts,
  133. clientId: GOOGLE_PICKER_CLIENT_ID,
  134. })
  135. .use(RemoteSources, {
  136. companionUrl: COMPANION_URL,
  137. sources: [
  138. 'GooglePhotos',
  139. 'Box',
  140. 'Dropbox',
  141. 'Facebook',
  142. 'Instagram',
  143. 'OneDrive',
  144. 'Unsplash',
  145. 'Zoom',
  146. 'Url',
  147. ],
  148. companionAllowedHosts,
  149. })
  150. .use(Webcam, {
  151. target: Dashboard,
  152. showVideoSourceDropdown: true,
  153. showRecordingLength: true,
  154. })
  155. .use(Webdav, {
  156. target: Dashboard,
  157. companionUrl: COMPANION_URL,
  158. companionAllowedHosts
  159. })
  160. .use(Audio, {
  161. target: Dashboard,
  162. showRecordingLength: true,
  163. })
  164. .use(ScreenCapture, { target: Dashboard })
  165. .use(Form, { target: '#upload-form' })
  166. .use(ImageEditor, { target: Dashboard })
  167. .use(DropTarget, {
  168. target: document.body,
  169. })
  170. if (COMPRESS) {
  171. uppyDashboard.use(Compressor)
  172. }
  173. switch (UPLOADER) {
  174. case 'tus':
  175. uppyDashboard.use(Tus, { endpoint: TUS_ENDPOINT, limit: 6 })
  176. break
  177. case 's3':
  178. uppyDashboard.use(AwsS3, {
  179. endpoint: COMPANION_URL,
  180. shouldUseMultipart: false,
  181. })
  182. break
  183. case 's3-multipart':
  184. uppyDashboard.use(AwsS3, {
  185. endpoint: COMPANION_URL,
  186. shouldUseMultipart: true,
  187. })
  188. break
  189. case 'xhr':
  190. uppyDashboard.use(XHRUpload, {
  191. endpoint: XHR_ENDPOINT,
  192. limit: 6,
  193. bundle: false,
  194. })
  195. break
  196. case 'transloadit':
  197. uppyDashboard.use(Transloadit, {
  198. service: TRANSLOADIT_SERVICE_URL,
  199. waitForEncoding: true,
  200. assemblyOptions,
  201. })
  202. break
  203. case 'transloadit-s3':
  204. uppyDashboard.use(AwsS3, { companionUrl: COMPANION_URL })
  205. uppyDashboard.use(Transloadit, {
  206. waitForEncoding: true,
  207. importFromUploadURLs: true,
  208. assemblyOptions,
  209. })
  210. break
  211. case 'transloadit-xhr':
  212. uppyDashboard.setMeta({
  213. params: JSON.stringify({
  214. auth: { key: TRANSLOADIT_KEY },
  215. template_id: TRANSLOADIT_TEMPLATE,
  216. }),
  217. })
  218. uppyDashboard.use(XHRUpload, {
  219. method: 'POST',
  220. endpoint: `${TRANSLOADIT_SERVICE_URL}/assemblies`,
  221. allowedMetaFields: ['params'],
  222. bundle: true,
  223. })
  224. break
  225. default:
  226. }
  227. if (RESTORE) {
  228. uppyDashboard.use(GoldenRetriever, { serviceWorker: true })
  229. }
  230. window.uppy = uppyDashboard
  231. uppyDashboard.on('complete', (result) => {
  232. if (result.failed.length === 0) {
  233. console.log('Upload successful 😀')
  234. } else {
  235. console.warn('Upload failed 😞')
  236. }
  237. console.log('successful files:', result.successful)
  238. console.log('failed files:', result.failed)
  239. if (UPLOADER === 'transloadit') {
  240. console.log('Transloadit result:', result.transloadit)
  241. }
  242. })
  243. const modalTrigger = document.querySelector('#pick-files')
  244. if (modalTrigger) modalTrigger.click()
  245. }