11import { Tracker } from 'meteor/tracker' ;
22import { Session } from 'meteor/session' ;
3- import s from 'underscore.string' ;
4- import { Handlebars } from 'meteor/ui' ;
53import { Random } from 'meteor/random' ;
64
75import { settings } from '../../../settings/client' ;
8- import { t , fileUploadIsValidContentType , APIClient } from '../../../utils' ;
9- import { modal , prependReplies } from '../../../ui-utils' ;
10-
11-
12- const readAsDataURL = ( file , callback ) => {
13- const reader = new FileReader ( ) ;
14- reader . onload = ( e ) => callback ( e . target . result , file ) ;
15-
16- return reader . readAsDataURL ( file ) ;
17- } ;
6+ import { fileUploadIsValidContentType , APIClient } from '../../../utils' ;
7+ import { prependReplies } from '../../../ui-utils' ;
8+ import { imperativeModal } from '../../../../client/lib/imperativeModal' ;
9+ import FileUploadModal from '../../../../client/components/modals/FileUploadModal' ;
1810
1911export const uploadFileWithMessage = async ( rid , tmid , { description, fileName, msg, file } ) => {
2012 const data = new FormData ( ) ;
@@ -84,129 +76,6 @@ export const uploadFileWithMessage = async (rid, tmid, { description, fileName,
8476 }
8577} ;
8678
87-
88- const showUploadPreview = ( file , callback ) => {
89- // If greater then 10MB don't try and show a preview
90- if ( file . file . size > ( 10 * 1000000 ) ) {
91- return callback ( file , null ) ;
92- }
93-
94- if ( file . file . type == null ) {
95- return callback ( file , null ) ;
96- }
97-
98- if ( ( file . file . type . indexOf ( 'audio' ) > - 1 ) || ( file . file . type . indexOf ( 'video' ) > - 1 ) || ( file . file . type . indexOf ( 'image' ) > - 1 ) ) {
99- file . type = file . file . type . split ( '/' ) [ 0 ] ;
100-
101- return readAsDataURL ( file . file , ( content ) => callback ( file , content ) ) ;
102- }
103-
104- return callback ( file , null ) ;
105- } ;
106-
107- const getAudioUploadPreview = ( file , preview ) => `\
108- <div class='upload-preview'>
109- <audio style="width: 100%;" controls="controls">
110- <source src="${ preview } " type="${ file . file . type } ">
111- Your browser does not support the audio element.
112- </audio>
113- </div>
114- <div class='upload-preview-title'>
115- <div class="rc-input__wrapper">
116- <input class="rc-input__element" id='file-name' style='display: inherit;' value='${ Handlebars . _escape ( file . name ) } ' placeholder='${ t ( 'Upload_file_name' ) } '>
117- </div>
118- <div class="rc-input__wrapper">
119- <input class="rc-input__element" id='file-description' autofocus style='display: inherit;' value='' placeholder='${ t ( 'Upload_file_description' ) } '>
120- </div>
121- </div>` ;
122-
123- const getVideoUploadPreview = ( file , preview ) => `\
124- <div class='upload-preview'>
125- <video style="width: 100%;" controls="controls">
126- <source src="${ preview } " type="video/webm">
127- Your browser does not support the video element.
128- </video>
129- </div>
130- <div class='upload-preview-title'>
131- <div class="rc-input__wrapper">
132- <input class="rc-input__element" id='file-name' style='display: inherit;' value='${ Handlebars . _escape ( file . name ) } ' placeholder='${ t ( 'Upload_file_name' ) } '>
133- </div>
134- <div class="rc-input__wrapper">
135- <input class="rc-input__element" id='file-description' autofocus style='display: inherit;' value='' placeholder='${ t ( 'Upload_file_description' ) } '>
136- </div>
137- </div>` ;
138-
139- const getImageUploadPreview = ( file , preview ) => `\
140- <div class='upload-preview'>
141- <div class='upload-preview-file' style='background-image: url(${ preview } )'></div>
142- </div>
143- <div class='upload-preview-title'>
144- <div class="rc-input__wrapper">
145- <input class="rc-input__element" id='file-name' style='display: inherit;' value='${ Handlebars . _escape ( file . name ) } ' placeholder='${ t ( 'Upload_file_name' ) } '>
146- </div>
147- <div class="rc-input__wrapper">
148- <input class="rc-input__element" id='file-description' autofocus style='display: inherit;' value='' placeholder='${ t ( 'Upload_file_description' ) } '>
149- </div>
150- </div>` ;
151-
152- const formatBytes = ( bytes , decimals ) => {
153- if ( bytes === 0 ) {
154- return '0 Bytes' ;
155- }
156-
157- const k = 1000 ;
158- const dm = ( decimals + 1 ) || 3 ;
159-
160- const sizes = [
161- 'Bytes' ,
162- 'KB' ,
163- 'MB' ,
164- 'GB' ,
165- 'TB' ,
166- 'PB' ,
167- ] ;
168-
169- const i = Math . floor ( Math . log ( bytes ) / Math . log ( k ) ) ;
170-
171- return `${ parseFloat ( ( bytes / Math . pow ( k , i ) ) . toFixed ( dm ) ) } ${ sizes [ i ] } ` ;
172- } ;
173-
174- const getGenericUploadPreview = ( file ) => `\
175- <div class='upload-preview'>
176- <div>${ Handlebars . _escape ( file . name ) } - ${ formatBytes ( file . file . size ) } </div>
177- </div>
178- <div class='upload-preview-title'>
179- <div class="rc-input__wrapper">
180- <input class="rc-input__element" id='file-name' style='display: inherit;' value='${ Handlebars . _escape ( file . name ) } ' placeholder='${ t ( 'Upload_file_name' ) } '>
181- </div>
182- <div class="rc-input__wrapper">
183- <input class="rc-input__element" id='file-description' style='display: inherit;' value='' autoFocus placeholder='${ t ( 'Upload_file_description' ) } '>
184- </div>
185- </div>` ;
186-
187- const getUploadPreview = async ( file , preview ) => {
188- if ( file . type === 'audio' ) {
189- return getAudioUploadPreview ( file , preview ) ;
190- }
191-
192- if ( file . type === 'video' ) {
193- return getVideoUploadPreview ( file , preview ) ;
194- }
195-
196- const isImageFormatSupported = ( ) => new Promise ( ( resolve ) => {
197- const element = document . createElement ( 'img' ) ;
198- element . onload = ( ) => resolve ( true ) ;
199- element . onerror = ( ) => resolve ( false ) ;
200- element . src = preview ;
201- } ) ;
202-
203- if ( file . type === 'image' && await isImageFormatSupported ( ) ) {
204- return getImageUploadPreview ( file , preview ) ;
205- }
206-
207- return getGenericUploadPreview ( file , preview ) ;
208- } ;
209-
21079export const fileUpload = async ( files , input , { rid, tmid } ) => {
21180 const threadsEnabled = settings . get ( 'Threads_enabled' ) ;
21281
@@ -228,55 +97,30 @@ export const fileUpload = async (files, input, { rid, tmid }) => {
22897 const uploadNextFile = ( ) => {
22998 const file = files . pop ( ) ;
23099 if ( ! file ) {
231- modal . close ( ) ;
232100 return ;
233101 }
234102
235- if ( file . file . type && ! fileUploadIsValidContentType ( file . file . type ) ) {
236- modal . open ( {
237- title : t ( 'FileUpload_MediaType_NotAccepted' ) ,
238- text : file . file . type || `*.${ s . strRightBack ( file . file . name , '.' ) } ` ,
239- type : 'error' ,
240- timer : 3000 ,
241- } ) ;
242- return ;
243- }
244-
245- if ( file . file . size === 0 ) {
246- modal . open ( {
247- title : t ( 'FileUpload_File_Empty' ) ,
248- type : 'error' ,
249- timer : 1000 ,
250- } ) ;
251- return ;
252- }
253-
254- showUploadPreview ( file , async ( file , preview ) => modal . open ( {
255- title : t ( 'Upload_file_question' ) ,
256- text : await getUploadPreview ( file , preview ) ,
257- showCancelButton : true ,
258- closeOnConfirm : false ,
259- closeOnCancel : false ,
260- confirmButtonText : t ( 'Send' ) ,
261- cancelButtonText : t ( 'Cancel' ) ,
262- html : true ,
263- onRendered : ( ) => $ ( '#file-description' ) . focus ( ) ,
264- } , async ( isConfirm ) => {
265- if ( ! isConfirm ) {
266- return ;
267- }
268-
269- const fileName = document . getElementById ( 'file-name' ) . value || file . name || file . file . name ;
270-
271- uploadFileWithMessage ( rid , tmid , {
272- description : document . getElementById ( 'file-description' ) . value || undefined ,
273- fileName,
274- msg : msg || undefined ,
275- file,
276- } ) ;
277-
278- uploadNextFile ( ) ;
279- } ) ) ;
103+ imperativeModal . open ( {
104+ component : FileUploadModal ,
105+ props : {
106+ file : file . file ,
107+ onClose : ( ) => {
108+ imperativeModal . close ( ) ;
109+ uploadNextFile ( ) ;
110+ } ,
111+ onSubmit : ( fileName , description ) => {
112+ uploadFileWithMessage ( rid , tmid , {
113+ description,
114+ fileName,
115+ msg : msg || undefined ,
116+ file,
117+ } ) ;
118+ imperativeModal . close ( ) ;
119+ uploadNextFile ( ) ;
120+ } ,
121+ isValidContentType : file . file . type && fileUploadIsValidContentType ( file . file . type ) ,
122+ } ,
123+ } ) ;
280124 } ;
281125
282126 uploadNextFile ( ) ;
0 commit comments